Matter fix wrong unsupported messages (#18394)

This commit is contained in:
s-hadinger 2023-04-11 22:56:05 +02:00 committed by GitHub
parent 5bf605340c
commit f33ccac2df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 2842 additions and 2305 deletions

View File

@ -141,6 +141,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because
#include "solidify/solidified_Matter_IM_Message.h" #include "solidify/solidified_Matter_IM_Message.h"
#include "solidify/solidified_Matter_IM_Subscription.h" #include "solidify/solidified_Matter_IM_Subscription.h"
#include "solidify/solidified_Matter_IM.h" #include "solidify/solidified_Matter_IM.h"
#include "solidify/solidified_Matter_Control_Message.h"
#include "solidify/solidified_Matter_Plugin.h" #include "solidify/solidified_Matter_Plugin.h"
#include "solidify/solidified_Matter_Base38.h" #include "solidify/solidified_Matter_Base38.h"
#include "solidify/solidified_Matter_UI.h" #include "solidify/solidified_Matter_UI.h"
@ -299,6 +300,7 @@ module matter (scope: global, strings: weak) {
IM_Subscription, class(be_class_Matter_IM_Subscription) IM_Subscription, class(be_class_Matter_IM_Subscription)
IM_Subscription_Shop, class(be_class_Matter_IM_Subscription_Shop) IM_Subscription_Shop, class(be_class_Matter_IM_Subscription_Shop)
IM, class(be_class_Matter_IM) IM, class(be_class_Matter_IM)
Control_Message, class(be_class_Matter_Control_Message)
UI, class(be_class_Matter_UI) UI, class(be_class_Matter_UI)
// QR Code // QR Code

View File

@ -78,9 +78,7 @@ class Matter_Commisioning_Context
tasmota.log("MTR: received message " + matter.inspect(msg), 3) tasmota.log("MTR: received message " + matter.inspect(msg), 3)
if msg.opcode == 0x10 if msg.opcode == 0x10
return self.parse_MsgCounterSyncReq(msg) # don't need to do anything, the message is acked already before this call
elif msg.opcode == 0x11
return self.parse_MsgCounterSyncRsp(msg)
elif msg.opcode == 0x20 elif msg.opcode == 0x20
return self.parse_PBKDFParamRequest(msg) return self.parse_PBKDFParamRequest(msg)
elif msg.opcode == 0x22 elif msg.opcode == 0x22
@ -695,28 +693,6 @@ class Matter_Commisioning_Context
return false # we don't explicitly ack the message return false # we don't explicitly ack the message
end end
#############################################################
# MsgCounterSyncReq
#
# Not yet implemented
def parse_MsgCounterSyncReq(msg)
import string
var session = msg.session
tasmota.log(string.format("MTR: >????????? MsgCounterSyncReq not implemented %s", msg.raw[msg.app_payload_idx..].tohex()), 2)
return false # we don't explicitly ack the message
end
#############################################################
# MsgCounterSyncRsp
#
# Not yet implemented
def parse_MsgCounterSyncRsp(msg)
import string
var session = msg.session
tasmota.log(string.format("MTR: >????????? MsgCounterSyncRsp not implemented %s", msg.raw[msg.app_payload_idx..].tohex()), 2)
return false # we don't explicitly ack the message
end
############################################################# #############################################################
# placeholder, nothing to run for now # placeholder, nothing to run for now
def every_second() def every_second()

View File

@ -0,0 +1,79 @@
#
# Matter_Control_Message.be - suppport for Matter Control Messages (flag C = 1)
#
# Copyright (C) 2023 Stephan Hadinger & Theo Arends
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import matter
#@ solidify:Matter_Control_Message,weak
#################################################################################
# Class Matter_Control_Message
#
# Control message have C flag = 1
# Used primarily for Message Counter Synchronization Protocol (MCSP)
#################################################################################
class Matter_Control_Message
var responder # reference to the caller, sending packets
var device # root device object
def init(responder)
import crypto
self.responder = responder
self.device = responder.device
end
def process_incoming_control_message(msg)
tasmota.log("MTR: received control message " + matter.inspect(msg), 2)
if msg.opcode == 0x00
return self.parse_MsgCounterSyncReq(msg)
elif msg.opcode == 0x01
return self.parse_MsgCounterSyncRsp(msg)
else
import string
tasmota.log(string.format("MTR: >????????? Unknown OpCode (control message) %02X", msg.opcode), 2)
return false
end
return false
end
#############################################################
# MsgCounterSyncReq
#
# Not yet implemented
def parse_MsgCounterSyncReq(msg)
import string
var session = msg.session
tasmota.log(string.format("MTR: >MCSyncReq * Not implemented %s", msg.raw[msg.app_payload_idx..].tohex()), 2)
return false # we don't explicitly ack the message
end
#############################################################
# MsgCounterSyncRsp
#
# Not yet implemented
def parse_MsgCounterSyncRsp(msg)
import string
var session = msg.session
tasmota.log(string.format("MTR: >MCSyncRsp * Not implemented %s", msg.raw[msg.app_payload_idx..].tohex()), 2)
return false # we don't explicitly ack the message
end
end
matter.Control_Message = Matter_Control_Message

View File

@ -96,18 +96,7 @@ class Matter_IM
# #
# returns `true` if packet could be sent # returns `true` if packet could be sent
def send_ack_now(msg) def send_ack_now(msg)
if msg.x_flag_r # send Ack only if requester asks for it msg.session._message_handler.send_encrypted_ack(msg, false #-not reliable-#)
var resp = msg.build_standalone_ack(false #-not reliable-#)
resp.encode_frame()
resp.encrypt()
import string
tasmota.log(string.format("MTR: <Ack_now (%6i) rack=%i id=%i [%s]:%i", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter, resp.remote_ip, resp.remote_port), 3)
msg.session._message_handler.send_response(resp.raw, resp.remote_ip, resp.remote_port, nil, resp.session.local_session_id)
# self.send_response(resp.raw, resp.remote_ip, resp.remote_port, resp.message_counter, resp.session.local_session_id)
# return msg.send_im(msg.session._message_handler) # send message now
else
return true
end
end end
############################################################# #############################################################

View File

@ -182,7 +182,9 @@ matter.IM_WriteResponse = Matter_IM_WriteResponse
# Report Data for a Read Request # Report Data for a Read Request
################################################################################# #################################################################################
class Matter_IM_ReportData : Matter_IM_Message class Matter_IM_ReportData : Matter_IM_Message
static var MAX_MESSAGE = 1000 # max bytes size for a single TLV worklaod static var MAX_MESSAGE = 1200 # max bytes size for a single TLV worklaod
# the maximum MTU is 1280, which leaves 80 bytes for the rest of the message
# section 4.4.4 (p. 114)
def init(msg, data) def init(msg, data)
super(self).init(msg, 0x05 #-Report Data-#, true) super(self).init(msg, 0x05 #-Report Data-#, true)

View File

@ -28,12 +28,45 @@ class Matter_MessageHandler
# handlers # handlers
var commissioning # Commissioning Context instance, handling the PASE/CASE phases var commissioning # Commissioning Context instance, handling the PASE/CASE phases
var im # Instance of `matter.IM` handling Interaction Model var im # Instance of `matter.IM` handling Interaction Model
var control_message # Instance of `matter.Control_Message` for MCSP
############################################################# #############################################################
def init(device) def init(device)
self.device = device self.device = device
self.commissioning = matter.Commisioning_Context(self) self.commissioning = matter.Commisioning_Context(self)
self.im = matter.IM(device) self.im = matter.IM(device)
self.control_message = matter.Control_Message(self)
end
#############################################################
# Send a unencrypted Ack if needed
#
# reliable: do we send as reliable message
#
def send_simple_ack(frame, reliable)
import string
if frame.x_flag_r # nothing to respond, check if we need a standalone ack
var resp = frame.build_standalone_ack(reliable)
resp.encode_frame()
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i %s", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter, reliable ? '{reliable}' : ''), 3)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, reliable ? resp.message_counter : nil, resp.session.local_session_id)
end
end
#############################################################
# Send an encrypted Ack if needed
#
# reliable: do we send as reliable message
#
def send_encrypted_ack(frame, reliable)
import string
if frame.x_flag_r # nothing to respond, check if we need a standalone ack
var resp = frame.build_standalone_ack(reliable)
resp.encode_frame()
resp.encrypt()
tasmota.log(string.format("MTR: <Ack* (%6i) ack=%i id=%i %s", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter, reliable ? '{reliable}' : ''), 3)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, reliable ? resp.message_counter : nil, resp.session.local_session_id)
end
end end
############################################################# #############################################################
@ -54,7 +87,13 @@ class Matter_MessageHandler
if !ok return false end if !ok return false end
# do we need decryption? # do we need decryption?
if frame.local_session_id == 0 && frame.sec_sesstype == 0 if frame.sec_p
# Control message
tasmota.log("MTR: CONTROL MESSAGE=" + matter.inspect(frame))
var session = self.device.sessions.find_session_source_id_unsecure(frame.source_node_id, 90) # 90 seconds max
tasmota.log("MTR: find session by source_node_id = " + str(frame.source_node_id) + " session_id = " + str(session.local_session_id), 2)
return self.control_message.process_incoming_control_message(frame)
elif frame.local_session_id == 0 && frame.sec_sesstype == 0
############################################################# #############################################################
### unencrypted session, handled by commissioning ### unencrypted session, handled by commissioning
var session = self.device.sessions.find_session_source_id_unsecure(frame.source_node_id, 90) # 90 seconds max var session = self.device.sessions.find_session_source_id_unsecure(frame.source_node_id, 90) # 90 seconds max
@ -67,12 +106,7 @@ class Matter_MessageHandler
# check if it's a duplicate # check if it's a duplicate
if !session._counter_insecure_rcv.validate(frame.message_counter, false) if !session._counter_insecure_rcv.validate(frame.message_counter, false)
tasmota.log(string.format("MTR: . Duplicate unencrypted message = %i ref = %i", frame.message_counter, session._counter_insecure_rcv.val()), 3) tasmota.log(string.format("MTR: . Duplicate unencrypted message = %i ref = %i", frame.message_counter, session._counter_insecure_rcv.val()), 3)
if frame.x_flag_r # nothing to respond, check if we need a standalone ack self.send_simple_ack(frame, false #-not reliable-#)
var resp = frame.build_standalone_ack(false)
resp.encode_frame()
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i {reliable}", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter), 4)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, nil, resp.session.local_session_id)
end
return false return false
end end
@ -87,12 +121,7 @@ class Matter_MessageHandler
end end
ret = self.commissioning.process_incoming(frame) ret = self.commissioning.process_incoming(frame)
# if ret is false, the implicit Ack was not sent # if ret is false, the implicit Ack was not sent
if !ret && frame.x_flag_r # nothing to respond, check if we need a standalone ack if !ret self.send_simple_ack(frame, false #-not reliable-#) end
var resp = frame.build_standalone_ack(false #-not reliable-#)
resp.encode_frame()
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter), 3)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, nil, resp.session.local_session_id)
end
return true return true
else else
############################################################# #############################################################
@ -113,13 +142,7 @@ class Matter_MessageHandler
# check if it's a duplicate # check if it's a duplicate
if !session.counter_rcv_validate(frame.message_counter, true) if !session.counter_rcv_validate(frame.message_counter, true)
tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3) tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3)
if frame.x_flag_r # nothing to respond, check if we need a standalone ack self.send_encrypted_ack(frame, false #-not reliable-#)
var resp = frame.build_standalone_ack(false)
resp.encode_frame()
resp.encrypt()
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i {reliable}", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter), 4)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, nil, resp.session.local_session_id)
end
return false return false
end end
@ -158,12 +181,8 @@ class Matter_MessageHandler
if ret if ret
self.im.send_enqueued(self) self.im.send_enqueued(self)
elif frame.x_flag_r # nothing to respond, check if we need a standalone ack else
var resp = frame.build_standalone_ack(true) self.send_encrypted_ack(frame, true #-reliable-#)
resp.encode_frame()
resp.encrypt()
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i {reliable}", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter), 3)
self.send_response(resp.raw, resp.remote_ip, resp.remote_port, resp.message_counter, resp.session.local_session_id)
end end
ret = true ret = true

View File

@ -178,7 +178,9 @@ class Matter_Plugin_Root : Matter_Plugin
elif attribute == 0x0004 # ---------- TrustedRootCertificates / list[octstr] ---------- elif attribute == 0x0004 # ---------- TrustedRootCertificates / list[octstr] ----------
# TODO # TODO
elif attribute == 0x0005 # ---------- Current­ FabricIndex / u1 ---------- elif attribute == 0x0005 # ---------- Current­ FabricIndex / u1 ----------
return TLV.create_TLV(TLV.U1, session._fabric.get_fabric_index()) # number of active sessions var fab_index = session._fabric.get_fabric_index()
if fab_index == nil fab_index = 0 end # if PASE session, then the fabric index should be zero
return TLV.create_TLV(TLV.U1, fab_index) # number of active sessions
end end
# ==================================================================================================== # ====================================================================================================

View File

@ -38,10 +38,10 @@ class Matter_Expirable end
################################################################################# #################################################################################
class Matter_Fabric : Matter_Expirable class Matter_Fabric : Matter_Expirable
static var _MAX_CASE = 5 # maximum number of concurrent CASE sessions per fabric static var _MAX_CASE = 5 # maximum number of concurrent CASE sessions per fabric
static var _GROUP_SND_INCR = 32 # counter increased when persisting
# Group Key Derivation # Group Key Derivation
static var _GROUP_KEY = "GroupKey v1.0" # starting with double `_` means it's not writable static var _GROUP_KEY = "GroupKey v1.0" # starting with double `_` means it's not writable
var _store # reference back to session store var _store # reference back to session store
# timestamp # timestamp
var created var created
@ -62,6 +62,11 @@ class Matter_Fabric : Matter_Expirable
var fabric_compressed # comrpessed fabric_id identifier, hashed with root_ca public key var fabric_compressed # comrpessed fabric_id identifier, hashed with root_ca public key
var device_id # our own device id bytes(8) little endian var device_id # our own device id bytes(8) little endian
var fabric_label # set by UpdateFabricLabel var fabric_label # set by UpdateFabricLabel
# global group counters (send)
var counter_group_data_snd # counter for group data
var counter_group_ctrl_snd # counter for group command
var _counter_group_data_snd_impl# implementation of counter_group_data_snd by matter.Counter()
var _counter_group_ctrl_snd_impl# implementation of counter_group_ctrl_snd by matter.Counter()
# Admin info extracted from NOC/ICAC # Admin info extracted from NOC/ICAC
var admin_subject var admin_subject
var admin_vendor var admin_vendor
@ -73,6 +78,11 @@ class Matter_Fabric : Matter_Expirable
self._sessions = matter.Expirable_list() self._sessions = matter.Expirable_list()
self.fabric_label = "" self.fabric_label = ""
self.created = tasmota.rtc()['utc'] self.created = tasmota.rtc()['utc']
# init group counters
self._counter_group_data_snd_impl = matter.Counter()
self._counter_group_ctrl_snd_impl = matter.Counter()
self.counter_group_data_snd = self._counter_group_data_snd_impl.next() + self._GROUP_SND_INCR
self.counter_group_ctrl_snd = self._counter_group_data_snd_impl.next() + self._GROUP_SND_INCR
end end
def get_noc() return self.noc end def get_noc() return self.noc end
@ -89,6 +99,53 @@ class Matter_Fabric : Matter_Expirable
def set_fabric_index(v) self.fabric_index = v end def set_fabric_index(v) self.fabric_index = v end
#############################################################
# When hydrating from persistance, update counters
def hydrate_post()
# reset counter_snd to highest known.
# We advance it only in case it is actually used
# This avoids updaing counters on dead sessions
self._counter_group_data_snd_impl.reset(self.counter_group_data_snd)
self._counter_group_ctrl_snd_impl.reset(self.counter_group_ctrl_snd)
self.counter_group_data_snd = self._counter_group_data_snd_impl.val()
self.counter_group_ctrl_snd = self._counter_group_ctrl_snd_impl.val()
end
#############################################################
# Management of security counters
#############################################################
# Provide the next counter value, and update the last know persisted if needed
#
def counter_group_data_snd_next()
import string
var next = self._counter_group_data_snd_impl.next()
tasmota.log(string.format("MTR: . Counter_group_data_snd=%i", next), 3)
if matter.Counter.is_greater(next, self.counter_group_data_snd)
self.counter_group_data_snd = next + self._GROUP_SND_INCR
if self.does_persist()
# the persisted counter is behind the actual counter
self.save()
end
end
return next
end
#############################################################
# Provide the next counter value, and update the last know persisted if needed
#
def counter_group_ctrl_snd_next()
import string
var next = self._counter_group_ctrl_snd_impl.next()
tasmota.log(string.format("MTR: . Counter_group_ctrl_snd=%i", next), 3)
if matter.Counter.is_greater(next, self.counter_group_ctrl_snd)
self.counter_group_ctrl_snd = next + self._GROUP_SND_INCR
if self.does_persist()
# the persisted counter is behind the actual counter
self.save()
end
end
return next
end
############################################################# #############################################################
# Called before removal # Called before removal
def log_new_fabric() def log_new_fabric()
@ -304,7 +361,7 @@ class Matter_Session : Matter_Expirable
self._counter_rcv_impl = matter.Counter() self._counter_rcv_impl = matter.Counter()
self.counter_rcv = 0 # avoid nil values self.counter_rcv = 0 # avoid nil values
self.counter_snd = self._counter_snd_impl.next() + self._COUNTER_SND_INCR self.counter_snd = self._counter_snd_impl.next() + self._COUNTER_SND_INCR
# print(">>>> INIT", "counter_rcv=", self.counter_rcv, "counter_snd=", self.counter_snd) #
self._counter_insecure_rcv = matter.Counter() self._counter_insecure_rcv = matter.Counter()
self._counter_insecure_snd = matter.Counter() self._counter_insecure_snd = matter.Counter()
self._breadcrumb = 0 self._breadcrumb = 0

View File

@ -0,0 +1,246 @@
/* Solidification of Matter_Control_Message.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
extern const bclass be_class_Matter_Control_Message;
/********************************************************************
** Solidified function: parse_MsgCounterSyncRsp
********************************************************************/
be_local_closure(Matter_Control_Message_parse_MsgCounterSyncRsp, /* name */
be_nested_proto(
11, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[11]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(session),
/* K2 */ be_nested_str_weak(tasmota),
/* K3 */ be_nested_str_weak(log),
/* K4 */ be_nested_str_weak(format),
/* K5 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncRsp_X20_X2A_X20Not_X20implemented_X20_X25s),
/* K6 */ be_nested_str_weak(raw),
/* K7 */ be_nested_str_weak(app_payload_idx),
/* K8 */ be_const_int(2147483647),
/* K9 */ be_nested_str_weak(tohex),
/* K10 */ be_const_int(2),
}),
be_str_weak(parse_MsgCounterSyncRsp),
&be_const_str_solidified,
( &(const binstruction[17]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x880C0301, // 0001 GETMBR R3 R1 K1
0xB8120400, // 0002 GETNGBL R4 K2
0x8C100903, // 0003 GETMET R4 R4 K3
0x8C180504, // 0004 GETMET R6 R2 K4
0x58200005, // 0005 LDCONST R8 K5
0x88240307, // 0006 GETMBR R9 R1 K7
0x40241308, // 0007 CONNECT R9 R9 K8
0x88280306, // 0008 GETMBR R10 R1 K6
0x94241409, // 0009 GETIDX R9 R10 R9
0x8C241309, // 000A GETMET R9 R9 K9
0x7C240200, // 000B CALL R9 1
0x7C180600, // 000C CALL R6 3
0x581C000A, // 000D LDCONST R7 K10
0x7C100600, // 000E CALL R4 3
0x50100000, // 000F LDBOOL R4 0 0
0x80040800, // 0010 RET 1 R4
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: parse_MsgCounterSyncReq
********************************************************************/
be_local_closure(Matter_Control_Message_parse_MsgCounterSyncReq, /* name */
be_nested_proto(
11, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[11]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(session),
/* K2 */ be_nested_str_weak(tasmota),
/* K3 */ be_nested_str_weak(log),
/* K4 */ be_nested_str_weak(format),
/* K5 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncReq_X20_X2A_X20Not_X20implemented_X20_X25s),
/* K6 */ be_nested_str_weak(raw),
/* K7 */ be_nested_str_weak(app_payload_idx),
/* K8 */ be_const_int(2147483647),
/* K9 */ be_nested_str_weak(tohex),
/* K10 */ be_const_int(2),
}),
be_str_weak(parse_MsgCounterSyncReq),
&be_const_str_solidified,
( &(const binstruction[17]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x880C0301, // 0001 GETMBR R3 R1 K1
0xB8120400, // 0002 GETNGBL R4 K2
0x8C100903, // 0003 GETMET R4 R4 K3
0x8C180504, // 0004 GETMET R6 R2 K4
0x58200005, // 0005 LDCONST R8 K5
0x88240307, // 0006 GETMBR R9 R1 K7
0x40241308, // 0007 CONNECT R9 R9 K8
0x88280306, // 0008 GETMBR R10 R1 K6
0x94241409, // 0009 GETIDX R9 R10 R9
0x8C241309, // 000A GETMET R9 R9 K9
0x7C240200, // 000B CALL R9 1
0x7C180600, // 000C CALL R6 3
0x581C000A, // 000D LDCONST R7 K10
0x7C100600, // 000E CALL R4 3
0x50100000, // 000F LDBOOL R4 0 0
0x80040800, // 0010 RET 1 R4
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(Matter_Control_Message_init, /* name */
be_nested_proto(
4, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str_weak(crypto),
/* K1 */ be_nested_str_weak(responder),
/* K2 */ be_nested_str_weak(device),
}),
be_str_weak(init),
&be_const_str_solidified,
( &(const binstruction[ 5]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x90020201, // 0001 SETMBR R0 K1 R1
0x880C0302, // 0002 GETMBR R3 R1 K2
0x90020403, // 0003 SETMBR R0 K2 R3
0x80000000, // 0004 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: process_incoming_control_message
********************************************************************/
be_local_closure(Matter_Control_Message_process_incoming_control_message, /* name */
be_nested_proto(
9, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[14]) { /* constants */
/* K0 */ be_nested_str_weak(tasmota),
/* K1 */ be_nested_str_weak(log),
/* K2 */ be_nested_str_weak(MTR_X3A_X20received_X20control_X20message_X20),
/* K3 */ be_nested_str_weak(matter),
/* K4 */ be_nested_str_weak(inspect),
/* K5 */ be_const_int(2),
/* K6 */ be_nested_str_weak(opcode),
/* K7 */ be_const_int(0),
/* K8 */ be_nested_str_weak(parse_MsgCounterSyncReq),
/* K9 */ be_const_int(1),
/* K10 */ be_nested_str_weak(parse_MsgCounterSyncRsp),
/* K11 */ be_nested_str_weak(string),
/* K12 */ be_nested_str_weak(format),
/* K13 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28control_X20message_X29_X20_X2502X),
}),
be_str_weak(process_incoming_control_message),
&be_const_str_solidified,
( &(const binstruction[38]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x8C080501, // 0001 GETMET R2 R2 K1
0xB8120600, // 0002 GETNGBL R4 K3
0x8C100904, // 0003 GETMET R4 R4 K4
0x5C180200, // 0004 MOVE R6 R1
0x7C100400, // 0005 CALL R4 2
0x00120404, // 0006 ADD R4 K2 R4
0x58140005, // 0007 LDCONST R5 K5
0x7C080600, // 0008 CALL R2 3
0x88080306, // 0009 GETMBR R2 R1 K6
0x1C080507, // 000A EQ R2 R2 K7
0x780A0004, // 000B JMPF R2 #0011
0x8C080108, // 000C GETMET R2 R0 K8
0x5C100200, // 000D MOVE R4 R1
0x7C080400, // 000E CALL R2 2
0x80040400, // 000F RET 1 R2
0x70020012, // 0010 JMP #0024
0x88080306, // 0011 GETMBR R2 R1 K6
0x1C080509, // 0012 EQ R2 R2 K9
0x780A0004, // 0013 JMPF R2 #0019
0x8C08010A, // 0014 GETMET R2 R0 K10
0x5C100200, // 0015 MOVE R4 R1
0x7C080400, // 0016 CALL R2 2
0x80040400, // 0017 RET 1 R2
0x7002000A, // 0018 JMP #0024
0xA40A1600, // 0019 IMPORT R2 K11
0xB80E0000, // 001A GETNGBL R3 K0
0x8C0C0701, // 001B GETMET R3 R3 K1
0x8C14050C, // 001C GETMET R5 R2 K12
0x581C000D, // 001D LDCONST R7 K13
0x88200306, // 001E GETMBR R8 R1 K6
0x7C140600, // 001F CALL R5 3
0x58180005, // 0020 LDCONST R6 K5
0x7C0C0600, // 0021 CALL R3 3
0x500C0000, // 0022 LDBOOL R3 0 0
0x80040600, // 0023 RET 1 R3
0x50080000, // 0024 LDBOOL R2 0 0
0x80040400, // 0025 RET 1 R2
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Matter_Control_Message
********************************************************************/
be_local_class(Matter_Control_Message,
2,
NULL,
be_nested_map(6,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(parse_MsgCounterSyncRsp, -1), be_const_closure(Matter_Control_Message_parse_MsgCounterSyncRsp_closure) },
{ be_const_key_weak(responder, 2), be_const_var(0) },
{ be_const_key_weak(parse_MsgCounterSyncReq, -1), be_const_closure(Matter_Control_Message_parse_MsgCounterSyncReq_closure) },
{ be_const_key_weak(init, 4), be_const_closure(Matter_Control_Message_init_closure) },
{ be_const_key_weak(device, -1), be_const_var(1) },
{ be_const_key_weak(process_incoming_control_message, -1), be_const_closure(Matter_Control_Message_process_incoming_control_message_closure) },
})),
be_str_weak(Matter_Control_Message)
);
/*******************************************************************/
void be_load_Matter_Control_Message_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Matter_Control_Message);
be_setglobal(vm, "Matter_Control_Message");
be_pop(vm, 1);
}
/********************************************************************/
/* End of solidification */

View File

@ -2058,7 +2058,7 @@ be_local_closure(Matter_IM_send_subscribe_update, /* name */
********************************************************************/ ********************************************************************/
be_local_closure(Matter_IM_send_ack_now, /* name */ be_local_closure(Matter_IM_send_ack_now, /* name */
be_nested_proto( be_nested_proto(
14, /* nstack */ 6, /* nstack */
2, /* argc */ 2, /* argc */
2, /* varg */ 2, /* varg */
0, /* has upvals */ 0, /* has upvals */
@ -2066,67 +2066,21 @@ be_local_closure(Matter_IM_send_ack_now, /* name */
0, /* has sup protos */ 0, /* has sup protos */
NULL, /* no sub protos */ NULL, /* no sub protos */
1, /* has constants */ 1, /* has constants */
( &(const bvalue[19]) { /* constants */ ( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str_weak(x_flag_r), /* K0 */ be_nested_str_weak(session),
/* K1 */ be_nested_str_weak(build_standalone_ack), /* K1 */ be_nested_str_weak(_message_handler),
/* K2 */ be_nested_str_weak(encode_frame), /* K2 */ be_nested_str_weak(send_encrypted_ack),
/* K3 */ be_nested_str_weak(encrypt),
/* K4 */ be_nested_str_weak(string),
/* K5 */ be_nested_str_weak(tasmota),
/* K6 */ be_nested_str_weak(log),
/* K7 */ be_nested_str_weak(format),
/* K8 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_now_X20_X20_X20_X28_X256i_X29_X20rack_X3D_X25i_X20id_X3D_X25i_X20_X5B_X25s_X5D_X3A_X25i),
/* K9 */ be_nested_str_weak(session),
/* K10 */ be_nested_str_weak(local_session_id),
/* K11 */ be_nested_str_weak(ack_message_counter),
/* K12 */ be_nested_str_weak(message_counter),
/* K13 */ be_nested_str_weak(remote_ip),
/* K14 */ be_nested_str_weak(remote_port),
/* K15 */ be_const_int(3),
/* K16 */ be_nested_str_weak(_message_handler),
/* K17 */ be_nested_str_weak(send_response),
/* K18 */ be_nested_str_weak(raw),
}), }),
be_str_weak(send_ack_now), be_str_weak(send_ack_now),
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[37]) { /* code */ ( &(const binstruction[ 7]) { /* code */
0x88080300, // 0000 GETMBR R2 R1 K0 0x88080300, // 0000 GETMBR R2 R1 K0
0x780A001F, // 0001 JMPF R2 #0022 0x88080501, // 0001 GETMBR R2 R2 K1
0x8C080301, // 0002 GETMET R2 R1 K1 0x8C080502, // 0002 GETMET R2 R2 K2
0x50100000, // 0003 LDBOOL R4 0 0 0x5C100200, // 0003 MOVE R4 R1
0x7C080400, // 0004 CALL R2 2 0x50140000, // 0004 LDBOOL R5 0 0
0x8C0C0502, // 0005 GETMET R3 R2 K2 0x7C080600, // 0005 CALL R2 3
0x7C0C0200, // 0006 CALL R3 1 0x80000000, // 0006 RET 0
0x8C0C0503, // 0007 GETMET R3 R2 K3
0x7C0C0200, // 0008 CALL R3 1
0xA40E0800, // 0009 IMPORT R3 K4
0xB8120A00, // 000A GETNGBL R4 K5
0x8C100906, // 000B GETMET R4 R4 K6
0x8C180707, // 000C GETMET R6 R3 K7
0x58200008, // 000D LDCONST R8 K8
0x88240509, // 000E GETMBR R9 R2 K9
0x8824130A, // 000F GETMBR R9 R9 K10
0x8828050B, // 0010 GETMBR R10 R2 K11
0x882C050C, // 0011 GETMBR R11 R2 K12
0x8830050D, // 0012 GETMBR R12 R2 K13
0x8834050E, // 0013 GETMBR R13 R2 K14
0x7C180E00, // 0014 CALL R6 7
0x581C000F, // 0015 LDCONST R7 K15
0x7C100600, // 0016 CALL R4 3
0x88100309, // 0017 GETMBR R4 R1 K9
0x88100910, // 0018 GETMBR R4 R4 K16
0x8C100911, // 0019 GETMET R4 R4 K17
0x88180512, // 001A GETMBR R6 R2 K18
0x881C050D, // 001B GETMBR R7 R2 K13
0x8820050E, // 001C GETMBR R8 R2 K14
0x4C240000, // 001D LDNIL R9
0x88280509, // 001E GETMBR R10 R2 K9
0x8828150A, // 001F GETMBR R10 R10 K10
0x7C100C00, // 0020 CALL R4 6
0x70020001, // 0021 JMP #0024
0x50080200, // 0022 LDBOOL R2 1 0
0x80040400, // 0023 RET 1 R2
0x80000000, // 0024 RET 0
}) })
) )
); );

View File

@ -976,7 +976,7 @@ be_local_class(Matter_IM_ReportData,
( (struct bmapnode*) &(const bmapnode[]) { ( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(send_im, 1), be_const_closure(Matter_IM_ReportData_send_im_closure) }, { be_const_key_weak(send_im, 1), be_const_closure(Matter_IM_ReportData_send_im_closure) },
{ be_const_key_weak(init, -1), be_const_closure(Matter_IM_ReportData_init_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_IM_ReportData_init_closure) },
{ be_const_key_weak(MAX_MESSAGE, -1), be_const_int(1000) }, { be_const_key_weak(MAX_MESSAGE, -1), be_const_int(1200) },
})), })),
be_str_weak(Matter_IM_ReportData) be_str_weak(Matter_IM_ReportData)
); );

View File

@ -110,7 +110,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
}), }),
be_str_weak(read_attribute), be_str_weak(read_attribute),
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[883]) { /* code */ ( &(const binstruction[888]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0 0xA40E0000, // 0000 IMPORT R3 K0
0xB8120200, // 0001 GETNGBL R4 K1 0xB8120200, // 0001 GETNGBL R4 K1
0x88100902, // 0002 GETMBR R4 R4 K2 0x88100902, // 0002 GETMBR R4 R4 K2
@ -167,11 +167,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0x50280000, // 0035 LDBOOL R10 0 0 0x50280000, // 0035 LDBOOL R10 0 0
0x7C1C0600, // 0036 CALL R7 3 0x7C1C0600, // 0036 CALL R7 3
0x80040E00, // 0037 RET 1 R7 0x80040E00, // 0037 RET 1 R7
0x70020338, // 0038 JMP #0372 0x7002033D, // 0038 JMP #0377
0x541E0031, // 0039 LDINT R7 50 0x541E0031, // 0039 LDINT R7 50
0x1C1C0A07, // 003A EQ R7 R5 R7 0x1C1C0A07, // 003A EQ R7 R5 R7
0x781E0000, // 003B JMPF R7 #003D 0x781E0000, // 003B JMPF R7 #003D
0x70020334, // 003C JMP #0372 0x70020339, // 003C JMP #0377
0x541E0032, // 003D LDINT R7 51 0x541E0032, // 003D LDINT R7 51
0x1C1C0A07, // 003E EQ R7 R5 R7 0x1C1C0A07, // 003E EQ R7 R5 R7
0x781E00DC, // 003F JMPF R7 #011D 0x781E00DC, // 003F JMPF R7 #011D
@ -395,11 +395,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0x50280000, // 0119 LDBOOL R10 0 0 0x50280000, // 0119 LDBOOL R10 0 0
0x7C1C0600, // 011A CALL R7 3 0x7C1C0600, // 011A CALL R7 3
0x80040E00, // 011B RET 1 R7 0x80040E00, // 011B RET 1 R7
0x70020254, // 011C JMP #0372 0x70020259, // 011C JMP #0377
0x541E0033, // 011D LDINT R7 52 0x541E0033, // 011D LDINT R7 52
0x1C1C0A07, // 011E EQ R7 R5 R7 0x1C1C0A07, // 011E EQ R7 R5 R7
0x781E0000, // 011F JMPF R7 #0121 0x781E0000, // 011F JMPF R7 #0121
0x70020250, // 0120 JMP #0372 0x70020255, // 0120 JMP #0377
0x541E0037, // 0121 LDINT R7 56 0x541E0037, // 0121 LDINT R7 56
0x1C1C0A07, // 0122 EQ R7 R5 R7 0x1C1C0A07, // 0122 EQ R7 R5 R7
0x781E002C, // 0123 JMPF R7 #0151 0x781E002C, // 0123 JMPF R7 #0151
@ -447,10 +447,10 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0x5C2C0E00, // 014D MOVE R11 R7 0x5C2C0E00, // 014D MOVE R11 R7
0x7C200600, // 014E CALL R8 3 0x7C200600, // 014E CALL R8 3
0x80041000, // 014F RET 1 R8 0x80041000, // 014F RET 1 R8
0x70020220, // 0150 JMP #0372 0x70020225, // 0150 JMP #0377
0x541E003D, // 0151 LDINT R7 62 0x541E003D, // 0151 LDINT R7 62
0x1C1C0A07, // 0152 EQ R7 R5 R7 0x1C1C0A07, // 0152 EQ R7 R5 R7
0x781E008B, // 0153 JMPF R7 #01E0 0x781E0090, // 0153 JMPF R7 #01E5
0x1C1C0D05, // 0154 EQ R7 R6 K5 0x1C1C0D05, // 0154 EQ R7 R6 K5
0x781E0025, // 0155 JMPF R7 #017C 0x781E0025, // 0155 JMPF R7 #017C
0x8C1C0911, // 0156 GETMET R7 R4 K17 0x8C1C0911, // 0156 GETMET R7 R4 K17
@ -490,7 +490,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0xAC200200, // 0178 CATCH R8 1 0 0xAC200200, // 0178 CATCH R8 1 0
0xB0080000, // 0179 RAISE 2 R0 R0 0xB0080000, // 0179 RAISE 2 R0 R0
0x80040E00, // 017A RET 1 R7 0x80040E00, // 017A RET 1 R7
0x70020062, // 017B JMP #01DF 0x70020067, // 017B JMP #01E4
0x1C1C0D09, // 017C EQ R7 R6 K9 0x1C1C0D09, // 017C EQ R7 R6 K9
0x781E003C, // 017D JMPF R7 #01BB 0x781E003C, // 017D JMPF R7 #01BB
0x8C1C0911, // 017E GETMET R7 R4 K17 0x8C1C0911, // 017E GETMET R7 R4 K17
@ -553,7 +553,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0xAC200200, // 01B7 CATCH R8 1 0 0xAC200200, // 01B7 CATCH R8 1 0
0xB0080000, // 01B8 RAISE 2 R0 R0 0xB0080000, // 01B8 RAISE 2 R0 R0
0x80040E00, // 01B9 RET 1 R7 0x80040E00, // 01B9 RET 1 R7
0x70020023, // 01BA JMP #01DF 0x70020028, // 01BA JMP #01E4
0x1C1C0D0D, // 01BB EQ R7 R6 K13 0x1C1C0D0D, // 01BB EQ R7 R6 K13
0x781E0007, // 01BC JMPF R7 #01C5 0x781E0007, // 01BC JMPF R7 #01C5
0x8C1C0906, // 01BD GETMET R7 R4 K6 0x8C1C0906, // 01BD GETMET R7 R4 K6
@ -563,7 +563,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0x88281543, // 01C1 GETMBR R10 R10 K67 0x88281543, // 01C1 GETMBR R10 R10 K67
0x7C1C0600, // 01C2 CALL R7 3 0x7C1C0600, // 01C2 CALL R7 3
0x80040E00, // 01C3 RET 1 R7 0x80040E00, // 01C3 RET 1 R7
0x70020019, // 01C4 JMP #01DF 0x7002001E, // 01C4 JMP #01E4
0x1C1C0D0F, // 01C5 EQ R7 R6 K15 0x1C1C0D0F, // 01C5 EQ R7 R6 K15
0x781E0009, // 01C6 JMPF R7 #01D1 0x781E0009, // 01C6 JMPF R7 #01D1
0x881C0133, // 01C7 GETMBR R7 R0 K51 0x881C0133, // 01C7 GETMBR R7 R0 K51
@ -575,425 +575,430 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */
0x5C2C0E00, // 01CD MOVE R11 R7 0x5C2C0E00, // 01CD MOVE R11 R7
0x7C200600, // 01CE CALL R8 3 0x7C200600, // 01CE CALL R8 3
0x80041000, // 01CF RET 1 R8 0x80041000, // 01CF RET 1 R8
0x7002000D, // 01D0 JMP #01DF 0x70020012, // 01D0 JMP #01E4
0x541E0003, // 01D1 LDINT R7 4 0x541E0003, // 01D1 LDINT R7 4
0x1C1C0C07, // 01D2 EQ R7 R6 R7 0x1C1C0C07, // 01D2 EQ R7 R6 R7
0x781E0000, // 01D3 JMPF R7 #01D5 0x781E0000, // 01D3 JMPF R7 #01D5
0x70020009, // 01D4 JMP #01DF 0x7002000E, // 01D4 JMP #01E4
0x541E0004, // 01D5 LDINT R7 5 0x541E0004, // 01D5 LDINT R7 5
0x1C1C0C07, // 01D6 EQ R7 R6 R7 0x1C1C0C07, // 01D6 EQ R7 R6 R7
0x781E0006, // 01D7 JMPF R7 #01DF 0x781E000B, // 01D7 JMPF R7 #01E4
0x8C1C0906, // 01D8 GETMET R7 R4 K6 0x881C0345, // 01D8 GETMBR R7 R1 K69
0x8824090E, // 01D9 GETMBR R9 R4 K14 0x8C1C0F39, // 01D9 GETMET R7 R7 K57
0x88280345, // 01DA GETMBR R10 R1 K69 0x7C1C0200, // 01DA CALL R7 1
0x8C281539, // 01DB GETMET R10 R10 K57 0x4C200000, // 01DB LDNIL R8
0x7C280200, // 01DC CALL R10 1 0x1C200E08, // 01DC EQ R8 R7 R8
0x7C1C0600, // 01DD CALL R7 3 0x78220000, // 01DD JMPF R8 #01DF
0x80040E00, // 01DE RET 1 R7 0x581C0005, // 01DE LDCONST R7 K5
0x70020191, // 01DF JMP #0372 0x8C200906, // 01DF GETMET R8 R4 K6
0x541E003B, // 01E0 LDINT R7 60 0x8828090E, // 01E0 GETMBR R10 R4 K14
0x1C1C0A07, // 01E1 EQ R7 R5 R7 0x5C2C0E00, // 01E1 MOVE R11 R7
0x781E003C, // 01E2 JMPF R7 #0220 0x7C200600, // 01E2 CALL R8 3
0x1C1C0D05, // 01E3 EQ R7 R6 K5 0x80041000, // 01E3 RET 1 R8
0x781E0012, // 01E4 JMPF R7 #01F8 0x70020191, // 01E4 JMP #0377
0x881C0133, // 01E5 GETMBR R7 R0 K51 0x541E003B, // 01E5 LDINT R7 60
0x8C1C0F46, // 01E6 GETMET R7 R7 K70 0x1C1C0A07, // 01E6 EQ R7 R5 R7
0x7C1C0200, // 01E7 CALL R7 1 0x781E003C, // 01E7 JMPF R7 #0225
0x88200133, // 01E8 GETMBR R8 R0 K51 0x1C1C0D05, // 01E8 EQ R7 R6 K5
0x8C201147, // 01E9 GETMET R8 R8 K71 0x781E0012, // 01E9 JMPF R7 #01FD
0x7C200200, // 01EA CALL R8 1 0x881C0133, // 01EA GETMBR R7 R0 K51
0x781E0004, // 01EB JMPF R7 #01F1 0x8C1C0F46, // 01EB GETMET R7 R7 K70
0x78220001, // 01EC JMPF R8 #01EF 0x7C1C0200, // 01EC CALL R7 1
0x5824000D, // 01ED LDCONST R9 K13 0x88200133, // 01ED GETMBR R8 R0 K51
0x70020000, // 01EE JMP #01F0 0x8C201147, // 01EE GETMET R8 R8 K71
0x58240009, // 01EF LDCONST R9 K9 0x7C200200, // 01EF CALL R8 1
0x70020000, // 01F0 JMP #01F2 0x781E0004, // 01F0 JMPF R7 #01F6
0x58240005, // 01F1 LDCONST R9 K5 0x78220001, // 01F1 JMPF R8 #01F4
0x8C280906, // 01F2 GETMET R10 R4 K6 0x5824000D, // 01F2 LDCONST R9 K13
0x8830090E, // 01F3 GETMBR R12 R4 K14 0x70020000, // 01F3 JMP #01F5
0x5C341200, // 01F4 MOVE R13 R9 0x58240009, // 01F4 LDCONST R9 K9
0x7C280600, // 01F5 CALL R10 3 0x70020000, // 01F5 JMP #01F7
0x80041400, // 01F6 RET 1 R10 0x58240005, // 01F6 LDCONST R9 K5
0x70020026, // 01F7 JMP #021F 0x8C280906, // 01F7 GETMET R10 R4 K6
0x1C1C0D09, // 01F8 EQ R7 R6 K9 0x8830090E, // 01F8 GETMBR R12 R4 K14
0x781E0011, // 01F9 JMPF R7 #020C 0x5C341200, // 01F9 MOVE R13 R9
0x881C0133, // 01FA GETMBR R7 R0 K51 0x7C280600, // 01FA CALL R10 3
0x881C0F48, // 01FB GETMBR R7 R7 K72 0x80041400, // 01FB RET 1 R10
0x4C200000, // 01FC LDNIL R8 0x70020026, // 01FC JMP #0224
0x20200E08, // 01FD NE R8 R7 R8 0x1C1C0D09, // 01FD EQ R7 R6 K9
0x78220006, // 01FE JMPF R8 #0206 0x781E0011, // 01FE JMPF R7 #0211
0x8C200906, // 01FF GETMET R8 R4 K6 0x881C0133, // 01FF GETMBR R7 R0 K51
0x8828090C, // 0200 GETMBR R10 R4 K12 0x881C0F48, // 0200 GETMBR R7 R7 K72
0x8C2C0F39, // 0201 GETMET R11 R7 K57 0x4C200000, // 0201 LDNIL R8
0x7C2C0200, // 0202 CALL R11 1 0x20200E08, // 0202 NE R8 R7 R8
0x7C200600, // 0203 CALL R8 3 0x78220006, // 0203 JMPF R8 #020B
0x80041000, // 0204 RET 1 R8 0x8C200906, // 0204 GETMET R8 R4 K6
0x70020004, // 0205 JMP #020B 0x8828090C, // 0205 GETMBR R10 R4 K12
0x8C200906, // 0206 GETMET R8 R4 K6 0x8C2C0F39, // 0206 GETMET R11 R7 K57
0x88280918, // 0207 GETMBR R10 R4 K24 0x7C2C0200, // 0207 CALL R11 1
0x4C2C0000, // 0208 LDNIL R11 0x7C200600, // 0208 CALL R8 3
0x7C200600, // 0209 CALL R8 3 0x80041000, // 0209 RET 1 R8
0x80041000, // 020A RET 1 R8 0x70020004, // 020A JMP #0210
0x70020012, // 020B JMP #021F 0x8C200906, // 020B GETMET R8 R4 K6
0x1C1C0D0D, // 020C EQ R7 R6 K13 0x88280918, // 020C GETMBR R10 R4 K24
0x781E0010, // 020D JMPF R7 #021F 0x4C2C0000, // 020D LDNIL R11
0x881C0133, // 020E GETMBR R7 R0 K51 0x7C200600, // 020E CALL R8 3
0x881C0F48, // 020F GETMBR R7 R7 K72 0x80041000, // 020F RET 1 R8
0x4C200000, // 0210 LDNIL R8 0x70020012, // 0210 JMP #0224
0x20200E08, // 0211 NE R8 R7 R8 0x1C1C0D0D, // 0211 EQ R7 R6 K13
0x78220006, // 0212 JMPF R8 #021A 0x781E0010, // 0212 JMPF R7 #0224
0x8C200906, // 0213 GETMET R8 R4 K6 0x881C0133, // 0213 GETMBR R7 R0 K51
0x8828090C, // 0214 GETMBR R10 R4 K12 0x881C0F48, // 0214 GETMBR R7 R7 K72
0x8C2C0F3E, // 0215 GETMET R11 R7 K62 0x4C200000, // 0215 LDNIL R8
0x7C2C0200, // 0216 CALL R11 1 0x20200E08, // 0216 NE R8 R7 R8
0x7C200600, // 0217 CALL R8 3 0x78220006, // 0217 JMPF R8 #021F
0x80041000, // 0218 RET 1 R8 0x8C200906, // 0218 GETMET R8 R4 K6
0x70020004, // 0219 JMP #021F 0x8828090C, // 0219 GETMBR R10 R4 K12
0x8C200906, // 021A GETMET R8 R4 K6 0x8C2C0F3E, // 021A GETMET R11 R7 K62
0x88280918, // 021B GETMBR R10 R4 K24 0x7C2C0200, // 021B CALL R11 1
0x4C2C0000, // 021C LDNIL R11 0x7C200600, // 021C CALL R8 3
0x7C200600, // 021D CALL R8 3 0x80041000, // 021D RET 1 R8
0x80041000, // 021E RET 1 R8 0x70020004, // 021E JMP #0224
0x70020151, // 021F JMP #0372 0x8C200906, // 021F GETMET R8 R4 K6
0x541E0027, // 0220 LDINT R7 40 0x88280918, // 0220 GETMBR R10 R4 K24
0x1C1C0A07, // 0221 EQ R7 R5 R7 0x4C2C0000, // 0221 LDNIL R11
0x781E00AE, // 0222 JMPF R7 #02D2 0x7C200600, // 0222 CALL R8 3
0x1C1C0D05, // 0223 EQ R7 R6 K5 0x80041000, // 0223 RET 1 R8
0x781E0005, // 0224 JMPF R7 #022B 0x70020151, // 0224 JMP #0377
0x8C1C0906, // 0225 GETMET R7 R4 K6 0x541E0027, // 0225 LDINT R7 40
0x8824090C, // 0226 GETMBR R9 R4 K12 0x1C1C0A07, // 0226 EQ R7 R5 R7
0x58280009, // 0227 LDCONST R10 K9 0x781E00AE, // 0227 JMPF R7 #02D7
0x7C1C0600, // 0228 CALL R7 3 0x1C1C0D05, // 0228 EQ R7 R6 K5
0x80040E00, // 0229 RET 1 R7 0x781E0005, // 0229 JMPF R7 #0230
0x700200A5, // 022A JMP #02D1 0x8C1C0906, // 022A GETMET R7 R4 K6
0x1C1C0D09, // 022B EQ R7 R6 K9 0x8824090C, // 022B GETMBR R9 R4 K12
0x781E0005, // 022C JMPF R7 #0233 0x58280009, // 022C LDCONST R10 K9
0x8C1C0906, // 022D GETMET R7 R4 K6 0x7C1C0600, // 022D CALL R7 3
0x88240916, // 022E GETMBR R9 R4 K22 0x80040E00, // 022E RET 1 R7
0x58280049, // 022F LDCONST R10 K73 0x700200A5, // 022F JMP #02D6
0x7C1C0600, // 0230 CALL R7 3 0x1C1C0D09, // 0230 EQ R7 R6 K9
0x80040E00, // 0231 RET 1 R7 0x781E0005, // 0231 JMPF R7 #0238
0x7002009D, // 0232 JMP #02D1 0x8C1C0906, // 0232 GETMET R7 R4 K6
0x1C1C0D0D, // 0233 EQ R7 R6 K13 0x88240916, // 0233 GETMBR R9 R4 K22
0x781E0006, // 0234 JMPF R7 #023C 0x58280049, // 0234 LDCONST R10 K73
0x8C1C0906, // 0235 GETMET R7 R4 K6 0x7C1C0600, // 0235 CALL R7 3
0x8824090C, // 0236 GETMBR R9 R4 K12 0x80040E00, // 0236 RET 1 R7
0x88280133, // 0237 GETMBR R10 R0 K51 0x7002009D, // 0237 JMP #02D6
0x8828154A, // 0238 GETMBR R10 R10 K74 0x1C1C0D0D, // 0238 EQ R7 R6 K13
0x7C1C0600, // 0239 CALL R7 3 0x781E0006, // 0239 JMPF R7 #0241
0x80040E00, // 023A RET 1 R7 0x8C1C0906, // 023A GETMET R7 R4 K6
0x70020094, // 023B JMP #02D1 0x8824090C, // 023B GETMBR R9 R4 K12
0x1C1C0D0F, // 023C EQ R7 R6 K15 0x88280133, // 023C GETMBR R10 R0 K51
0x781E000A, // 023D JMPF R7 #0249 0x8828154A, // 023D GETMBR R10 R10 K74
0x8C1C0906, // 023E GETMET R7 R4 K6 0x7C1C0600, // 023E CALL R7 3
0x88240916, // 023F GETMBR R9 R4 K22 0x80040E00, // 023F RET 1 R7
0xB82A2400, // 0240 GETNGBL R10 K18 0x70020094, // 0240 JMP #02D6
0x8C281526, // 0241 GETMET R10 R10 K38 0x1C1C0D0F, // 0241 EQ R7 R6 K15
0x5830004B, // 0242 LDCONST R12 K75 0x781E000A, // 0242 JMPF R7 #024E
0x50340200, // 0243 LDBOOL R13 1 0 0x8C1C0906, // 0243 GETMET R7 R4 K6
0x7C280600, // 0244 CALL R10 3 0x88240916, // 0244 GETMBR R9 R4 K22
0x9428154B, // 0245 GETIDX R10 R10 K75 0xB82A2400, // 0245 GETNGBL R10 K18
0x7C1C0600, // 0246 CALL R7 3 0x8C281526, // 0246 GETMET R10 R10 K38
0x80040E00, // 0247 RET 1 R7 0x5830004B, // 0247 LDCONST R12 K75
0x70020087, // 0248 JMP #02D1 0x50340200, // 0248 LDBOOL R13 1 0
0x541E0003, // 0249 LDINT R7 4 0x7C280600, // 0249 CALL R10 3
0x1C1C0C07, // 024A EQ R7 R6 R7 0x9428154B, // 024A GETIDX R10 R10 K75
0x781E0005, // 024B JMPF R7 #0252 0x7C1C0600, // 024B CALL R7 3
0x8C1C0906, // 024C GETMET R7 R4 K6 0x80040E00, // 024C RET 1 R7
0x8824090C, // 024D GETMBR R9 R4 K12 0x70020087, // 024D JMP #02D6
0x542A7FFF, // 024E LDINT R10 32768 0x541E0003, // 024E LDINT R7 4
0x7C1C0600, // 024F CALL R7 3 0x1C1C0C07, // 024F EQ R7 R6 R7
0x80040E00, // 0250 RET 1 R7 0x781E0005, // 0250 JMPF R7 #0257
0x7002007E, // 0251 JMP #02D1 0x8C1C0906, // 0251 GETMET R7 R4 K6
0x541E0004, // 0252 LDINT R7 5 0x8824090C, // 0252 GETMBR R9 R4 K12
0x1C1C0C07, // 0253 EQ R7 R6 R7 0x542A7FFF, // 0253 LDINT R10 32768
0x781E000A, // 0254 JMPF R7 #0260 0x7C1C0600, // 0254 CALL R7 3
0x8C1C0906, // 0255 GETMET R7 R4 K6 0x80040E00, // 0255 RET 1 R7
0x88240916, // 0256 GETMBR R9 R4 K22 0x7002007E, // 0256 JMP #02D6
0xB82A2400, // 0257 GETNGBL R10 K18 0x541E0004, // 0257 LDINT R7 5
0x8C281526, // 0258 GETMET R10 R10 K38 0x1C1C0C07, // 0258 EQ R7 R6 R7
0x5830004C, // 0259 LDCONST R12 K76 0x781E000A, // 0259 JMPF R7 #0265
0x50340200, // 025A LDBOOL R13 1 0 0x8C1C0906, // 025A GETMET R7 R4 K6
0x7C280600, // 025B CALL R10 3 0x88240916, // 025B GETMBR R9 R4 K22
0x9428154D, // 025C GETIDX R10 R10 K77 0xB82A2400, // 025C GETNGBL R10 K18
0x7C1C0600, // 025D CALL R7 3 0x8C281526, // 025D GETMET R10 R10 K38
0x80040E00, // 025E RET 1 R7 0x5830004C, // 025E LDCONST R12 K76
0x70020070, // 025F JMP #02D1 0x50340200, // 025F LDBOOL R13 1 0
0x541E0005, // 0260 LDINT R7 6 0x7C280600, // 0260 CALL R10 3
0x1C1C0C07, // 0261 EQ R7 R6 R7 0x9428154D, // 0261 GETIDX R10 R10 K77
0x781E0005, // 0262 JMPF R7 #0269 0x7C1C0600, // 0262 CALL R7 3
0x8C1C0906, // 0263 GETMET R7 R4 K6 0x80040E00, // 0263 RET 1 R7
0x88240916, // 0264 GETMBR R9 R4 K22 0x70020070, // 0264 JMP #02D6
0x5828004E, // 0265 LDCONST R10 K78 0x541E0005, // 0265 LDINT R7 6
0x7C1C0600, // 0266 CALL R7 3 0x1C1C0C07, // 0266 EQ R7 R6 R7
0x80040E00, // 0267 RET 1 R7 0x781E0005, // 0267 JMPF R7 #026E
0x70020067, // 0268 JMP #02D1 0x8C1C0906, // 0268 GETMET R7 R4 K6
0x541E0006, // 0269 LDINT R7 7 0x88240916, // 0269 GETMBR R9 R4 K22
0x1C1C0C07, // 026A EQ R7 R6 R7 0x5828004E, // 026A LDCONST R10 K78
0x781E0005, // 026B JMPF R7 #0272 0x7C1C0600, // 026B CALL R7 3
0x8C1C0906, // 026C GETMET R7 R4 K6 0x80040E00, // 026C RET 1 R7
0x8824090C, // 026D GETMBR R9 R4 K12 0x70020067, // 026D JMP #02D6
0x58280005, // 026E LDCONST R10 K5 0x541E0006, // 026E LDINT R7 7
0x7C1C0600, // 026F CALL R7 3 0x1C1C0C07, // 026F EQ R7 R6 R7
0x80040E00, // 0270 RET 1 R7 0x781E0005, // 0270 JMPF R7 #0277
0x7002005E, // 0271 JMP #02D1 0x8C1C0906, // 0271 GETMET R7 R4 K6
0x541E0007, // 0272 LDINT R7 8 0x8824090C, // 0272 GETMBR R9 R4 K12
0x1C1C0C07, // 0273 EQ R7 R6 R7 0x58280005, // 0273 LDCONST R10 K5
0x781E000B, // 0274 JMPF R7 #0281 0x7C1C0600, // 0274 CALL R7 3
0x8C1C0906, // 0275 GETMET R7 R4 K6 0x80040E00, // 0275 RET 1 R7
0x88240916, // 0276 GETMBR R9 R4 K22 0x7002005E, // 0276 JMP #02D6
0xB82A2400, // 0277 GETNGBL R10 K18 0x541E0007, // 0277 LDINT R7 8
0x8C281526, // 0278 GETMET R10 R10 K38 0x1C1C0C07, // 0278 EQ R7 R6 R7
0x5830004F, // 0279 LDCONST R12 K79 0x781E000B, // 0279 JMPF R7 #0286
0x50340200, // 027A LDBOOL R13 1 0 0x8C1C0906, // 027A GETMET R7 R4 K6
0x7C280600, // 027B CALL R10 3 0x88240916, // 027B GETMBR R9 R4 K22
0x94281550, // 027C GETIDX R10 R10 K80 0xB82A2400, // 027C GETNGBL R10 K18
0x94281551, // 027D GETIDX R10 R10 K81 0x8C281526, // 027D GETMET R10 R10 K38
0x7C1C0600, // 027E CALL R7 3 0x5830004F, // 027E LDCONST R12 K79
0x80040E00, // 027F RET 1 R7 0x50340200, // 027F LDBOOL R13 1 0
0x7002004F, // 0280 JMP #02D1 0x7C280600, // 0280 CALL R10 3
0x541E0008, // 0281 LDINT R7 9 0x94281550, // 0281 GETIDX R10 R10 K80
0x1C1C0C07, // 0282 EQ R7 R6 R7 0x94281551, // 0282 GETIDX R10 R10 K81
0x781E0005, // 0283 JMPF R7 #028A 0x7C1C0600, // 0283 CALL R7 3
0x8C1C0906, // 0284 GETMET R7 R4 K6 0x80040E00, // 0284 RET 1 R7
0x8824090C, // 0285 GETMBR R9 R4 K12 0x7002004F, // 0285 JMP #02D6
0x58280009, // 0286 LDCONST R10 K9 0x541E0008, // 0286 LDINT R7 9
0x7C1C0600, // 0287 CALL R7 3 0x1C1C0C07, // 0287 EQ R7 R6 R7
0x80040E00, // 0288 RET 1 R7 0x781E0005, // 0288 JMPF R7 #028F
0x70020046, // 0289 JMP #02D1 0x8C1C0906, // 0289 GETMET R7 R4 K6
0x541E0009, // 028A LDINT R7 10 0x8824090C, // 028A GETMBR R9 R4 K12
0x1C1C0C07, // 028B EQ R7 R6 R7 0x58280009, // 028B LDCONST R10 K9
0x781E0015, // 028C JMPF R7 #02A3 0x7C1C0600, // 028C CALL R7 3
0xB81E2400, // 028D GETNGBL R7 K18 0x80040E00, // 028D RET 1 R7
0x8C1C0F26, // 028E GETMET R7 R7 K38 0x70020046, // 028E JMP #02D6
0x5824004F, // 028F LDCONST R9 K79 0x541E0009, // 028F LDINT R7 10
0x50280200, // 0290 LDBOOL R10 1 0 0x1C1C0C07, // 0290 EQ R7 R6 R7
0x7C1C0600, // 0291 CALL R7 3 0x781E0015, // 0291 JMPF R7 #02A8
0x941C0F50, // 0292 GETIDX R7 R7 K80 0xB81E2400, // 0292 GETNGBL R7 K18
0x941C0F52, // 0293 GETIDX R7 R7 K82 0x8C1C0F26, // 0293 GETMET R7 R7 K38
0x8C20071B, // 0294 GETMET R8 R3 K27 0x5824004F, // 0294 LDCONST R9 K79
0x5C280E00, // 0295 MOVE R10 R7 0x50280200, // 0295 LDBOOL R10 1 0
0x582C0053, // 0296 LDCONST R11 K83 0x7C1C0600, // 0296 CALL R7 3
0x7C200600, // 0297 CALL R8 3 0x941C0F50, // 0297 GETIDX R7 R7 K80
0x24241105, // 0298 GT R9 R8 K5 0x941C0F52, // 0298 GETIDX R7 R7 K82
0x78260002, // 0299 JMPF R9 #029D 0x8C20071B, // 0299 GETMET R8 R3 K27
0x04241109, // 029A SUB R9 R8 K9 0x5C280E00, // 029A MOVE R10 R7
0x40260A09, // 029B CONNECT R9 K5 R9 0x582C0053, // 029B LDCONST R11 K83
0x941C0E09, // 029C GETIDX R7 R7 R9 0x7C200600, // 029C CALL R8 3
0x8C240906, // 029D GETMET R9 R4 K6 0x24241105, // 029D GT R9 R8 K5
0x882C0916, // 029E GETMBR R11 R4 K22 0x78260002, // 029E JMPF R9 #02A2
0x5C300E00, // 029F MOVE R12 R7 0x04241109, // 029F SUB R9 R8 K9
0x7C240600, // 02A0 CALL R9 3 0x40260A09, // 02A0 CONNECT R9 K5 R9
0x80041200, // 02A1 RET 1 R9 0x941C0E09, // 02A1 GETIDX R7 R7 R9
0x7002002D, // 02A2 JMP #02D1 0x8C240906, // 02A2 GETMET R9 R4 K6
0x541E000E, // 02A3 LDINT R7 15 0x882C0916, // 02A3 GETMBR R11 R4 K22
0x1C1C0C07, // 02A4 EQ R7 R6 R7 0x5C300E00, // 02A4 MOVE R12 R7
0x781E000B, // 02A5 JMPF R7 #02B2 0x7C240600, // 02A5 CALL R9 3
0x8C1C0906, // 02A6 GETMET R7 R4 K6 0x80041200, // 02A6 RET 1 R9
0x88240916, // 02A7 GETMBR R9 R4 K22 0x7002002D, // 02A7 JMP #02D6
0xB82A2400, // 02A8 GETNGBL R10 K18 0x541E000E, // 02A8 LDINT R7 15
0x8C281525, // 02A9 GETMET R10 R10 K37 0x1C1C0C07, // 02A9 EQ R7 R6 R7
0x7C280200, // 02AA CALL R10 1 0x781E000B, // 02AA JMPF R7 #02B7
0x8C28151B, // 02AB GETMET R10 R10 K27 0x8C1C0906, // 02AB GETMET R7 R4 K6
0x5830001C, // 02AC LDCONST R12 K28 0x88240916, // 02AC GETMBR R9 R4 K22
0x5834001D, // 02AD LDCONST R13 K29 0xB82A2400, // 02AD GETNGBL R10 K18
0x7C280600, // 02AE CALL R10 3 0x8C281525, // 02AE GETMET R10 R10 K37
0x7C1C0600, // 02AF CALL R7 3 0x7C280200, // 02AF CALL R10 1
0x80040E00, // 02B0 RET 1 R7 0x8C28151B, // 02B0 GETMET R10 R10 K27
0x7002001E, // 02B1 JMP #02D1 0x5830001C, // 02B1 LDCONST R12 K28
0x541E0011, // 02B2 LDINT R7 18 0x5834001D, // 02B2 LDCONST R13 K29
0x1C1C0C07, // 02B3 EQ R7 R6 R7 0x7C280600, // 02B3 CALL R10 3
0x781E000B, // 02B4 JMPF R7 #02C1 0x7C1C0600, // 02B4 CALL R7 3
0x8C1C0906, // 02B5 GETMET R7 R4 K6 0x80040E00, // 02B5 RET 1 R7
0x88240916, // 02B6 GETMBR R9 R4 K22 0x7002001E, // 02B6 JMP #02D6
0xB82A2400, // 02B7 GETNGBL R10 K18 0x541E0011, // 02B7 LDINT R7 18
0x8C281525, // 02B8 GETMET R10 R10 K37 0x1C1C0C07, // 02B8 EQ R7 R6 R7
0x7C280200, // 02B9 CALL R10 1 0x781E000B, // 02B9 JMPF R7 #02C6
0x8C28151B, // 02BA GETMET R10 R10 K27 0x8C1C0906, // 02BA GETMET R7 R4 K6
0x5830001C, // 02BB LDCONST R12 K28 0x88240916, // 02BB GETMBR R9 R4 K22
0x5834001D, // 02BC LDCONST R13 K29 0xB82A2400, // 02BC GETNGBL R10 K18
0x7C280600, // 02BD CALL R10 3 0x8C281525, // 02BD GETMET R10 R10 K37
0x7C1C0600, // 02BE CALL R7 3 0x7C280200, // 02BE CALL R10 1
0x80040E00, // 02BF RET 1 R7 0x8C28151B, // 02BF GETMET R10 R10 K27
0x7002000F, // 02C0 JMP #02D1 0x5830001C, // 02C0 LDCONST R12 K28
0x541E0012, // 02C1 LDINT R7 19 0x5834001D, // 02C1 LDCONST R13 K29
0x1C1C0C07, // 02C2 EQ R7 R6 R7 0x7C280600, // 02C2 CALL R10 3
0x781E000C, // 02C3 JMPF R7 #02D1 0x7C1C0600, // 02C3 CALL R7 3
0x8C1C090A, // 02C4 GETMET R7 R4 K10 0x80040E00, // 02C4 RET 1 R7
0x7C1C0200, // 02C5 CALL R7 1 0x7002000F, // 02C5 JMP #02D6
0x8C200F0B, // 02C6 GETMET R8 R7 K11 0x541E0012, // 02C6 LDINT R7 19
0x58280005, // 02C7 LDCONST R10 K5 0x1C1C0C07, // 02C7 EQ R7 R6 R7
0x882C090C, // 02C8 GETMBR R11 R4 K12 0x781E000C, // 02C8 JMPF R7 #02D6
0x5830000F, // 02C9 LDCONST R12 K15 0x8C1C090A, // 02C9 GETMET R7 R4 K10
0x7C200800, // 02CA CALL R8 4 0x7C1C0200, // 02CA CALL R7 1
0x8C200F0B, // 02CB GETMET R8 R7 K11 0x8C200F0B, // 02CB GETMET R8 R7 K11
0x58280009, // 02CC LDCONST R10 K9 0x58280005, // 02CC LDCONST R10 K5
0x882C090C, // 02CD GETMBR R11 R4 K12 0x882C090C, // 02CD GETMBR R11 R4 K12
0x5830000F, // 02CE LDCONST R12 K15 0x5830000F, // 02CE LDCONST R12 K15
0x7C200800, // 02CF CALL R8 4 0x7C200800, // 02CF CALL R8 4
0x80040E00, // 02D0 RET 1 R7 0x8C200F0B, // 02D0 GETMET R8 R7 K11
0x7002009F, // 02D1 JMP #0372 0x58280009, // 02D1 LDCONST R10 K9
0x541E003E, // 02D2 LDINT R7 63 0x882C090C, // 02D2 GETMBR R11 R4 K12
0x1C1C0A07, // 02D3 EQ R7 R5 R7 0x5830000F, // 02D3 LDCONST R12 K15
0x781E0000, // 02D4 JMPF R7 #02D6 0x7C200800, // 02D4 CALL R8 4
0x7002009B, // 02D5 JMP #0372 0x80040E00, // 02D5 RET 1 R7
0x541E0029, // 02D6 LDINT R7 42 0x7002009F, // 02D6 JMP #0377
0x1C1C0A07, // 02D7 EQ R7 R5 R7 0x541E003E, // 02D7 LDINT R7 63
0x781E001D, // 02D8 JMPF R7 #02F7 0x1C1C0A07, // 02D8 EQ R7 R5 R7
0x1C1C0D05, // 02D9 EQ R7 R6 K5 0x781E0000, // 02D9 JMPF R7 #02DB
0x781E0003, // 02DA JMPF R7 #02DF 0x7002009B, // 02DA JMP #0377
0x8C1C0911, // 02DB GETMET R7 R4 K17 0x541E0029, // 02DB LDINT R7 42
0x7C1C0200, // 02DC CALL R7 1 0x1C1C0A07, // 02DC EQ R7 R5 R7
0x80040E00, // 02DD RET 1 R7 0x781E001D, // 02DD JMPF R7 #02FC
0x70020016, // 02DE JMP #02F6 0x1C1C0D05, // 02DE EQ R7 R6 K5
0x1C1C0D09, // 02DF EQ R7 R6 K9 0x781E0003, // 02DF JMPF R7 #02E4
0x781E0005, // 02E0 JMPF R7 #02E7 0x8C1C0911, // 02E0 GETMET R7 R4 K17
0x8C1C0906, // 02E1 GETMET R7 R4 K6 0x7C1C0200, // 02E1 CALL R7 1
0x88240910, // 02E2 GETMBR R9 R4 K16 0x80040E00, // 02E2 RET 1 R7
0x58280005, // 02E3 LDCONST R10 K5 0x70020016, // 02E3 JMP #02FB
0x7C1C0600, // 02E4 CALL R7 3 0x1C1C0D09, // 02E4 EQ R7 R6 K9
0x80040E00, // 02E5 RET 1 R7 0x781E0005, // 02E5 JMPF R7 #02EC
0x7002000E, // 02E6 JMP #02F6 0x8C1C0906, // 02E6 GETMET R7 R4 K6
0x1C1C0D0D, // 02E7 EQ R7 R6 K13 0x88240910, // 02E7 GETMBR R9 R4 K16
0x781E0005, // 02E8 JMPF R7 #02EF 0x58280005, // 02E8 LDCONST R10 K5
0x8C1C0906, // 02E9 GETMET R7 R4 K6 0x7C1C0600, // 02E9 CALL R7 3
0x8824090E, // 02EA GETMBR R9 R4 K14 0x80040E00, // 02EA RET 1 R7
0x58280009, // 02EB LDCONST R10 K9 0x7002000E, // 02EB JMP #02FB
0x7C1C0600, // 02EC CALL R7 3 0x1C1C0D0D, // 02EC EQ R7 R6 K13
0x80040E00, // 02ED RET 1 R7 0x781E0005, // 02ED JMPF R7 #02F4
0x70020006, // 02EE JMP #02F6 0x8C1C0906, // 02EE GETMET R7 R4 K6
0x1C1C0D0F, // 02EF EQ R7 R6 K15 0x8824090E, // 02EF GETMBR R9 R4 K14
0x781E0004, // 02F0 JMPF R7 #02F6 0x58280009, // 02F0 LDCONST R10 K9
0x8C1C0906, // 02F1 GETMET R7 R4 K6 0x7C1C0600, // 02F1 CALL R7 3
0x88240918, // 02F2 GETMBR R9 R4 K24 0x80040E00, // 02F2 RET 1 R7
0x4C280000, // 02F3 LDNIL R10 0x70020006, // 02F3 JMP #02FB
0x7C1C0600, // 02F4 CALL R7 3 0x1C1C0D0F, // 02F4 EQ R7 R6 K15
0x80040E00, // 02F5 RET 1 R7 0x781E0004, // 02F5 JMPF R7 #02FB
0x7002007A, // 02F6 JMP #0372 0x8C1C0906, // 02F6 GETMET R7 R4 K6
0x541E002A, // 02F7 LDINT R7 43 0x88240918, // 02F7 GETMBR R9 R4 K24
0x1C1C0A07, // 02F8 EQ R7 R5 R7 0x4C280000, // 02F8 LDNIL R10
0x781E0016, // 02F9 JMPF R7 #0311 0x7C1C0600, // 02F9 CALL R7 3
0x1C1C0D05, // 02FA EQ R7 R6 K5 0x80040E00, // 02FA RET 1 R7
0x781E0007, // 02FB JMPF R7 #0304 0x7002007A, // 02FB JMP #0377
0x8C1C0906, // 02FC GETMET R7 R4 K6 0x541E002A, // 02FC LDINT R7 43
0x88240916, // 02FD GETMBR R9 R4 K22 0x1C1C0A07, // 02FD EQ R7 R5 R7
0xB82A2400, // 02FE GETNGBL R10 K18 0x781E0016, // 02FE JMPF R7 #0316
0x8C281554, // 02FF GETMET R10 R10 K84 0x1C1C0D05, // 02FF EQ R7 R6 K5
0x7C280200, // 0300 CALL R10 1 0x781E0007, // 0300 JMPF R7 #0309
0x7C1C0600, // 0301 CALL R7 3 0x8C1C0906, // 0301 GETMET R7 R4 K6
0x80040E00, // 0302 RET 1 R7 0x88240916, // 0302 GETMBR R9 R4 K22
0x7002000B, // 0303 JMP #0310 0xB82A2400, // 0303 GETNGBL R10 K18
0x1C1C0D09, // 0304 EQ R7 R6 K9 0x8C281554, // 0304 GETMET R10 R10 K84
0x781E0009, // 0305 JMPF R7 #0310 0x7C280200, // 0305 CALL R10 1
0x8C1C0911, // 0306 GETMET R7 R4 K17 0x7C1C0600, // 0306 CALL R7 3
0x7C1C0200, // 0307 CALL R7 1 0x80040E00, // 0307 RET 1 R7
0x8C200F0B, // 0308 GETMET R8 R7 K11 0x7002000B, // 0308 JMP #0315
0x4C280000, // 0309 LDNIL R10 0x1C1C0D09, // 0309 EQ R7 R6 K9
0x882C0916, // 030A GETMBR R11 R4 K22 0x781E0009, // 030A JMPF R7 #0315
0xB8322400, // 030B GETNGBL R12 K18 0x8C1C0911, // 030B GETMET R7 R4 K17
0x8C301954, // 030C GETMET R12 R12 K84 0x7C1C0200, // 030C CALL R7 1
0x7C300200, // 030D CALL R12 1 0x8C200F0B, // 030D GETMET R8 R7 K11
0x7C200800, // 030E CALL R8 4 0x4C280000, // 030E LDNIL R10
0x80040E00, // 030F RET 1 R7 0x882C0916, // 030F GETMBR R11 R4 K22
0x70020060, // 0310 JMP #0372 0xB8322400, // 0310 GETNGBL R12 K18
0x541E002B, // 0311 LDINT R7 44 0x8C301954, // 0311 GETMET R12 R12 K84
0x1C1C0A07, // 0312 EQ R7 R5 R7 0x7C300200, // 0312 CALL R12 1
0x781E001C, // 0313 JMPF R7 #0331 0x7C200800, // 0313 CALL R8 4
0x1C1C0D05, // 0314 EQ R7 R6 K5 0x80040E00, // 0314 RET 1 R7
0x781E0005, // 0315 JMPF R7 #031C 0x70020060, // 0315 JMP #0377
0x8C1C0906, // 0316 GETMET R7 R4 K6 0x541E002B, // 0316 LDINT R7 44
0x8824090E, // 0317 GETMBR R9 R4 K14 0x1C1C0A07, // 0317 EQ R7 R5 R7
0x58280009, // 0318 LDCONST R10 K9 0x781E001C, // 0318 JMPF R7 #0336
0x7C1C0600, // 0319 CALL R7 3 0x1C1C0D05, // 0319 EQ R7 R6 K5
0x80040E00, // 031A RET 1 R7 0x781E0005, // 031A JMPF R7 #0321
0x70020013, // 031B JMP #0330 0x8C1C0906, // 031B GETMET R7 R4 K6
0x1C1C0D09, // 031C EQ R7 R6 K9 0x8824090E, // 031C GETMBR R9 R4 K14
0x781E0005, // 031D JMPF R7 #0324 0x58280009, // 031D LDCONST R10 K9
0x8C1C0906, // 031E GETMET R7 R4 K6 0x7C1C0600, // 031E CALL R7 3
0x8824090E, // 031F GETMBR R9 R4 K14 0x80040E00, // 031F RET 1 R7
0x542A0003, // 0320 LDINT R10 4 0x70020013, // 0320 JMP #0335
0x7C1C0600, // 0321 CALL R7 3 0x1C1C0D09, // 0321 EQ R7 R6 K9
0x80040E00, // 0322 RET 1 R7 0x781E0005, // 0322 JMPF R7 #0329
0x7002000B, // 0323 JMP #0330 0x8C1C0906, // 0323 GETMET R7 R4 K6
0x1C1C0D0D, // 0324 EQ R7 R6 K13 0x8824090E, // 0324 GETMBR R9 R4 K14
0x781E0009, // 0325 JMPF R7 #0330 0x542A0003, // 0325 LDINT R10 4
0x8C1C0911, // 0326 GETMET R7 R4 K17 0x7C1C0600, // 0326 CALL R7 3
0x7C1C0200, // 0327 CALL R7 1 0x80040E00, // 0327 RET 1 R7
0x8C200F0B, // 0328 GETMET R8 R7 K11 0x7002000B, // 0328 JMP #0335
0x4C280000, // 0329 LDNIL R10 0x1C1C0D0D, // 0329 EQ R7 R6 K13
0x8C2C0906, // 032A GETMET R11 R4 K6 0x781E0009, // 032A JMPF R7 #0335
0x8834090E, // 032B GETMBR R13 R4 K14 0x8C1C0911, // 032B GETMET R7 R4 K17
0x543A0003, // 032C LDINT R14 4 0x7C1C0200, // 032C CALL R7 1
0x7C2C0600, // 032D CALL R11 3 0x8C200F0B, // 032D GETMET R8 R7 K11
0x7C200600, // 032E CALL R8 3 0x4C280000, // 032E LDNIL R10
0x80040E00, // 032F RET 1 R7 0x8C2C0906, // 032F GETMET R11 R4 K6
0x70020040, // 0330 JMP #0372 0x8834090E, // 0330 GETMBR R13 R4 K14
0x541E0030, // 0331 LDINT R7 49 0x543A0003, // 0331 LDINT R14 4
0x1C1C0A07, // 0332 EQ R7 R5 R7 0x7C2C0600, // 0332 CALL R11 3
0x781E0010, // 0333 JMPF R7 #0345 0x7C200600, // 0333 CALL R8 3
0x1C1C0D0F, // 0334 EQ R7 R6 K15 0x80040E00, // 0334 RET 1 R7
0x781E0005, // 0335 JMPF R7 #033C 0x70020040, // 0335 JMP #0377
0x8C1C0906, // 0336 GETMET R7 R4 K6 0x541E0030, // 0336 LDINT R7 49
0x8824090E, // 0337 GETMBR R9 R4 K14 0x1C1C0A07, // 0337 EQ R7 R5 R7
0x542A001D, // 0338 LDINT R10 30 0x781E0010, // 0338 JMPF R7 #034A
0x7C1C0600, // 0339 CALL R7 3 0x1C1C0D0F, // 0339 EQ R7 R6 K15
0x80040E00, // 033A RET 1 R7 0x781E0005, // 033A JMPF R7 #0341
0x70020007, // 033B JMP #0344 0x8C1C0906, // 033B GETMET R7 R4 K6
0x541EFFFB, // 033C LDINT R7 65532 0x8824090E, // 033C GETMBR R9 R4 K14
0x1C1C0C07, // 033D EQ R7 R6 R7 0x542A001D, // 033D LDINT R10 30
0x781E0004, // 033E JMPF R7 #0344 0x7C1C0600, // 033E CALL R7 3
0x8C1C0906, // 033F GETMET R7 R4 K6 0x80040E00, // 033F RET 1 R7
0x8824092A, // 0340 GETMBR R9 R4 K42 0x70020007, // 0340 JMP #0349
0x542A0003, // 0341 LDINT R10 4 0x541EFFFB, // 0341 LDINT R7 65532
0x7C1C0600, // 0342 CALL R7 3 0x1C1C0C07, // 0342 EQ R7 R6 R7
0x80040E00, // 0343 RET 1 R7 0x781E0004, // 0343 JMPF R7 #0349
0x7002002C, // 0344 JMP #0372 0x8C1C0906, // 0344 GETMET R7 R4 K6
0x541E001C, // 0345 LDINT R7 29 0x8824092A, // 0345 GETMBR R9 R4 K42
0x1C1C0A07, // 0346 EQ R7 R5 R7 0x542A0003, // 0346 LDINT R10 4
0x781E0021, // 0347 JMPF R7 #036A 0x7C1C0600, // 0347 CALL R7 3
0x1C1C0D0F, // 0348 EQ R7 R6 K15 0x80040E00, // 0348 RET 1 R7
0x781E0016, // 0349 JMPF R7 #0361 0x7002002C, // 0349 JMP #0377
0x8C1C0911, // 034A GETMET R7 R4 K17 0x541E001C, // 034A LDINT R7 29
0x7C1C0200, // 034B CALL R7 1 0x1C1C0A07, // 034B EQ R7 R5 R7
0x88200133, // 034C GETMBR R8 R0 K51 0x781E0021, // 034C JMPF R7 #036F
0x8C201155, // 034D GETMET R8 R8 K85 0x1C1C0D0F, // 034D EQ R7 R6 K15
0x50280200, // 034E LDBOOL R10 1 0 0x781E0016, // 034E JMPF R7 #0366
0x7C200400, // 034F CALL R8 2 0x8C1C0911, // 034F GETMET R7 R4 K17
0x60240010, // 0350 GETGBL R9 G16 0x7C1C0200, // 0350 CALL R7 1
0x5C281000, // 0351 MOVE R10 R8 0x88200133, // 0351 GETMBR R8 R0 K51
0x7C240200, // 0352 CALL R9 1 0x8C201155, // 0352 GETMET R8 R8 K85
0xA8020007, // 0353 EXBLK 0 #035C 0x50280200, // 0353 LDBOOL R10 1 0
0x5C281200, // 0354 MOVE R10 R9 0x7C200400, // 0354 CALL R8 2
0x7C280000, // 0355 CALL R10 0 0x60240010, // 0355 GETGBL R9 G16
0x8C2C0F0B, // 0356 GETMET R11 R7 K11 0x5C281000, // 0356 MOVE R10 R8
0x4C340000, // 0357 LDNIL R13 0x7C240200, // 0357 CALL R9 1
0x8838090C, // 0358 GETMBR R14 R4 K12 0xA8020007, // 0358 EXBLK 0 #0361
0x5C3C1400, // 0359 MOVE R15 R10 0x5C281200, // 0359 MOVE R10 R9
0x7C2C0800, // 035A CALL R11 4 0x7C280000, // 035A CALL R10 0
0x7001FFF7, // 035B JMP #0354 0x8C2C0F0B, // 035B GETMET R11 R7 K11
0x5824003A, // 035C LDCONST R9 K58 0x4C340000, // 035C LDNIL R13
0xAC240200, // 035D CATCH R9 1 0 0x8838090C, // 035D GETMBR R14 R4 K12
0xB0080000, // 035E RAISE 2 R0 R0 0x5C3C1400, // 035E MOVE R15 R10
0x80040E00, // 035F RET 1 R7 0x7C2C0800, // 035F CALL R11 4
0x70020007, // 0360 JMP #0369 0x7001FFF7, // 0360 JMP #0359
0x601C0003, // 0361 GETGBL R7 G3 0x5824003A, // 0361 LDCONST R9 K58
0x5C200000, // 0362 MOVE R8 R0 0xAC240200, // 0362 CATCH R9 1 0
0x7C1C0200, // 0363 CALL R7 1 0xB0080000, // 0363 RAISE 2 R0 R0
0x8C1C0F56, // 0364 GETMET R7 R7 K86 0x80040E00, // 0364 RET 1 R7
0x5C240200, // 0365 MOVE R9 R1 0x70020007, // 0365 JMP #036E
0x5C280400, // 0366 MOVE R10 R2 0x601C0003, // 0366 GETGBL R7 G3
0x7C1C0600, // 0367 CALL R7 3 0x5C200000, // 0367 MOVE R8 R0
0x80040E00, // 0368 RET 1 R7 0x7C1C0200, // 0368 CALL R7 1
0x70020007, // 0369 JMP #0372 0x8C1C0F56, // 0369 GETMET R7 R7 K86
0x601C0003, // 036A GETGBL R7 G3 0x5C240200, // 036A MOVE R9 R1
0x5C200000, // 036B MOVE R8 R0 0x5C280400, // 036B MOVE R10 R2
0x7C1C0200, // 036C CALL R7 1 0x7C1C0600, // 036C CALL R7 3
0x8C1C0F56, // 036D GETMET R7 R7 K86 0x80040E00, // 036D RET 1 R7
0x5C240200, // 036E MOVE R9 R1 0x70020007, // 036E JMP #0377
0x5C280400, // 036F MOVE R10 R2 0x601C0003, // 036F GETGBL R7 G3
0x7C1C0600, // 0370 CALL R7 3 0x5C200000, // 0370 MOVE R8 R0
0x80040E00, // 0371 RET 1 R7 0x7C1C0200, // 0371 CALL R7 1
0x80000000, // 0372 RET 0 0x8C1C0F56, // 0372 GETMET R7 R7 K86
0x5C240200, // 0373 MOVE R9 R1
0x5C280400, // 0374 MOVE R10 R2
0x7C1C0600, // 0375 CALL R7 3
0x80040E00, // 0376 RET 1 R7
0x80000000, // 0377 RET 0
}) })
) )
); );