diff --git a/boards/px4/fmu-v6x/default.px4board b/boards/px4/fmu-v6x/default.px4board index c79064e442..a6ba8a5b6e 100644 --- a/boards/px4/fmu-v6x/default.px4board +++ b/boards/px4/fmu-v6x/default.px4board @@ -56,6 +56,7 @@ CONFIG_MODULES_CONTROL_ALLOCATOR=y CONFIG_MODULES_DATAMAN=y CONFIG_MODULES_EKF2=y CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_ESC_FLASHER=y CONFIG_MODULES_EVENTS=y CONFIG_MODULES_FLIGHT_MODE_MANAGER=y CONFIG_MODULES_FW_ATT_CONTROL=y diff --git a/msg/CMakeLists.txt b/msg/CMakeLists.txt index dcb33a5cbd..84e51d5d5f 100644 --- a/msg/CMakeLists.txt +++ b/msg/CMakeLists.txt @@ -68,6 +68,9 @@ set(msg_files DistanceSensorModeChangeRequest.msg DronecanNodeStatus.msg Ekf2Timestamps.msg + EscFlasherRequest.msg + EscFlasherRequestAck.msg + EscFlasherStatus.msg EscReport.msg EscStatus.msg EstimatorAidSource1d.msg diff --git a/msg/EscFlasherRequest.msg b/msg/EscFlasherRequest.msg new file mode 100644 index 0000000000..5308685182 --- /dev/null +++ b/msg/EscFlasherRequest.msg @@ -0,0 +1,16 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 msg_id # Give a unique message identifier so we can compare when getting an ACK + +uint8 request # Request type +# use these items as enum values, they can never change +uint8 REQUEST_ESC_INFO = 0 # Request ESC_INFO from one or more ESCs +uint8 REQUEST_FLASHING = 1 # Request flashing for one or more ESCs +uint8 REQUEST_CANCEL = 2 # Cancel any pending request and return control to DShot +uint8 REQUEST_FLASHING_COMPLETE = 3 # Flashing complete, return control to DShot + +uint8 motor_flags # Flags for which motors are being requested +# motor_flags bit 0 : Set to 1 if ESC0 is being flashed +# motor_flags bit 1 : Set to 1 if ESC1 is being flashed +# motor_flags bit 2 : Set to 1 if ESC2 is being flashed +# motor_flags bit 3 : Set to 1 if ESC3 is being flashed diff --git a/msg/EscFlasherRequestAck.msg b/msg/EscFlasherRequestAck.msg new file mode 100644 index 0000000000..9fb454fe1b --- /dev/null +++ b/msg/EscFlasherRequestAck.msg @@ -0,0 +1,31 @@ +# ESC Flasher Request Acknowledgement uORB message. +# Used for acknowledging the ESC Flasher command being received. +# Follows the MAVLink COMMAND_ACK message definition + +uint64 timestamp # time since system start (microseconds) + +uint32 msg_id # Message identifier that we are responding to + +uint8 request # Request type +# use these items as enum values, they can never change +uint8 REQUEST_ESC_INFO = 0 # Request ESC_INFO from one or more ESCs +uint8 REQUEST_FLASHING = 1 # Request flashing for one or more ESCs +uint8 REQUEST_CANCEL = 2 # Cancel any pending request and return control to DShot +uint8 REQUEST_FLASHING_COMPLETE = 3 # Flashing complete, return control to DShot + +uint8 result # Command acknowledge result +# Result cases. This follows the MAVLink MAV_RESULT enum definition +uint8 ESC_FLASHER_CMD_RESULT_ACCEPTED = 0 # Command ACCEPTED and EXECUTED | +uint8 ESC_FLASHER_CMD_RESULT_TEMPORARILY_REJECTED = 1 # Command TEMPORARY REJECTED/DENIED | +uint8 ESC_FLASHER_CMD_RESULT_DENIED = 2 # Command PERMANENTLY DENIED | +uint8 ESC_FLASHER_CMD_RESULT_UNSUPPORTED = 3 # Command UNKNOWN/UNSUPPORTED | +uint8 ESC_FLASHER_CMD_RESULT_FAILED = 4 # Command executed, but failed | +uint8 ESC_FLASHER_CMD_RESULT_IN_PROGRESS = 5 # Command being executed | +uint8 ESC_FLASHER_CMD_RESULT_CANCELLED = 6 # Command Canceled + +uint8[16] fw_major # Firmware versions major +uint8[16] fw_minor # Firmware versions minor +uint16 fw_flags # Bit flags for valid fw versions + +uint32[16] gpio_pins # GPIO pin definitions +uint16 gpio_flags # Bit flags for valid gpio pins diff --git a/msg/EscFlasherStatus.msg b/msg/EscFlasherStatus.msg new file mode 100644 index 0000000000..944f8578b9 --- /dev/null +++ b/msg/EscFlasherStatus.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +bool esc_flashing_in_progress + +uint8 version_major + +uint8 version_minor diff --git a/src/modules/esc_flasher/AM32Firmware.c b/src/modules/esc_flasher/AM32Firmware.c new file mode 100644 index 0000000000..574cea348e --- /dev/null +++ b/src/modules/esc_flasher/AM32Firmware.c @@ -0,0 +1,1318 @@ +#include "AM32Firmware.h" + +#ifdef INCLUDE_AM32_FIRMWARE + +const uint8_t am32_fw_version_major = 2; +const uint8_t am32_fw_version_minor = 189; + +/* D:\Firefly\AM32\FIRMWARE BYTES\2-186\0x08001000.bin (5/15/2025 3:28:57 PM) + StartOffset(h): 00000000, EndOffset(h): 00004EFF, Length(h): 00004F00 */ + +const unsigned char am32_firmware[20752] = { + 0x00, 0x0D, 0x00, 0x20, 0xD1, 0x10, 0x00, 0x08, 0x71, 0x1D, 0x00, 0x08, 0xF9, 0x14, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x1E, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x1D, 0x00, 0x08, 0x63, 0x1E, 0x00, 0x08, + 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, + 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE5, 0x14, 0x00, 0x08, + 0xE3, 0x10, 0x00, 0x08, 0x0D, 0x14, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0x39, 0x14, 0x00, 0x08, + 0x4D, 0x12, 0x00, 0x08, 0xCD, 0x1F, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, + 0xF5, 0x1F, 0x00, 0x08, 0x1D, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x1F, 0x00, 0x08, + 0xA1, 0x1F, 0x00, 0x08, 0xC9, 0x1F, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, + 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0xE3, 0x10, 0x00, 0x08, 0x39, 0x20, 0x00, 0x08, + 0xE3, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x10, 0x00, 0x08, 0x03, 0x48, 0x85, 0x46, + 0x00, 0xF0, 0x80, 0xF8, 0x00, 0x48, 0x00, 0x47, 0x55, 0x39, 0x00, 0x08, 0x00, 0x0D, 0x00, 0x20, + 0x04, 0x48, 0x80, 0x47, 0x04, 0x48, 0x00, 0x47, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, + 0xFE, 0xE7, 0xFE, 0xE7, 0x89, 0x1F, 0x00, 0x08, 0xBD, 0x10, 0x00, 0x08, 0x03, 0x46, 0x0B, 0x43, + 0x9B, 0x07, 0x03, 0xD0, 0x09, 0xE0, 0x08, 0xC9, 0x12, 0x1F, 0x08, 0xC0, 0x04, 0x2A, 0xFA, 0xD2, + 0x03, 0xE0, 0x0B, 0x78, 0x03, 0x70, 0x40, 0x1C, 0x49, 0x1C, 0x52, 0x1E, 0xF9, 0xD2, 0x70, 0x47, + 0xD2, 0xB2, 0x01, 0xE0, 0x02, 0x70, 0x40, 0x1C, 0x49, 0x1E, 0xFB, 0xD2, 0x70, 0x47, 0x00, 0x22, + 0xF6, 0xE7, 0x10, 0xB5, 0x13, 0x46, 0x0A, 0x46, 0x04, 0x46, 0x19, 0x46, 0xFF, 0xF7, 0xF0, 0xFF, + 0x20, 0x46, 0x10, 0xBD, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x29, 0x03, 0xD0, 0x00, 0x20, 0x20, 0x22, + 0x01, 0x23, 0x10, 0xE0, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, 0xC0, 0x43, 0xC0, 0x46, 0xC0, 0x46, + 0x0D, 0xE0, 0x25, 0x46, 0xD5, 0x40, 0x8D, 0x42, 0x05, 0xD3, 0x0D, 0x46, 0x95, 0x40, 0x64, 0x1B, + 0x1D, 0x46, 0x95, 0x40, 0x40, 0x19, 0x15, 0x46, 0x52, 0x1E, 0x00, 0x2D, 0xF1, 0xDC, 0x21, 0x46, + 0x70, 0xBD, 0x00, 0x00, 0x70, 0xB5, 0x00, 0x25, 0x04, 0x46, 0x2E, 0x46, 0x00, 0x29, 0x11, 0xD0, + 0x00, 0x2C, 0x01, 0xDA, 0x01, 0x25, 0x44, 0x42, 0x00, 0x29, 0x01, 0xDA, 0x01, 0x26, 0x49, 0x42, + 0x20, 0x46, 0xFF, 0xF7, 0xCF, 0xFF, 0xB5, 0x42, 0x00, 0xD0, 0x40, 0x42, 0x00, 0x2D, 0x00, 0xD0, + 0x49, 0x42, 0x70, 0xBD, 0x00, 0x2C, 0x02, 0xDA, 0x01, 0x21, 0xC9, 0x07, 0x02, 0xE0, 0x00, 0x2C, + 0x00, 0xDD, 0x03, 0x49, 0x08, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x21, 0x46, 0x70, 0xBD, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x7F, 0x1C, 0xB5, 0x09, 0x48, 0x00, 0x90, 0x09, 0x48, 0x01, 0x90, 0x05, 0x46, + 0x01, 0x26, 0x00, 0x9C, 0x05, 0xE0, 0xE3, 0x68, 0x07, 0xCC, 0x33, 0x43, 0x0C, 0x3C, 0x98, 0x47, + 0x10, 0x34, 0xAC, 0x42, 0xF7, 0xD3, 0xFF, 0xF7, 0x6D, 0xFF, 0x00, 0x00, 0x08, 0x5E, 0x00, 0x08, + 0x28, 0x5E, 0x00, 0x08, 0x70, 0xB5, 0x8C, 0x18, 0x05, 0x78, 0x40, 0x1C, 0x6B, 0x07, 0x5B, 0x0F, + 0x01, 0xD1, 0x03, 0x78, 0x40, 0x1C, 0x2A, 0x11, 0x06, 0xD1, 0x02, 0x78, 0x40, 0x1C, 0x03, 0xE0, + 0x06, 0x78, 0x0E, 0x70, 0x40, 0x1C, 0x49, 0x1C, 0x5B, 0x1E, 0xF9, 0xD1, 0x2B, 0x07, 0x05, 0xD4, + 0x00, 0x23, 0x52, 0x1E, 0x0D, 0xD4, 0x0B, 0x70, 0x49, 0x1C, 0xFA, 0xE7, 0x03, 0x78, 0x40, 0x1C, + 0xCB, 0x1A, 0x92, 0x1C, 0x03, 0xE0, 0x1D, 0x78, 0x0D, 0x70, 0x49, 0x1C, 0x5B, 0x1C, 0x52, 0x1E, + 0xF9, 0xD5, 0xA1, 0x42, 0xD8, 0xD3, 0x00, 0x20, 0x70, 0xBD, 0x00, 0x00, 0xB0, 0xB5, 0xA9, 0x4C, + 0x20, 0x68, 0x80, 0x02, 0x00, 0xD4, 0xB0, 0xBD, 0x01, 0x20, 0x45, 0x05, 0x09, 0x48, 0x00, 0x68, + 0x09, 0x49, 0x09, 0x68, 0x49, 0x08, 0x88, 0x42, 0x03, 0xD9, 0x25, 0x60, 0x02, 0xF0, 0xF2, 0xF9, + 0xB0, 0xBD, 0x01, 0xF0, 0x1B, 0xFF, 0x05, 0x49, 0x09, 0x78, 0x88, 0x42, 0xEB, 0xD1, 0x25, 0x60, + 0xB0, 0xBD, 0xC0, 0x46, 0x24, 0x00, 0x00, 0x40, 0x7C, 0x05, 0x00, 0x20, 0xCE, 0x00, 0x00, 0x20, + 0x05, 0x48, 0x81, 0x88, 0x05, 0x4A, 0x11, 0x80, 0x01, 0x88, 0x05, 0x4A, 0x11, 0x80, 0x40, 0x88, + 0x04, 0x49, 0x08, 0x80, 0x70, 0x47, 0xC0, 0x46, 0x9C, 0x05, 0x00, 0x20, 0x5C, 0x05, 0x00, 0x20, + 0x60, 0x05, 0x00, 0x20, 0x46, 0x05, 0x00, 0x20, 0xF0, 0xB5, 0x93, 0xB0, 0x00, 0x27, 0x11, 0x97, + 0x10, 0x97, 0x0F, 0x97, 0x0E, 0x97, 0x0D, 0x97, 0x0C, 0x97, 0x0B, 0x97, 0x0A, 0x97, 0x09, 0x97, + 0x08, 0x97, 0x07, 0x97, 0x06, 0x97, 0x05, 0x97, 0x04, 0x97, 0x03, 0x97, 0x01, 0x21, 0x48, 0x02, + 0x0B, 0x46, 0x01, 0x91, 0x44, 0x49, 0x4A, 0x68, 0x02, 0x43, 0x4A, 0x60, 0x4A, 0x68, 0x02, 0x40, + 0x12, 0x92, 0x12, 0x98, 0x58, 0x04, 0x0A, 0x68, 0x02, 0x43, 0x0A, 0x60, 0x09, 0x68, 0x01, 0x40, + 0x12, 0x91, 0x12, 0x98, 0x07, 0x97, 0x03, 0x26, 0x04, 0x96, 0x40, 0x20, 0x00, 0x90, 0x03, 0x90, + 0x09, 0x20, 0xC4, 0x06, 0x03, 0xAD, 0x20, 0x46, 0x29, 0x46, 0x00, 0xF0, 0x1F, 0xF9, 0x07, 0x97, + 0x04, 0x96, 0x08, 0x20, 0x02, 0x90, 0x03, 0x90, 0x20, 0x46, 0x29, 0x46, 0x00, 0xF0, 0x16, 0xF9, + 0x32, 0x48, 0x01, 0x68, 0x32, 0x4A, 0x0A, 0x40, 0x02, 0x60, 0x31, 0x03, 0x02, 0x68, 0x8A, 0x43, + 0x02, 0x60, 0x01, 0x68, 0x20, 0x22, 0x0A, 0x43, 0x02, 0x60, 0x01, 0x68, 0x00, 0x9C, 0xA1, 0x43, + 0x01, 0x60, 0x01, 0x68, 0x80, 0x22, 0x0A, 0x43, 0x02, 0x60, 0x31, 0x02, 0x02, 0x68, 0x8A, 0x43, + 0x01, 0x9B, 0x19, 0x02, 0x51, 0x18, 0x01, 0x60, 0xB1, 0x02, 0x02, 0x68, 0x8A, 0x43, 0x99, 0x02, + 0x1E, 0x46, 0x51, 0x18, 0x01, 0x60, 0x23, 0x4D, 0x28, 0x68, 0x02, 0x99, 0x08, 0x43, 0x28, 0x60, + 0x28, 0x68, 0x20, 0x43, 0x28, 0x60, 0x18, 0x04, 0x29, 0x68, 0x01, 0x43, 0x29, 0x60, 0x07, 0x20, + 0x80, 0x05, 0x1D, 0x49, 0x0A, 0x68, 0x82, 0x43, 0xD8, 0x05, 0x10, 0x18, 0x08, 0x60, 0xD8, 0x07, + 0x0E, 0x90, 0x11, 0x97, 0x10, 0x97, 0x0F, 0x97, 0x2C, 0x46, 0x28, 0x3C, 0x0E, 0xA9, 0x20, 0x46, + 0x00, 0xF0, 0xA4, 0xF8, 0x0D, 0x97, 0x0C, 0x96, 0x0B, 0x97, 0x0A, 0x97, 0x09, 0x97, 0x09, 0xA9, + 0x20, 0x46, 0x00, 0xF0, 0xB5, 0xF8, 0x04, 0x20, 0xC0, 0x43, 0x29, 0x46, 0x1C, 0x39, 0x0A, 0x68, + 0x02, 0x40, 0x0A, 0x60, 0x29, 0x46, 0x14, 0x39, 0x0A, 0x68, 0x06, 0x23, 0x13, 0x43, 0xB3, 0x43, + 0x0B, 0x60, 0x24, 0x3D, 0x29, 0x68, 0x01, 0x40, 0x29, 0x60, 0x28, 0x68, 0x02, 0x99, 0x88, 0x43, + 0x28, 0x60, 0x13, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x14, 0x10, 0x02, 0x40, 0x08, 0x00, 0x02, 0x40, + 0xEF, 0xBF, 0xFF, 0xFF, 0x28, 0x24, 0x01, 0x40, 0x08, 0x27, 0x01, 0x40, 0x10, 0xB5, 0x09, 0x4C, + 0x20, 0x68, 0x80, 0x07, 0x03, 0xD4, 0x20, 0x68, 0x00, 0x07, 0x07, 0xD4, 0x10, 0xBD, 0x01, 0x20, + 0x60, 0x60, 0xFF, 0xF7, 0x35, 0xFF, 0x20, 0x68, 0x00, 0x07, 0xF7, 0xD5, 0x08, 0x20, 0x60, 0x60, + 0x10, 0xBD, 0xC0, 0x46, 0x00, 0x00, 0x02, 0x40, 0xF0, 0xB5, 0x81, 0xB0, 0x01, 0x25, 0xEC, 0x03, + 0x21, 0x48, 0x01, 0x78, 0x21, 0x48, 0x00, 0x29, 0x11, 0xD0, 0x1E, 0x49, 0x09, 0x78, 0x00, 0x29, + 0x0D, 0xD0, 0x29, 0x03, 0x02, 0x68, 0x0A, 0x43, 0x02, 0x60, 0x00, 0x21, 0x01, 0x64, 0x1F, 0x48, + 0x00, 0x78, 0x00, 0x28, 0x24, 0xD0, 0x03, 0xF0, 0x01, 0xFB, 0x02, 0x25, 0x22, 0xE0, 0x01, 0x1F, + 0x0A, 0x68, 0x52, 0x04, 0x0C, 0xD5, 0x16, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x08, 0xD0, 0xAA, 0x03, + 0x14, 0x4B, 0x1E, 0x68, 0x02, 0x27, 0x37, 0x43, 0x08, 0x26, 0xB7, 0x43, 0x1F, 0x60, 0x02, 0x60, + 0x0A, 0x68, 0x92, 0x04, 0x04, 0xD4, 0x09, 0x68, 0x21, 0x42, 0x11, 0xD0, 0x29, 0x03, 0x0E, 0xE0, + 0x29, 0x03, 0x01, 0x60, 0x01, 0x6C, 0xA9, 0x43, 0x01, 0x64, 0x04, 0xF0, 0xE3, 0xFA, 0x03, 0xE0, + 0x03, 0xF0, 0x20, 0xFC, 0x0A, 0x48, 0x05, 0x70, 0x07, 0x48, 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, + 0x01, 0xB0, 0xF0, 0xBD, 0x10, 0x05, 0x00, 0x20, 0x17, 0x05, 0x00, 0x20, 0x04, 0x00, 0x02, 0x40, + 0x1A, 0x05, 0x00, 0x20, 0x20, 0x04, 0x00, 0x40, 0x10, 0x04, 0x01, 0x40, 0xE0, 0x04, 0x00, 0x20, + 0x01, 0x05, 0x00, 0x20, 0x80, 0xB5, 0x01, 0x20, 0xC0, 0x03, 0x02, 0x49, 0x08, 0x60, 0x03, 0xF0, + 0x71, 0xFA, 0x80, 0xBD, 0x14, 0x04, 0x01, 0x40, 0xFE, 0xE7, 0x00, 0x00, 0x82, 0x68, 0xD2, 0x07, + 0x12, 0xD1, 0xC2, 0x68, 0x09, 0x4B, 0x13, 0x40, 0x4A, 0x68, 0x1A, 0x43, 0x8B, 0x68, 0x13, 0x43, + 0xCA, 0x68, 0x1A, 0x43, 0xC2, 0x60, 0x03, 0x22, 0x92, 0x07, 0x03, 0x69, 0x93, 0x43, 0x09, 0x68, + 0x19, 0x43, 0x01, 0x61, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0xC7, 0x3F, 0xFF, 0xFF, + 0x70, 0xB5, 0x82, 0x68, 0xD2, 0x07, 0x0C, 0xD1, 0xC2, 0x68, 0x07, 0x4B, 0x13, 0x40, 0x74, 0xC9, + 0x09, 0x68, 0x1A, 0x43, 0x22, 0x43, 0x2A, 0x43, 0x32, 0x43, 0x0A, 0x43, 0xC2, 0x60, 0x00, 0x20, + 0x70, 0xBD, 0x01, 0x20, 0x70, 0xBD, 0xC0, 0x46, 0x3C, 0xC2, 0xFE, 0xFF, 0xF0, 0xB5, 0x84, 0xB0, + 0x0B, 0x68, 0x00, 0x2B, 0x49, 0xD0, 0x00, 0x25, 0x01, 0x91, 0x00, 0x90, 0x10, 0xE0, 0x7F, 0x43, + 0x7F, 0x43, 0x3B, 0x46, 0x0F, 0x21, 0x59, 0x43, 0x8E, 0x43, 0x5D, 0x43, 0x35, 0x43, 0x00, 0x98, + 0x05, 0x51, 0x01, 0x99, 0x03, 0x9D, 0x6D, 0x1C, 0x0B, 0x68, 0x1C, 0x46, 0xEC, 0x40, 0x35, 0xD0, + 0x01, 0x22, 0xAA, 0x40, 0x1A, 0x40, 0xF6, 0xD0, 0x03, 0x95, 0x14, 0x46, 0x54, 0x43, 0x4B, 0x68, + 0x26, 0x46, 0x5E, 0x43, 0x03, 0x27, 0x67, 0x43, 0x05, 0x68, 0xBD, 0x43, 0x35, 0x43, 0x05, 0x60, + 0xFE, 0x43, 0x02, 0x93, 0x5D, 0x1E, 0x23, 0x46, 0x01, 0x2D, 0x05, 0xD8, 0x8D, 0x68, 0x5D, 0x43, + 0x87, 0x68, 0x37, 0x40, 0x2F, 0x43, 0x87, 0x60, 0x0D, 0x69, 0x5D, 0x43, 0xC7, 0x68, 0x37, 0x40, + 0x2F, 0x43, 0xC7, 0x60, 0x02, 0x9D, 0x02, 0x2D, 0x03, 0x9D, 0xD4, 0xD1, 0x17, 0x0A, 0x05, 0xD0, + 0x24, 0x24, 0x4D, 0x69, 0x06, 0x59, 0x00, 0x2F, 0xC1, 0xD1, 0x04, 0xE0, 0x20, 0x24, 0x4D, 0x69, + 0x06, 0x59, 0x00, 0x2F, 0xBB, 0xD1, 0x5B, 0x43, 0xBC, 0xE7, 0x00, 0x23, 0x4A, 0x68, 0x52, 0x1E, + 0x01, 0x2A, 0x05, 0xD8, 0xC9, 0x68, 0x59, 0x43, 0x42, 0x68, 0x9A, 0x43, 0x0A, 0x43, 0x42, 0x60, + 0x00, 0x20, 0x04, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x80, 0xB5, 0x7D, 0x21, 0xC9, 0x00, 0xFF, 0xF7, + 0x89, 0xFD, 0x40, 0x1E, 0x03, 0x49, 0x48, 0x60, 0x00, 0x20, 0x88, 0x60, 0x05, 0x20, 0x08, 0x60, + 0x80, 0xBD, 0xC0, 0x46, 0x10, 0xE0, 0x00, 0xE0, 0xB0, 0xB5, 0x04, 0x46, 0x3E, 0x4D, 0x28, 0x68, + 0x0C, 0x21, 0x01, 0x40, 0x3D, 0x48, 0x08, 0x29, 0x0F, 0xD1, 0x29, 0x68, 0xC9, 0x03, 0x00, 0xD4, + 0x3B, 0x48, 0xA9, 0x6A, 0x0F, 0x22, 0x0A, 0x40, 0x51, 0x1C, 0xFF, 0xF7, 0x6B, 0xFD, 0x01, 0x46, + 0x28, 0x68, 0x80, 0x02, 0x00, 0x0F, 0x80, 0x1C, 0x48, 0x43, 0x20, 0x60, 0x29, 0x68, 0x09, 0x06, + 0x09, 0x0F, 0x35, 0x4A, 0x51, 0x5C, 0xC8, 0x40, 0x60, 0x60, 0x29, 0x68, 0x49, 0x05, 0x49, 0x0F, + 0x30, 0x4A, 0x51, 0x5C, 0xC8, 0x40, 0xA0, 0x60, 0xB0, 0xBD, 0xC0, 0x46, 0x10, 0xB5, 0x00, 0x28, + 0x01, 0xD0, 0x00, 0x20, 0x10, 0xBD, 0x28, 0x4C, 0xE1, 0x6A, 0x03, 0x20, 0x08, 0x40, 0xC0, 0x46, + 0x78, 0x44, 0x00, 0x79, 0x40, 0x00, 0x87, 0x44, 0x01, 0x30, 0x24, 0x29, 0x20, 0x68, 0x0C, 0x21, + 0x01, 0x40, 0x22, 0x48, 0x08, 0x29, 0x0F, 0xD1, 0x21, 0x68, 0xC9, 0x03, 0x00, 0xD4, 0x20, 0x48, + 0xA1, 0x6A, 0x0F, 0x22, 0x0A, 0x40, 0x51, 0x1C, 0xFF, 0xF7, 0x34, 0xFD, 0x01, 0x46, 0x20, 0x68, + 0x80, 0x02, 0x00, 0x0F, 0x80, 0x1C, 0x48, 0x43, 0x21, 0x68, 0x22, 0x68, 0x52, 0x05, 0x52, 0x0F, + 0x18, 0x4B, 0x9A, 0x5C, 0x09, 0x06, 0x09, 0x0F, 0x17, 0x4B, 0x59, 0x5C, 0xC8, 0x40, 0xD0, 0x40, + 0x10, 0xBD, 0xE0, 0x69, 0x02, 0x21, 0x01, 0x40, 0x88, 0x03, 0x10, 0xBD, 0x20, 0x1F, 0x00, 0x68, + 0x80, 0x07, 0xC1, 0x17, 0x0D, 0x48, 0x08, 0x40, 0x10, 0xBD, 0x20, 0x68, 0x0C, 0x21, 0x01, 0x40, + 0x0A, 0x48, 0x08, 0x29, 0xEC, 0xD1, 0x21, 0x68, 0xC9, 0x03, 0x00, 0xD4, 0x08, 0x48, 0xA1, 0x6A, + 0x0F, 0x22, 0x0A, 0x40, 0x51, 0x1C, 0xFF, 0xF7, 0x05, 0xFD, 0x01, 0x46, 0x20, 0x68, 0x80, 0x02, + 0x00, 0x0F, 0x80, 0x1C, 0x48, 0x43, 0x10, 0xBD, 0x04, 0x10, 0x02, 0x40, 0x00, 0x12, 0x7A, 0x00, + 0x00, 0x09, 0x3D, 0x00, 0x2E, 0x5D, 0x00, 0x08, 0x1E, 0x5D, 0x00, 0x08, 0x01, 0x49, 0x08, 0x60, + 0x70, 0x47, 0xC0, 0x46, 0x9C, 0x01, 0x00, 0x20, 0xB0, 0xB5, 0x1F, 0x22, 0xD3, 0x02, 0x34, 0xC9, + 0x9C, 0x43, 0x3F, 0x23, 0x9B, 0x02, 0x9D, 0x43, 0x0B, 0x78, 0x2B, 0x43, 0x23, 0x43, 0x0F, 0x24, + 0x24, 0x03, 0xA2, 0x43, 0x1A, 0x43, 0x03, 0x23, 0x9B, 0x03, 0x4C, 0x68, 0x8D, 0x68, 0x9C, 0x43, + 0x14, 0x43, 0x49, 0x88, 0x03, 0x4A, 0x0A, 0x40, 0x22, 0x43, 0x2A, 0x43, 0x42, 0x64, 0x00, 0x20, + 0xB0, 0xBD, 0xC0, 0x46, 0xFF, 0x1F, 0x00, 0x00, 0xB0, 0xB5, 0x05, 0x68, 0x01, 0x22, 0x94, 0x07, + 0xA0, 0x42, 0x05, 0xD0, 0x23, 0x4B, 0x98, 0x42, 0x02, 0xD0, 0x23, 0x4B, 0x98, 0x42, 0x17, 0xD1, + 0x70, 0x23, 0x9D, 0x43, 0x4B, 0x68, 0x2B, 0x43, 0x20, 0x4D, 0xA8, 0x42, 0x14, 0xDD, 0x20, 0x4C, + 0xA0, 0x42, 0x06, 0xDC, 0x1B, 0x4C, 0xA0, 0x42, 0x16, 0xD0, 0x20, 0x4C, 0xA0, 0x42, 0x13, 0xD0, + 0x2E, 0xE0, 0x1C, 0x4C, 0xA0, 0x42, 0x0F, 0xD0, 0x1B, 0x4C, 0xA0, 0x42, 0x0C, 0xD0, 0x27, 0xE0, + 0x2B, 0x46, 0x16, 0x4D, 0xA8, 0x42, 0xEA, 0xDC, 0xA0, 0x42, 0x05, 0xD0, 0x12, 0x4C, 0xA0, 0x42, + 0x02, 0xD0, 0x17, 0x4C, 0xA0, 0x42, 0x1B, 0xD1, 0x03, 0x24, 0x24, 0x02, 0xA3, 0x43, 0xCC, 0x68, + 0x1C, 0x43, 0x04, 0x60, 0x8B, 0x68, 0xC3, 0x62, 0x0B, 0x88, 0x83, 0x62, 0x97, 0x4B, 0xC3, 0x18, + 0x0A, 0x24, 0xE3, 0x41, 0x07, 0x2B, 0x06, 0xD8, 0x14, 0x46, 0x9C, 0x40, 0xE1, 0x23, 0x1C, 0x42, + 0x01, 0xD0, 0x09, 0x7C, 0x01, 0x63, 0x41, 0x69, 0x11, 0x43, 0x41, 0x61, 0x00, 0x20, 0xB0, 0xBD, + 0x1C, 0x46, 0xE6, 0xE7, 0x00, 0x2C, 0x01, 0x40, 0x00, 0x04, 0x00, 0x40, 0xFF, 0x2B, 0x01, 0x40, + 0xFF, 0x43, 0x01, 0x40, 0x00, 0x48, 0x01, 0x40, 0x00, 0x44, 0x01, 0x40, 0x00, 0x40, 0x01, 0x40, + 0x00, 0x20, 0x00, 0x40, 0xF0, 0xB5, 0x84, 0xB0, 0x01, 0x23, 0xFF, 0x29, 0x44, 0xDC, 0x01, 0x29, + 0x7F, 0xD0, 0x10, 0x29, 0x00, 0xD0, 0xFB, 0xE0, 0x01, 0x6A, 0x10, 0x23, 0x99, 0x43, 0x01, 0x62, + 0x01, 0x6A, 0x30, 0x23, 0x99, 0x43, 0x13, 0x69, 0x5B, 0x08, 0x5C, 0x01, 0x0C, 0x43, 0x17, 0x68, + 0x51, 0x68, 0x09, 0x01, 0x21, 0x43, 0x79, 0x4C, 0x06, 0x19, 0x0A, 0x24, 0xE6, 0x41, 0x45, 0x68, + 0x84, 0x69, 0x07, 0x2E, 0x1E, 0xD8, 0x03, 0x97, 0x01, 0x27, 0xB7, 0x40, 0xE1, 0x26, 0x37, 0x42, + 0x17, 0xD0, 0x03, 0x26, 0xB6, 0x02, 0xB5, 0x43, 0x53, 0x69, 0x02, 0x93, 0x97, 0x69, 0xD3, 0x69, + 0xBF, 0x00, 0x26, 0x46, 0x70, 0x4C, 0x3C, 0x40, 0x2C, 0x43, 0xDD, 0x00, 0x25, 0x43, 0x34, 0x46, + 0xC0, 0x23, 0x99, 0x43, 0x02, 0x9B, 0x5B, 0x08, 0xDB, 0x01, 0x0B, 0x43, 0x91, 0x68, 0x89, 0x01, + 0x19, 0x43, 0x03, 0x9F, 0x45, 0x60, 0x73, 0x23, 0x1B, 0x02, 0x9C, 0x43, 0x3B, 0x02, 0x23, 0x43, + 0x83, 0x61, 0xD2, 0x68, 0x82, 0x63, 0x76, 0xE0, 0x01, 0x27, 0x3D, 0x02, 0xA9, 0x42, 0x74, 0xD0, + 0x3D, 0x03, 0xA9, 0x42, 0x00, 0xD0, 0xB3, 0xE0, 0x01, 0x6A, 0xA9, 0x43, 0x01, 0x62, 0x5B, 0x49, + 0x45, 0x18, 0x0A, 0x21, 0xCD, 0x41, 0x01, 0x6A, 0x43, 0x68, 0x14, 0x68, 0x02, 0x94, 0x54, 0x68, + 0x01, 0x94, 0x14, 0x69, 0x03, 0x94, 0xC6, 0x69, 0x07, 0x2D, 0x00, 0xD9, 0xA3, 0xE0, 0x3C, 0x46, + 0xAC, 0x40, 0xE1, 0x25, 0x2C, 0x42, 0x00, 0xD1, 0x9D, 0xE0, 0xBC, 0x03, 0xA3, 0x43, 0x94, 0x69, + 0xA4, 0x01, 0x1C, 0x43, 0x01, 0x9D, 0x44, 0x60, 0x73, 0x23, 0x1B, 0x02, 0x9E, 0x43, 0x02, 0x9B, + 0x1B, 0x02, 0x33, 0x43, 0xC3, 0x61, 0xD2, 0x68, 0x02, 0x64, 0x03, 0x22, 0x12, 0x03, 0x91, 0x43, + 0x47, 0x4A, 0x10, 0x32, 0x03, 0x9B, 0x1B, 0x03, 0x13, 0x40, 0x0B, 0x43, 0x29, 0x03, 0x19, 0x43, + 0x39, 0xE0, 0x01, 0x27, 0xF9, 0x43, 0x03, 0x6A, 0x0B, 0x40, 0x03, 0x62, 0x13, 0x69, 0x0B, 0x40, + 0x04, 0x6A, 0x03, 0x21, 0x02, 0x91, 0x8C, 0x43, 0x1C, 0x43, 0x16, 0x68, 0x51, 0x68, 0x21, 0x43, + 0x3A, 0x4B, 0xC3, 0x18, 0x0A, 0x24, 0xE3, 0x41, 0x45, 0x68, 0x84, 0x69, 0x07, 0x2B, 0x1B, 0xD8, + 0x03, 0x96, 0x3E, 0x46, 0x9E, 0x40, 0xE1, 0x23, 0x1E, 0x42, 0x14, 0xD0, 0x02, 0x9B, 0x1B, 0x02, + 0x9D, 0x43, 0x7B, 0x02, 0x56, 0x69, 0x02, 0x96, 0x97, 0x69, 0xD6, 0x69, 0x9F, 0x43, 0x2F, 0x43, + 0x75, 0x00, 0x3D, 0x43, 0x0C, 0x23, 0x99, 0x43, 0x02, 0x9B, 0x5B, 0x08, 0xDB, 0x00, 0x0B, 0x43, + 0x91, 0x68, 0x89, 0x00, 0x19, 0x43, 0x03, 0x9E, 0x45, 0x60, 0x73, 0x23, 0x9C, 0x43, 0x34, 0x43, + 0x84, 0x61, 0xD2, 0x68, 0x42, 0x63, 0x01, 0x62, 0x41, 0xE0, 0x01, 0x6A, 0xA9, 0x43, 0x01, 0x62, + 0x24, 0x49, 0x49, 0x1C, 0x13, 0x69, 0x1B, 0x02, 0x0B, 0x40, 0x03, 0x21, 0x02, 0x91, 0x09, 0x02, + 0x05, 0x6A, 0x8D, 0x43, 0x1D, 0x43, 0x11, 0x68, 0x03, 0x91, 0x51, 0x68, 0x0B, 0x02, 0x2B, 0x43, + 0x1A, 0x49, 0x41, 0x18, 0x0A, 0x25, 0xE9, 0x41, 0x46, 0x68, 0xC5, 0x69, 0x07, 0x29, 0x1D, 0xD8, + 0x8F, 0x40, 0xE1, 0x21, 0x0F, 0x42, 0x19, 0xD0, 0x02, 0x9C, 0x21, 0x03, 0x8E, 0x43, 0x51, 0x69, + 0x01, 0x91, 0x91, 0x69, 0xD7, 0x69, 0x00, 0x97, 0x09, 0x01, 0x11, 0x4F, 0x0F, 0x40, 0x37, 0x43, + 0x00, 0x99, 0x4E, 0x01, 0x3E, 0x43, 0xA1, 0x02, 0x8B, 0x43, 0x0F, 0x49, 0x09, 0x1D, 0x01, 0x9C, + 0xA4, 0x02, 0x0C, 0x40, 0x1C, 0x43, 0x91, 0x68, 0x8B, 0x02, 0x23, 0x43, 0x46, 0x60, 0x73, 0x21, + 0x8D, 0x43, 0x03, 0x99, 0x0D, 0x43, 0xC5, 0x61, 0xD1, 0x68, 0xC1, 0x63, 0x03, 0x62, 0x00, 0x23, + 0x18, 0x46, 0x04, 0xB0, 0xF0, 0xBD, 0x1C, 0x46, 0x64, 0xE7, 0xC0, 0x46, 0x00, 0xD4, 0xFE, 0xBF, + 0xF0, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xF7, 0xFF, 0xFF, 0x70, 0xB5, 0x84, 0xB0, + 0x02, 0x46, 0x03, 0x68, 0x01, 0x20, 0xDB, 0x07, 0x28, 0xD1, 0x13, 0x68, 0x29, 0x4C, 0x1C, 0x40, + 0x4B, 0x68, 0x23, 0x43, 0xCC, 0x68, 0x1C, 0x43, 0x0B, 0x69, 0x23, 0x43, 0x8C, 0x69, 0x1C, 0x43, + 0x14, 0x60, 0x03, 0x23, 0x1C, 0x03, 0x55, 0x68, 0xA5, 0x43, 0x8C, 0x68, 0x2C, 0x43, 0x54, 0x60, + 0x1B, 0x02, 0x94, 0x68, 0x9C, 0x43, 0x4B, 0x69, 0x23, 0x43, 0x93, 0x60, 0x1E, 0x4B, 0x9A, 0x42, + 0x0E, 0xD0, 0x1E, 0x4B, 0x9A, 0x42, 0x09, 0xD1, 0x0E, 0x46, 0x05, 0x46, 0x14, 0x46, 0x00, 0x20, + 0xFF, 0xF7, 0xDC, 0xFD, 0x02, 0x46, 0x00, 0x2A, 0x28, 0x46, 0x0B, 0xD1, 0x04, 0xB0, 0x70, 0xBD, + 0x0E, 0x46, 0x05, 0x46, 0x14, 0x46, 0x01, 0xA8, 0xFF, 0xF7, 0xA6, 0xFD, 0x03, 0x9A, 0x00, 0x2A, + 0x28, 0x46, 0xF3, 0xD0, 0x31, 0x68, 0x00, 0x29, 0xF0, 0xD0, 0x01, 0x20, 0xC0, 0x03, 0xB3, 0x69, + 0x83, 0x42, 0x0D, 0xD1, 0x50, 0x00, 0x4A, 0x08, 0x10, 0x18, 0xFF, 0xF7, 0x13, 0xFB, 0x0C, 0x49, + 0x01, 0x40, 0x00, 0x07, 0x40, 0x0F, 0x40, 0x18, 0xE0, 0x60, 0x00, 0x20, 0x04, 0xB0, 0x70, 0xBD, + 0x48, 0x08, 0x80, 0x18, 0xFF, 0xF7, 0x06, 0xFB, 0x80, 0xB2, 0xE0, 0x60, 0x00, 0x20, 0x04, 0xB0, + 0x70, 0xBD, 0xC0, 0x46, 0xF3, 0x69, 0xFF, 0xFF, 0x00, 0x44, 0x00, 0x40, 0x00, 0x38, 0x01, 0x40, + 0xF0, 0xFF, 0x00, 0x00, 0x06, 0x48, 0x07, 0x49, 0x01, 0x60, 0x07, 0x49, 0x01, 0x60, 0x02, 0x21, + 0x41, 0x60, 0x7D, 0x21, 0x49, 0x01, 0x81, 0x60, 0x04, 0x49, 0x01, 0x60, 0x70, 0x47, 0xC0, 0x46, + 0x00, 0x30, 0x00, 0x40, 0xCC, 0xCC, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, + 0xF0, 0xB5, 0x9F, 0xB0, 0x00, 0x26, 0x1D, 0x96, 0x1C, 0x96, 0x1B, 0x96, 0x1A, 0x96, 0x19, 0x96, + 0x18, 0x96, 0x17, 0x96, 0x16, 0x96, 0x15, 0x96, 0x14, 0x96, 0x13, 0x96, 0x12, 0x96, 0x11, 0x96, + 0x10, 0x96, 0x0F, 0x96, 0x0E, 0x96, 0x0D, 0x96, 0x0C, 0x96, 0x0B, 0x96, 0x0A, 0x96, 0x09, 0x96, + 0x08, 0x96, 0x07, 0x96, 0x06, 0x96, 0x05, 0x96, 0x01, 0x24, 0xE2, 0x02, 0x04, 0x92, 0x6B, 0x49, + 0x48, 0x68, 0x10, 0x43, 0x48, 0x60, 0x48, 0x68, 0x10, 0x40, 0x1E, 0x90, 0x1E, 0x98, 0x19, 0xA9, + 0x0E, 0x74, 0x0E, 0x80, 0x1C, 0x96, 0x10, 0x46, 0x31, 0x38, 0x1B, 0x90, 0x1A, 0x96, 0x64, 0x4D, + 0x28, 0x46, 0xFF, 0xF7, 0xE1, 0xFD, 0x28, 0x68, 0x80, 0x21, 0x01, 0x91, 0x08, 0x43, 0x28, 0x60, + 0xA8, 0x68, 0x60, 0x49, 0x01, 0x40, 0xA9, 0x60, 0xA8, 0x69, 0x08, 0x21, 0x02, 0x91, 0x08, 0x43, + 0xA8, 0x61, 0x12, 0x96, 0x13, 0x96, 0x14, 0x96, 0x15, 0x96, 0x16, 0x96, 0x17, 0x96, 0x18, 0x96, + 0x60, 0x20, 0x11, 0x90, 0x11, 0xAF, 0x28, 0x46, 0x21, 0x46, 0x3A, 0x46, 0xFF, 0xF7, 0x22, 0xFE, + 0x04, 0x20, 0xC1, 0x43, 0x00, 0x91, 0xA8, 0x69, 0x08, 0x40, 0xA8, 0x61, 0xA8, 0x69, 0x04, 0x99, + 0x08, 0x43, 0xA8, 0x61, 0x13, 0x96, 0x12, 0x96, 0x10, 0x21, 0x28, 0x46, 0x3A, 0x46, 0xFF, 0xF7, + 0x11, 0xFE, 0xA8, 0x69, 0x4C, 0x49, 0x08, 0x40, 0xA8, 0x61, 0xE8, 0x69, 0x02, 0x99, 0x08, 0x43, + 0xE8, 0x61, 0x13, 0x96, 0x12, 0x96, 0x21, 0x02, 0x02, 0x91, 0x28, 0x46, 0x3A, 0x46, 0xFF, 0xF7, + 0x01, 0xFE, 0xE8, 0x69, 0x00, 0x99, 0x08, 0x40, 0xE8, 0x61, 0xE8, 0x69, 0x04, 0x99, 0x08, 0x43, + 0xE8, 0x61, 0x13, 0x96, 0x12, 0x96, 0x21, 0x03, 0x28, 0x46, 0x3A, 0x46, 0xFF, 0xF7, 0xF2, 0xFD, + 0xE8, 0x69, 0x3D, 0x49, 0x08, 0x40, 0xE8, 0x61, 0x68, 0x68, 0x70, 0x21, 0x88, 0x43, 0x68, 0x60, + 0x0B, 0xA9, 0xCE, 0x81, 0x18, 0x20, 0x08, 0x73, 0xA8, 0x68, 0x01, 0x9F, 0xB8, 0x43, 0xA8, 0x60, + 0x10, 0x96, 0x60, 0x03, 0x0F, 0x90, 0x0D, 0x96, 0x0C, 0x96, 0x0B, 0x96, 0x28, 0x46, 0xFF, 0xF7, + 0x5B, 0xFD, 0x25, 0x46, 0x60, 0x04, 0x2D, 0x4B, 0x19, 0x68, 0x01, 0x43, 0x19, 0x60, 0x19, 0x68, + 0x01, 0x40, 0x1E, 0x91, 0x1E, 0x98, 0xA0, 0x04, 0x03, 0x94, 0x19, 0x68, 0x01, 0x43, 0x19, 0x60, + 0x19, 0x68, 0x01, 0x40, 0x1E, 0x91, 0x02, 0x24, 0x0A, 0x94, 0x09, 0x96, 0x08, 0x96, 0x07, 0x96, + 0x06, 0x94, 0x05, 0x97, 0x1E, 0x98, 0x09, 0x20, 0xC0, 0x06, 0x04, 0x90, 0x05, 0xAF, 0x39, 0x46, + 0xFF, 0xF7, 0x3C, 0xFC, 0x0A, 0x94, 0x09, 0x96, 0x08, 0x96, 0x07, 0x96, 0x06, 0x94, 0x05, 0x95, + 0x1E, 0x4D, 0x28, 0x46, 0x39, 0x46, 0xFF, 0xF7, 0x31, 0xFC, 0x0A, 0x94, 0x09, 0x96, 0x08, 0x96, + 0x07, 0x96, 0x06, 0x94, 0x05, 0x94, 0x28, 0x46, 0x39, 0x46, 0xFF, 0xF7, 0x27, 0xFC, 0x0A, 0x94, + 0x09, 0x96, 0x08, 0x96, 0x07, 0x96, 0x06, 0x94, 0x02, 0x98, 0x05, 0x90, 0x04, 0x9D, 0x28, 0x46, + 0x39, 0x46, 0xFF, 0xF7, 0x1B, 0xFC, 0x0A, 0x94, 0x09, 0x96, 0x08, 0x96, 0x07, 0x96, 0x06, 0x94, + 0x03, 0x98, 0x40, 0x02, 0x05, 0x90, 0x28, 0x46, 0x39, 0x46, 0xFF, 0xF7, 0x0F, 0xFC, 0x0A, 0x94, + 0x09, 0x96, 0x08, 0x96, 0x07, 0x96, 0x06, 0x94, 0x03, 0x98, 0x80, 0x02, 0x05, 0x90, 0x28, 0x46, + 0x39, 0x46, 0xFF, 0xF7, 0x03, 0xFC, 0x1F, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x14, 0x10, 0x02, 0x40, + 0x00, 0x2C, 0x01, 0x40, 0xF8, 0xBF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x48, + 0x70, 0x47, 0x70, 0x47, 0xF0, 0xB5, 0x81, 0xB0, 0x33, 0x48, 0x01, 0x68, 0x01, 0x25, 0xA9, 0x43, + 0x01, 0x60, 0x32, 0x4C, 0xE0, 0x7C, 0xE1, 0x7B, 0x01, 0x29, 0x0A, 0xD1, 0x40, 0x1C, 0xE0, 0x74, + 0xC1, 0xB2, 0x07, 0x29, 0x03, 0xD3, 0x2E, 0x48, 0x05, 0x73, 0xE5, 0x74, 0x28, 0x46, 0x28, 0x40, + 0x09, 0xE0, 0x41, 0x1E, 0xE1, 0x74, 0x08, 0x06, 0x03, 0xD1, 0x29, 0x48, 0x05, 0x73, 0x06, 0x21, + 0xE1, 0x74, 0x28, 0x46, 0x88, 0x43, 0xA0, 0x73, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, 0x24, 0x4F, + 0xF8, 0x7B, 0x00, 0x28, 0x02, 0xD1, 0xE0, 0x7C, 0x00, 0xF0, 0x20, 0xFA, 0x62, 0xB6, 0x00, 0xF0, + 0xFD, 0xF9, 0x20, 0x4E, 0x30, 0x68, 0x20, 0x49, 0x88, 0x42, 0x00, 0xD3, 0xE5, 0x72, 0x00, 0x20, + 0xF8, 0x76, 0x38, 0x77, 0xE0, 0x7C, 0x40, 0x00, 0x80, 0x19, 0x21, 0x6D, 0x41, 0x82, 0x48, 0x20, + 0x38, 0x5A, 0x4A, 0x22, 0xBA, 0x5A, 0x10, 0x18, 0x40, 0x08, 0x40, 0x18, 0x41, 0x08, 0x21, 0x65, + 0x2F, 0x22, 0xF1, 0x4B, 0x9A, 0x5C, 0x00, 0x2A, 0x03, 0xD0, 0x7A, 0x7F, 0x4A, 0x43, 0x91, 0x09, + 0x02, 0xE0, 0xA2, 0x78, 0x01, 0x09, 0x51, 0x43, 0x80, 0x08, 0x40, 0x1A, 0x42, 0x22, 0xB8, 0x52, + 0x39, 0x87, 0xE0, 0x7A, 0x00, 0x28, 0x05, 0xD0, 0xB0, 0x68, 0x0C, 0x49, 0x88, 0x42, 0x07, 0xD9, + 0x01, 0xB0, 0xF0, 0xBD, 0x01, 0xF0, 0x3E, 0xF8, 0xB0, 0x68, 0x08, 0x49, 0x88, 0x42, 0xF7, 0xD8, + 0x40, 0x1C, 0xB0, 0x60, 0x01, 0xB0, 0xF0, 0xBD, 0x0C, 0x20, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x20, + 0x00, 0x05, 0x00, 0x20, 0x7C, 0x05, 0x00, 0x20, 0xC5, 0x09, 0x00, 0x00, 0x0F, 0x27, 0x00, 0x00, + 0x70, 0x47, 0x70, 0x47, 0xB0, 0xB5, 0x45, 0x49, 0x0A, 0x68, 0x01, 0x20, 0x02, 0x43, 0x0A, 0x60, + 0x09, 0x68, 0x43, 0x4D, 0x29, 0x68, 0x01, 0x43, 0x29, 0x60, 0x29, 0x68, 0x89, 0x07, 0x08, 0xD4, + 0x29, 0x68, 0x89, 0x07, 0x05, 0xD4, 0x29, 0x68, 0x89, 0x07, 0x02, 0xD4, 0x29, 0x68, 0x89, 0x07, + 0xF3, 0xD5, 0x2B, 0x68, 0x80, 0x21, 0x0B, 0x43, 0x78, 0x22, 0x93, 0x43, 0x2B, 0x60, 0x6B, 0x6B, + 0x03, 0x43, 0x6B, 0x63, 0x6B, 0x6B, 0x9B, 0x07, 0x08, 0xD4, 0x6B, 0x6B, 0x9B, 0x07, 0x05, 0xD4, + 0x6B, 0x6B, 0x9B, 0x07, 0x02, 0xD4, 0x6B, 0x6B, 0x9B, 0x07, 0xF3, 0xD5, 0x6B, 0x6B, 0x0B, 0x43, + 0x93, 0x43, 0x6B, 0x63, 0x69, 0x6A, 0x01, 0x43, 0x69, 0x62, 0x69, 0x6A, 0x89, 0x07, 0x08, 0xD4, + 0x69, 0x6A, 0x89, 0x07, 0x05, 0xD4, 0x69, 0x6A, 0x89, 0x07, 0x02, 0xD4, 0x69, 0x6A, 0x89, 0x07, + 0xF3, 0xD5, 0x3D, 0x21, 0x09, 0x04, 0x6A, 0x68, 0x8A, 0x43, 0x05, 0x21, 0xC9, 0x04, 0x51, 0x18, + 0x69, 0x60, 0xE9, 0x6A, 0x0F, 0x22, 0x91, 0x43, 0xE9, 0x62, 0x01, 0x06, 0x2A, 0x68, 0x0A, 0x43, + 0x2A, 0x60, 0x41, 0x06, 0x2A, 0x68, 0x0A, 0x42, 0x08, 0xD1, 0x2A, 0x68, 0x0A, 0x42, 0x05, 0xD1, + 0x2A, 0x68, 0x0A, 0x42, 0x02, 0xD1, 0x2A, 0x68, 0x0A, 0x42, 0xF3, 0xD0, 0x69, 0x68, 0xF0, 0x22, + 0x91, 0x43, 0x69, 0x60, 0x07, 0x21, 0x09, 0x02, 0x6A, 0x68, 0x8A, 0x43, 0x6A, 0x60, 0x69, 0x68, + 0x02, 0x22, 0x0A, 0x43, 0x82, 0x43, 0x6A, 0x60, 0x69, 0x68, 0x0C, 0x20, 0x01, 0x40, 0x08, 0x29, + 0x0B, 0xD0, 0x69, 0x68, 0x01, 0x40, 0x08, 0x29, 0x07, 0xD0, 0x69, 0x68, 0x01, 0x40, 0x08, 0x29, + 0x03, 0xD0, 0x69, 0x68, 0x01, 0x40, 0x08, 0x29, 0xEE, 0xD1, 0x0A, 0x4C, 0x20, 0x46, 0xFF, 0xF7, + 0x5B, 0xFB, 0x20, 0x46, 0xFF, 0xF7, 0xF2, 0xFB, 0x68, 0x6B, 0x04, 0x21, 0x88, 0x43, 0x68, 0x63, + 0x28, 0x6B, 0x03, 0x21, 0x88, 0x43, 0x28, 0x63, 0xB0, 0xBD, 0xC0, 0x46, 0x00, 0x20, 0x02, 0x40, + 0x00, 0x10, 0x02, 0x40, 0x00, 0x6C, 0xDC, 0x02, 0x70, 0x47, 0x00, 0x00, 0x80, 0xB5, 0x01, 0x20, + 0xC0, 0x43, 0x02, 0x49, 0x08, 0x60, 0xFF, 0xF7, 0xED, 0xFE, 0x80, 0xBD, 0x10, 0x20, 0x00, 0x40, + 0x02, 0x20, 0xC0, 0x43, 0x07, 0x49, 0x0A, 0x68, 0x92, 0x07, 0x03, 0xD4, 0x0A, 0x68, 0xD2, 0x07, + 0x04, 0xD1, 0x70, 0x47, 0x08, 0x60, 0x0A, 0x68, 0xD2, 0x07, 0xFA, 0xD0, 0x40, 0x1C, 0x08, 0x60, + 0x70, 0x47, 0xC0, 0x46, 0x10, 0x40, 0x01, 0x40, 0x70, 0x47, 0x00, 0x00, 0x02, 0x20, 0xC0, 0x43, + 0x07, 0x49, 0x0A, 0x68, 0x92, 0x07, 0x03, 0xD4, 0x0A, 0x68, 0xD2, 0x07, 0x04, 0xD1, 0x70, 0x47, + 0x08, 0x60, 0x0A, 0x68, 0xD2, 0x07, 0xFA, 0xD0, 0x40, 0x1C, 0x08, 0x60, 0x70, 0x47, 0xC0, 0x46, + 0x10, 0x2C, 0x01, 0x40, 0x02, 0x20, 0xC0, 0x43, 0x07, 0x49, 0x0A, 0x68, 0x92, 0x07, 0x03, 0xD4, + 0x0A, 0x68, 0xD2, 0x07, 0x04, 0xD1, 0x70, 0x47, 0x08, 0x60, 0x0A, 0x68, 0xD2, 0x07, 0xFA, 0xD0, + 0x40, 0x1C, 0x08, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x10, 0x04, 0x00, 0x40, 0x80, 0xB5, 0x05, 0x48, + 0x01, 0x68, 0xC9, 0x07, 0x04, 0xD0, 0x01, 0x21, 0xC9, 0x43, 0x01, 0x60, 0x03, 0xF0, 0x22, 0xFB, + 0x80, 0xBD, 0xC0, 0x46, 0x10, 0x10, 0x00, 0x40, 0x70, 0x47, 0x00, 0x00, 0x81, 0xB0, 0x00, 0x20, + 0x00, 0x90, 0x22, 0x48, 0x02, 0x68, 0x22, 0x49, 0x0A, 0x40, 0x52, 0x18, 0x18, 0x32, 0x02, 0x60, + 0x02, 0x68, 0x00, 0x2A, 0x08, 0xD5, 0x02, 0x68, 0x00, 0x2A, 0x05, 0xD5, 0x02, 0x68, 0x00, 0x2A, + 0x02, 0xD5, 0x02, 0x68, 0x00, 0x2A, 0xF3, 0xD4, 0x01, 0x22, 0x00, 0x92, 0x00, 0x9B, 0x00, 0x2B, + 0x17, 0xD0, 0x00, 0x9B, 0x5B, 0x1E, 0x00, 0x93, 0x00, 0x9B, 0x00, 0x2B, 0x11, 0xD0, 0x00, 0x9B, + 0x5B, 0x1E, 0x00, 0x93, 0x00, 0x9B, 0x00, 0x2B, 0x0B, 0xD0, 0x00, 0x9B, 0x5B, 0x1E, 0x00, 0x93, + 0x00, 0x9B, 0x00, 0x2B, 0x05, 0xD0, 0x00, 0x9B, 0x5B, 0x1E, 0x00, 0x93, 0x00, 0x9B, 0x00, 0x2B, + 0xE7, 0xD1, 0x03, 0x68, 0x0B, 0x40, 0x13, 0x43, 0x03, 0x60, 0x01, 0x46, 0x08, 0x39, 0x0A, 0x68, + 0xD2, 0x07, 0x08, 0xD1, 0x0A, 0x68, 0xD2, 0x07, 0x05, 0xD1, 0x0A, 0x68, 0xD2, 0x07, 0x02, 0xD1, + 0x09, 0x68, 0xC9, 0x07, 0xF1, 0xD0, 0x01, 0xB0, 0x70, 0x47, 0xC0, 0x46, 0x08, 0x24, 0x01, 0x40, + 0xE8, 0xFF, 0xFF, 0x7F, 0x70, 0xB5, 0x03, 0x21, 0x8A, 0x03, 0x09, 0x20, 0xC0, 0x06, 0x03, 0x68, + 0x93, 0x43, 0x01, 0x22, 0x94, 0x03, 0x1B, 0x19, 0x03, 0x60, 0x80, 0x23, 0x83, 0x62, 0x0B, 0x04, + 0x04, 0x68, 0x9C, 0x43, 0x13, 0x04, 0xE3, 0x18, 0x03, 0x60, 0x13, 0x02, 0x83, 0x62, 0xEB, 0x4B, + 0x1D, 0x68, 0x15, 0x43, 0x02, 0x24, 0xA5, 0x43, 0x1D, 0x60, 0x9A, 0x62, 0x8D, 0x04, 0x06, 0x68, + 0xAE, 0x43, 0x95, 0x04, 0x75, 0x19, 0x05, 0x60, 0x55, 0x02, 0x85, 0x62, 0x1D, 0x68, 0x04, 0x26, + 0x2E, 0x43, 0x08, 0x25, 0xAE, 0x43, 0x1E, 0x60, 0x9C, 0x62, 0x09, 0x05, 0x03, 0x68, 0x8B, 0x43, + 0x11, 0x05, 0x59, 0x18, 0x01, 0x60, 0x91, 0x02, 0x81, 0x62, 0x70, 0xBD, 0x70, 0xB5, 0xDC, 0x4A, + 0x14, 0x7D, 0x03, 0x21, 0x8D, 0x03, 0x09, 0x20, 0xC0, 0x06, 0x03, 0x68, 0xAB, 0x43, 0x00, 0x2C, + 0x04, 0xD0, 0x01, 0x24, 0xE4, 0x03, 0x23, 0x43, 0x03, 0x60, 0x05, 0xE0, 0x01, 0x24, 0xA4, 0x03, + 0x23, 0x43, 0x03, 0x60, 0x80, 0x23, 0x83, 0x62, 0x0B, 0x04, 0x04, 0x68, 0x9C, 0x43, 0x01, 0x23, + 0x5D, 0x04, 0x64, 0x19, 0x04, 0x60, 0x16, 0x7D, 0xCC, 0x4C, 0x25, 0x68, 0x8D, 0x43, 0x00, 0x2E, + 0x03, 0xD0, 0x02, 0x26, 0x35, 0x43, 0x25, 0x60, 0x02, 0xE0, 0x1D, 0x43, 0x25, 0x60, 0xA3, 0x62, + 0x8D, 0x04, 0x06, 0x68, 0xAE, 0x43, 0xDD, 0x04, 0x75, 0x19, 0x05, 0x60, 0x15, 0x7D, 0x22, 0x68, + 0x0C, 0x26, 0xB2, 0x43, 0x00, 0x2D, 0x03, 0xD0, 0x08, 0x25, 0x2A, 0x43, 0x22, 0x60, 0x04, 0xE0, + 0x04, 0x25, 0x2A, 0x43, 0x22, 0x60, 0x02, 0x22, 0xA2, 0x62, 0x09, 0x05, 0x02, 0x68, 0x8A, 0x43, + 0x59, 0x05, 0x51, 0x18, 0x01, 0x60, 0x70, 0xBD, 0xDC, 0x06, 0x00, 0x20, 0x0C, 0x48, 0x00, 0x68, + 0x00, 0x09, 0x18, 0x28, 0x01, 0xD8, 0x00, 0x20, 0x00, 0xE0, 0x01, 0x20, 0x80, 0x00, 0xB8, 0x49, + 0x0A, 0x68, 0x04, 0x23, 0x9A, 0x43, 0x10, 0x18, 0x08, 0x60, 0x06, 0x48, 0x01, 0x78, 0x4A, 0x42, + 0x4A, 0x41, 0x51, 0x05, 0x04, 0x4A, 0x11, 0x60, 0x00, 0x78, 0x40, 0x05, 0x50, 0x60, 0x70, 0x47, + 0x7C, 0x05, 0x00, 0x20, 0xCE, 0x00, 0x00, 0x20, 0x08, 0x04, 0x01, 0x40, 0xF0, 0xB5, 0x41, 0x1E, + 0x05, 0x29, 0x00, 0xD9, 0x48, 0xE1, 0x09, 0x20, 0xC0, 0x06, 0xC0, 0x46, 0x79, 0x44, 0x09, 0x79, + 0x49, 0x00, 0x8F, 0x44, 0x02, 0xB9, 0x5B, 0x8A, 0x2E, 0xE8, 0xA0, 0x4B, 0x19, 0x68, 0x04, 0x22, + 0x0A, 0x43, 0x08, 0x21, 0x8A, 0x43, 0x1A, 0x60, 0x02, 0x24, 0x9C, 0x62, 0x03, 0x22, 0x11, 0x05, + 0x05, 0x68, 0x8D, 0x43, 0x01, 0x21, 0x0E, 0x05, 0xAD, 0x19, 0x05, 0x60, 0x8D, 0x02, 0x85, 0x62, + 0x1D, 0x68, 0x0D, 0x43, 0xA5, 0x43, 0x1D, 0x60, 0x99, 0x61, 0x93, 0x04, 0x04, 0x68, 0x9C, 0x43, + 0x8B, 0x04, 0xE3, 0x18, 0x03, 0x60, 0x4B, 0x02, 0x83, 0x62, 0x91, 0x4B, 0x1B, 0x7D, 0x94, 0x03, + 0x02, 0x68, 0xA2, 0x43, 0x00, 0x2B, 0x00, 0xD1, 0xFB, 0xE0, 0xCB, 0x03, 0x1A, 0x43, 0x02, 0x60, + 0xFC, 0xE0, 0x03, 0x22, 0x91, 0x03, 0x03, 0x68, 0x8B, 0x43, 0x01, 0x21, 0x8C, 0x03, 0x1B, 0x19, + 0x03, 0x60, 0x80, 0x23, 0x83, 0x62, 0x13, 0x04, 0x04, 0x68, 0x9C, 0x43, 0x0B, 0x04, 0xE3, 0x18, + 0x03, 0x60, 0x0B, 0x02, 0x83, 0x62, 0x81, 0x4B, 0x1C, 0x68, 0x04, 0x25, 0x25, 0x43, 0x08, 0x24, + 0xA5, 0x43, 0x1D, 0x60, 0x02, 0x24, 0x9C, 0x61, 0x15, 0x05, 0x06, 0x68, 0xAE, 0x43, 0x0D, 0x05, + 0x75, 0x19, 0x05, 0x60, 0x8D, 0x02, 0x85, 0x62, 0x79, 0x4D, 0x2E, 0x7D, 0x1D, 0x68, 0x95, 0x43, + 0x00, 0x2E, 0x00, 0xD1, 0xBC, 0xE0, 0x25, 0x43, 0x1D, 0x60, 0xBC, 0xE0, 0x73, 0x4B, 0x1A, 0x68, + 0x01, 0x21, 0x0A, 0x43, 0x02, 0x24, 0xA2, 0x43, 0x1A, 0x60, 0x99, 0x62, 0x03, 0x22, 0x95, 0x04, + 0x06, 0x68, 0xAE, 0x43, 0x8D, 0x04, 0x75, 0x19, 0x05, 0x60, 0x4D, 0x02, 0x85, 0x62, 0x95, 0x03, + 0x06, 0x68, 0xAE, 0x43, 0x8D, 0x03, 0x75, 0x19, 0x05, 0x60, 0x80, 0x25, 0x85, 0x61, 0x12, 0x04, + 0x05, 0x68, 0x95, 0x43, 0x0A, 0x04, 0xAA, 0x18, 0x02, 0x60, 0x0A, 0x02, 0x82, 0x62, 0x64, 0x4A, + 0x16, 0x7D, 0x1D, 0x68, 0x0C, 0x22, 0x95, 0x43, 0x49, 0x05, 0x64, 0x4A, 0x00, 0x2E, 0x00, 0xD1, + 0x95, 0xE0, 0x08, 0x24, 0x25, 0x43, 0x1D, 0x60, 0xAF, 0xE0, 0x5C, 0x4B, 0x19, 0x68, 0x04, 0x22, + 0x0A, 0x43, 0x08, 0x21, 0x8A, 0x43, 0x1A, 0x60, 0x02, 0x24, 0x9C, 0x62, 0x03, 0x21, 0x0A, 0x05, + 0x06, 0x68, 0x96, 0x43, 0x01, 0x25, 0x2A, 0x05, 0xB2, 0x18, 0x02, 0x60, 0xAA, 0x02, 0x82, 0x62, + 0x8A, 0x03, 0x06, 0x68, 0x96, 0x43, 0xAA, 0x03, 0xB2, 0x18, 0x02, 0x60, 0x80, 0x22, 0x82, 0x61, + 0x0A, 0x04, 0x06, 0x68, 0x96, 0x43, 0x2A, 0x04, 0xB2, 0x18, 0x02, 0x60, 0x2A, 0x02, 0x82, 0x62, + 0x4B, 0x4A, 0x17, 0x7D, 0x1E, 0x68, 0x8E, 0x43, 0xE9, 0x04, 0x4B, 0x4A, 0x00, 0x2F, 0x6B, 0xD0, + 0x26, 0x43, 0x1E, 0x60, 0x51, 0x23, 0x81, 0xE0, 0x03, 0x22, 0x91, 0x03, 0x03, 0x68, 0x8B, 0x43, + 0x01, 0x21, 0x8C, 0x03, 0x1B, 0x19, 0x03, 0x60, 0x80, 0x23, 0x83, 0x62, 0x13, 0x04, 0x04, 0x68, + 0x9C, 0x43, 0x0B, 0x04, 0xE3, 0x18, 0x03, 0x60, 0x0B, 0x02, 0x83, 0x62, 0x3B, 0x4B, 0x1D, 0x68, + 0x0D, 0x43, 0x02, 0x24, 0xA5, 0x43, 0x1D, 0x60, 0x99, 0x61, 0x92, 0x04, 0x05, 0x68, 0x95, 0x43, + 0x8A, 0x04, 0xAA, 0x18, 0x02, 0x60, 0x4A, 0x02, 0x82, 0x62, 0x35, 0x4A, 0x16, 0x7D, 0x1D, 0x68, + 0x0C, 0x22, 0x95, 0x43, 0x49, 0x05, 0x35, 0x4A, 0x00, 0x2E, 0x4B, 0xD0, 0x08, 0x24, 0x25, 0x43, + 0x1D, 0x60, 0x61, 0x23, 0x52, 0xE0, 0x2D, 0x4A, 0x11, 0x68, 0x01, 0x23, 0x19, 0x43, 0x02, 0x24, + 0xA1, 0x43, 0x11, 0x60, 0x93, 0x62, 0x03, 0x21, 0x8D, 0x04, 0x06, 0x68, 0xAE, 0x43, 0x9D, 0x04, + 0x75, 0x19, 0x05, 0x60, 0x5D, 0x02, 0x85, 0x62, 0x15, 0x68, 0x04, 0x26, 0x2E, 0x43, 0x08, 0x25, + 0xAE, 0x43, 0x16, 0x60, 0x94, 0x61, 0x0A, 0x05, 0x04, 0x68, 0x94, 0x43, 0x1A, 0x05, 0xA2, 0x18, + 0x02, 0x60, 0x9A, 0x02, 0x82, 0x62, 0x1E, 0x4A, 0x15, 0x7D, 0x89, 0x03, 0x04, 0x68, 0x8C, 0x43, + 0x59, 0x04, 0x1C, 0x4A, 0x00, 0x2D, 0x23, 0xD0, 0xDB, 0x03, 0x1C, 0x43, 0x04, 0x60, 0x24, 0xE0, + 0x0D, 0x43, 0x1D, 0x60, 0x99, 0x62, 0xC9, 0x04, 0x61, 0x23, 0x17, 0x4A, 0x1E, 0xE0, 0x04, 0x26, + 0x35, 0x43, 0x1D, 0x60, 0x9C, 0x62, 0x18, 0xE0, 0x2E, 0x43, 0x1E, 0x60, 0x9D, 0x62, 0x51, 0x23, + 0x14, 0xE0, 0x8B, 0x03, 0x1A, 0x43, 0x02, 0x60, 0x80, 0x22, 0x82, 0x62, 0x49, 0x04, 0x51, 0x23, + 0x0C, 0x4A, 0x0B, 0xE0, 0x04, 0x26, 0x35, 0x43, 0x1D, 0x60, 0x9C, 0x62, 0x61, 0x23, 0x05, 0xE0, + 0x9B, 0x03, 0x1C, 0x43, 0x04, 0x60, 0x80, 0x23, 0x83, 0x62, 0x41, 0x23, 0x04, 0x68, 0x14, 0x40, + 0x0C, 0x43, 0x04, 0x60, 0x06, 0x48, 0x03, 0x60, 0xF0, 0xBD, 0xC0, 0x46, 0x00, 0x04, 0x00, 0x48, + 0xDC, 0x06, 0x00, 0x20, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, + 0x1C, 0x00, 0x01, 0x40, 0xF0, 0xB5, 0x89, 0xB0, 0xE0, 0x48, 0x02, 0x68, 0xC1, 0x6F, 0x89, 0x1A, + 0xDF, 0x4D, 0xA9, 0x81, 0x8B, 0xB2, 0x59, 0x09, 0x69, 0x81, 0xDE, 0x4C, 0x24, 0x88, 0xA3, 0x42, + 0x00, 0xD8, 0x23, 0xE1, 0xDC, 0x4C, 0x24, 0x88, 0xA3, 0x42, 0x00, 0xD3, 0x1E, 0xE1, 0xDB, 0x4B, + 0x00, 0x27, 0x1F, 0x80, 0x43, 0x68, 0x9A, 0x1A, 0x92, 0xB2, 0x01, 0x26, 0x8A, 0x42, 0x32, 0x46, + 0x00, 0xD8, 0x3A, 0x46, 0x2A, 0x62, 0x82, 0x68, 0xC3, 0x68, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, + 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x6A, 0x62, 0x02, 0x69, 0x43, 0x69, 0x9A, 0x1A, 0x92, 0xB2, + 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0xAA, 0x62, 0x82, 0x69, 0xC3, 0x69, 0x9A, 0x1A, + 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x07, 0x92, 0xEA, 0x62, 0x02, 0x6A, + 0x43, 0x6A, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x06, 0x92, + 0x2A, 0x63, 0x82, 0x6A, 0xC3, 0x6A, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, + 0x3A, 0x46, 0x05, 0x92, 0x6A, 0x63, 0x02, 0x6B, 0x43, 0x6B, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, + 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x04, 0x92, 0xAA, 0x63, 0x82, 0x6B, 0xC3, 0x6B, 0x9A, 0x1A, + 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x08, 0x92, 0xEA, 0x63, 0x02, 0x6C, + 0x43, 0x6C, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x02, 0x92, + 0x2A, 0x64, 0x82, 0x6C, 0xC3, 0x6C, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, + 0x3A, 0x46, 0x01, 0x92, 0x6A, 0x64, 0x02, 0x6D, 0x43, 0x6D, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, + 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x00, 0x92, 0xAA, 0x64, 0x82, 0x6D, 0xC3, 0x6D, 0x9A, 0x1A, + 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, 0x3A, 0x46, 0x03, 0x92, 0xEA, 0x64, 0x02, 0x6E, + 0x43, 0x6E, 0x9A, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x33, 0x46, 0x00, 0xD8, 0x3B, 0x46, 0x2B, 0x65, + 0x82, 0x6E, 0xC4, 0x6E, 0xA2, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x34, 0x46, 0x00, 0xD8, 0x3C, 0x46, + 0x6C, 0x65, 0x02, 0x6F, 0x45, 0x6F, 0xAA, 0x1A, 0x92, 0xB2, 0x8A, 0x42, 0x32, 0x46, 0x00, 0xD8, + 0x3A, 0x46, 0xB5, 0x4D, 0xAA, 0x65, 0x85, 0x6F, 0xC0, 0x6F, 0x40, 0x1B, 0x80, 0xB2, 0x88, 0x42, + 0x00, 0xD8, 0x3E, 0x46, 0xB0, 0x48, 0xC6, 0x65, 0x01, 0x6A, 0x45, 0x6A, 0x80, 0x6A, 0x06, 0x9F, + 0x79, 0x40, 0x02, 0x9F, 0x79, 0x40, 0xC9, 0x00, 0x05, 0x9F, 0x7D, 0x40, 0x01, 0x9F, 0x7D, 0x40, + 0xAD, 0x00, 0x0D, 0x43, 0x04, 0x99, 0x48, 0x40, 0x00, 0x99, 0x48, 0x40, 0x47, 0x00, 0x08, 0x98, + 0x07, 0x99, 0x48, 0x40, 0x08, 0x90, 0xD8, 0x00, 0xA1, 0x00, 0x08, 0x18, 0x51, 0x00, 0x44, 0x18, + 0xA2, 0x48, 0x00, 0x78, 0xA2, 0x4B, 0x19, 0x78, 0xC9, 0xB2, 0x01, 0x43, 0x0D, 0xD1, 0x00, 0xF0, + 0x33, 0xFD, 0x9F, 0x4B, 0x00, 0x28, 0x08, 0xD0, 0x9B, 0x49, 0x08, 0x79, 0x40, 0x1C, 0x08, 0x71, + 0xC0, 0xB2, 0x65, 0x28, 0x01, 0xD3, 0x01, 0x20, 0x18, 0x70, 0xA0, 0x19, 0x3D, 0x43, 0x08, 0x9A, + 0x03, 0x99, 0x4A, 0x40, 0x19, 0x78, 0x00, 0x29, 0x01, 0xD0, 0x0F, 0x21, 0x48, 0x40, 0xFE, 0x21, + 0x0D, 0x40, 0xA9, 0x18, 0x88, 0x42, 0x3B, 0xD1, 0x8F, 0x4C, 0x22, 0x6A, 0x63, 0x6A, 0x27, 0x46, + 0x28, 0x37, 0xE1, 0xCF, 0xA1, 0x6B, 0x07, 0x91, 0xE1, 0x6B, 0x08, 0x91, 0x92, 0x02, 0x5B, 0x02, + 0x13, 0x43, 0x02, 0x02, 0x1A, 0x43, 0xEB, 0x01, 0x13, 0x43, 0xB2, 0x01, 0x1A, 0x43, 0x7B, 0x01, + 0x13, 0x43, 0x07, 0x98, 0x01, 0x01, 0x19, 0x43, 0x08, 0x98, 0xC0, 0x00, 0x08, 0x43, 0x21, 0x6C, + 0x63, 0x6C, 0xA2, 0x6C, 0xE6, 0x6C, 0x8D, 0x00, 0x05, 0x43, 0x59, 0x00, 0x29, 0x43, 0x25, 0x46, + 0x00, 0x20, 0xEB, 0x4B, 0x18, 0x80, 0xE3, 0x89, 0x5B, 0x1C, 0xE3, 0x81, 0x01, 0x2E, 0x02, 0xD1, + 0x7C, 0x4B, 0x01, 0x24, 0x1C, 0x70, 0x11, 0x43, 0xAA, 0x79, 0x00, 0x2A, 0x15, 0xD0, 0x02, 0x2A, + 0x0E, 0xD0, 0x01, 0x2A, 0x1E, 0xD1, 0x02, 0x20, 0xA8, 0x71, 0x29, 0x82, 0x09, 0xB0, 0xF0, 0xBD, + 0x00, 0x20, 0x71, 0x49, 0x88, 0x71, 0x48, 0x8A, 0x40, 0x1C, 0x48, 0x82, 0x09, 0xB0, 0xF0, 0xBD, + 0x03, 0x20, 0xA8, 0x71, 0xE9, 0x71, 0x09, 0xB0, 0xF0, 0xBD, 0x30, 0x29, 0x15, 0xDB, 0x6A, 0x78, + 0x00, 0x2A, 0x12, 0xD0, 0x6C, 0x48, 0x00, 0x22, 0x02, 0x70, 0xDC, 0x48, 0x01, 0x80, 0xAA, 0x70, + 0x09, 0xB0, 0xF0, 0xBD, 0x03, 0x2A, 0xE9, 0xD1, 0x25, 0x29, 0xE7, 0xD1, 0x29, 0x8A, 0xEA, 0x79, + 0xD3, 0x4B, 0x5A, 0x54, 0xA8, 0x71, 0x09, 0xB0, 0xF0, 0xBD, 0x4A, 0x1E, 0x2E, 0x2A, 0x06, 0xD8, + 0x61, 0x48, 0x01, 0x70, 0xD1, 0x48, 0x00, 0x22, 0x02, 0x80, 0xC8, 0xB2, 0x0E, 0xE0, 0x00, 0x29, + 0x02, 0xD0, 0x5D, 0x48, 0x00, 0x78, 0x09, 0xE0, 0x29, 0x78, 0x01, 0x29, 0x01, 0xD1, 0x00, 0x21, + 0x69, 0x70, 0x59, 0x49, 0x08, 0x70, 0xC9, 0x49, 0x08, 0x80, 0xA8, 0x70, 0x00, 0x28, 0xC5, 0xD0, + 0x56, 0x49, 0x09, 0x78, 0x00, 0x29, 0xC1, 0xD1, 0x50, 0x49, 0x09, 0x78, 0x00, 0x29, 0xBD, 0xD0, + 0xE9, 0x78, 0x88, 0x42, 0x02, 0xD0, 0x00, 0x21, 0xA9, 0x70, 0xE8, 0x70, 0x05, 0x28, 0x05, 0xD3, + 0xA9, 0x78, 0x49, 0x1C, 0xA9, 0x70, 0xC9, 0xB2, 0x06, 0x29, 0xAF, 0xD3, 0x29, 0x46, 0x00, 0x25, + 0x8D, 0x70, 0x41, 0x1E, 0x23, 0x29, 0x00, 0xD9, 0x80, 0xE0, 0xC0, 0x46, 0x79, 0x44, 0x09, 0x79, + 0x49, 0x00, 0x8F, 0x44, 0x11, 0x4E, 0x2F, 0x6B, 0x6F, 0x3D, 0x52, 0x59, 0x78, 0x73, 0x7B, 0x1D, + 0x42, 0x27, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x15, 0x60, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x66, 0x3E, 0x49, 0x01, 0x20, 0x08, 0x70, 0x65, 0xE0, + 0xA7, 0x48, 0x40, 0x7C, 0x01, 0x21, 0x08, 0x1A, 0x39, 0x49, 0x08, 0x70, 0x14, 0x20, 0x5D, 0xE0, + 0x02, 0xF0, 0x6E, 0xF9, 0xA2, 0x48, 0x40, 0x7C, 0x40, 0x1C, 0x36, 0x49, 0x08, 0x70, 0x32, 0x48, + 0x00, 0x78, 0x53, 0xE0, 0x2C, 0x49, 0x4D, 0x71, 0x07, 0x20, 0x40, 0x02, 0xFF, 0x30, 0x08, 0x81, + 0x0E, 0x20, 0x4B, 0xE0, 0x2F, 0x49, 0x03, 0x20, 0x08, 0x70, 0x47, 0xE0, 0xD8, 0x05, 0x00, 0x20, + 0x80, 0x04, 0x00, 0x20, 0xF0, 0x04, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, 0x44, 0x05, 0x00, 0x20, + 0x29, 0x48, 0x01, 0x21, 0x01, 0x70, 0x06, 0x20, 0x38, 0xE0, 0x01, 0x21, 0x1E, 0x4B, 0x59, 0x71, + 0x07, 0x20, 0x40, 0x02, 0x18, 0x81, 0x1A, 0x78, 0x0D, 0x20, 0x01, 0x2A, 0x2E, 0xD1, 0x59, 0x70, + 0x2C, 0xE0, 0x20, 0x49, 0x02, 0x20, 0x08, 0x70, 0x28, 0xE0, 0x1D, 0x48, 0x01, 0x21, 0x01, 0x70, + 0x87, 0x48, 0x45, 0x74, 0x07, 0x20, 0x21, 0xE0, 0x19, 0x48, 0x05, 0x70, 0x84, 0x48, 0x01, 0x21, + 0x41, 0x74, 0x08, 0x20, 0x1A, 0xE0, 0x82, 0x48, 0x40, 0x7C, 0x15, 0x49, 0x08, 0x70, 0x15, 0x20, + 0x14, 0xE0, 0x01, 0x20, 0x0C, 0x49, 0x88, 0x71, 0x24, 0x20, 0x0F, 0xE0, 0x11, 0x49, 0x04, 0x20, + 0x08, 0x70, 0x0B, 0xE0, 0x0F, 0x49, 0x05, 0x20, 0x08, 0x70, 0x07, 0xE0, 0x78, 0x48, 0x01, 0x21, + 0x81, 0x74, 0x0A, 0x20, 0x02, 0xE0, 0x76, 0x48, 0x85, 0x74, 0x09, 0x20, 0x06, 0x49, 0x0D, 0x70, + 0x0A, 0x49, 0x08, 0x70, 0x09, 0xB0, 0xF0, 0xBD, 0x80, 0x04, 0x00, 0x20, 0x17, 0x05, 0x00, 0x20, + 0x10, 0x05, 0x00, 0x20, 0x0E, 0x05, 0x00, 0x20, 0xD8, 0x06, 0x00, 0x20, 0x13, 0x05, 0x00, 0x20, + 0xCF, 0x00, 0x00, 0x20, 0x0B, 0x05, 0x00, 0x20, 0x20, 0x05, 0x00, 0x20, 0x30, 0x08, 0x00, 0x20, + 0xF0, 0xB5, 0x81, 0xB0, 0x5E, 0x4E, 0x03, 0xCE, 0x08, 0x1A, 0x5E, 0x49, 0x41, 0x18, 0x5F, 0x4A, + 0x08, 0x3E, 0x91, 0x42, 0x0E, 0xD8, 0x5E, 0x4D, 0x00, 0x24, 0x2C, 0x80, 0x5D, 0x4B, 0x59, 0x78, + 0x00, 0x29, 0x09, 0xD0, 0xD9, 0x78, 0x00, 0x29, 0x66, 0xD1, 0x99, 0x78, 0x00, 0x29, 0x2D, 0xD0, + 0x18, 0x89, 0x2C, 0xE0, 0x54, 0x4D, 0x8B, 0xE0, 0x1E, 0x46, 0x59, 0x49, 0x89, 0x7C, 0x00, 0x29, + 0x0D, 0xD0, 0x59, 0x49, 0x0A, 0x88, 0x7D, 0x21, 0xCB, 0x00, 0x90, 0x42, 0x15, 0xD9, 0x52, 0x4C, + 0x24, 0x88, 0x09, 0x01, 0x00, 0x91, 0x51, 0x1C, 0x5B, 0x1C, 0x22, 0x46, 0x11, 0xE0, 0x4E, 0x49, + 0x0A, 0x88, 0x50, 0x49, 0x09, 0x88, 0x7D, 0x23, 0x1B, 0x01, 0x2F, 0x33, 0x00, 0x93, 0x2F, 0x23, + 0x01, 0xF0, 0x9A, 0xFE, 0x31, 0x28, 0x06, 0xDA, 0x06, 0xE0, 0x4A, 0x49, 0x09, 0x88, 0x00, 0x93, + 0x00, 0x23, 0x01, 0xF0, 0x91, 0xFE, 0x04, 0x46, 0x34, 0x61, 0x61, 0xE0, 0x18, 0x81, 0x49, 0x1C, + 0x99, 0x70, 0x41, 0x4F, 0x39, 0x88, 0x80, 0xB2, 0x00, 0xF0, 0x7A, 0xFB, 0x33, 0x28, 0x03, 0xD3, + 0x3C, 0x4B, 0x5C, 0x70, 0x39, 0x46, 0x20, 0xE0, 0x38, 0x88, 0x07, 0x21, 0x41, 0x43, 0x05, 0xCE, + 0x10, 0x1A, 0x40, 0x18, 0xC0, 0x08, 0x38, 0x80, 0x36, 0x4B, 0x99, 0x78, 0x08, 0x3E, 0x33, 0x29, + 0x39, 0x46, 0x12, 0xD3, 0x19, 0x38, 0x81, 0xB2, 0x34, 0x4A, 0x89, 0x18, 0xCA, 0x0F, 0x89, 0x18, + 0x49, 0x08, 0x21, 0x22, 0x1F, 0x46, 0x32, 0x4B, 0x99, 0x54, 0x01, 0x21, 0xF9, 0x70, 0x2E, 0x49, + 0x08, 0x80, 0x01, 0xF0, 0x53, 0xFF, 0x2C, 0x49, 0x3B, 0x46, 0x08, 0x88, 0x18, 0x81, 0xD8, 0x78, + 0x00, 0x28, 0x2D, 0xD0, 0x03, 0xCE, 0x08, 0x1A, 0x19, 0x79, 0x7D, 0x22, 0xD2, 0x00, 0xFA, 0x32, + 0x90, 0x42, 0x0D, 0xD2, 0x49, 0x1C, 0x1F, 0x46, 0x19, 0x71, 0x26, 0x4A, 0x13, 0x88, 0x07, 0x26, + 0x5E, 0x43, 0x30, 0x18, 0xC0, 0x08, 0x10, 0x80, 0xC8, 0xB2, 0x4C, 0x28, 0x04, 0xD2, 0x17, 0xE0, + 0x1F, 0x46, 0xC8, 0xB2, 0x4C, 0x28, 0x13, 0xD3, 0x1E, 0x48, 0x01, 0x88, 0x19, 0x31, 0x8A, 0xB2, + 0x14, 0x4B, 0x9A, 0x18, 0x33, 0x32, 0xD3, 0x0F, 0xD2, 0x18, 0x52, 0x08, 0x20, 0x23, 0x18, 0x4E, + 0xF2, 0x54, 0x7C, 0x70, 0x01, 0x80, 0x02, 0xF0, 0x53, 0xF8, 0x3C, 0x71, 0x01, 0xF0, 0xFA, 0xFE, + 0x00, 0x20, 0x28, 0x80, 0x15, 0x48, 0x02, 0x88, 0x0E, 0x49, 0x09, 0x69, 0x8C, 0x1A, 0x14, 0x4B, + 0x1B, 0x68, 0x9C, 0x42, 0x01, 0xDD, 0xD1, 0x18, 0x06, 0xE0, 0x54, 0x1A, 0x9C, 0x42, 0x03, 0xDD, + 0xD1, 0x1A, 0x01, 0x80, 0x01, 0xB0, 0xF0, 0xBD, 0x01, 0x80, 0x01, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, + 0xD8, 0x05, 0x00, 0x20, 0xDF, 0xFC, 0xFF, 0xFF, 0x3A, 0x05, 0x00, 0x20, 0x76, 0x05, 0x00, 0x00, + 0x44, 0x05, 0x00, 0x20, 0xE4, 0x04, 0x00, 0x20, 0xDC, 0x00, 0x00, 0x20, 0x2A, 0xF9, 0xFF, 0xFF, + 0xDC, 0x06, 0x00, 0x20, 0xDA, 0x00, 0x00, 0x20, 0xDE, 0x00, 0x00, 0x20, 0x3E, 0x05, 0x00, 0x20, + 0xA8, 0x01, 0x00, 0x20, 0x80, 0xB2, 0x65, 0x49, 0x0A, 0x68, 0x0B, 0x68, 0x9B, 0x1A, 0x9B, 0xB2, + 0x98, 0x42, 0x0E, 0xD9, 0x0B, 0x68, 0x9B, 0x1A, 0x9B, 0xB2, 0x98, 0x42, 0x09, 0xD9, 0x0B, 0x68, + 0x9B, 0x1A, 0x9B, 0xB2, 0x98, 0x42, 0x04, 0xD9, 0x0B, 0x68, 0x9B, 0x1A, 0x9B, 0xB2, 0x98, 0x42, + 0xEB, 0xD8, 0x70, 0x47, 0x70, 0xB5, 0x00, 0x28, 0x3D, 0xD0, 0x03, 0x25, 0x05, 0x40, 0x7D, 0x21, + 0xC9, 0x00, 0x55, 0x4A, 0x55, 0x4B, 0x00, 0x2D, 0x04, 0x46, 0x32, 0xD0, 0x1C, 0x68, 0x1E, 0x68, + 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, 0x0E, 0xD2, 0x1E, 0x68, 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, + 0x09, 0xD2, 0x1E, 0x68, 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, 0x04, 0xD2, 0x1E, 0x68, 0x36, 0x1B, + 0x16, 0x40, 0x8E, 0x42, 0xEB, 0xD3, 0x01, 0x2D, 0x03, 0xD1, 0x44, 0x1E, 0x04, 0x28, 0x36, 0xD2, + 0x19, 0xE0, 0x1C, 0x68, 0x1E, 0x68, 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, 0x0E, 0xD2, 0x1E, 0x68, + 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, 0x09, 0xD2, 0x1E, 0x68, 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, + 0x04, 0xD2, 0x1E, 0x68, 0x36, 0x1B, 0x16, 0x40, 0x8E, 0x42, 0xEB, 0xD3, 0x02, 0x2D, 0x03, 0xD1, + 0x84, 0x1E, 0x04, 0x28, 0x1B, 0xD2, 0x70, 0xBD, 0x1C, 0x68, 0x1D, 0x68, 0x2D, 0x1B, 0x15, 0x40, + 0x8D, 0x42, 0x0E, 0xD2, 0x1D, 0x68, 0x2D, 0x1B, 0x15, 0x40, 0x8D, 0x42, 0x09, 0xD2, 0x1D, 0x68, + 0x2D, 0x1B, 0x15, 0x40, 0x8D, 0x42, 0x04, 0xD2, 0x1D, 0x68, 0x2D, 0x1B, 0x15, 0x40, 0x8D, 0x42, + 0xEB, 0xD3, 0xC4, 0x1E, 0x04, 0x28, 0x02, 0xD2, 0xE5, 0xE7, 0x24, 0x1F, 0xE3, 0xD0, 0x18, 0x68, + 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x0E, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, + 0x8D, 0x42, 0x09, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x04, 0xD2, 0x1D, 0x68, + 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0xEB, 0xD3, 0x18, 0x68, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, + 0x8D, 0x42, 0x0E, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x09, 0xD2, 0x1D, 0x68, + 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x04, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, + 0xEB, 0xD3, 0x18, 0x68, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x0E, 0xD2, 0x1D, 0x68, + 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0x09, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, + 0x04, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0xEB, 0xD3, 0x18, 0x68, 0x1D, 0x68, + 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0xB8, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, + 0xB3, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, 0x15, 0x40, 0x8D, 0x42, 0xAE, 0xD2, 0x1D, 0x68, 0x2D, 0x1A, + 0x15, 0x40, 0x8D, 0x42, 0xEB, 0xD3, 0xA8, 0xE7, 0xF8, 0xFF, 0x00, 0x00, 0x24, 0x48, 0x01, 0x40, + 0xF0, 0xB5, 0x7F, 0x4B, 0xC9, 0x33, 0x7F, 0x48, 0x43, 0x80, 0x7F, 0x49, 0x0F, 0x68, 0x00, 0x25, + 0x2A, 0x46, 0x03, 0xE0, 0x52, 0x18, 0x28, 0x35, 0x78, 0x2D, 0x77, 0xD0, 0x7A, 0x49, 0x4E, 0x19, + 0x71, 0x68, 0xCF, 0x1B, 0x1B, 0xD1, 0xB7, 0x68, 0x79, 0x1A, 0x21, 0xD1, 0xF1, 0x68, 0xCF, 0x1B, + 0x27, 0xD1, 0x37, 0x69, 0x79, 0x1A, 0x2D, 0xD1, 0x71, 0x69, 0xCF, 0x1B, 0x33, 0xD1, 0xB7, 0x69, + 0x79, 0x1A, 0x39, 0xD1, 0xF1, 0x69, 0xCF, 0x1B, 0x3F, 0xD1, 0x37, 0x6A, 0x79, 0x1A, 0x45, 0xD1, + 0x71, 0x6A, 0xCF, 0x1B, 0x4B, 0xD1, 0xB7, 0x6A, 0x79, 0x1A, 0xDC, 0xD0, 0x50, 0xE0, 0x9C, 0xB2, + 0xA7, 0x42, 0x01, 0xD2, 0x47, 0x80, 0x3B, 0x46, 0xD2, 0x19, 0xB7, 0x68, 0x79, 0x1A, 0xDD, 0xD0, + 0x9C, 0xB2, 0xA1, 0x42, 0x01, 0xD2, 0x41, 0x80, 0x0B, 0x46, 0x52, 0x18, 0xF1, 0x68, 0xCF, 0x1B, + 0xD7, 0xD0, 0x9C, 0xB2, 0xA7, 0x42, 0x01, 0xD2, 0x47, 0x80, 0x3B, 0x46, 0xD2, 0x19, 0x37, 0x69, + 0x79, 0x1A, 0xD1, 0xD0, 0x9C, 0xB2, 0xA1, 0x42, 0x01, 0xD2, 0x41, 0x80, 0x0B, 0x46, 0x52, 0x18, + 0x71, 0x69, 0xCF, 0x1B, 0xCB, 0xD0, 0x9C, 0xB2, 0xA7, 0x42, 0x01, 0xD2, 0x47, 0x80, 0x3B, 0x46, + 0xD2, 0x19, 0xB7, 0x69, 0x79, 0x1A, 0xC5, 0xD0, 0x9C, 0xB2, 0xA1, 0x42, 0x01, 0xD2, 0x41, 0x80, + 0x0B, 0x46, 0x52, 0x18, 0xF1, 0x69, 0xCF, 0x1B, 0xBF, 0xD0, 0x9C, 0xB2, 0xA7, 0x42, 0x01, 0xD2, + 0x47, 0x80, 0x3B, 0x46, 0xD2, 0x19, 0x37, 0x6A, 0x79, 0x1A, 0xB9, 0xD0, 0x9C, 0xB2, 0xA1, 0x42, + 0x01, 0xD2, 0x41, 0x80, 0x0B, 0x46, 0x52, 0x18, 0x71, 0x6A, 0xCF, 0x1B, 0xB3, 0xD0, 0x9C, 0xB2, + 0xA7, 0x42, 0x01, 0xD2, 0x47, 0x80, 0x3B, 0x46, 0xD2, 0x19, 0xB7, 0x6A, 0x79, 0x1A, 0x8A, 0xD0, + 0x9C, 0xB2, 0xA1, 0x42, 0x86, 0xD2, 0x41, 0x80, 0x0B, 0x46, 0x83, 0xE7, 0x51, 0x09, 0x3F, 0x4D, + 0xA9, 0x61, 0x3F, 0x4C, 0x21, 0x78, 0x01, 0x29, 0x25, 0xD1, 0x59, 0x1E, 0x89, 0xB2, 0x02, 0x29, + 0x0A, 0xD8, 0x0F, 0x21, 0xC9, 0x01, 0x8A, 0x42, 0x06, 0xD2, 0x00, 0x21, 0xA9, 0x71, 0x39, 0x4E, + 0x31, 0x70, 0x0E, 0x26, 0x36, 0x49, 0x0E, 0xE0, 0x19, 0x1F, 0x89, 0xB2, 0x04, 0x29, 0x12, 0xD8, + 0x19, 0x21, 0xC9, 0x01, 0x8A, 0x42, 0x0E, 0xD2, 0x32, 0x49, 0x01, 0x26, 0x0E, 0x70, 0x30, 0x49, + 0x0E, 0x70, 0xA9, 0x1D, 0x07, 0x26, 0x30, 0x4F, 0x3E, 0x70, 0x01, 0x26, 0x0E, 0x70, 0x20, 0x21, + 0x01, 0x70, 0x2E, 0x49, 0x0E, 0x70, 0x1F, 0x46, 0xC9, 0x3F, 0x2D, 0x49, 0x09, 0x78, 0x01, 0x29, + 0x0D, 0xD1, 0xBD, 0xB2, 0x22, 0x4E, 0xB5, 0x42, 0x09, 0xD2, 0x26, 0x4D, 0x2F, 0x26, 0x2E, 0x70, + 0x01, 0x25, 0x27, 0x4E, 0x35, 0x70, 0x02, 0x26, 0x06, 0x70, 0x24, 0x4E, 0x35, 0x70, 0x25, 0x78, + 0x0D, 0x43, 0x00, 0xD0, 0xF0, 0xBD, 0x59, 0x1E, 0x89, 0xB2, 0x02, 0x29, 0x0A, 0xD8, 0x0F, 0x21, + 0xC9, 0x01, 0x8A, 0x42, 0x06, 0xD2, 0x00, 0x21, 0x18, 0x4A, 0x91, 0x71, 0x19, 0x4A, 0x11, 0x70, + 0x0E, 0x21, 0x0E, 0xE0, 0x19, 0x1F, 0x89, 0xB2, 0x04, 0x29, 0x14, 0x4B, 0x13, 0xD8, 0x19, 0x21, + 0xC9, 0x01, 0x8A, 0x42, 0x0F, 0xD2, 0x13, 0x49, 0x01, 0x22, 0x0A, 0x70, 0x22, 0x70, 0x9C, 0x1D, + 0x07, 0x21, 0x11, 0x4A, 0x11, 0x70, 0x01, 0x21, 0x21, 0x70, 0x20, 0x21, 0x0F, 0x4A, 0x01, 0x23, + 0x13, 0x70, 0x01, 0x70, 0xF0, 0xBD, 0xB9, 0xB2, 0x05, 0x4A, 0x91, 0x42, 0xD2, 0xD2, 0x09, 0x49, + 0x2F, 0x22, 0x0A, 0x70, 0x01, 0x21, 0x0A, 0x4A, 0x11, 0x70, 0x02, 0x21, 0xEE, 0xE7, 0xC0, 0x46, + 0x57, 0x4D, 0x00, 0x00, 0x3C, 0x01, 0x00, 0x20, 0xD8, 0x05, 0x00, 0x20, 0xE4, 0x04, 0x00, 0x20, + 0x19, 0x05, 0x00, 0x20, 0xA4, 0x01, 0x00, 0x20, 0xE1, 0x04, 0x00, 0x20, 0x18, 0x05, 0x00, 0x20, + 0x1A, 0x05, 0x00, 0x20, 0x07, 0x48, 0x08, 0x49, 0x81, 0x60, 0x08, 0x49, 0xC1, 0x60, 0x41, 0x68, + 0x07, 0x4A, 0x0A, 0x40, 0xD1, 0x1C, 0x41, 0x60, 0x01, 0x68, 0x01, 0x22, 0x0A, 0x43, 0x02, 0x60, + 0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x02, 0x40, 0x40, 0x24, 0x01, 0x40, 0x9C, 0x05, 0x00, 0x20, + 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x20, 0x40, 0x05, 0x59, 0x49, 0x0A, 0x68, 0x02, 0x43, 0x0A, 0x60, + 0x70, 0x47, 0xC0, 0x46, 0xB0, 0xB5, 0x82, 0xB0, 0x4C, 0x48, 0x01, 0x68, 0x01, 0x24, 0x21, 0x43, + 0x01, 0x60, 0x01, 0x68, 0x10, 0x22, 0x0A, 0x43, 0x02, 0x60, 0x21, 0x02, 0x02, 0x68, 0x0A, 0x43, + 0x02, 0x60, 0x01, 0x68, 0x04, 0x22, 0x0A, 0x43, 0x02, 0x60, 0x01, 0x68, 0x40, 0x22, 0x0A, 0x43, + 0x02, 0x60, 0xA1, 0x02, 0x02, 0x68, 0x0A, 0x43, 0x02, 0x60, 0x21, 0x03, 0x02, 0x68, 0x0A, 0x43, + 0x02, 0x60, 0x64, 0x21, 0x01, 0x62, 0x01, 0x46, 0x20, 0x39, 0x0A, 0x68, 0x22, 0x43, 0x0A, 0x60, + 0xE5, 0x03, 0x41, 0x6A, 0x29, 0x43, 0x41, 0x62, 0x0C, 0x38, 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, + 0x37, 0x48, 0x01, 0x6A, 0x21, 0x43, 0x01, 0x62, 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, 0x35, 0x48, + 0x01, 0x46, 0x0C, 0x39, 0x0A, 0x68, 0x22, 0x43, 0x0A, 0x60, 0x81, 0x68, 0x21, 0x43, 0x81, 0x60, + 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, 0x01, 0x68, 0xA1, 0x43, 0x01, 0x60, 0x2E, 0x48, 0x01, 0x68, + 0x21, 0x43, 0x01, 0x60, 0x41, 0x69, 0x21, 0x43, 0x41, 0x61, 0xA0, 0x07, 0x01, 0x68, 0x21, 0x43, + 0x01, 0x60, 0x41, 0x69, 0x21, 0x43, 0x41, 0x61, 0x28, 0x48, 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, + 0x41, 0x69, 0x21, 0x43, 0x41, 0x61, 0xC1, 0x68, 0x21, 0x43, 0xC1, 0x60, 0xFE, 0xF7, 0x9C, 0xF9, + 0xFF, 0xF7, 0x80, 0xFF, 0xFF, 0xF7, 0x5A, 0xF8, 0x00, 0x20, 0x01, 0x90, 0x51, 0x48, 0x01, 0x68, + 0x21, 0x43, 0x01, 0x60, 0x1E, 0x48, 0x00, 0x68, 0x1E, 0x49, 0xFE, 0xF7, 0xCB, 0xF8, 0x06, 0x21, + 0x41, 0x43, 0x01, 0x91, 0x01, 0x98, 0x00, 0x28, 0x17, 0xD0, 0x01, 0x98, 0x40, 0x1E, 0x01, 0x90, + 0x01, 0x98, 0x00, 0x28, 0x11, 0xD0, 0x01, 0x98, 0x40, 0x1E, 0x01, 0x90, 0x01, 0x98, 0x00, 0x28, + 0x0B, 0xD0, 0x01, 0x98, 0x40, 0x1E, 0x01, 0x90, 0x01, 0x98, 0x00, 0x28, 0x05, 0xD0, 0x01, 0x98, + 0x40, 0x1E, 0x01, 0x90, 0x01, 0x98, 0x00, 0x28, 0xE7, 0xD1, 0xFF, 0x20, 0x00, 0x06, 0x0E, 0x49, + 0x0A, 0x68, 0x82, 0x43, 0xE0, 0x07, 0x10, 0x18, 0x08, 0x60, 0x0C, 0x48, 0x80, 0x21, 0x01, 0x60, + 0x0B, 0x48, 0x01, 0x68, 0x29, 0x43, 0x01, 0x60, 0x02, 0xB0, 0xB0, 0xBD, 0x20, 0x2C, 0x01, 0x40, + 0x00, 0x04, 0x00, 0x40, 0x0C, 0x20, 0x00, 0x40, 0x00, 0x48, 0x01, 0x40, 0x00, 0x10, 0x00, 0x40, + 0x9C, 0x01, 0x00, 0x20, 0x40, 0x0D, 0x03, 0x00, 0x04, 0xE4, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, + 0x00, 0x04, 0x01, 0x40, 0x70, 0xB5, 0x03, 0x21, 0x8A, 0x03, 0x09, 0x20, 0xC0, 0x06, 0x03, 0x68, + 0x93, 0x43, 0x01, 0x22, 0x94, 0x03, 0x1B, 0x19, 0x03, 0x60, 0x80, 0x23, 0x83, 0x61, 0x0B, 0x04, + 0x04, 0x68, 0x9C, 0x43, 0x13, 0x04, 0xE3, 0x18, 0x03, 0x60, 0x13, 0x02, 0x83, 0x62, 0x0F, 0x4B, + 0x1D, 0x68, 0x15, 0x43, 0x02, 0x24, 0xA5, 0x43, 0x1D, 0x60, 0x9A, 0x61, 0x8D, 0x04, 0x06, 0x68, + 0xAE, 0x43, 0x95, 0x04, 0x75, 0x19, 0x05, 0x60, 0x55, 0x02, 0x85, 0x62, 0x1D, 0x68, 0x04, 0x26, + 0x2E, 0x43, 0x08, 0x25, 0xAE, 0x43, 0x1E, 0x60, 0x9C, 0x61, 0x09, 0x05, 0x03, 0x68, 0x8B, 0x43, + 0x11, 0x05, 0x59, 0x18, 0x01, 0x60, 0x91, 0x02, 0x81, 0x62, 0x70, 0xBD, 0x00, 0x04, 0x00, 0x48, + 0x02, 0x48, 0x01, 0x68, 0x01, 0x22, 0x0A, 0x43, 0x02, 0x60, 0x70, 0x47, 0x14, 0x2C, 0x01, 0x40, + 0x40, 0x1A, 0xC1, 0x17, 0x48, 0x40, 0x40, 0x1A, 0x70, 0x47, 0x00, 0x00, 0x07, 0x48, 0x00, 0x68, + 0xC0, 0x00, 0x07, 0x49, 0x40, 0x18, 0x01, 0x21, 0x89, 0x03, 0x81, 0x40, 0x05, 0x4A, 0x12, 0x68, + 0x0A, 0x40, 0x0E, 0x30, 0xC2, 0x40, 0xD0, 0xB2, 0x70, 0x47, 0xC0, 0x46, 0xA0, 0x01, 0x00, 0x20, + 0x20, 0xFF, 0xF7, 0xFF, 0x1C, 0x00, 0x01, 0x40, 0x02, 0x48, 0x01, 0x68, 0x10, 0x20, 0x08, 0x40, + 0x70, 0x47, 0xC0, 0x46, 0x10, 0x04, 0x00, 0x48, 0xF0, 0xB5, 0x00, 0x29, 0x34, 0xD0, 0x01, 0x22, + 0x0A, 0x40, 0x01, 0x29, 0x33, 0xD1, 0x00, 0x21, 0x0D, 0x46, 0x00, 0x2A, 0x2A, 0xD0, 0x42, 0x5C, + 0x6A, 0x40, 0x51, 0x00, 0x07, 0x20, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD5, 0xC1, 0xE0, 0x4A, 0x00, + 0x49, 0xB2, 0x00, 0x29, 0x00, 0xD5, 0xC2, 0xE0, 0x51, 0x00, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD5, + 0xC3, 0xE0, 0x4A, 0x00, 0x49, 0xB2, 0x00, 0x29, 0x00, 0xD5, 0xC4, 0xE0, 0x51, 0x00, 0x52, 0xB2, + 0x00, 0x2A, 0x00, 0xD5, 0xC5, 0xE0, 0x4A, 0x00, 0x49, 0xB2, 0x00, 0x29, 0x00, 0xD5, 0xC6, 0xE0, + 0x51, 0x00, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD5, 0xC7, 0xE0, 0x4D, 0x00, 0x49, 0xB2, 0x00, 0x29, + 0x00, 0xD5, 0x45, 0x40, 0xE8, 0xB2, 0xF0, 0xBD, 0x00, 0x25, 0xE8, 0xB2, 0xF0, 0xBD, 0xFE, 0x23, + 0x0B, 0x40, 0x00, 0x21, 0x0D, 0x46, 0x02, 0xE0, 0x89, 0x1C, 0x8B, 0x42, 0xC5, 0xD0, 0x46, 0x5C, + 0x6E, 0x40, 0x75, 0x00, 0x07, 0x24, 0x76, 0xB2, 0x00, 0x2E, 0x40, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, + 0x00, 0x2D, 0x41, 0xD4, 0x75, 0x00, 0x76, 0xB2, 0x00, 0x2E, 0x42, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, + 0x00, 0x2D, 0x43, 0xD4, 0x75, 0x00, 0x76, 0xB2, 0x00, 0x2E, 0x44, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, + 0x00, 0x2D, 0x45, 0xD4, 0x77, 0x00, 0x75, 0xB2, 0x00, 0x2D, 0x46, 0xD4, 0x7D, 0x00, 0x7E, 0xB2, + 0x00, 0x2E, 0x00, 0xD5, 0x65, 0x40, 0x46, 0x18, 0x76, 0x78, 0x6E, 0x40, 0x75, 0x00, 0x76, 0xB2, + 0x00, 0x2E, 0x40, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0x41, 0xD4, 0x75, 0x00, 0x76, 0xB2, + 0x00, 0x2E, 0x42, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0x43, 0xD4, 0x75, 0x00, 0x76, 0xB2, + 0x00, 0x2E, 0x44, 0xD4, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0x45, 0xD4, 0x77, 0x00, 0x75, 0xB2, + 0x00, 0x2D, 0x46, 0xD4, 0x7D, 0x00, 0x7E, 0xB2, 0x00, 0x2E, 0xB5, 0xD5, 0x47, 0xE0, 0x65, 0x40, + 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0xBD, 0xD5, 0x66, 0x40, 0x75, 0x00, 0x76, 0xB2, 0x00, 0x2E, + 0xBC, 0xD5, 0x65, 0x40, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0xBB, 0xD5, 0x66, 0x40, 0x75, 0x00, + 0x76, 0xB2, 0x00, 0x2E, 0xBA, 0xD5, 0x65, 0x40, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0xB9, 0xD5, + 0x66, 0x40, 0x77, 0x00, 0x75, 0xB2, 0x00, 0x2D, 0xB8, 0xD5, 0x67, 0x40, 0x7D, 0x00, 0x7E, 0xB2, + 0x00, 0x2E, 0xB7, 0xD4, 0xB7, 0xE7, 0x65, 0x40, 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0xBD, 0xD5, + 0x66, 0x40, 0x75, 0x00, 0x76, 0xB2, 0x00, 0x2E, 0xBC, 0xD5, 0x65, 0x40, 0x6E, 0x00, 0x6D, 0xB2, + 0x00, 0x2D, 0xBB, 0xD5, 0x66, 0x40, 0x75, 0x00, 0x76, 0xB2, 0x00, 0x2E, 0xBA, 0xD5, 0x65, 0x40, + 0x6E, 0x00, 0x6D, 0xB2, 0x00, 0x2D, 0xB9, 0xD5, 0x66, 0x40, 0x77, 0x00, 0x75, 0xB2, 0x00, 0x2D, + 0xB8, 0xD5, 0x67, 0x40, 0x7D, 0x00, 0x7E, 0xB2, 0x00, 0x2E, 0x00, 0xD4, 0x6C, 0xE7, 0x65, 0x40, + 0x6A, 0xE7, 0x41, 0x40, 0x4A, 0x00, 0x49, 0xB2, 0x00, 0x29, 0x00, 0xD4, 0x3C, 0xE7, 0x42, 0x40, + 0x51, 0x00, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD4, 0x3B, 0xE7, 0x41, 0x40, 0x4A, 0x00, 0x49, 0xB2, + 0x00, 0x29, 0x00, 0xD4, 0x3A, 0xE7, 0x42, 0x40, 0x51, 0x00, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD4, + 0x39, 0xE7, 0x41, 0x40, 0x4A, 0x00, 0x49, 0xB2, 0x00, 0x29, 0x00, 0xD4, 0x38, 0xE7, 0x42, 0x40, + 0x51, 0x00, 0x52, 0xB2, 0x00, 0x2A, 0x00, 0xD4, 0x37, 0xE7, 0x41, 0x40, 0x4D, 0x00, 0x49, 0xB2, + 0x00, 0x29, 0x00, 0xD5, 0x35, 0xE7, 0x35, 0xE7, 0x10, 0xB5, 0x82, 0xB0, 0x47, 0x49, 0x0B, 0x68, + 0x01, 0x20, 0x42, 0x07, 0x13, 0x60, 0x4B, 0x68, 0x53, 0x60, 0x8B, 0x68, 0x93, 0x60, 0xCB, 0x68, + 0xD3, 0x60, 0x0B, 0x69, 0x13, 0x61, 0x4B, 0x69, 0x53, 0x61, 0x8B, 0x69, 0x93, 0x61, 0xCB, 0x69, + 0xD3, 0x61, 0x0B, 0x6A, 0x13, 0x62, 0x4B, 0x6A, 0x53, 0x62, 0x8B, 0x6A, 0x93, 0x62, 0xCB, 0x6A, + 0xD3, 0x62, 0x0B, 0x6B, 0x13, 0x63, 0x4B, 0x6B, 0x53, 0x63, 0x8B, 0x6B, 0x93, 0x63, 0xCB, 0x6B, + 0xD3, 0x63, 0x0B, 0x6C, 0x13, 0x64, 0x4B, 0x6C, 0x53, 0x64, 0x8B, 0x6C, 0x93, 0x64, 0xCB, 0x6C, + 0xD3, 0x64, 0x0B, 0x6D, 0x13, 0x65, 0x4B, 0x6D, 0x53, 0x65, 0x8B, 0x6D, 0x93, 0x65, 0xCB, 0x6D, + 0xD3, 0x65, 0x0B, 0x6E, 0x13, 0x66, 0x4B, 0x6E, 0x53, 0x66, 0x8B, 0x6E, 0x93, 0x66, 0xCB, 0x6E, + 0xD3, 0x66, 0x0B, 0x6F, 0x13, 0x67, 0x4B, 0x6F, 0x53, 0x67, 0x8B, 0x6F, 0x93, 0x67, 0xC9, 0x6F, + 0xD1, 0x67, 0x27, 0x49, 0x0B, 0x68, 0x27, 0x4A, 0x13, 0x60, 0x4B, 0x68, 0x53, 0x60, 0x8B, 0x68, + 0x93, 0x60, 0xCB, 0x68, 0xD3, 0x60, 0x0B, 0x69, 0x13, 0x61, 0x4B, 0x69, 0x53, 0x61, 0x8B, 0x69, + 0x93, 0x61, 0xCB, 0x69, 0xD3, 0x61, 0x0B, 0x6A, 0x13, 0x62, 0x4B, 0x6A, 0x53, 0x62, 0x8B, 0x6A, + 0x93, 0x62, 0xCB, 0x6A, 0xD3, 0x62, 0x0B, 0x6B, 0x13, 0x63, 0x4B, 0x6B, 0x53, 0x63, 0x8B, 0x6B, + 0x93, 0x63, 0xC9, 0x6B, 0xD1, 0x63, 0x18, 0x49, 0x0A, 0x68, 0x02, 0x43, 0x0A, 0x60, 0x09, 0x68, + 0x01, 0x40, 0x01, 0x91, 0x01, 0x98, 0x15, 0x48, 0x01, 0x68, 0x03, 0x24, 0xA1, 0x43, 0x01, 0x60, + 0x01, 0x68, 0x21, 0x43, 0x01, 0x60, 0x7D, 0x20, 0xC1, 0x00, 0x11, 0x48, 0x00, 0x68, 0xFD, 0xF7, + 0xA9, 0xFE, 0x40, 0x1E, 0x01, 0x0E, 0x00, 0xD0, 0xFE, 0xE7, 0x93, 0x49, 0x0D, 0x4A, 0x50, 0x60, + 0x0D, 0x48, 0x03, 0x68, 0x0B, 0x40, 0xA1, 0x07, 0x59, 0x18, 0x01, 0x60, 0x00, 0x20, 0x90, 0x60, + 0x07, 0x20, 0x10, 0x60, 0x62, 0xB6, 0x02, 0xB0, 0x10, 0xBD, 0xC0, 0x46, 0x00, 0x10, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x80, 0x00, 0x00, 0x20, 0x18, 0x10, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40, + 0x9C, 0x01, 0x00, 0x20, 0x10, 0xE0, 0x00, 0xE0, 0x20, 0xED, 0x00, 0xE0, 0xF0, 0xB5, 0x93, 0xB0, + 0xFE, 0xF7, 0x18, 0xFD, 0x7C, 0x4B, 0x58, 0x68, 0x01, 0x26, 0x01, 0x96, 0x30, 0x43, 0x58, 0x60, + 0x58, 0x68, 0x30, 0x40, 0x0C, 0x90, 0x0C, 0x98, 0x30, 0x07, 0x99, 0x68, 0x01, 0x43, 0x99, 0x60, + 0x99, 0x68, 0x01, 0x40, 0x0C, 0x91, 0x0C, 0x98, 0x74, 0x48, 0x01, 0x68, 0x10, 0x22, 0x07, 0x92, + 0x11, 0x43, 0x01, 0x60, 0x75, 0x04, 0x18, 0x68, 0x28, 0x43, 0x18, 0x60, 0x18, 0x68, 0x28, 0x40, + 0x0C, 0x90, 0x0C, 0x98, 0xB1, 0x04, 0x08, 0x91, 0x18, 0x68, 0x08, 0x43, 0x18, 0x60, 0x18, 0x68, + 0x08, 0x40, 0x0C, 0x90, 0x0C, 0x98, 0x09, 0x20, 0xC1, 0x06, 0x04, 0x91, 0xF0, 0x03, 0x88, 0x62, + 0x18, 0x68, 0x30, 0x43, 0x18, 0x60, 0x18, 0x68, 0x1F, 0x46, 0x30, 0x40, 0x0C, 0x90, 0x0C, 0x98, + 0xFF, 0x20, 0x0B, 0x90, 0x00, 0x04, 0x62, 0x4A, 0x11, 0x68, 0x81, 0x43, 0xB0, 0x05, 0x08, 0x18, + 0x10, 0x60, 0xB0, 0x02, 0x5F, 0x49, 0x08, 0x60, 0x10, 0x68, 0x5F, 0x4B, 0x18, 0x40, 0xB4, 0x07, + 0x00, 0x19, 0x10, 0x60, 0xF0, 0x02, 0x0A, 0x90, 0x08, 0x60, 0xFE, 0xF7, 0x51, 0xFB, 0xB8, 0x68, + 0x30, 0x43, 0xB8, 0x60, 0xB8, 0x68, 0x30, 0x40, 0x0C, 0x90, 0x0C, 0x98, 0x17, 0x20, 0x03, 0x90, + 0x09, 0x94, 0xA0, 0x62, 0x55, 0x48, 0xE0, 0x62, 0x00, 0x24, 0x11, 0x94, 0x10, 0x94, 0x0F, 0x94, + 0x0E, 0x94, 0x0D, 0x94, 0x0C, 0x94, 0x38, 0x68, 0x05, 0x95, 0x28, 0x43, 0x38, 0x60, 0x38, 0x68, + 0x28, 0x40, 0x12, 0x90, 0x03, 0x27, 0x0D, 0x97, 0x02, 0x97, 0x02, 0x20, 0x06, 0x90, 0x0C, 0x90, + 0x12, 0x98, 0x0C, 0xAE, 0x04, 0x9D, 0x28, 0x46, 0x31, 0x46, 0xFE, 0xF7, 0x1F, 0xF8, 0x10, 0x94, + 0x0D, 0x97, 0x20, 0x20, 0x0C, 0x90, 0x28, 0x46, 0x31, 0x46, 0xFE, 0xF7, 0x17, 0xF8, 0x40, 0x49, + 0x48, 0x68, 0x0B, 0x9A, 0x90, 0x43, 0x48, 0x60, 0x0D, 0x46, 0x7D, 0x20, 0x40, 0x01, 0x01, 0x46, + 0x60, 0x31, 0x3C, 0x4B, 0x19, 0x60, 0x01, 0x9E, 0x31, 0x02, 0x37, 0x4F, 0xBA, 0x68, 0x0A, 0x43, + 0xBA, 0x60, 0xBA, 0x68, 0x0A, 0x40, 0x0C, 0x92, 0x0C, 0x99, 0x39, 0x49, 0x03, 0x9A, 0x8A, 0x62, + 0xC8, 0x62, 0xA8, 0x68, 0x34, 0x4A, 0x10, 0x40, 0xA8, 0x60, 0xF0, 0x04, 0x18, 0x60, 0x0A, 0x68, + 0x80, 0x20, 0x02, 0x43, 0x0A, 0x60, 0xB9, 0x68, 0x07, 0x9D, 0x29, 0x43, 0xB9, 0x60, 0xB9, 0x68, + 0x29, 0x40, 0x0C, 0x91, 0x0C, 0x99, 0x0B, 0x99, 0x09, 0x02, 0x29, 0x4B, 0x9A, 0x68, 0x8A, 0x43, + 0x02, 0x99, 0x89, 0x03, 0x51, 0x18, 0x99, 0x60, 0x26, 0x49, 0x05, 0x9A, 0x0A, 0x60, 0x29, 0x49, + 0x2F, 0x22, 0x0A, 0x60, 0x32, 0x23, 0x4B, 0x60, 0x79, 0x68, 0x08, 0x9B, 0x19, 0x43, 0x79, 0x60, + 0x79, 0x68, 0x19, 0x40, 0x0C, 0x91, 0x0C, 0x99, 0x23, 0x49, 0x8A, 0x62, 0x1F, 0x4A, 0xCA, 0x62, + 0x0A, 0x68, 0x82, 0x43, 0x0A, 0x60, 0x11, 0x94, 0x10, 0x94, 0x0F, 0x94, 0x0E, 0x94, 0x0D, 0x94, + 0x0C, 0x94, 0xB8, 0x68, 0x06, 0x99, 0x08, 0x43, 0xB8, 0x60, 0xB8, 0x68, 0x08, 0x40, 0x12, 0x90, + 0x12, 0x98, 0x38, 0x68, 0x18, 0x43, 0x38, 0x60, 0x38, 0x68, 0x18, 0x40, 0x12, 0x90, 0x12, 0x98, + 0x11, 0x96, 0x10, 0x94, 0x0F, 0x94, 0x0E, 0x94, 0x0D, 0x91, 0x0C, 0x95, 0x13, 0x48, 0x0C, 0xA9, + 0xFD, 0xF7, 0xAC, 0xFF, 0x0A, 0x4A, 0x10, 0x68, 0x0B, 0x49, 0x08, 0x40, 0x09, 0x99, 0x40, 0x18, + 0x10, 0x60, 0x0A, 0x98, 0x07, 0x49, 0x08, 0x60, 0x0D, 0x48, 0x04, 0x60, 0x3F, 0x21, 0x41, 0x60, + 0x01, 0xF0, 0x8A, 0xFF, 0x13, 0xB0, 0xF0, 0xBD, 0x14, 0x10, 0x02, 0x40, 0x00, 0x20, 0x02, 0x40, + 0x08, 0xE4, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x40, 0x28, 0x10, 0x00, 0x40, 0x00, 0x48, 0x01, 0x40, 0x00, 0x04, 0x00, 0x48, + 0x28, 0x04, 0x00, 0x40, 0xB0, 0xB5, 0x24, 0x4C, 0x20, 0x68, 0x7E, 0x28, 0x19, 0xD3, 0x23, 0x48, + 0x01, 0x68, 0xB9, 0x48, 0x7C, 0x29, 0x09, 0xD8, 0x40, 0x21, 0x41, 0x5A, 0xC9, 0x08, 0x4A, 0x29, + 0x04, 0xD8, 0xA1, 0x68, 0x89, 0x08, 0x7D, 0x29, 0x00, 0xD2, 0xB0, 0xBD, 0x41, 0x7D, 0x49, 0x1C, + 0x41, 0x75, 0xC8, 0xB2, 0x65, 0x28, 0x04, 0xD3, 0x01, 0xF0, 0x38, 0xF8, 0x00, 0x20, 0xA0, 0x60, + 0xB0, 0xBD, 0xA5, 0x4C, 0x60, 0x7B, 0x00, 0x28, 0x09, 0xD0, 0x00, 0x25, 0xFF, 0xF7, 0x06, 0xFD, + 0xA1, 0x7B, 0x88, 0x42, 0xE9, 0xD0, 0x6D, 0x1C, 0x60, 0x7B, 0x85, 0x42, 0xF6, 0xD3, 0xEF, 0xF3, + 0x10, 0x80, 0x72, 0xB6, 0x01, 0xF0, 0x22, 0xF8, 0x4A, 0x20, 0xA3, 0x49, 0x0A, 0x5A, 0x48, 0x23, + 0xCA, 0x52, 0x0A, 0x4A, 0x13, 0x68, 0x0B, 0x52, 0x00, 0x20, 0x10, 0x60, 0x08, 0x4A, 0x90, 0x61, + 0x42, 0x23, 0xC9, 0x5A, 0x49, 0x1C, 0x11, 0x62, 0x50, 0x60, 0x10, 0x68, 0x01, 0x21, 0x01, 0x43, + 0x11, 0x60, 0x62, 0xB6, 0xB0, 0xBD, 0xC0, 0x46, 0x7C, 0x05, 0x00, 0x20, 0x24, 0x00, 0x00, 0x40, + 0x0C, 0x20, 0x00, 0x40, 0xF0, 0xB5, 0x83, 0xB0, 0x87, 0x4C, 0x88, 0x49, 0xC0, 0x22, 0x20, 0x46, + 0xFD, 0xF7, 0xF4, 0xFC, 0x86, 0x48, 0x00, 0x90, 0x19, 0x20, 0x18, 0x21, 0x30, 0x22, 0x85, 0x4D, + 0x2B, 0x46, 0x00, 0xF0, 0xD1, 0xFF, 0x84, 0x4F, 0x78, 0x86, 0x20, 0x7E, 0x01, 0x46, 0x0C, 0x39, + 0x0B, 0x29, 0x07, 0xD8, 0x00, 0x95, 0x0C, 0x21, 0x18, 0x22, 0x80, 0x4B, 0x00, 0xF0, 0xC4, 0xFF, + 0x78, 0x86, 0x20, 0x7E, 0xFC, 0x21, 0x01, 0x40, 0x7D, 0x4A, 0x08, 0x29, 0x07, 0xD1, 0x00, 0x92, + 0x07, 0x21, 0x10, 0x22, 0x7B, 0x4B, 0x00, 0xF0, 0xB7, 0xFF, 0x78, 0x86, 0x00, 0xE0, 0x78, 0x8E, + 0x79, 0x49, 0x18, 0x39, 0x80, 0xB2, 0x08, 0x60, 0x60, 0x7E, 0x01, 0x46, 0x32, 0x39, 0x64, 0x29, + 0x0A, 0xD8, 0x21, 0x7D, 0x00, 0x29, 0x0C, 0xD0, 0x38, 0x85, 0x03, 0x21, 0xFD, 0xF7, 0xE2, 0xFC, + 0xB8, 0x85, 0x0A, 0x30, 0xF8, 0x85, 0x0A, 0xE0, 0x55, 0x20, 0xB8, 0x85, 0x96, 0x20, 0x38, 0x85, + 0x05, 0xE0, 0x41, 0x08, 0xB9, 0x85, 0x40, 0x00, 0x38, 0x85, 0x0A, 0x31, 0xF9, 0x85, 0xA0, 0x7E, + 0x28, 0x26, 0x70, 0x43, 0x14, 0x30, 0xB8, 0x82, 0x02, 0x20, 0x01, 0xF0, 0xC3, 0xFE, 0x60, 0x78, + 0x00, 0x28, 0x41, 0xD0, 0xA0, 0x7F, 0x0B, 0x28, 0x00, 0xD9, 0x05, 0x20, 0x01, 0xF0, 0xBA, 0xFE, + 0x27, 0x21, 0x00, 0x20, 0x02, 0x90, 0x60, 0x54, 0x23, 0x21, 0x61, 0x5C, 0x39, 0x71, 0x22, 0x21, + 0x61, 0x5C, 0x5E, 0x4A, 0x89, 0x18, 0xF9, 0x83, 0x25, 0x21, 0x61, 0x5C, 0xFA, 0x31, 0x39, 0x84, + 0x20, 0x21, 0x61, 0x5C, 0x49, 0x00, 0x5A, 0x4A, 0x89, 0x18, 0x79, 0x83, 0x21, 0x21, 0x61, 0x5C, + 0x49, 0x00, 0x58, 0x4A, 0x89, 0x18, 0xB9, 0x83, 0x24, 0x21, 0x61, 0x5C, 0x49, 0x1E, 0x4A, 0x42, + 0x4A, 0x41, 0x55, 0x49, 0xCA, 0x70, 0xA2, 0x5D, 0x1A, 0x3A, 0x15, 0x23, 0xDB, 0x43, 0x9A, 0x42, + 0x01, 0xD8, 0x05, 0x22, 0xA2, 0x55, 0x29, 0x26, 0xA5, 0x5D, 0x0B, 0x3D, 0x0A, 0x23, 0xDA, 0x43, + 0x95, 0x42, 0x00, 0xD8, 0xA3, 0x55, 0x2A, 0x25, 0x60, 0x5D, 0x06, 0x46, 0x0A, 0x3E, 0xF6, 0xB2, + 0xF6, 0x2E, 0x03, 0xD8, 0x63, 0x55, 0x17, 0xE0, 0xBD, 0x8A, 0x5B, 0xE0, 0x09, 0x23, 0xDB, 0x43, + 0x43, 0x43, 0x52, 0x3B, 0xFB, 0x70, 0xD8, 0xB2, 0x3B, 0x8D, 0x1B, 0x18, 0x3B, 0x85, 0xBB, 0x8D, + 0x1B, 0x18, 0xBB, 0x85, 0x7B, 0x8F, 0x1B, 0x18, 0x7B, 0x87, 0x7B, 0x8D, 0x1B, 0x18, 0x7B, 0x85, + 0x39, 0x4D, 0x2B, 0x68, 0x03, 0x43, 0x2B, 0x60, 0x02, 0x9E, 0x2B, 0x23, 0xE0, 0x5C, 0x8D, 0x38, + 0x47, 0x25, 0xED, 0x43, 0xA8, 0x42, 0x01, 0xD8, 0xFF, 0x20, 0xE0, 0x54, 0x2C, 0x20, 0x20, 0x5C, + 0x40, 0x1E, 0x62, 0x28, 0x01, 0xD8, 0x01, 0x20, 0x88, 0x71, 0x2D, 0x23, 0xE0, 0x5C, 0x0B, 0x38, + 0x90, 0x42, 0x01, 0xD8, 0x05, 0x20, 0xE0, 0x54, 0x2E, 0x20, 0x23, 0x5C, 0x09, 0x2B, 0x0A, 0xD8, + 0x04, 0x2B, 0x0D, 0xD8, 0x0A, 0x46, 0x1A, 0x32, 0x7B, 0x44, 0x1B, 0x79, 0x5B, 0x00, 0x9F, 0x44, + 0x02, 0x30, 0x05, 0x07, 0x33, 0x00, 0x8E, 0x76, 0x4E, 0x76, 0x28, 0x4A, 0x01, 0x20, 0x10, 0x70, + 0xBD, 0x8A, 0xA8, 0x08, 0x4A, 0x28, 0x00, 0xD8, 0xBE, 0x71, 0xE1, 0x7E, 0x20, 0x20, 0xFD, 0xF7, + 0x39, 0xFC, 0x04, 0x46, 0x0C, 0x21, 0x28, 0x46, 0xFD, 0xF7, 0x34, 0xFC, 0x21, 0x46, 0xFD, 0xF7, + 0x31, 0xFC, 0x38, 0x87, 0x64, 0x21, 0x28, 0x46, 0xFD, 0xF7, 0x2C, 0xFC, 0x21, 0x46, 0xFD, 0xF7, + 0x29, 0xFC, 0xF8, 0x86, 0x12, 0x4A, 0x4B, 0x20, 0x81, 0x00, 0x08, 0x46, 0xC8, 0x30, 0x00, 0x90, + 0xD2, 0x1C, 0x0B, 0x48, 0x43, 0x1C, 0x28, 0x46, 0x00, 0xF0, 0xDE, 0xFE, 0xB8, 0x84, 0x03, 0xB0, + 0xF0, 0xBD, 0x01, 0x20, 0x48, 0x76, 0xD0, 0xE7, 0x10, 0x48, 0x06, 0x70, 0x10, 0x48, 0x01, 0x22, + 0x02, 0x70, 0x19, 0x31, 0x0A, 0x46, 0xC9, 0xE7, 0xDC, 0x06, 0x00, 0x20, 0x38, 0x5D, 0x00, 0x08, + 0xE7, 0x03, 0x00, 0x00, 0xCF, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x9E, 0x0F, 0x00, 0x00, + 0xB5, 0x0B, 0x00, 0x00, 0x6D, 0x17, 0x00, 0x00, 0x44, 0x2C, 0x01, 0x40, 0x5E, 0x05, 0x00, 0x00, + 0xEE, 0x02, 0x00, 0x00, 0xD6, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x81, 0x04, 0x00, 0x20, + 0x80, 0x04, 0x00, 0x20, 0x00, 0xB5, 0x8F, 0xB0, 0xFF, 0xF7, 0xC6, 0xFC, 0x7F, 0x20, 0x45, 0x01, + 0x28, 0x68, 0xE6, 0x49, 0x88, 0x42, 0x11, 0xD1, 0x68, 0x68, 0xE5, 0x49, 0x88, 0x42, 0x0D, 0xD1, + 0x28, 0x7B, 0x1F, 0x28, 0x07, 0xD0, 0x2B, 0x28, 0x03, 0xD0, 0x35, 0x28, 0x06, 0xD1, 0xE1, 0x48, + 0x02, 0xE0, 0xE1, 0x48, 0x00, 0xE0, 0xE1, 0x48, 0xE1, 0x49, 0xC8, 0x64, 0xFF, 0xF7, 0x4E, 0xFD, + 0xFF, 0xF7, 0x98, 0xFA, 0xFF, 0xF7, 0xAE, 0xFE, 0xDE, 0x4B, 0xDA, 0x78, 0x02, 0x20, 0x08, 0x90, + 0x42, 0x40, 0x18, 0x79, 0xC1, 0xB2, 0xBD, 0x20, 0x41, 0x40, 0x11, 0x43, 0x4A, 0x1E, 0x91, 0x41, + 0x5A, 0x78, 0xD2, 0xB2, 0xD6, 0x4B, 0x1B, 0x78, 0xDC, 0xB2, 0x01, 0x23, 0x94, 0x42, 0x0C, 0x93, + 0x1A, 0x46, 0x00, 0xD8, 0x00, 0x22, 0x11, 0x43, 0x01, 0x29, 0x0F, 0xD1, 0xD1, 0x4E, 0x30, 0x71, + 0x02, 0x20, 0xF0, 0x70, 0x70, 0x1D, 0xD0, 0xA1, 0x0C, 0x22, 0xFD, 0xF7, 0x87, 0xFB, 0x74, 0x70, + 0xCB, 0x48, 0xC2, 0x6C, 0xC0, 0x21, 0x30, 0x46, 0x01, 0xF0, 0x98, 0xF8, 0xC8, 0x4C, 0x60, 0x8E, + 0x20, 0x86, 0xC8, 0x4A, 0x50, 0x7C, 0x40, 0x1E, 0x41, 0x1E, 0x88, 0x41, 0xE0, 0x73, 0x10, 0x7D, + 0x00, 0x28, 0x01, 0xD1, 0x00, 0x20, 0xD0, 0x74, 0x26, 0x20, 0x02, 0x90, 0x10, 0x5C, 0xC6, 0x49, + 0x00, 0x28, 0x11, 0xD0, 0x01, 0x20, 0x50, 0x82, 0xA0, 0x71, 0x00, 0x20, 0x90, 0x75, 0x90, 0x82, + 0x08, 0x46, 0xBE, 0x30, 0x60, 0x87, 0xA0, 0x8D, 0x32, 0x30, 0xA0, 0x85, 0xE0, 0x8D, 0x32, 0x30, + 0xE0, 0x85, 0x20, 0x8D, 0x32, 0x30, 0x20, 0x85, 0x00, 0xF0, 0x88, 0xFF, 0xBB, 0x4F, 0x00, 0x26, + 0x7E, 0x87, 0xFE, 0xF7, 0x7F, 0xF8, 0xBA, 0x48, 0xBA, 0x49, 0x01, 0x60, 0x01, 0xF0, 0x0E, 0xF8, + 0x38, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x01, 0x20, 0x78, 0x71, 0x1F, 0x35, 0xB6, 0x48, 0x01, 0x68, + 0x29, 0x40, 0x01, 0x60, 0xF9, 0x66, 0x00, 0x68, 0x01, 0x0C, 0x39, 0x67, 0x00, 0x0F, 0x39, 0x46, + 0x01, 0xD1, 0x19, 0x20, 0xC6, 0x43, 0x8E, 0x77, 0x01, 0xF0, 0x36, 0xFD, 0xFF, 0x20, 0x07, 0x90, + 0x68, 0x30, 0x0E, 0x90, 0x7D, 0x20, 0x81, 0x00, 0x06, 0x91, 0xC1, 0x00, 0x0B, 0x91, 0x00, 0x01, + 0x0D, 0x90, 0xA6, 0x4D, 0x07, 0xE0, 0xA9, 0x48, 0x07, 0x60, 0x47, 0x60, 0x87, 0x60, 0xFE, 0xF7, + 0x19, 0xFB, 0x5A, 0x20, 0x2F, 0x52, 0xA6, 0x48, 0x80, 0x68, 0x05, 0x28, 0x01, 0xD3, 0x08, 0x98, + 0x00, 0xE0, 0x04, 0x20, 0xA0, 0x74, 0x60, 0x74, 0xA1, 0x4A, 0xD0, 0x8A, 0x91, 0x8A, 0x08, 0x18, + 0x11, 0x8B, 0x40, 0x18, 0x51, 0x8B, 0x40, 0x18, 0x91, 0x8B, 0x40, 0x18, 0xD1, 0x8B, 0x40, 0x18, + 0x00, 0x1D, 0x40, 0x08, 0xD0, 0x60, 0x96, 0x48, 0x96, 0x49, 0x01, 0x60, 0x8D, 0x4F, 0x78, 0x7D, + 0x01, 0x28, 0x09, 0xD1, 0x20, 0x6D, 0x61, 0x8E, 0x00, 0x91, 0x4B, 0x08, 0x60, 0x21, 0xC8, 0x22, + 0x00, 0xF0, 0xE2, 0xFD, 0x20, 0x86, 0x78, 0x7D, 0x02, 0x28, 0x15, 0xD1, 0x90, 0x48, 0x00, 0x68, + 0x01, 0x46, 0x65, 0x39, 0x94, 0x29, 0x02, 0xD8, 0x05, 0x21, 0x41, 0x43, 0x0B, 0xE0, 0x41, 0x1E, + 0x63, 0x29, 0x02, 0xD2, 0x0E, 0x99, 0x8D, 0x31, 0x05, 0xE0, 0xF9, 0x21, 0xC9, 0x43, 0xFA, 0x38, + 0x88, 0x42, 0x88, 0x49, 0x00, 0xD8, 0x21, 0x86, 0x44, 0x20, 0x28, 0x5A, 0x86, 0x49, 0x88, 0x42, + 0x04, 0xD3, 0xE8, 0x7D, 0x00, 0x28, 0x01, 0xD0, 0x00, 0xF0, 0x9C, 0xFC, 0xA8, 0x8D, 0x83, 0x49, + 0x88, 0x42, 0x32, 0xD3, 0x2D, 0x20, 0xC1, 0x00, 0xEC, 0x8D, 0x20, 0x04, 0xFD, 0xF7, 0x12, 0xFB, + 0x69, 0x6F, 0x40, 0x18, 0x68, 0x67, 0x7E, 0x48, 0x00, 0x78, 0x03, 0x28, 0x11, 0xD0, 0x02, 0x28, + 0x07, 0xD0, 0x01, 0x28, 0x1F, 0xD1, 0xE8, 0x7F, 0x0E, 0x99, 0x08, 0x18, 0x99, 0x30, 0x02, 0x21, + 0x15, 0xE0, 0xE0, 0xB2, 0x29, 0x21, 0x41, 0x43, 0xC8, 0x0A, 0x03, 0x21, 0x4A, 0x02, 0x80, 0x18, + 0x0D, 0xE0, 0x54, 0x20, 0x28, 0x5A, 0x73, 0x49, 0x41, 0x43, 0x09, 0x0C, 0x40, 0x1A, 0x40, 0x08, + 0x40, 0x18, 0x00, 0x09, 0xC0, 0xB2, 0x64, 0x49, 0x08, 0x18, 0xD6, 0x30, 0x01, 0x21, 0x6C, 0x4A, + 0x11, 0x70, 0x6D, 0x49, 0x08, 0x80, 0x00, 0x20, 0xA8, 0x85, 0x65, 0x48, 0x86, 0x68, 0x01, 0x21, + 0x00, 0x23, 0x64, 0x2E, 0x0A, 0x46, 0x00, 0xD8, 0x1A, 0x46, 0xA8, 0x8E, 0x80, 0xB2, 0xC8, 0x28, + 0x00, 0xD3, 0x19, 0x46, 0x43, 0x42, 0x43, 0x41, 0x0B, 0x9C, 0xA6, 0x42, 0x0C, 0x9C, 0x00, 0xD8, + 0x1C, 0x46, 0x00, 0x2C, 0x01, 0xD1, 0x0A, 0x40, 0x01, 0xD0, 0x00, 0x21, 0xA9, 0x74, 0xF9, 0x7C, + 0x00, 0x29, 0x4B, 0x4C, 0x03, 0xD0, 0x9F, 0x28, 0x01, 0xD8, 0x00, 0x21, 0xA9, 0x74, 0x29, 0x7A, + 0x00, 0x29, 0x06, 0xD0, 0x0E, 0x99, 0x29, 0x31, 0x88, 0x42, 0x08, 0xD2, 0x00, 0x20, 0xA8, 0x74, + 0x05, 0xE0, 0x95, 0x28, 0x01, 0xD8, 0x64, 0x20, 0x00, 0xE0, 0x0A, 0x20, 0xE0, 0x71, 0x4C, 0x4F, + 0xF8, 0x68, 0x03, 0x21, 0x0A, 0x91, 0xFD, 0xF7, 0xAD, 0xFA, 0x38, 0x60, 0x0B, 0x2E, 0x3D, 0x4F, + 0x30, 0xD3, 0x01, 0x46, 0x28, 0x7B, 0x00, 0x28, 0x2C, 0xD0, 0x45, 0x4E, 0x30, 0x69, 0xFF, 0xF7, + 0x37, 0xFA, 0x31, 0x68, 0x0D, 0x9A, 0x91, 0x42, 0x20, 0xD2, 0x4A, 0x08, 0x90, 0x42, 0x1D, 0xD9, + 0x00, 0x20, 0x3F, 0x4A, 0x90, 0x60, 0xEA, 0x79, 0x52, 0x1C, 0xEA, 0x71, 0x22, 0x6D, 0x0B, 0x9B, + 0x9A, 0x42, 0x00, 0xD9, 0x01, 0x20, 0xAA, 0x8F, 0x92, 0xB2, 0x2F, 0x2A, 0x0C, 0x9A, 0x00, 0xD8, + 0xC4, 0xE2, 0xBB, 0x7C, 0x00, 0x2B, 0x00, 0xD0, 0xC5, 0xE2, 0x01, 0x2A, 0x01, 0xD1, 0x00, 0x20, + 0xE8, 0x74, 0x01, 0x20, 0xE0, 0x72, 0x20, 0x8D, 0x40, 0x08, 0x28, 0x86, 0x30, 0x48, 0x01, 0x61, + 0x00, 0x20, 0x28, 0x73, 0x22, 0x6D, 0x2B, 0x7C, 0x34, 0x48, 0x08, 0x38, 0x01, 0x68, 0x34, 0x4E, + 0x31, 0x40, 0x00, 0x2B, 0x10, 0xD0, 0x79, 0x2A, 0x0E, 0xD3, 0x01, 0x60, 0x2F, 0x4A, 0x10, 0x68, + 0x2F, 0x49, 0x08, 0x40, 0x2F, 0x49, 0x08, 0x18, 0x24, 0x38, 0x10, 0x60, 0x10, 0x1F, 0x01, 0x68, + 0x40, 0x20, 0x08, 0x43, 0xBF, 0x21, 0x0B, 0xE0, 0x2A, 0x4A, 0x51, 0x18, 0x24, 0x39, 0x01, 0x60, + 0x26, 0x4A, 0x10, 0x68, 0x26, 0x49, 0x08, 0x40, 0x10, 0x60, 0x10, 0x1F, 0x00, 0x68, 0x07, 0x99, + 0x88, 0x43, 0x11, 0x1F, 0x08, 0x60, 0xA8, 0x7B, 0x00, 0x28, 0x45, 0xD0, 0x76, 0x20, 0x2B, 0x5A, + 0x54, 0x20, 0x29, 0x5A, 0x5A, 0x20, 0x2C, 0x5A, 0xEA, 0x8D, 0xE8, 0x7F, 0x00, 0x94, 0x00, 0xF0, + 0x09, 0xFC, 0x2C, 0x46, 0x0E, 0x34, 0x0A, 0x20, 0x3F, 0xE0, 0xC0, 0x46, 0xDA, 0xE3, 0x25, 0x59, + 0xD9, 0x63, 0xB8, 0x4E, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x01, 0x08, 0x00, 0x7C, 0x00, 0x08, + 0xC0, 0x00, 0x00, 0x20, 0xDC, 0x06, 0x00, 0x20, 0x46, 0x69, 0x72, 0x65, 0x66, 0x6C, 0x79, 0x20, + 0x47, 0x32, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, + 0x00, 0x30, 0x00, 0x40, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x58, 0x01, 0x40, 0x34, 0x2C, 0x01, 0x40, + 0x7C, 0x05, 0x00, 0x20, 0xE2, 0x04, 0x00, 0x00, 0x11, 0x27, 0x00, 0x00, 0x21, 0x4E, 0x00, 0x00, + 0x85, 0x04, 0x00, 0x20, 0xAF, 0x47, 0x00, 0x00, 0x88, 0x04, 0x00, 0x20, 0x10, 0xE4, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x40, 0x20, 0x20, 0x28, 0x5C, 0x00, 0x28, 0x09, 0xD0, + 0x00, 0xF0, 0xB8, 0xFB, 0x2C, 0x46, 0x20, 0x34, 0x31, 0x20, 0x01, 0xF0, 0x03, 0xF8, 0x00, 0x20, + 0x20, 0x70, 0xC8, 0x4C, 0x68, 0x7B, 0x40, 0x1C, 0x68, 0x73, 0xC0, 0xB2, 0xC9, 0x28, 0x76, 0xD3, + 0xFD, 0xF7, 0x7E, 0xFA, 0xC4, 0x49, 0x08, 0x88, 0x49, 0x89, 0x09, 0x1A, 0x5C, 0x22, 0xAA, 0x5A, + 0x12, 0x1A, 0x50, 0x20, 0x50, 0x43, 0xFD, 0xF7, 0xE5, 0xF9, 0x06, 0x46, 0x1E, 0x36, 0x5E, 0x20, + 0x2E, 0x52, 0x54, 0x24, 0x28, 0x5B, 0x07, 0x27, 0x47, 0x43, 0x60, 0x20, 0x28, 0x5A, 0xBB, 0x49, + 0x48, 0x43, 0xBB, 0x49, 0xFD, 0xF7, 0xB6, 0xF9, 0xB6, 0x49, 0xC9, 0x8C, 0x48, 0x43, 0x64, 0x21, + 0x09, 0x91, 0xFD, 0xF7, 0xAF, 0xF9, 0xC0, 0x19, 0xC7, 0x08, 0x2F, 0x53, 0xB5, 0x49, 0x08, 0x68, + 0xB5, 0x4A, 0x10, 0x40, 0x00, 0x1D, 0x08, 0x60, 0x6A, 0x7C, 0x53, 0x00, 0xB3, 0x4C, 0xE0, 0x5A, + 0x46, 0x21, 0x69, 0x5A, 0xE1, 0x52, 0xEE, 0x77, 0x52, 0x1C, 0xD3, 0xB2, 0x00, 0x26, 0x63, 0x2B, + 0x33, 0x46, 0x00, 0xD8, 0x13, 0x46, 0xAE, 0x4C, 0x63, 0x74, 0xAE, 0x4B, 0x5A, 0x68, 0x10, 0x1A, + 0x40, 0x18, 0x58, 0x60, 0x09, 0x99, 0xFD, 0xF7, 0x8D, 0xF9, 0xE0, 0x86, 0x80, 0xB2, 0xA0, 0x67, + 0xA2, 0x49, 0x48, 0x43, 0xCD, 0x21, 0x89, 0x00, 0xFD, 0xF7, 0x84, 0xF9, 0x01, 0x04, 0x00, 0xD5, + 0x30, 0x46, 0xA3, 0x4D, 0xE8, 0x85, 0xE8, 0x78, 0x00, 0x28, 0x9A, 0x4C, 0x1D, 0xD0, 0x68, 0x7A, + 0x21, 0x8C, 0x41, 0x43, 0xB8, 0xB2, 0x81, 0x42, 0x15, 0xD9, 0x68, 0x8D, 0x40, 0x1C, 0x68, 0x85, + 0x29, 0x7D, 0x9D, 0x4A, 0x51, 0x43, 0x9D, 0x4A, 0x89, 0x18, 0x80, 0xB2, 0x81, 0x42, 0x0C, 0xDA, + 0x00, 0x24, 0xAC, 0x87, 0xFE, 0xF7, 0x36, 0xF9, 0x00, 0xF0, 0x48, 0xFC, 0x6C, 0x87, 0xEC, 0x74, + 0xEC, 0x75, 0x8C, 0x4C, 0x01, 0xE0, 0x00, 0x20, 0x68, 0x85, 0x00, 0x20, 0x68, 0x73, 0x00, 0x27, + 0x6F, 0x75, 0x28, 0x7D, 0x00, 0x28, 0x3C, 0xD0, 0xA8, 0x8F, 0x31, 0x28, 0x74, 0xD3, 0xE9, 0x7D, + 0x00, 0x29, 0x71, 0xD0, 0x88, 0x28, 0x00, 0xD9, 0x2C, 0xE1, 0xA8, 0x78, 0x00, 0x28, 0x0F, 0xD0, + 0x8B, 0x4A, 0x10, 0x68, 0x01, 0x21, 0x88, 0x43, 0x10, 0x60, 0x00, 0xF0, 0x27, 0xFC, 0x00, 0x24, + 0x88, 0x48, 0x04, 0x60, 0x44, 0x60, 0x84, 0x60, 0xFE, 0xF7, 0x40, 0xF9, 0xAC, 0x70, 0x79, 0x4C, + 0x50, 0x27, 0xE9, 0x5B, 0x4E, 0x26, 0x2A, 0x46, 0xAD, 0x5B, 0x4C, 0x20, 0x13, 0x5A, 0xE2, 0x7B, + 0x00, 0x2A, 0x0A, 0x96, 0x00, 0xD1, 0x08, 0xE2, 0x4A, 0x1E, 0x11, 0xB2, 0x00, 0x29, 0x0E, 0x99, + 0x00, 0xD4, 0x11, 0x46, 0x6A, 0x1E, 0x14, 0xB2, 0x00, 0x2C, 0x0E, 0x9D, 0x00, 0xD4, 0x15, 0x46, + 0x5B, 0x1E, 0x1A, 0xB2, 0x00, 0x2A, 0x0E, 0x9A, 0x6A, 0x4C, 0x00, 0xD5, 0x0C, 0xE2, 0x1A, 0x46, + 0x0A, 0xE2, 0x70, 0x48, 0xC1, 0x68, 0x74, 0x48, 0xFD, 0xF7, 0x34, 0xF9, 0xE9, 0x7C, 0x41, 0x43, + 0x5A, 0x20, 0x29, 0x52, 0x88, 0xB2, 0x71, 0x49, 0x48, 0x43, 0xC0, 0x0C, 0x62, 0x21, 0x68, 0x52, + 0xA1, 0x79, 0x00, 0x29, 0x0D, 0x99, 0x09, 0xD0, 0x63, 0x8F, 0x22, 0x8F, 0xE1, 0x8E, 0x5D, 0x4C, + 0xA4, 0x8F, 0x00, 0x94, 0x5B, 0x4C, 0x00, 0xF0, 0xBF, 0xFB, 0x01, 0x46, 0xA1, 0x86, 0x2B, 0x20, + 0x67, 0x4F, 0x3A, 0x5C, 0xE8, 0x7F, 0x90, 0x42, 0x66, 0x4E, 0x09, 0xD9, 0xA3, 0x8F, 0x01, 0x21, + 0x00, 0x91, 0x11, 0x46, 0x0A, 0x39, 0x0A, 0x32, 0x5B, 0x08, 0x00, 0xF0, 0xAD, 0xFB, 0xA0, 0x86, + 0x58, 0x48, 0x80, 0x68, 0x63, 0x28, 0x2C, 0xD8, 0x21, 0x6D, 0x06, 0x98, 0x81, 0x42, 0x28, 0xD9, + 0x0C, 0x20, 0x32, 0x29, 0x31, 0xD3, 0x31, 0xE0, 0x01, 0x26, 0xAE, 0x70, 0x58, 0x49, 0x08, 0x7F, + 0x00, 0x28, 0x00, 0xD1, 0x87, 0xE5, 0x29, 0x20, 0x08, 0x5C, 0x40, 0x00, 0x65, 0x8E, 0x28, 0x18, + 0x13, 0x38, 0x40, 0x21, 0x4A, 0x4A, 0x50, 0x52, 0x81, 0xB2, 0x20, 0x8E, 0x48, 0x43, 0x29, 0x46, + 0xFD, 0xF7, 0xC8, 0xF8, 0x28, 0x1A, 0x46, 0x4D, 0x40, 0x1C, 0x58, 0x24, 0x28, 0x53, 0x00, 0xF0, + 0x2B, 0xFD, 0x28, 0x5B, 0x3B, 0x4C, 0x47, 0x49, 0x08, 0x60, 0x48, 0x60, 0x88, 0x60, 0xEE, 0x73, + 0x6F, 0xE5, 0x40, 0x48, 0x00, 0x68, 0x0C, 0x21, 0x00, 0x91, 0x64, 0x21, 0x03, 0x23, 0x06, 0x9A, + 0x00, 0xF0, 0x72, 0xFB, 0x21, 0x6D, 0x32, 0x29, 0x00, 0xD2, 0x02, 0x20, 0x60, 0x73, 0x2F, 0x20, + 0x38, 0x5C, 0x00, 0x28, 0x09, 0xD0, 0x40, 0x20, 0x28, 0x5A, 0x17, 0x21, 0x00, 0x91, 0x64, 0x21, + 0x0D, 0x23, 0x0D, 0x9A, 0x00, 0xF0, 0x60, 0xFB, 0x68, 0x77, 0x30, 0x68, 0x3A, 0x49, 0x88, 0x42, + 0x00, 0xD2, 0x50, 0xE5, 0xE8, 0x7C, 0x01, 0x28, 0x00, 0xD0, 0x4C, 0xE5, 0xA8, 0x7C, 0x40, 0x1C, + 0xA8, 0x74, 0x00, 0xF0, 0x73, 0xFB, 0x01, 0x20, 0x09, 0x90, 0xE0, 0x72, 0xA8, 0x8F, 0x2F, 0x28, + 0x03, 0xD8, 0x32, 0x48, 0x20, 0x65, 0x00, 0x20, 0xE8, 0x74, 0x00, 0x26, 0x25, 0x48, 0x86, 0x60, + 0x2C, 0x4F, 0x38, 0x68, 0x4A, 0x21, 0x68, 0x52, 0x3E, 0x60, 0x21, 0x6D, 0x0A, 0x9A, 0x4A, 0x43, + 0x80, 0xB2, 0x10, 0x18, 0x01, 0x09, 0x2A, 0x4A, 0x11, 0x40, 0xC2, 0x08, 0x52, 0x1A, 0x42, 0x23, + 0xEA, 0x52, 0x80, 0x08, 0x20, 0x65, 0x29, 0x87, 0x90, 0xB2, 0x1A, 0x49, 0x89, 0x68, 0x05, 0x29, + 0x13, 0xD2, 0x39, 0x68, 0x1A, 0x49, 0x08, 0x62, 0xE0, 0x7C, 0xE1, 0x7B, 0x01, 0x29, 0x00, 0xD0, + 0xC6, 0xE0, 0x40, 0x1C, 0xE0, 0x74, 0xC1, 0xB2, 0x07, 0x29, 0x19, 0x4F, 0x02, 0xD3, 0x09, 0x98, + 0x28, 0x73, 0xE0, 0x74, 0x09, 0x99, 0x08, 0x40, 0xC5, 0xE0, 0x39, 0x68, 0x81, 0x42, 0xE9, 0xD2, + 0x39, 0x68, 0x81, 0x42, 0xE6, 0xD2, 0x39, 0x68, 0x81, 0x42, 0xE3, 0xD2, 0x39, 0x68, 0x81, 0x42, + 0xF3, 0xD3, 0xDF, 0xE7, 0xC0, 0x00, 0x00, 0x20, 0xB8, 0xF7, 0xFF, 0x1F, 0xE4, 0x0C, 0x00, 0x00, + 0xFF, 0x0F, 0x00, 0x00, 0x08, 0x24, 0x01, 0x40, 0xE8, 0xFF, 0xFF, 0x7F, 0x32, 0x08, 0x00, 0x20, + 0x00, 0x05, 0x00, 0x20, 0x7C, 0x05, 0x00, 0x20, 0x7C, 0xFC, 0xFF, 0xFF, 0x20, 0x4E, 0x00, 0x00, + 0x0C, 0x20, 0x00, 0x40, 0x34, 0x2C, 0x01, 0x40, 0xC0, 0x27, 0x09, 0x00, 0xCD, 0xCC, 0x00, 0x00, + 0xDC, 0x06, 0x00, 0x20, 0x24, 0x00, 0x00, 0x40, 0xC9, 0xAF, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, + 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x26, 0xAE, 0x70, 0x50, 0x20, 0x09, 0x90, 0x28, 0x5A, 0x4E, 0x21, + 0x05, 0x91, 0x6A, 0x5A, 0x4C, 0x21, 0x0A, 0x91, 0x69, 0x5A, 0xE3, 0x7B, 0x00, 0x2B, 0x01, 0x96, + 0x03, 0x97, 0x00, 0xD1, 0x70, 0xE1, 0x43, 0x1E, 0x18, 0xB2, 0x00, 0x28, 0x0E, 0x98, 0x00, 0xD4, + 0x18, 0x46, 0x53, 0x1E, 0x1A, 0xB2, 0x00, 0x2A, 0x0E, 0x9A, 0x00, 0xD4, 0x1A, 0x46, 0x4B, 0x1E, + 0x19, 0xB2, 0x00, 0x29, 0x0E, 0x99, 0x00, 0xD4, 0x19, 0x46, 0x0A, 0x9B, 0x09, 0x9E, 0xA8, 0x53, + 0x05, 0x98, 0x2A, 0x52, 0xE9, 0x52, 0x40, 0x20, 0x04, 0x90, 0x20, 0x5A, 0x09, 0xB2, 0x49, 0x00, + 0xDF, 0x4A, 0x51, 0x5E, 0x41, 0x18, 0x60, 0x8E, 0x48, 0x43, 0x0D, 0x99, 0xFD, 0xF7, 0x0A, 0xF8, + 0x2D, 0x26, 0x27, 0x46, 0xE6, 0x4C, 0xA1, 0x5D, 0x48, 0x43, 0x0A, 0x24, 0x21, 0x46, 0xFD, 0xF7, + 0x01, 0xF8, 0x80, 0xB2, 0x01, 0xF0, 0xC4, 0xF9, 0x04, 0x98, 0x38, 0x5A, 0x05, 0x99, 0x69, 0x5E, + 0x49, 0x00, 0xD3, 0x4A, 0x51, 0x5E, 0x41, 0x18, 0x78, 0x8E, 0x48, 0x43, 0x0D, 0x99, 0xFC, 0xF7, + 0xF1, 0xFF, 0xDB, 0x49, 0x89, 0x5D, 0x48, 0x43, 0x21, 0x46, 0x25, 0x46, 0xFC, 0xF7, 0xEA, 0xFF, + 0x80, 0xB2, 0x01, 0xF0, 0xB3, 0xF9, 0x04, 0x98, 0x38, 0x5A, 0x09, 0x99, 0xC2, 0x4C, 0x61, 0x5E, + 0x49, 0x00, 0xC7, 0x4A, 0x51, 0x5E, 0x41, 0x18, 0x78, 0x8E, 0x48, 0x43, 0x0D, 0x99, 0xFC, 0xF7, + 0xD9, 0xFF, 0xCF, 0x49, 0x89, 0x5D, 0x26, 0x46, 0x48, 0x43, 0x29, 0x46, 0xFC, 0xF7, 0xD2, 0xFF, + 0x80, 0xB2, 0x01, 0xF0, 0xA1, 0xF9, 0xA0, 0x8F, 0xC8, 0x28, 0x57, 0xD9, 0x0A, 0x98, 0x03, 0x99, + 0x31, 0x52, 0x09, 0x98, 0xF8, 0x87, 0x3C, 0x46, 0x0F, 0x46, 0x52, 0xE0, 0x02, 0x46, 0xBB, 0x7C, + 0x00, 0x2B, 0x00, 0xD1, 0x39, 0xE5, 0x02, 0x46, 0x01, 0x2A, 0x00, 0xD1, 0x37, 0xE5, 0x38, 0xE5, + 0x41, 0x1E, 0xE1, 0x74, 0x08, 0x06, 0xBE, 0x4F, 0x03, 0xD1, 0x09, 0x98, 0x28, 0x73, 0x06, 0x21, + 0xE1, 0x74, 0x09, 0x98, 0x88, 0x43, 0xA0, 0x73, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, 0xE8, 0x7B, + 0x00, 0x28, 0x02, 0xD1, 0xE0, 0x7C, 0xFD, 0xF7, 0xF1, 0xFF, 0x62, 0xB6, 0xFD, 0xF7, 0xCE, 0xFF, + 0xA6, 0x48, 0x00, 0x68, 0xA1, 0x49, 0x88, 0x42, 0x01, 0xD9, 0x09, 0x98, 0xE0, 0x72, 0xEE, 0x76, + 0x2E, 0x77, 0xAE, 0x75, 0xA1, 0x4A, 0x90, 0x68, 0x41, 0x1C, 0x91, 0x60, 0xE0, 0x7C, 0x40, 0x00, + 0x82, 0x18, 0x20, 0x6D, 0x50, 0x82, 0x02, 0x9A, 0xBA, 0x5C, 0x53, 0x1E, 0x9A, 0x41, 0x7B, 0x7F, + 0x00, 0x2B, 0x0C, 0x9B, 0x00, 0xD1, 0x13, 0x46, 0x01, 0x2B, 0x07, 0xD1, 0x14, 0x29, 0x00, 0xD2, + 0x19, 0xE4, 0x0D, 0x99, 0x49, 0x1C, 0x88, 0x42, 0x04, 0xD3, 0x14, 0xE4, 0x0D, 0x99, 0x88, 0x42, + 0x00, 0xD3, 0x10, 0xE4, 0xE6, 0x72, 0xFE, 0xF7, 0x15, 0xFE, 0x0C, 0xE4, 0xF8, 0x8F, 0x3C, 0x46, + 0x03, 0x9F, 0xFE, 0xF7, 0x17, 0xFC, 0x0A, 0x98, 0x30, 0x5A, 0x00, 0x28, 0x35, 0x46, 0x01, 0xD0, + 0xFF, 0xF7, 0x01, 0xFC, 0x01, 0x9E, 0xEE, 0x74, 0x2F, 0x75, 0x85, 0x48, 0x20, 0x65, 0xE6, 0x72, + 0x86, 0x4A, 0x10, 0x61, 0x10, 0x60, 0x83, 0x49, 0x08, 0x60, 0xEF, 0x73, 0x14, 0x20, 0x90, 0x60, + 0x8F, 0x48, 0x40, 0x7F, 0x00, 0x28, 0x01, 0xD0, 0xE0, 0x8D, 0x28, 0x86, 0x20, 0x7B, 0xE1, 0x7B, + 0x01, 0x29, 0x00, 0xD0, 0xA6, 0xE0, 0x40, 0x1C, 0xE0, 0x74, 0xC1, 0xB2, 0x07, 0x29, 0x02, 0xD3, + 0x2E, 0x73, 0xE6, 0x74, 0x30, 0x46, 0x30, 0x40, 0xA5, 0xE0, 0x4C, 0x1C, 0x21, 0xB2, 0x00, 0x22, + 0x0E, 0x9E, 0xB1, 0x42, 0x11, 0x46, 0x00, 0xDC, 0x21, 0x46, 0x6C, 0x1C, 0x25, 0xB2, 0x0E, 0x9E, + 0xB5, 0x42, 0x15, 0x46, 0x00, 0xDC, 0x25, 0x46, 0x5B, 0x1C, 0x1C, 0xB2, 0x0E, 0x9E, 0xB4, 0x42, + 0x00, 0xDC, 0x1A, 0x46, 0x66, 0x4C, 0x0A, 0x9E, 0x67, 0x4B, 0xD9, 0x53, 0x9D, 0x53, 0x1A, 0x52, + 0x40, 0x20, 0x05, 0x90, 0x20, 0x5A, 0x11, 0xB2, 0x49, 0x00, 0x69, 0x4A, 0x51, 0x5E, 0x41, 0x18, + 0x60, 0x8E, 0x48, 0x43, 0x0D, 0x9E, 0x31, 0x46, 0xFC, 0xF7, 0x1C, 0xFF, 0x09, 0x97, 0x2D, 0x27, + 0x6F, 0x4C, 0xE1, 0x5D, 0x48, 0x43, 0x0A, 0x25, 0x29, 0x46, 0xFC, 0xF7, 0x13, 0xFF, 0x80, 0xB2, + 0x01, 0xF0, 0xD6, 0xF8, 0x56, 0x48, 0x05, 0x9C, 0x00, 0x5B, 0x57, 0x49, 0x0A, 0x9A, 0x89, 0x5E, + 0x49, 0x00, 0x5B, 0x4A, 0x51, 0x5E, 0x41, 0x18, 0x51, 0x48, 0x40, 0x8E, 0x48, 0x43, 0x31, 0x46, + 0xFC, 0xF7, 0x00, 0xFF, 0x62, 0x49, 0xC9, 0x5D, 0x48, 0x43, 0x29, 0x46, 0xFC, 0xF7, 0xFA, 0xFE, + 0x80, 0xB2, 0x01, 0xF0, 0xC3, 0xF8, 0x4A, 0x48, 0x00, 0x5B, 0x09, 0x99, 0x4A, 0x4A, 0x51, 0x5E, + 0x49, 0x00, 0x4F, 0x4A, 0x51, 0x5E, 0x41, 0x18, 0x45, 0x48, 0x40, 0x8E, 0x48, 0x43, 0x31, 0x46, + 0xFC, 0xF7, 0xE8, 0xFE, 0x56, 0x4A, 0xD1, 0x5D, 0x14, 0x46, 0x48, 0x43, 0x29, 0x46, 0xFC, 0xF7, + 0xE1, 0xFE, 0x80, 0xB2, 0x01, 0xF0, 0xB0, 0xF8, 0xE5, 0x7E, 0x3E, 0x48, 0x29, 0x46, 0xFC, 0xF7, + 0xB9, 0xFE, 0x06, 0x46, 0x43, 0x48, 0x29, 0x46, 0x3B, 0x4D, 0x39, 0x4C, 0xFC, 0xF7, 0xB2, 0xFE, + 0x03, 0x46, 0xA8, 0x8F, 0x00, 0x96, 0x30, 0x21, 0x78, 0x22, 0x00, 0xF0, 0x6D, 0xF9, 0xE0, 0x87, + 0x80, 0xB2, 0xFE, 0xF7, 0x6F, 0xFB, 0x0E, 0x98, 0xF1, 0x30, 0xE1, 0x8F, 0xFC, 0xF7, 0xA2, 0xFE, + 0x5A, 0x21, 0x68, 0x52, 0xFF, 0xF7, 0x57, 0xFB, 0x43, 0x1C, 0x18, 0xB2, 0x0E, 0x9E, 0xB0, 0x42, + 0x38, 0x46, 0x00, 0xDC, 0x18, 0x46, 0x53, 0x1C, 0x1A, 0xB2, 0x0E, 0x9E, 0xB2, 0x42, 0x3A, 0x46, + 0x00, 0xDC, 0x1A, 0x46, 0x4B, 0x1C, 0x19, 0xB2, 0x0E, 0x9E, 0xB1, 0x42, 0x39, 0x46, 0x00, 0xDC, + 0x8A, 0xE6, 0x8A, 0xE6, 0x41, 0x1E, 0xE1, 0x74, 0x08, 0x06, 0x02, 0xD1, 0x2E, 0x73, 0x06, 0x21, + 0xE1, 0x74, 0x30, 0x46, 0x88, 0x43, 0xA0, 0x73, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, 0xE8, 0x7B, + 0x00, 0x28, 0x02, 0xD1, 0xE0, 0x7C, 0xFD, 0xF7, 0xE1, 0xFE, 0x62, 0xB6, 0xFD, 0xF7, 0xBE, 0xFE, + 0x1E, 0x48, 0x00, 0x68, 0x19, 0x49, 0x88, 0x42, 0x00, 0xD9, 0xE6, 0x72, 0xEF, 0x76, 0x2F, 0x77, + 0xE0, 0x7C, 0x40, 0x00, 0x19, 0x49, 0x40, 0x18, 0x21, 0x6D, 0x41, 0x82, 0xFE, 0xF7, 0x10, 0xFE, + 0xFF, 0xF7, 0x19, 0xFB, 0xFD, 0xF7, 0x2E, 0xFE, 0x00, 0x20, 0xE8, 0x75, 0x28, 0x76, 0x12, 0x49, + 0x08, 0x60, 0x48, 0x60, 0xA8, 0x87, 0x68, 0x87, 0x88, 0x60, 0x00, 0xF0, 0x31, 0xFB, 0x01, 0x20, + 0x01, 0x02, 0x11, 0x48, 0xFC, 0xF7, 0x43, 0xFE, 0xBF, 0xF3, 0x4F, 0x8F, 0x0F, 0x48, 0x10, 0x49, + 0x01, 0x60, 0xBF, 0xF3, 0x4F, 0x8F, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0xFA, 0xE7, + 0xC0, 0x00, 0x00, 0x20, 0x2A, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0xC4, 0x09, 0x00, 0x00, + 0x28, 0x23, 0x00, 0x00, 0x24, 0x00, 0x00, 0x40, 0x34, 0x2C, 0x01, 0x40, 0x7C, 0x05, 0x00, 0x20, + 0xAC, 0x01, 0x00, 0x20, 0x58, 0x1B, 0x00, 0x00, 0xD8, 0x05, 0x00, 0x20, 0x0C, 0xED, 0x00, 0xE0, + 0x04, 0x00, 0xFA, 0x05, 0xB0, 0xB5, 0x12, 0x4C, 0xD6, 0x49, 0x30, 0x25, 0x20, 0x46, 0x2A, 0x46, + 0xFC, 0xF7, 0xFC, 0xFD, 0x20, 0x46, 0x29, 0x46, 0xFE, 0xF7, 0xF6, 0xFD, 0x60, 0x55, 0xB0, 0xBD, + 0xDC, 0x06, 0x00, 0x20, 0xB0, 0xB5, 0x0A, 0x4C, 0x04, 0x9D, 0x25, 0x72, 0xA3, 0x71, 0x22, 0x71, + 0xA1, 0x70, 0x20, 0x70, 0x28, 0x0A, 0xE0, 0x71, 0x18, 0x0A, 0x60, 0x71, 0x10, 0x0A, 0xE0, 0x70, + 0x08, 0x0A, 0x60, 0x70, 0x09, 0x21, 0x20, 0x46, 0xFE, 0xF7, 0xDE, 0xFD, 0x60, 0x72, 0xB0, 0xBD, + 0xA4, 0x05, 0x00, 0x20, 0xF0, 0xB5, 0x83, 0xB0, 0x59, 0x49, 0x0E, 0x89, 0x00, 0x2E, 0x02, 0xD0, + 0x00, 0x20, 0x08, 0x81, 0x24, 0xE0, 0x57, 0x49, 0x09, 0x78, 0x00, 0x29, 0x00, 0xD1, 0x56, 0x48, + 0xC1, 0x0B, 0x0D, 0xD1, 0x81, 0x0B, 0x0D, 0xD1, 0x41, 0x0B, 0x0D, 0xD1, 0x01, 0x0B, 0x0D, 0xD1, + 0xC1, 0x0A, 0x0D, 0xD1, 0x81, 0x0A, 0x0D, 0xD1, 0x41, 0x0A, 0x4A, 0x1E, 0x91, 0x41, 0x0A, 0xE0, + 0x07, 0x21, 0x08, 0xE0, 0x06, 0x21, 0x06, 0xE0, 0x05, 0x21, 0x04, 0xE0, 0x04, 0x21, 0x02, 0xE0, + 0x03, 0x21, 0x00, 0xE0, 0x02, 0x21, 0x46, 0x4A, 0x51, 0x61, 0xC8, 0x40, 0x4E, 0x02, 0x06, 0x43, + 0x46, 0x48, 0x00, 0x78, 0x80, 0x00, 0x01, 0x90, 0x45, 0x49, 0x0B, 0x18, 0x40, 0x27, 0x5F, 0x60, + 0x31, 0x0A, 0x44, 0x48, 0x40, 0x5C, 0x00, 0x90, 0x84, 0x00, 0x38, 0x46, 0xA0, 0x43, 0x98, 0x60, + 0x35, 0x09, 0x69, 0x40, 0x71, 0x40, 0x0F, 0x24, 0x02, 0x94, 0x8C, 0x43, 0x31, 0x01, 0x09, 0x19, + 0x37, 0x4A, 0x91, 0x61, 0x00, 0x99, 0xCA, 0x00, 0x3A, 0x40, 0x42, 0x40, 0xDA, 0x60, 0xC8, 0x03, + 0x02, 0x99, 0x0D, 0x40, 0x37, 0x49, 0x4D, 0x5D, 0xA9, 0x02, 0x01, 0x43, 0x35, 0x48, 0x00, 0x5D, + 0x00, 0x90, 0x02, 0x9C, 0x26, 0x40, 0x33, 0x4C, 0xA4, 0x5D, 0x02, 0x94, 0x66, 0x01, 0x06, 0x43, + 0x34, 0x46, 0x0C, 0x43, 0x2A, 0x48, 0xC4, 0x61, 0xC8, 0x0A, 0x38, 0x40, 0x50, 0x40, 0x18, 0x61, + 0x8A, 0x0A, 0x3A, 0x40, 0x42, 0x40, 0x5A, 0x61, 0x48, 0x0A, 0x38, 0x40, 0x50, 0x40, 0x98, 0x61, + 0xA9, 0x00, 0x39, 0x40, 0x41, 0x40, 0xD9, 0x61, 0xE8, 0x00, 0x38, 0x40, 0x48, 0x40, 0x18, 0x62, + 0xA1, 0x09, 0x39, 0x40, 0x41, 0x40, 0x59, 0x62, 0x60, 0x09, 0x38, 0x40, 0x48, 0x40, 0x98, 0x62, + 0x21, 0x09, 0x39, 0x40, 0x41, 0x40, 0xD9, 0x62, 0x02, 0x9A, 0x90, 0x00, 0x38, 0x40, 0x48, 0x40, + 0x18, 0x63, 0xD1, 0x00, 0x39, 0x40, 0x41, 0x40, 0x59, 0x63, 0x3F, 0x20, 0xC0, 0x43, 0x01, 0x40, + 0x72, 0x08, 0x3A, 0x40, 0x4A, 0x40, 0x9A, 0x63, 0x71, 0x00, 0x3E, 0x40, 0x56, 0x40, 0xDE, 0x63, + 0x39, 0x40, 0x71, 0x40, 0x19, 0x64, 0x00, 0x22, 0x11, 0x4C, 0x01, 0x9D, 0x62, 0x51, 0x00, 0x9C, + 0xA2, 0x00, 0x3A, 0x40, 0x4A, 0x40, 0x5A, 0x64, 0xE1, 0x00, 0x39, 0x40, 0x51, 0x40, 0x99, 0x64, + 0x22, 0x01, 0x3A, 0x40, 0x4A, 0x40, 0xDA, 0x64, 0x02, 0x40, 0x60, 0x01, 0x38, 0x40, 0x50, 0x40, + 0x18, 0x65, 0xE1, 0x07, 0x49, 0x0E, 0x41, 0x40, 0x59, 0x65, 0x03, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, + 0x80, 0x04, 0x00, 0x20, 0x13, 0x05, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0x00, 0xE1, 0x04, 0x00, 0x20, + 0x9C, 0x07, 0x00, 0x20, 0xF8, 0x5D, 0x00, 0x08, 0x70, 0xB5, 0x04, 0x9D, 0x88, 0x42, 0x14, 0xDD, + 0x2C, 0x46, 0x25, 0x46, 0x90, 0x42, 0x14, 0xDA, 0xAB, 0x42, 0x15, 0xD0, 0x16, 0x46, 0xEA, 0x18, + 0x54, 0x10, 0x72, 0x18, 0x52, 0x10, 0x91, 0x42, 0x0C, 0xD0, 0x90, 0x42, 0xF1, 0xDD, 0x51, 0x1C, + 0x88, 0x42, 0x23, 0x46, 0x32, 0x46, 0xEB, 0xDC, 0x01, 0xE0, 0x16, 0x46, 0x1C, 0x46, 0xB0, 0x42, + 0x00, 0xDB, 0x2C, 0x46, 0x20, 0x46, 0x70, 0xBD, 0x18, 0x46, 0x70, 0xBD, 0x01, 0x20, 0x40, 0x05, + 0x02, 0x49, 0x0A, 0x68, 0x82, 0x43, 0x0A, 0x60, 0x48, 0x61, 0x70, 0x47, 0x00, 0x04, 0x01, 0x40, + 0xF0, 0xB5, 0x81, 0xB0, 0xAA, 0x4D, 0xAB, 0x48, 0x68, 0x60, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, + 0xA9, 0x48, 0x00, 0x78, 0xE8, 0x60, 0x28, 0x61, 0x68, 0x61, 0x79, 0x24, 0x85, 0x4E, 0x86, 0x4F, + 0x37, 0x60, 0xA4, 0x1E, 0x14, 0x21, 0x20, 0x46, 0xFC, 0xF7, 0xFC, 0xFC, 0xC0, 0xB2, 0xFD, 0xF7, + 0x65, 0xFD, 0x60, 0x08, 0x0A, 0x30, 0x28, 0x60, 0x0A, 0x20, 0xFE, 0xF7, 0xD3, 0xF9, 0x02, 0x2C, + 0xEE, 0xD8, 0xFD, 0xF7, 0xBF, 0xFC, 0x00, 0x20, 0x28, 0x60, 0x9C, 0x49, 0x08, 0x80, 0x9C, 0x48, + 0x00, 0x88, 0x68, 0x60, 0x62, 0xB6, 0x01, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0xF0, 0xB5, 0x83, 0xB0, + 0x03, 0x20, 0xFD, 0xF7, 0x4B, 0xFD, 0x00, 0x21, 0x35, 0x20, 0x94, 0x4E, 0x8F, 0x4A, 0x02, 0x91, + 0x0B, 0x46, 0x04, 0xE0, 0x5B, 0x1C, 0xA8, 0x1C, 0x31, 0x3D, 0x7E, 0x2D, 0x4C, 0xD2, 0x05, 0x46, + 0x6D, 0x48, 0x6C, 0x49, 0x08, 0x60, 0x02, 0x98, 0x30, 0x80, 0x50, 0x19, 0x40, 0x1E, 0x07, 0x78, + 0xFF, 0x2F, 0xEF, 0xD0, 0x50, 0x5D, 0x00, 0x28, 0x2D, 0xD0, 0x0A, 0x21, 0x84, 0x4E, 0x31, 0x60, + 0xF7, 0x21, 0x41, 0x43, 0x7D, 0x20, 0x40, 0x01, 0x09, 0x18, 0x23, 0x48, 0x01, 0x93, 0xFC, 0xF7, + 0xB9, 0xFC, 0x04, 0x46, 0x21, 0x48, 0x21, 0x46, 0xFC, 0xF7, 0xB4, 0xFC, 0x70, 0x60, 0x7E, 0x49, + 0x09, 0x78, 0x48, 0x43, 0x7B, 0x49, 0xFC, 0xF7, 0xAD, 0xFC, 0xF0, 0x60, 0x30, 0x61, 0x70, 0x61, + 0x01, 0x98, 0xC0, 0xB2, 0xFE, 0x21, 0x41, 0x43, 0xCE, 0x19, 0x19, 0x48, 0x21, 0x46, 0xFC, 0xF7, + 0xA1, 0xFC, 0x70, 0x43, 0x75, 0x4E, 0x64, 0x21, 0xFC, 0xF7, 0x9C, 0xFC, 0x80, 0xB2, 0xFE, 0xF7, + 0x79, 0xF9, 0x00, 0x23, 0x0B, 0xE0, 0x00, 0x24, 0x6D, 0x48, 0xC4, 0x60, 0x04, 0x61, 0x44, 0x61, + 0xD8, 0xB2, 0xFE, 0x21, 0x41, 0x43, 0xC8, 0x19, 0xFE, 0xF7, 0x6C, 0xF9, 0x23, 0x46, 0xBE, 0x4A, + 0xA8, 0x1C, 0x31, 0x3D, 0x7E, 0x2D, 0xB2, 0xD3, 0xFD, 0xF7, 0x54, 0xFC, 0x00, 0x20, 0x64, 0x4A, + 0x10, 0x60, 0x67, 0x49, 0x09, 0x88, 0x51, 0x60, 0x30, 0x80, 0x43, 0x48, 0x41, 0x49, 0x08, 0x60, + 0x03, 0xB0, 0xF0, 0xBD, 0xDC, 0x06, 0x00, 0x20, 0xC0, 0xD8, 0xA7, 0x00, 0x00, 0x3E, 0x49, 0x00, + 0xA0, 0x86, 0x01, 0x00, 0xB0, 0xB5, 0x5A, 0x4D, 0x5A, 0x48, 0x68, 0x60, 0x28, 0x20, 0x28, 0x60, + 0x59, 0x48, 0x00, 0x78, 0xE8, 0x60, 0x28, 0x61, 0x68, 0x61, 0x02, 0x20, 0xFD, 0xF7, 0xCE, 0xFC, + 0x96, 0x24, 0x20, 0x46, 0xFE, 0xF7, 0x3E, 0xF9, 0x32, 0x48, 0x33, 0x49, 0x01, 0x60, 0x50, 0x20, + 0x28, 0x60, 0x20, 0x46, 0xFE, 0xF7, 0x36, 0xF9, 0xFD, 0xF7, 0x24, 0xFC, 0x00, 0x20, 0x28, 0x60, + 0x4E, 0x49, 0x08, 0x80, 0x4E, 0x48, 0x00, 0x88, 0x68, 0x60, 0xB0, 0xBD, 0xB0, 0xB5, 0x48, 0x4D, + 0x48, 0x48, 0x68, 0x60, 0x32, 0x20, 0x28, 0x60, 0x47, 0x48, 0x00, 0x78, 0xE8, 0x60, 0x28, 0x61, + 0x68, 0x61, 0x02, 0x20, 0xFD, 0xF7, 0xAA, 0xFC, 0x96, 0x24, 0x20, 0x46, 0xFE, 0xF7, 0x1A, 0xF9, + 0x20, 0x48, 0x21, 0x49, 0x01, 0x60, 0x1E, 0x20, 0x28, 0x60, 0x20, 0x46, 0xFE, 0xF7, 0x12, 0xF9, + 0xFD, 0xF7, 0x00, 0xFC, 0x00, 0x20, 0x28, 0x60, 0x3C, 0x49, 0x08, 0x80, 0x3C, 0x48, 0x00, 0x88, + 0x68, 0x60, 0xB0, 0xBD, 0xF0, 0xB5, 0x81, 0xB0, 0x35, 0x4D, 0x36, 0x48, 0x68, 0x60, 0xEF, 0xF3, + 0x10, 0x80, 0x72, 0xB6, 0x13, 0x4E, 0x14, 0x4F, 0x37, 0x60, 0x3C, 0x20, 0x28, 0x60, 0x32, 0x48, + 0x00, 0x78, 0xE8, 0x60, 0x28, 0x61, 0x68, 0x61, 0x01, 0x20, 0xFD, 0xF7, 0x7F, 0xFC, 0x4B, 0x24, + 0x20, 0x46, 0xFE, 0xF7, 0xEF, 0xF8, 0x50, 0x20, 0x28, 0x60, 0x20, 0x46, 0xFE, 0xF7, 0xEA, 0xF8, + 0x5A, 0x20, 0x28, 0x60, 0x37, 0x60, 0x20, 0x46, 0xFE, 0xF7, 0xE4, 0xF8, 0xFD, 0xF7, 0xD2, 0xFB, + 0x00, 0x20, 0x28, 0x60, 0x25, 0x49, 0x08, 0x80, 0x25, 0x48, 0x00, 0x88, 0x68, 0x60, 0x62, 0xB6, + 0x01, 0xB0, 0xF0, 0xBD, 0x00, 0x30, 0x00, 0x40, 0xAA, 0xAA, 0x00, 0x00, 0xB0, 0xB5, 0xEF, 0xF3, + 0x10, 0x80, 0x72, 0xB6, 0x30, 0x20, 0x70, 0x49, 0x08, 0x5C, 0x19, 0x4D, 0xFF, 0x28, 0x02, 0xD0, + 0xFF, 0xF7, 0x04, 0xFF, 0x25, 0xE0, 0x17, 0x48, 0x68, 0x60, 0x17, 0x48, 0x00, 0x78, 0xE8, 0x60, + 0x28, 0x61, 0x68, 0x61, 0x03, 0x20, 0xFD, 0xF7, 0x49, 0xFC, 0x37, 0x20, 0x28, 0x60, 0xC8, 0x24, + 0x20, 0x46, 0xFE, 0xF7, 0xB7, 0xF8, 0x05, 0x20, 0xFD, 0xF7, 0x40, 0xFC, 0x28, 0x20, 0x28, 0x60, + 0x20, 0x46, 0xFE, 0xF7, 0xAF, 0xF8, 0x06, 0x20, 0xFD, 0xF7, 0x38, 0xFC, 0x19, 0x20, 0x28, 0x60, + 0x20, 0x46, 0xFE, 0xF7, 0xA7, 0xF8, 0xFD, 0xF7, 0x95, 0xFB, 0x08, 0x48, 0x00, 0x21, 0x01, 0x80, + 0x29, 0x60, 0x07, 0x48, 0x00, 0x88, 0x68, 0x60, 0x62, 0xB6, 0xB0, 0xBD, 0xDC, 0x06, 0x00, 0x20, + 0x28, 0x2C, 0x01, 0x40, 0xCF, 0x07, 0x00, 0x00, 0xD5, 0x05, 0x00, 0x20, 0x44, 0x05, 0x00, 0x20, + 0xF2, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x0A, 0x4C, 0x60, 0x78, 0x02, 0x28, 0x08, 0xD0, 0x01, 0x28, + 0x03, 0xD1, 0xFD, 0xF7, 0x6F, 0xFD, 0x00, 0x20, 0x60, 0x70, 0x00, 0xF0, 0xEB, 0xF9, 0x10, 0xBD, + 0x04, 0x48, 0x80, 0x89, 0xFF, 0xF7, 0x9E, 0xFD, 0x00, 0x20, 0x60, 0x70, 0x10, 0xBD, 0xC0, 0x46, + 0x00, 0x05, 0x00, 0x20, 0x7C, 0x05, 0x00, 0x20, 0x10, 0xB5, 0x03, 0x22, 0x10, 0x04, 0x09, 0x21, + 0xC9, 0x06, 0x0B, 0x68, 0x83, 0x43, 0x01, 0x20, 0x04, 0x04, 0x1B, 0x19, 0x0B, 0x60, 0x03, 0x02, + 0x8B, 0x62, 0x93, 0x04, 0x0C, 0x68, 0x9C, 0x43, 0x83, 0x04, 0xE3, 0x18, 0x0B, 0x60, 0x43, 0x02, + 0x8B, 0x62, 0x13, 0x05, 0x0C, 0x68, 0x9C, 0x43, 0x03, 0x05, 0xE3, 0x18, 0x0B, 0x60, 0x83, 0x02, + 0x8B, 0x62, 0x92, 0x03, 0x0B, 0x68, 0x93, 0x43, 0xC2, 0x03, 0x9A, 0x18, 0x0A, 0x60, 0x06, 0x49, + 0x0A, 0x68, 0x02, 0x23, 0x13, 0x43, 0x83, 0x43, 0x0B, 0x60, 0x08, 0x68, 0x08, 0x22, 0x02, 0x43, + 0x04, 0x20, 0x82, 0x43, 0x0A, 0x60, 0x10, 0xBD, 0x00, 0x04, 0x00, 0x48, 0xB0, 0xB5, 0xBE, 0x48, + 0x01, 0x68, 0x02, 0x22, 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x91, 0x43, 0x01, 0x60, 0xBB, 0x48, + 0x01, 0x46, 0x08, 0x39, 0x41, 0x22, 0x0A, 0x60, 0x0A, 0x21, 0x01, 0x60, 0x13, 0x49, 0x09, 0x78, + 0x81, 0x60, 0x13, 0x49, 0xC1, 0x60, 0x02, 0x46, 0x0C, 0x3A, 0x13, 0x68, 0x01, 0x21, 0x0B, 0x43, + 0x13, 0x60, 0x00, 0x22, 0x42, 0x60, 0xB3, 0x4B, 0x0E, 0x4C, 0xDC, 0x60, 0x04, 0x46, 0x14, 0x34, + 0x9C, 0x60, 0x0D, 0x4C, 0x24, 0x78, 0x5C, 0x60, 0x0C, 0x4C, 0x1C, 0x60, 0x4B, 0x02, 0x04, 0x46, + 0x14, 0x3C, 0x25, 0x68, 0x1D, 0x43, 0x25, 0x60, 0x03, 0x68, 0x0B, 0x43, 0x03, 0x60, 0xAB, 0x4B, + 0x1A, 0x70, 0x20, 0x38, 0x02, 0x68, 0x0A, 0x43, 0x02, 0x60, 0xB0, 0xBD, 0xA4, 0x01, 0x00, 0x20, + 0xFF, 0xFF, 0x00, 0x00, 0xD8, 0x05, 0x00, 0x20, 0x3C, 0x01, 0x00, 0x20, 0x8B, 0x09, 0x00, 0x00, + 0x02, 0x48, 0x00, 0x21, 0x41, 0x60, 0x01, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x24, 0x04, 0x00, 0x40, + 0x80, 0xB5, 0x04, 0x49, 0x0A, 0x78, 0x04, 0x48, 0x42, 0x70, 0xCA, 0x6C, 0xC0, 0x21, 0x00, 0xF0, + 0x05, 0xF8, 0x80, 0xBD, 0xC0, 0x00, 0x00, 0x20, 0xDC, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x03, 0xAF, + 0x8B, 0xB0, 0x6E, 0x46, 0xF4, 0x1D, 0x19, 0x34, 0x15, 0x46, 0x71, 0x61, 0xB0, 0x61, 0xC8, 0x0F, + 0x0B, 0x18, 0x01, 0x22, 0x19, 0x46, 0xF2, 0x60, 0x91, 0x43, 0xC9, 0x1D, 0x07, 0x22, 0x91, 0x43, + 0x6A, 0x46, 0x50, 0x1A, 0x59, 0x10, 0x85, 0x46, 0xF0, 0x61, 0x31, 0x61, 0xFC, 0xF7, 0xE7, 0xFA, + 0x70, 0x69, 0x02, 0x28, 0x5A, 0xDB, 0xB2, 0x69, 0x35, 0x60, 0x74, 0x60, 0x03, 0x20, 0x31, 0x69, + 0x08, 0x40, 0xB0, 0x60, 0x48, 0x1E, 0x03, 0x28, 0x01, 0xD2, 0x00, 0x21, 0x23, 0xE0, 0x48, 0x00, + 0x5D, 0x49, 0x01, 0x40, 0x71, 0x61, 0x00, 0x23, 0x19, 0x46, 0xD2, 0x5C, 0xB0, 0x69, 0xC0, 0x18, + 0x44, 0x78, 0x24, 0x02, 0xA2, 0x18, 0xF5, 0x69, 0xEA, 0x52, 0x82, 0x78, 0xC4, 0x78, 0x24, 0x02, + 0xA2, 0x18, 0xEC, 0x18, 0x62, 0x80, 0x02, 0x79, 0x45, 0x79, 0x2D, 0x02, 0xAA, 0x18, 0xA2, 0x80, + 0x82, 0x79, 0xC0, 0x79, 0x00, 0x02, 0x80, 0x18, 0xE0, 0x80, 0xB2, 0x69, 0x08, 0x33, 0x09, 0x1D, + 0x70, 0x69, 0x98, 0x42, 0xE1, 0xD1, 0xB3, 0x68, 0x00, 0x2B, 0x74, 0x68, 0x35, 0x68, 0x25, 0xD0, + 0x49, 0x00, 0xB0, 0x69, 0x40, 0x5C, 0xB2, 0x69, 0x52, 0x18, 0x52, 0x78, 0x12, 0x02, 0x10, 0x18, + 0xF2, 0x69, 0x71, 0x61, 0x50, 0x52, 0x01, 0x2B, 0x18, 0xD0, 0x70, 0x69, 0x80, 0x1C, 0xB1, 0x69, + 0x0A, 0x5C, 0xB1, 0x69, 0x0B, 0x18, 0x5B, 0x78, 0x1B, 0x02, 0x9A, 0x18, 0xF3, 0x69, 0x1A, 0x52, + 0xB1, 0x69, 0xB0, 0x68, 0x02, 0x28, 0x09, 0xD0, 0x0A, 0x46, 0x70, 0x69, 0x00, 0x1D, 0x09, 0x5C, + 0x12, 0x18, 0x52, 0x78, 0x12, 0x02, 0x51, 0x18, 0xF2, 0x69, 0x11, 0x52, 0x30, 0x69, 0xA0, 0x60, + 0x36, 0x48, 0x01, 0x68, 0xC9, 0x07, 0x08, 0xD0, 0x01, 0x68, 0xC9, 0x07, 0x05, 0xD0, 0x01, 0x68, + 0xC9, 0x07, 0x02, 0xD0, 0x01, 0x68, 0xC9, 0x07, 0xF3, 0xD1, 0x41, 0x68, 0x09, 0x06, 0x06, 0xD5, + 0x2F, 0x49, 0x0A, 0x68, 0x03, 0x46, 0x08, 0x3B, 0x1A, 0x60, 0x49, 0x68, 0x19, 0x60, 0xA9, 0x05, + 0xF3, 0x68, 0x1D, 0xD1, 0x42, 0x68, 0x02, 0x21, 0x0A, 0x43, 0x42, 0x60, 0x85, 0x60, 0x42, 0x68, + 0x40, 0x23, 0x13, 0x43, 0x43, 0x60, 0x02, 0x68, 0xD2, 0x07, 0x08, 0xD0, 0x02, 0x68, 0xD2, 0x07, + 0x05, 0xD0, 0x02, 0x68, 0xD2, 0x07, 0x02, 0xD0, 0x02, 0x68, 0xD2, 0x07, 0xF3, 0xD1, 0x02, 0x68, + 0x92, 0x06, 0x01, 0xD5, 0x20, 0x22, 0x02, 0x60, 0x42, 0x68, 0x8A, 0x43, 0x42, 0x60, 0xF3, 0x68, + 0x00, 0x21, 0x61, 0x60, 0x07, 0xE0, 0x41, 0x68, 0x99, 0x43, 0x41, 0x60, 0x61, 0x68, 0x89, 0x1C, + 0x61, 0x60, 0x21, 0x68, 0x49, 0x1C, 0x21, 0x60, 0x21, 0x68, 0xA2, 0x68, 0x91, 0x42, 0x1A, 0xD2, + 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, 0x21, 0x68, 0x49, 0x00, 0xF2, 0x69, 0x51, 0x5A, 0x62, 0x68, + 0x51, 0x53, 0x01, 0x68, 0xC9, 0x07, 0x08, 0xD0, 0x01, 0x68, 0xC9, 0x07, 0x05, 0xD0, 0x01, 0x68, + 0xC9, 0x07, 0x02, 0xD0, 0x01, 0x68, 0xC9, 0x07, 0xF3, 0xD1, 0x01, 0x68, 0x89, 0x06, 0xDA, 0xD5, + 0x20, 0x21, 0x01, 0x60, 0xD7, 0xE7, 0x41, 0x68, 0x80, 0x22, 0x0A, 0x43, 0x42, 0x60, 0xFE, 0x1F, + 0x05, 0x3E, 0xB5, 0x46, 0xF0, 0xBD, 0xC0, 0x46, 0xF8, 0xFF, 0xFF, 0x7F, 0x0C, 0x20, 0x02, 0x40, + 0x44, 0x01, 0x00, 0x20, 0xB0, 0xB5, 0x1C, 0x48, 0x01, 0x68, 0x02, 0x22, 0x11, 0x43, 0x01, 0x60, + 0x01, 0x68, 0x91, 0x43, 0x01, 0x60, 0x19, 0x48, 0x01, 0x46, 0x08, 0x39, 0x60, 0x22, 0x0A, 0x60, + 0x03, 0x21, 0x01, 0x60, 0x16, 0x49, 0x09, 0x78, 0x81, 0x60, 0x3D, 0x21, 0xC1, 0x60, 0x02, 0x46, + 0x0C, 0x3A, 0x13, 0x68, 0x01, 0x21, 0x0B, 0x43, 0x13, 0x60, 0x12, 0x4B, 0x12, 0x4A, 0xDA, 0x60, + 0x02, 0x46, 0x14, 0x32, 0x9A, 0x60, 0x11, 0x4A, 0x54, 0x78, 0x17, 0x34, 0x5C, 0x60, 0x10, 0x4C, + 0x1C, 0x60, 0x4B, 0x02, 0x04, 0x46, 0x14, 0x3C, 0x25, 0x68, 0x1D, 0x43, 0x25, 0x60, 0x03, 0x68, + 0x0B, 0x43, 0x03, 0x60, 0xCB, 0x03, 0x44, 0x6A, 0x1C, 0x43, 0x44, 0x62, 0x11, 0x70, 0x20, 0x38, + 0x02, 0x68, 0x0A, 0x43, 0x02, 0x60, 0xB0, 0xBD, 0x10, 0x10, 0x02, 0x40, 0x20, 0x04, 0x00, 0x40, + 0xEA, 0x04, 0x00, 0x20, 0x44, 0x00, 0x02, 0x40, 0x9C, 0x07, 0x00, 0x20, 0xE0, 0x04, 0x00, 0x20, + 0x9B, 0x09, 0x00, 0x00, 0xF0, 0xB5, 0x0C, 0x49, 0x0C, 0x68, 0x08, 0x22, 0x14, 0x43, 0x04, 0x23, + 0x9C, 0x43, 0x0C, 0x60, 0x09, 0x4C, 0x25, 0x68, 0x01, 0x26, 0xB5, 0x43, 0x25, 0x60, 0x65, 0x68, + 0x07, 0x4F, 0x2F, 0x40, 0x38, 0x18, 0x60, 0x60, 0x20, 0x68, 0x30, 0x43, 0x20, 0x60, 0x08, 0x68, + 0x18, 0x43, 0x90, 0x43, 0x08, 0x60, 0xF0, 0xBD, 0x00, 0x38, 0x01, 0x40, 0x1C, 0x00, 0x02, 0x40, + 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0xB5, 0x85, 0xB0, 0xF5, 0x4D, 0xA8, 0x7C, 0x00, 0x28, 0x05, 0xD0, + 0xF4, 0x4E, 0x70, 0x7E, 0x00, 0x28, 0x05, 0xD0, 0xF0, 0x8F, 0x2F, 0xE1, 0xF1, 0x48, 0xC1, 0x8F, + 0x81, 0x86, 0x9B, 0xE1, 0x7D, 0x22, 0xD4, 0x00, 0xEF, 0x48, 0x00, 0x79, 0x43, 0x00, 0x19, 0x19, + 0x26, 0x20, 0x2D, 0x5C, 0xF0, 0x8F, 0x01, 0x27, 0x00, 0x2D, 0x04, 0x94, 0x18, 0xD0, 0x81, 0x42, + 0x48, 0xD2, 0xE9, 0x4A, 0xD2, 0x7B, 0xE6, 0x4C, 0x65, 0x7C, 0xAA, 0x42, 0x5A, 0xD1, 0x3C, 0x46, + 0x01, 0x25, 0x03, 0x95, 0xF5, 0x73, 0x00, 0x25, 0xB5, 0x86, 0x37, 0x79, 0x00, 0x2F, 0x00, 0xD1, + 0xA0, 0xE0, 0xF5, 0x73, 0x03, 0x9B, 0x9A, 0x1A, 0xDF, 0x4B, 0xDA, 0x73, 0x27, 0x46, 0x4C, 0xE0, + 0x81, 0x42, 0x3A, 0xD2, 0x03, 0x97, 0xDC, 0x4B, 0xDF, 0x7B, 0xD9, 0x4D, 0x6B, 0x7C, 0x02, 0x97, + 0x9F, 0x42, 0x00, 0xD0, 0x8C, 0xE0, 0x30, 0x7D, 0x43, 0x1E, 0x98, 0x41, 0x40, 0x23, 0xF3, 0x5A, + 0x9B, 0xB2, 0xC8, 0x2B, 0x03, 0x9F, 0x3B, 0x46, 0x00, 0xD3, 0x03, 0x46, 0xD2, 0x4D, 0xAC, 0x8C, + 0x2D, 0x6D, 0xA5, 0x42, 0x00, 0xD8, 0x03, 0x46, 0x01, 0x2B, 0x00, 0xD0, 0x88, 0xE0, 0xCF, 0x48, + 0x00, 0x24, 0x84, 0x60, 0x01, 0x20, 0xCC, 0x4D, 0xE8, 0x72, 0x02, 0x99, 0x40, 0x1A, 0xE8, 0x73, + 0xFF, 0xF7, 0x3C, 0xFC, 0xB4, 0x72, 0x28, 0x79, 0x40, 0x00, 0x04, 0x9C, 0x01, 0x19, 0xF0, 0x8F, + 0xC3, 0x4D, 0x79, 0xE0, 0xC2, 0x4D, 0xE2, 0x1A, 0x82, 0x42, 0x28, 0xD8, 0x19, 0x19, 0x81, 0x42, + 0x4F, 0xD3, 0x00, 0x21, 0x82, 0x42, 0x4F, 0xD9, 0x4F, 0xE0, 0xBD, 0x4D, 0xE2, 0x1A, 0x82, 0x42, + 0x78, 0xD8, 0x19, 0x19, 0x81, 0x42, 0x00, 0xD2, 0xB4, 0xE0, 0x00, 0x21, 0x82, 0x42, 0x00, 0xD8, + 0xB3, 0xE0, 0xB3, 0xE0, 0xF2, 0x7B, 0x00, 0x2A, 0x0C, 0xD1, 0x00, 0x22, 0x32, 0x71, 0xB8, 0x4A, + 0x00, 0x92, 0x2F, 0x3A, 0x2F, 0x23, 0xFF, 0xF7, 0xEF, 0xFB, 0xB0, 0x86, 0xF0, 0x8F, 0xB2, 0x49, + 0x09, 0x79, 0x4B, 0x00, 0xAE, 0x4D, 0x04, 0x9C, 0xE2, 0x1A, 0x82, 0x42, 0xD6, 0xD9, 0x03, 0x97, + 0x69, 0x7C, 0x01, 0x27, 0x7D, 0x1A, 0xAC, 0x4C, 0xE4, 0x7B, 0xA5, 0x42, 0x0B, 0xD1, 0xF7, 0x73, + 0x00, 0x25, 0xB5, 0x86, 0x34, 0x79, 0x00, 0x2C, 0x33, 0xD0, 0xF5, 0x73, 0xA6, 0x4B, 0xD9, 0x73, + 0x03, 0x9F, 0x04, 0x9C, 0x04, 0xE0, 0xF1, 0x7B, 0x00, 0x29, 0x03, 0x9F, 0x04, 0x9C, 0x0C, 0xD1, + 0x00, 0x21, 0x31, 0x71, 0x2F, 0x23, 0x00, 0x93, 0xA1, 0x4B, 0xFF, 0xF7, 0xC5, 0xFB, 0xB0, 0x86, + 0x9D, 0x48, 0x00, 0x79, 0x43, 0x00, 0xE2, 0x1A, 0xF0, 0x8F, 0x99, 0x4D, 0x19, 0x19, 0x81, 0x42, + 0xAF, 0xD2, 0x01, 0x21, 0x82, 0x42, 0x00, 0xD8, 0x0F, 0x46, 0x00, 0x2F, 0x73, 0xD1, 0x00, 0x21, + 0xB1, 0x86, 0xF2, 0x7B, 0x00, 0x2A, 0x6E, 0xD0, 0x01, 0x22, 0x32, 0x71, 0xF1, 0x73, 0x6A, 0xE0, + 0x03, 0x9F, 0x11, 0xE0, 0x8E, 0x4D, 0x27, 0x46, 0x04, 0x9C, 0xE2, 0x1A, 0x82, 0x42, 0x95, 0xD9, + 0xBD, 0xE7, 0x8B, 0x4D, 0x03, 0x9F, 0x04, 0x9C, 0x19, 0x19, 0x81, 0x42, 0x91, 0xD2, 0xE0, 0xE7, + 0xD0, 0x00, 0xF0, 0x87, 0x86, 0x4D, 0x04, 0x9C, 0x89, 0x4A, 0x00, 0x92, 0x2F, 0x3A, 0x2F, 0x23, + 0xFF, 0xF7, 0x92, 0xFB, 0xB0, 0x86, 0xF0, 0x8F, 0x83, 0x49, 0x09, 0x79, 0x4B, 0x00, 0xE2, 0x1A, + 0x82, 0x42, 0x86, 0xD9, 0x69, 0x7C, 0x01, 0x23, 0x5C, 0x1A, 0x7F, 0x4D, 0xED, 0x7B, 0xAC, 0x42, + 0x21, 0xD1, 0x30, 0x7D, 0x44, 0x1E, 0xA0, 0x41, 0x40, 0x24, 0x34, 0x5B, 0xA4, 0xB2, 0xC8, 0x2C, + 0x03, 0x97, 0x00, 0xD3, 0x07, 0x46, 0x78, 0x4D, 0xAC, 0x8C, 0x2D, 0x6D, 0xA5, 0x42, 0x00, 0xD8, + 0x07, 0x46, 0x01, 0x2F, 0x72, 0x4D, 0x11, 0xD1, 0x73, 0x4F, 0xF9, 0x73, 0xFB, 0x72, 0x73, 0x48, + 0x00, 0x24, 0x84, 0x60, 0xFF, 0xF7, 0x8A, 0xFB, 0xB4, 0x72, 0x38, 0x79, 0x40, 0x00, 0x04, 0x9C, + 0x22, 0x1A, 0xF0, 0x8F, 0x05, 0xE0, 0x6A, 0x4D, 0x04, 0x9C, 0x03, 0xE0, 0x04, 0x9C, 0xF4, 0x87, + 0x20, 0x46, 0x03, 0x9F, 0x2F, 0x21, 0x00, 0x91, 0x00, 0x21, 0x69, 0x4B, 0xFF, 0xF7, 0x54, 0xFB, + 0xB0, 0x86, 0x65, 0x48, 0x00, 0x79, 0x43, 0x00, 0xE2, 0x1A, 0xF0, 0x8F, 0x19, 0x19, 0x81, 0x42, + 0x00, 0xD3, 0x4A, 0xE7, 0x01, 0x21, 0x82, 0x42, 0x00, 0xD8, 0x0F, 0x46, 0x00, 0x2F, 0x02, 0xD1, + 0x00, 0x21, 0xB1, 0x72, 0xB1, 0x86, 0x71, 0x7E, 0x00, 0x29, 0x6F, 0xD0, 0x7D, 0x21, 0xCC, 0x00, + 0x21, 0x46, 0x2F, 0x31, 0x88, 0x42, 0x2F, 0xD9, 0x57, 0x4F, 0xF9, 0x7B, 0x6A, 0x7C, 0x91, 0x42, + 0x24, 0xD1, 0xB8, 0x8C, 0x3D, 0x6D, 0x01, 0x22, 0x00, 0x23, 0x85, 0x42, 0x10, 0x46, 0x00, 0xD8, + 0x18, 0x46, 0x40, 0x25, 0x75, 0x5B, 0xAD, 0xB2, 0xC8, 0x2D, 0x00, 0xD3, 0x1A, 0x46, 0x10, 0x40, + 0x32, 0x7D, 0xD2, 0xB2, 0x53, 0x1E, 0x9A, 0x41, 0x02, 0x43, 0x01, 0x2A, 0x0B, 0xD1, 0x4B, 0x48, + 0x00, 0x25, 0x85, 0x60, 0x01, 0x20, 0xF8, 0x72, 0x40, 0x1A, 0xF8, 0x73, 0xFF, 0xF7, 0x36, 0xFB, + 0xB5, 0x72, 0xF0, 0x8F, 0x01, 0xE0, 0x00, 0x20, 0xF0, 0x87, 0x41, 0x4D, 0x39, 0x7A, 0x42, 0x00, + 0x51, 0x1A, 0xA7, 0x4A, 0x89, 0x18, 0xB1, 0x86, 0x01, 0x46, 0x30, 0x39, 0x89, 0xB2, 0xA1, 0x42, + 0x2F, 0xD2, 0x2F, 0x46, 0x69, 0x7C, 0x01, 0x22, 0x53, 0x1A, 0x3B, 0x4C, 0xE5, 0x7B, 0xAB, 0x42, + 0x21, 0xD1, 0xA0, 0x8C, 0x25, 0x6D, 0x00, 0x23, 0x85, 0x42, 0x10, 0x46, 0x00, 0xD8, 0x18, 0x46, + 0x40, 0x25, 0x75, 0x5B, 0xAD, 0xB2, 0xC8, 0x2D, 0x00, 0xD3, 0x1A, 0x46, 0x10, 0x40, 0x32, 0x7D, + 0xD2, 0xB2, 0x53, 0x1E, 0x9A, 0x41, 0x02, 0x43, 0x01, 0x2A, 0x0A, 0xD1, 0xE1, 0x73, 0x01, 0x20, + 0xE0, 0x72, 0xF6, 0x48, 0x00, 0x25, 0x85, 0x60, 0xFF, 0xF7, 0x00, 0xFB, 0xB5, 0x72, 0xF0, 0x8F, + 0x01, 0xE0, 0x00, 0x20, 0xF0, 0x87, 0x21, 0x7A, 0x42, 0x00, 0x51, 0x1A, 0x31, 0x39, 0xB1, 0x86, + 0x3D, 0x46, 0x2F, 0x28, 0x02, 0xD8, 0x00, 0x20, 0xB0, 0x72, 0xB0, 0x86, 0xE9, 0x4F, 0xF8, 0x79, + 0xE7, 0x4E, 0xB1, 0x7C, 0x81, 0x42, 0x0A, 0xD9, 0xA8, 0x7D, 0x00, 0x28, 0x07, 0xD0, 0xFC, 0xF7, + 0xD1, 0xFF, 0xFF, 0xF7, 0xE3, 0xFA, 0x66, 0x20, 0xB0, 0x74, 0x00, 0x20, 0x55, 0xE0, 0xE8, 0x7C, + 0x00, 0x28, 0x05, 0xD0, 0xB0, 0x8E, 0x1D, 0x28, 0x25, 0xD8, 0x00, 0x21, 0xB1, 0x87, 0x3F, 0xE0, + 0x70, 0x79, 0x00, 0x28, 0x48, 0xD0, 0x30, 0x78, 0x00, 0x28, 0x72, 0xD0, 0x79, 0x6C, 0xBB, 0x6C, + 0xB0, 0x8E, 0x00, 0x91, 0x2F, 0x21, 0xD8, 0x4C, 0x22, 0x46, 0xFF, 0xF7, 0xA5, 0xFA, 0x01, 0x46, + 0xD7, 0x48, 0xFB, 0xF7, 0xFF, 0xFF, 0xE9, 0x7E, 0x49, 0x08, 0xFB, 0xF7, 0xFB, 0xFF, 0x30, 0x85, + 0xB0, 0x8E, 0x2E, 0x28, 0x6A, 0xD8, 0x00, 0x20, 0x78, 0x65, 0xB0, 0x87, 0x70, 0x66, 0x30, 0x7D, + 0x00, 0x28, 0x2F, 0xD0, 0x24, 0xE1, 0x1E, 0x28, 0x0C, 0xD1, 0x1E, 0x20, 0x18, 0xE0, 0xC0, 0x46, + 0xDC, 0x06, 0x00, 0x20, 0x00, 0x05, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x7C, 0x05, 0x00, 0x20, + 0xFF, 0x07, 0x00, 0x00, 0x28, 0x21, 0x69, 0x5C, 0x14, 0x22, 0x4A, 0x43, 0x82, 0x42, 0x07, 0xD9, + 0xA0, 0x21, 0x00, 0x91, 0x1E, 0x21, 0x2F, 0x23, 0xFF, 0xF7, 0x76, 0xFA, 0xB0, 0x87, 0xB0, 0x8E, + 0x28, 0x21, 0x6A, 0x5C, 0x14, 0x21, 0x51, 0x43, 0x81, 0x42, 0x07, 0xD8, 0xBA, 0x4A, 0x00, 0x92, + 0xA0, 0x23, 0xFF, 0xF7, 0x69, 0xFA, 0x00, 0xE0, 0xB0, 0x8E, 0xB0, 0x87, 0x30, 0x7D, 0x00, 0x28, + 0x00, 0xD0, 0xF5, 0xE0, 0xF0, 0x7D, 0x00, 0x28, 0x00, 0xD1, 0xF1, 0xE0, 0xE9, 0x7C, 0x50, 0x24, + 0x20, 0x46, 0x48, 0x43, 0x2F, 0x30, 0xB2, 0x8F, 0x90, 0x42, 0x00, 0xD9, 0x86, 0xE0, 0xF0, 0x7C, + 0x00, 0x28, 0x6B, 0xD1, 0xFC, 0xF7, 0x5E, 0xFF, 0xF8, 0x7A, 0x00, 0x28, 0x61, 0xD1, 0xF0, 0x7C, + 0x00, 0x28, 0x5C, 0xD1, 0xF8, 0x7C, 0xF9, 0x7B, 0x01, 0x29, 0x28, 0xD1, 0x40, 0x1C, 0xF8, 0x74, + 0xC1, 0xB2, 0x07, 0x29, 0x02, 0xD3, 0x01, 0x20, 0x30, 0x73, 0xF8, 0x74, 0x01, 0x21, 0x01, 0x40, + 0x27, 0xE0, 0x70, 0x6E, 0xA3, 0x49, 0xFB, 0xF7, 0x95, 0xFF, 0x81, 0xB2, 0x30, 0x29, 0x00, 0xD8, + 0x30, 0x21, 0x00, 0x04, 0xC0, 0x0E, 0x0D, 0xD0, 0x9B, 0x49, 0x0B, 0xE0, 0x70, 0x6E, 0x9D, 0x49, + 0xFB, 0xF7, 0x88, 0xFF, 0x81, 0xB2, 0x30, 0x29, 0x00, 0xD8, 0x30, 0x21, 0x00, 0x04, 0xC0, 0x0E, + 0x00, 0xD0, 0x21, 0x46, 0xB1, 0x87, 0x30, 0x7D, 0x00, 0x28, 0xBB, 0xD0, 0xB0, 0xE0, 0x40, 0x1E, + 0xF8, 0x74, 0x01, 0x06, 0x03, 0xD1, 0x01, 0x20, 0x30, 0x73, 0x06, 0x20, 0xF8, 0x74, 0x01, 0x21, + 0x81, 0x43, 0xB9, 0x73, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, 0xF0, 0x7B, 0x00, 0x28, 0x02, 0xD1, + 0xF8, 0x7C, 0xFC, 0xF7, 0xB3, 0xFF, 0x62, 0xB6, 0xFC, 0xF7, 0x90, 0xFF, 0x87, 0x48, 0x01, 0x68, + 0x89, 0x4A, 0x91, 0x42, 0x02, 0xD3, 0x01, 0x21, 0x82, 0x4A, 0xD1, 0x72, 0x00, 0x21, 0xF1, 0x76, + 0x31, 0x77, 0x80, 0x4F, 0x39, 0x6D, 0x83, 0x4A, 0x3A, 0x65, 0xFA, 0x7C, 0x83, 0x4B, 0x84, 0x4D, + 0x1D, 0x60, 0x52, 0x00, 0x10, 0x18, 0x41, 0x82, 0x01, 0x20, 0xF0, 0x74, 0x77, 0x4D, 0xFD, 0xF7, + 0xE9, 0xFD, 0x01, 0x20, 0xF0, 0x74, 0x38, 0x8D, 0x30, 0x86, 0xE9, 0x7C, 0xBB, 0x8D, 0xB0, 0x8F, + 0x75, 0x4A, 0x00, 0x29, 0x05, 0xD0, 0x11, 0x46, 0x2F, 0x39, 0x00, 0x91, 0x28, 0x33, 0x89, 0x21, + 0x03, 0xE0, 0x11, 0x46, 0x2F, 0x39, 0x00, 0x91, 0x2F, 0x21, 0xFF, 0xF7, 0xD5, 0xF9, 0x70, 0x86, + 0x26, 0x20, 0x28, 0x5C, 0x00, 0x28, 0x01, 0xD1, 0x00, 0x20, 0xF0, 0x73, 0xE8, 0x7C, 0x60, 0x43, + 0x2F, 0x30, 0xB1, 0x8F, 0x88, 0x42, 0x58, 0xD9, 0xF0, 0x7A, 0x05, 0x28, 0x15, 0xD8, 0xC0, 0x46, + 0x78, 0x44, 0x00, 0x79, 0x40, 0x00, 0x87, 0x44, 0x12, 0x05, 0x0E, 0x08, 0x0B, 0x05, 0xC0, 0x46, + 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xF7, 0xAA, 0xFA, 0x07, 0xE0, 0xFF, 0xF7, 0xE1, 0xF9, 0x04, 0xE0, + 0xFF, 0xF7, 0xC8, 0xFA, 0x01, 0xE0, 0xFF, 0xF7, 0x7D, 0xFA, 0x00, 0x20, 0xF0, 0x72, 0x28, 0x7D, + 0x00, 0x28, 0x21, 0xD0, 0xF0, 0x7C, 0x00, 0x28, 0x6D, 0xD0, 0xF8, 0x7C, 0x3C, 0x21, 0x41, 0x43, + 0x38, 0x8B, 0x42, 0x18, 0x10, 0x46, 0x3C, 0x38, 0x03, 0xB2, 0xFF, 0x21, 0x68, 0x31, 0x8B, 0x42, + 0x01, 0xDD, 0x58, 0x48, 0x10, 0x18, 0x4C, 0x22, 0xB0, 0x52, 0x02, 0x46, 0xEF, 0x32, 0x13, 0xB2, + 0x8B, 0x42, 0x01, 0xDD, 0x02, 0x46, 0x79, 0x3A, 0x32, 0x53, 0x02, 0x46, 0x77, 0x32, 0x13, 0xB2, + 0x8B, 0x42, 0x10, 0xDC, 0x10, 0x46, 0x0F, 0xE0, 0x00, 0x20, 0x70, 0x86, 0xF1, 0x7C, 0x00, 0x29, + 0x6A, 0xD1, 0x46, 0x49, 0x88, 0x60, 0x01, 0x20, 0xF8, 0x72, 0x28, 0x7F, 0x00, 0x28, 0x5E, 0xD0, + 0xFD, 0xF7, 0x30, 0xFE, 0x60, 0xE0, 0xF1, 0x38, 0x4E, 0x21, 0x70, 0x52, 0xE8, 0x7C, 0x01, 0x28, + 0x01, 0xD1, 0x01, 0x20, 0x30, 0x75, 0x00, 0x20, 0x70, 0x86, 0xF0, 0x7B, 0x00, 0x28, 0x01, 0xD0, + 0x05, 0xB0, 0xF0, 0xBD, 0xB0, 0x8F, 0x2E, 0x28, 0x12, 0xD9, 0x69, 0x7F, 0x1E, 0x22, 0xCA, 0x40, + 0x74, 0x8E, 0x36, 0x49, 0x89, 0x68, 0x91, 0x42, 0x0B, 0xD2, 0x39, 0x8D, 0x8C, 0x42, 0x01, 0xD2, + 0x71, 0x86, 0x0C, 0x46, 0x79, 0x8D, 0x8C, 0x42, 0x03, 0xD9, 0x71, 0x86, 0x0C, 0x46, 0x00, 0xE0, + 0x74, 0x8E, 0xB9, 0x8E, 0x8C, 0x42, 0x01, 0xD9, 0x71, 0x86, 0x0C, 0x46, 0xB1, 0x79, 0x00, 0x29, + 0x05, 0xD0, 0x22, 0x21, 0x79, 0x5E, 0x8C, 0x42, 0x01, 0xDD, 0x8C, 0xB2, 0x74, 0x86, 0x30, 0x28, + 0xD6, 0xD3, 0xB0, 0x6E, 0x01, 0x28, 0xD3, 0xDB, 0x26, 0x49, 0xFB, 0xF7, 0x7B, 0xFE, 0x20, 0x18, + 0x70, 0x86, 0x05, 0xB0, 0xF0, 0xBD, 0x21, 0x48, 0x00, 0x21, 0x81, 0x60, 0x01, 0x22, 0xFA, 0x72, + 0xB1, 0x75, 0x28, 0x7F, 0x00, 0x28, 0x0F, 0xD0, 0xE8, 0x7C, 0x00, 0x28, 0x85, 0xD1, 0x29, 0x20, + 0x28, 0x5C, 0x40, 0x00, 0x18, 0x49, 0x40, 0x18, 0x43, 0x38, 0x70, 0x84, 0x04, 0x92, 0xFF, 0xF7, + 0xCB, 0xFA, 0x04, 0x98, 0xF0, 0x73, 0x78, 0xE7, 0xFC, 0xF7, 0x2C, 0xFE, 0x75, 0xE7, 0xF0, 0x7B, + 0x00, 0x28, 0x01, 0xD1, 0xFC, 0xF7, 0x26, 0xFE, 0x26, 0x20, 0x29, 0x5C, 0xF0, 0x7B, 0x00, 0x29, + 0xA4, 0xD0, 0x00, 0x28, 0xA2, 0xD0, 0xF1, 0x8F, 0x7D, 0x20, 0xC4, 0x00, 0x20, 0x46, 0xFD, 0xF7, + 0xFF, 0xFD, 0x00, 0x19, 0x70, 0x84, 0x80, 0xB2, 0x79, 0x8E, 0x49, 0x1E, 0x81, 0x42, 0x02, 0xDD, + 0xFF, 0xF7, 0xAA, 0xFA, 0x91, 0xE7, 0xFD, 0xF7, 0xB5, 0xFD, 0x8E, 0xE7, 0xDC, 0x06, 0x00, 0x20, + 0x00, 0x05, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0xFF, 0x07, 0x00, 0x00, 0x7C, 0x05, 0x00, 0x20, + 0x00, 0x87, 0x93, 0x03, 0x10, 0x27, 0x00, 0x00, 0xC5, 0x09, 0x00, 0x00, 0x24, 0x00, 0x00, 0x40, + 0x88, 0x13, 0x00, 0x00, 0x5C, 0xFE, 0xFF, 0xFF, 0x03, 0x20, 0x00, 0x02, 0x03, 0x49, 0x0A, 0x68, + 0x82, 0x43, 0x01, 0x20, 0x00, 0x02, 0x10, 0x18, 0x08, 0x60, 0x70, 0x47, 0x0C, 0x04, 0x00, 0x48, + 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x34, 0x2C, 0x01, 0x40, 0x01, 0x49, 0x08, 0x60, + 0x70, 0x47, 0xC0, 0x46, 0x38, 0x2C, 0x01, 0x40, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0xC0, 0x46, + 0x3C, 0x2C, 0x01, 0x40, 0x0B, 0x28, 0x00, 0xD3, 0x0B, 0x20, 0x40, 0x00, 0x01, 0x49, 0x08, 0x70, + 0x70, 0x47, 0xC0, 0x46, 0xD5, 0x05, 0x00, 0x20, 0xF0, 0xB5, 0x91, 0xB0, 0x00, 0x24, 0x0F, 0x94, + 0x0E, 0x94, 0x0D, 0x94, 0x0C, 0x94, 0x0B, 0x94, 0x0A, 0x94, 0x09, 0x94, 0x08, 0x94, 0x07, 0x94, + 0x06, 0x94, 0x05, 0x94, 0x04, 0x94, 0x03, 0x94, 0x01, 0x20, 0x82, 0x03, 0x02, 0x92, 0x03, 0x46, + 0x00, 0x90, 0x3D, 0x48, 0x41, 0x68, 0x11, 0x43, 0x41, 0x60, 0x41, 0x68, 0x11, 0x40, 0x10, 0x91, + 0x10, 0x99, 0x99, 0x04, 0x02, 0x68, 0x0A, 0x43, 0x02, 0x60, 0x00, 0x68, 0x08, 0x40, 0x10, 0x90, + 0x10, 0x98, 0x08, 0x94, 0x07, 0x93, 0x06, 0x94, 0x02, 0x20, 0x04, 0x90, 0x40, 0x26, 0x03, 0x96, + 0x03, 0x25, 0x05, 0x95, 0x31, 0x48, 0x03, 0xA9, 0xFB, 0xF7, 0xE0, 0xFF, 0x30, 0x4F, 0x38, 0x68, + 0x30, 0x49, 0x01, 0x40, 0x10, 0x31, 0x39, 0x60, 0x28, 0x03, 0x39, 0x68, 0x81, 0x43, 0x39, 0x60, + 0x38, 0x68, 0x20, 0x21, 0x88, 0x43, 0x38, 0x60, 0x38, 0x68, 0xB0, 0x43, 0x38, 0x60, 0x38, 0x68, + 0x80, 0x21, 0x01, 0x91, 0x08, 0x43, 0x38, 0x60, 0x28, 0x02, 0x39, 0x68, 0x81, 0x43, 0x39, 0x60, + 0xA8, 0x02, 0x39, 0x68, 0x81, 0x43, 0x39, 0x60, 0x0F, 0x94, 0x0E, 0x94, 0x0C, 0x94, 0x0B, 0x94, + 0x0A, 0x94, 0xE1, 0x20, 0x40, 0x02, 0x09, 0x90, 0x08, 0x26, 0x0D, 0x96, 0x1E, 0x4D, 0x2C, 0x46, + 0x08, 0x3C, 0x09, 0xA9, 0x20, 0x46, 0xFC, 0xF7, 0x41, 0xFA, 0x00, 0x9B, 0x98, 0x02, 0x29, 0x68, + 0x81, 0x43, 0x29, 0x60, 0x09, 0x20, 0xC0, 0x02, 0x29, 0x1F, 0x0A, 0x68, 0x82, 0x43, 0x0A, 0x60, + 0x28, 0x68, 0x2A, 0x21, 0x88, 0x43, 0x28, 0x60, 0x20, 0x68, 0x18, 0x43, 0x20, 0x60, 0x02, 0x98, + 0x10, 0x30, 0x39, 0x68, 0x01, 0x40, 0x0C, 0x20, 0x10, 0x29, 0x02, 0x46, 0x00, 0xD0, 0x32, 0x46, + 0x0E, 0x4B, 0xD3, 0x51, 0x10, 0x29, 0x00, 0xD0, 0x06, 0x46, 0x28, 0x46, 0x20, 0x30, 0xF0, 0x51, + 0x78, 0x68, 0x0B, 0x49, 0x01, 0x40, 0x31, 0x31, 0x79, 0x60, 0x28, 0x68, 0x01, 0x99, 0x08, 0x43, + 0x28, 0x60, 0x11, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x14, 0x10, 0x02, 0x40, 0x00, 0x04, 0x00, 0x48, + 0x1C, 0x00, 0x02, 0x40, 0xEF, 0xBF, 0xFF, 0xFF, 0x08, 0x38, 0x01, 0x40, 0xA4, 0x05, 0x00, 0x20, + 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0xB5, 0x83, 0xB0, 0xF2, 0x4D, 0x68, 0x8E, 0x40, 0x27, 0xE8, 0x53, + 0xA8, 0x8D, 0x40, 0x1C, 0xA8, 0x85, 0xA8, 0x8C, 0x40, 0x1C, 0xA8, 0x84, 0xE8, 0x8C, 0x40, 0x1C, + 0xE8, 0x84, 0xE8, 0x7D, 0x00, 0x28, 0x44, 0xD1, 0x68, 0x7A, 0x00, 0x28, 0x41, 0xD1, 0x28, 0x7E, + 0x00, 0x28, 0x3E, 0xD0, 0xA8, 0x8E, 0x00, 0x28, 0x03, 0xD0, 0x52, 0x20, 0x00, 0x21, 0x29, 0x52, + 0x37, 0xE0, 0x52, 0x20, 0x29, 0x5A, 0x49, 0x1C, 0x29, 0x52, 0x89, 0xB2, 0xE2, 0x4A, 0x91, 0x42, + 0x2F, 0xD3, 0x69, 0x8F, 0x1F, 0x29, 0x1E, 0xD3, 0x02, 0x97, 0x01, 0x20, 0xE8, 0x75, 0xE8, 0x78, + 0x00, 0x28, 0x1C, 0xD0, 0x54, 0x20, 0x2C, 0x5A, 0xB9, 0x20, 0x41, 0x00, 0x20, 0x46, 0xFB, 0xF7, + 0x29, 0xFD, 0x68, 0x72, 0x60, 0x08, 0xB9, 0x28, 0x13, 0xD3, 0x00, 0x24, 0xD7, 0x4F, 0xD8, 0x4E, + 0xFF, 0xF7, 0x2C, 0xF9, 0x64, 0x20, 0xFD, 0xF7, 0xFD, 0xF9, 0x3E, 0x60, 0x64, 0x1C, 0x68, 0x7A, + 0x84, 0x42, 0xF5, 0xD3, 0x05, 0xE0, 0x00, 0x21, 0x29, 0x52, 0x29, 0x76, 0x09, 0xE0, 0xFF, 0xF7, + 0x1D, 0xF9, 0xA8, 0x7E, 0x00, 0x28, 0x02, 0x9F, 0x03, 0xD1, 0x26, 0x20, 0xCD, 0x49, 0x00, 0x22, + 0x0A, 0x54, 0xCC, 0x4E, 0xF1, 0x7F, 0x00, 0x29, 0x10, 0xD0, 0x56, 0x20, 0x2A, 0x5A, 0x52, 0x1C, + 0x2A, 0x52, 0x92, 0xB2, 0xC8, 0x4B, 0x5B, 0x78, 0xC9, 0x18, 0x14, 0x23, 0x4B, 0x43, 0x14, 0x3B, + 0x93, 0x42, 0x03, 0xD2, 0x00, 0x21, 0x29, 0x52, 0x01, 0x20, 0xA8, 0x73, 0x28, 0x7D, 0x00, 0x28, + 0x00, 0xD0, 0x71, 0xE1, 0xC0, 0x4C, 0xE0, 0x7A, 0x00, 0x28, 0x3F, 0xD0, 0xE8, 0x7C, 0x00, 0x28, + 0x3C, 0xD0, 0xFE, 0xF7, 0xCB, 0xFF, 0xFD, 0xF7, 0xA1, 0xFC, 0xA1, 0x7B, 0x00, 0x29, 0x0D, 0xD0, + 0x00, 0x28, 0x0D, 0xD0, 0xA8, 0x7D, 0x40, 0x1C, 0xA8, 0x75, 0x22, 0x7C, 0xC0, 0xB2, 0x90, 0x42, + 0x14, 0xD8, 0xE8, 0x7E, 0x00, 0x28, 0x29, 0xD1, 0x28, 0x7F, 0x16, 0xE0, 0x00, 0x28, 0x06, 0xD0, + 0x28, 0x7F, 0x40, 0x1C, 0x28, 0x77, 0xEA, 0x7E, 0x00, 0x2A, 0x1F, 0xD1, 0x0B, 0xE0, 0xA8, 0x7D, + 0x40, 0x1C, 0xA8, 0x75, 0x22, 0x7C, 0xC0, 0xB2, 0x90, 0x42, 0x0B, 0xD9, 0x00, 0x20, 0x28, 0x77, + 0xEA, 0x7E, 0x00, 0x2A, 0x12, 0xD1, 0x00, 0x29, 0x08, 0xD0, 0x61, 0x7C, 0xC0, 0xB2, 0x88, 0x42, + 0x08, 0xD8, 0x0B, 0xE0, 0xE8, 0x7E, 0x00, 0x28, 0x08, 0xD1, 0x28, 0x7F, 0xA1, 0x7C, 0xC0, 0xB2, + 0x88, 0x42, 0x03, 0xD9, 0x01, 0x20, 0xE8, 0x76, 0x00, 0xF0, 0x06, 0xFA, 0xE8, 0x8C, 0x15, 0x28, + 0x00, 0xD2, 0xB8, 0xE0, 0x00, 0x20, 0x00, 0x90, 0xE8, 0x84, 0xE9, 0x7C, 0xA8, 0x79, 0x00, 0x28, + 0x02, 0x97, 0x01, 0x91, 0x3F, 0xD0, 0x00, 0x29, 0x3D, 0xD0, 0x2E, 0x20, 0x28, 0x5E, 0x2C, 0x21, + 0x71, 0x5C, 0xC7, 0x22, 0xD2, 0x43, 0x4A, 0x43, 0x10, 0x18, 0x94, 0x49, 0x08, 0x60, 0x8A, 0x69, + 0x83, 0x1A, 0x8E, 0x68, 0xCA, 0x68, 0x0F, 0x69, 0x5A, 0x43, 0x4A, 0x61, 0x88, 0x61, 0x46, 0x43, + 0xF3, 0x19, 0x0E, 0x6A, 0xB3, 0x42, 0x00, 0xDB, 0x33, 0x46, 0x76, 0x42, 0xB3, 0x42, 0x00, 0xDC, + 0x33, 0x46, 0x0B, 0x61, 0xD2, 0x18, 0x4B, 0x68, 0x58, 0x43, 0x10, 0x18, 0x4A, 0x6A, 0x90, 0x42, + 0x02, 0x9F, 0x00, 0xDB, 0x10, 0x46, 0x52, 0x42, 0x90, 0x42, 0x82, 0x4E, 0x00, 0xDC, 0x10, 0x46, + 0xC8, 0x61, 0x83, 0x49, 0xFB, 0xF7, 0x8E, 0xFC, 0x61, 0x8C, 0x08, 0x18, 0x02, 0xB2, 0xA1, 0x8D, + 0x8A, 0x42, 0x00, 0xDB, 0x01, 0x46, 0x08, 0xB2, 0x7D, 0x21, 0x09, 0x01, 0x88, 0x42, 0x00, 0xDB, + 0x08, 0x46, 0x60, 0x84, 0x01, 0x99, 0x70, 0x7F, 0x00, 0x28, 0x31, 0xD0, 0x00, 0x29, 0x2F, 0xD0, + 0xE0, 0x8A, 0x21, 0x6D, 0x09, 0x1A, 0x75, 0x48, 0x81, 0x62, 0x02, 0x6C, 0x8B, 0x1A, 0x06, 0x6B, + 0x42, 0x6B, 0x87, 0x6B, 0x5A, 0x43, 0xC2, 0x63, 0x01, 0x64, 0x4E, 0x43, 0xF3, 0x19, 0x86, 0x6C, + 0xB3, 0x42, 0x00, 0xDB, 0x33, 0x46, 0x76, 0x42, 0xB3, 0x42, 0x00, 0xDC, 0x33, 0x46, 0x83, 0x63, + 0xD2, 0x18, 0xC3, 0x6A, 0x59, 0x43, 0x51, 0x18, 0xC2, 0x6C, 0x91, 0x42, 0x02, 0x9F, 0x00, 0xDB, + 0x11, 0x46, 0x52, 0x42, 0x91, 0x42, 0x00, 0xDC, 0x11, 0x46, 0x41, 0x64, 0xA8, 0x6E, 0x08, 0x18, + 0x64, 0x49, 0x88, 0x42, 0x00, 0xDB, 0x08, 0x46, 0xC1, 0x17, 0x88, 0x43, 0xA8, 0x66, 0x01, 0x99, + 0x68, 0x79, 0x00, 0x28, 0x37, 0xD0, 0x00, 0x29, 0x35, 0xD0, 0x38, 0x46, 0x29, 0x8D, 0x5E, 0x4A, + 0xD2, 0x68, 0x51, 0x1A, 0x61, 0x65, 0xE2, 0x6E, 0x8B, 0x1A, 0xE6, 0x6D, 0x22, 0x6E, 0x67, 0x6E, + 0x5A, 0x43, 0xA2, 0x66, 0xE1, 0x66, 0x4E, 0x43, 0xF3, 0x19, 0x66, 0x6F, 0xB3, 0x42, 0x00, 0xDB, + 0x33, 0x46, 0x76, 0x42, 0xB3, 0x42, 0x00, 0xDC, 0x33, 0x46, 0x63, 0x66, 0xD2, 0x18, 0xA3, 0x6D, + 0x59, 0x43, 0x51, 0x18, 0xA2, 0x6F, 0x91, 0x42, 0x07, 0x46, 0x00, 0xDB, 0x11, 0x46, 0x52, 0x42, + 0x91, 0x42, 0x00, 0xDC, 0x11, 0x46, 0x21, 0x67, 0x6A, 0x6E, 0x89, 0x18, 0x4B, 0x4A, 0x91, 0x42, + 0x00, 0xDB, 0x11, 0x46, 0xCA, 0x17, 0x91, 0x43, 0x69, 0x66, 0xE9, 0x48, 0x80, 0x68, 0x63, 0x28, + 0x01, 0xD8, 0x00, 0x98, 0x60, 0x66, 0x60, 0x79, 0x00, 0x28, 0x31, 0xD0, 0x7D, 0x20, 0x80, 0x00, + 0xE3, 0x4B, 0x19, 0x68, 0x01, 0x90, 0x81, 0x42, 0x02, 0xD8, 0x38, 0x46, 0x10, 0x26, 0x01, 0xE0, + 0x38, 0x46, 0x06, 0x26, 0x29, 0x8E, 0x02, 0x22, 0x96, 0x29, 0x17, 0x46, 0x00, 0xD3, 0x37, 0x46, + 0x9B, 0x68, 0x96, 0x2B, 0x00, 0xD3, 0x3A, 0x46, 0xD7, 0x4C, 0x62, 0x72, 0x07, 0x46, 0x2B, 0x5A, + 0x5E, 0x1A, 0x96, 0x42, 0x0A, 0xDD, 0x89, 0x18, 0xE9, 0x53, 0x21, 0x6D, 0x01, 0x98, 0x81, 0x42, + 0xD6, 0x49, 0x20, 0xD9, 0x01, 0x20, 0xA0, 0x72, 0xC8, 0x7D, 0x08, 0xE0, 0xC8, 0x1A, 0x90, 0x42, + 0xD2, 0x4B, 0x01, 0xDD, 0x88, 0x1A, 0xE8, 0x53, 0x00, 0x20, 0xA0, 0x72, 0xD8, 0x7D, 0xA0, 0x70, + 0xE8, 0x7D, 0x00, 0x28, 0x14, 0xD0, 0xE8, 0x7C, 0x00, 0x28, 0x11, 0xD0, 0xA8, 0x8F, 0x30, 0x28, + 0x0E, 0xD3, 0xEE, 0x5B, 0x27, 0x8E, 0x30, 0x46, 0x78, 0x43, 0x7D, 0x21, 0x09, 0x01, 0xFB, 0xF7, + 0xA9, 0xFB, 0x40, 0x1C, 0x1F, 0xE0, 0x00, 0x20, 0xA0, 0x72, 0xE8, 0x7D, 0x00, 0x28, 0xEA, 0xD1, + 0xE8, 0x7B, 0x00, 0x28, 0x0F, 0xD0, 0x68, 0x8C, 0x26, 0x46, 0x3C, 0x46, 0x37, 0x8E, 0x78, 0x43, + 0x7D, 0x21, 0x09, 0x01, 0xFB, 0xF7, 0x96, 0xFB, 0x71, 0x8E, 0x08, 0x1A, 0x40, 0x1C, 0x58, 0x21, + 0x68, 0x52, 0x2E, 0x5B, 0x09, 0xE0, 0xEE, 0x5B, 0x27, 0x8E, 0x30, 0x46, 0x78, 0x43, 0x7D, 0x21, + 0x09, 0x01, 0xFB, 0xF7, 0x87, 0xFB, 0x58, 0x21, 0x68, 0x52, 0x11, 0x49, 0x0F, 0x60, 0x80, 0xB2, + 0x88, 0x60, 0xC8, 0x60, 0x2E, 0x86, 0x08, 0x61, 0x44, 0x20, 0x29, 0x5A, 0x49, 0x1C, 0x29, 0x52, + 0x03, 0xB0, 0xF0, 0xBD, 0x00, 0x05, 0x00, 0x20, 0x21, 0x4E, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, + 0xAA, 0xAA, 0x00, 0x00, 0xDC, 0x06, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, + 0xF0, 0xD8, 0xFF, 0xFF, 0x60, 0xE3, 0x16, 0x00, 0x7C, 0x05, 0x00, 0x20, 0xF0, 0x58, 0x38, 0x01, + 0x2C, 0x2C, 0x01, 0x40, 0x70, 0xB5, 0x4E, 0x48, 0x00, 0x78, 0x4E, 0x4C, 0x21, 0x78, 0x00, 0x29, + 0x0B, 0xD0, 0x00, 0x28, 0x09, 0xD0, 0x4D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD0, 0xFE, 0xF7, + 0xED, 0xFF, 0x54, 0x48, 0x02, 0x21, 0x01, 0x70, 0x70, 0xBD, 0x47, 0x49, 0x09, 0x78, 0x01, 0x29, + 0x0C, 0xD0, 0x00, 0x29, 0x24, 0xD1, 0xFD, 0xF7, 0xDB, 0xF8, 0xFE, 0xF7, 0xDF, 0xFF, 0x70, 0xBD, + 0xFF, 0xF7, 0x20, 0xF9, 0x4B, 0x48, 0x01, 0x21, 0x01, 0x70, 0x70, 0xBD, 0x00, 0x28, 0x0C, 0xD0, + 0x3E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x14, 0xD0, 0x3D, 0x48, 0x00, 0x88, 0xFE, 0xF7, 0x32, 0xFD, + 0xFC, 0xF7, 0xF8, 0xFC, 0xFE, 0xF7, 0xCA, 0xFF, 0x70, 0xBD, 0x3A, 0x4D, 0x28, 0x78, 0x01, 0x28, + 0x0A, 0xD0, 0x39, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0E, 0xD0, 0x20, 0x78, 0x00, 0x28, 0x1D, 0xD0, + 0x70, 0xBD, 0xFF, 0xF7, 0xFF, 0xF8, 0x70, 0xBD, 0xFC, 0xF7, 0xE4, 0xFC, 0xFE, 0xF7, 0xB6, 0xFF, + 0x31, 0x48, 0x00, 0x78, 0x01, 0x28, 0xF0, 0xD1, 0xFD, 0xF7, 0xE6, 0xFA, 0x00, 0x28, 0x03, 0xD0, + 0x2E, 0x48, 0x03, 0x21, 0x01, 0x70, 0x04, 0xE0, 0x2C, 0x48, 0x02, 0x21, 0x01, 0x70, 0xFC, 0xF7, + 0xF7, 0xFE, 0xFE, 0xF7, 0xA3, 0xFF, 0x20, 0x78, 0x00, 0x28, 0xE1, 0xD1, 0x28, 0x49, 0x0A, 0x88, + 0x28, 0x4C, 0x28, 0x78, 0x00, 0x28, 0x16, 0xD0, 0x60, 0x79, 0x07, 0x28, 0x13, 0xD8, 0x06, 0x2A, + 0x11, 0xD3, 0x43, 0x1C, 0x63, 0x71, 0x24, 0x48, 0x05, 0x68, 0xC0, 0x6F, 0x40, 0x1B, 0x65, 0x69, + 0x40, 0x19, 0x60, 0x61, 0x08, 0x2B, 0x06, 0xD1, 0xC3, 0x09, 0xC0, 0x08, 0xC5, 0x1A, 0xA5, 0x81, + 0xC0, 0x18, 0x1A, 0x4B, 0x98, 0x80, 0x1D, 0x4D, 0x28, 0x88, 0x00, 0x28, 0x05, 0xD1, 0x63, 0x78, + 0x00, 0x2B, 0x02, 0xD1, 0x50, 0x1C, 0x08, 0x80, 0x70, 0xBD, 0x00, 0x26, 0x0E, 0x80, 0x18, 0x49, + 0x88, 0x42, 0xB5, 0xD3, 0x61, 0x89, 0xFD, 0xF7, 0x8B, 0xFA, 0x32, 0x28, 0x01, 0xD8, 0x20, 0x78, + 0x46, 0x1C, 0x26, 0x70, 0xF0, 0xB2, 0x33, 0x28, 0x07, 0xD3, 0xE0, 0x78, 0x00, 0x28, 0x04, 0xD1, + 0xFE, 0xF7, 0xB6, 0xFD, 0x01, 0x20, 0x00, 0x02, 0x20, 0x80, 0x28, 0x88, 0x60, 0x81, 0x70, 0xBD, + 0x10, 0x05, 0x00, 0x20, 0x17, 0x05, 0x00, 0x20, 0x18, 0x05, 0x00, 0x20, 0xE0, 0x04, 0x00, 0x20, + 0x88, 0x05, 0x00, 0x20, 0x19, 0x05, 0x00, 0x20, 0x1A, 0x05, 0x00, 0x20, 0x3C, 0x01, 0x00, 0x20, + 0x3A, 0x05, 0x00, 0x20, 0xE4, 0x04, 0x00, 0x20, 0xD8, 0x05, 0x00, 0x20, 0x34, 0x05, 0x00, 0x20, + 0xDD, 0x05, 0x00, 0x00, 0x01, 0x05, 0x00, 0x20, 0xF0, 0xB5, 0x81, 0xB0, 0x3C, 0x48, 0x01, 0x68, + 0x4A, 0x22, 0x3C, 0x4E, 0xB1, 0x52, 0x00, 0x24, 0x04, 0x60, 0x3B, 0x4D, 0x2A, 0x6D, 0x03, 0x23, + 0x53, 0x43, 0x89, 0xB2, 0x59, 0x18, 0x0A, 0x09, 0x38, 0x4B, 0x13, 0x40, 0xCA, 0x08, 0xD2, 0x1A, + 0x42, 0x27, 0xF2, 0x53, 0x89, 0x08, 0x29, 0x65, 0x33, 0x87, 0x91, 0xB2, 0x34, 0x4F, 0xBA, 0x68, + 0x05, 0x2A, 0x11, 0xD2, 0x00, 0x68, 0x33, 0x48, 0x01, 0x60, 0xE8, 0x7C, 0xE9, 0x7B, 0x01, 0x29, + 0x17, 0xD1, 0x40, 0x1C, 0xE8, 0x74, 0xC1, 0xB2, 0x07, 0x29, 0x02, 0xD3, 0x01, 0x20, 0x30, 0x73, + 0xE8, 0x74, 0x01, 0x21, 0x01, 0x40, 0x16, 0xE0, 0x02, 0x68, 0x8A, 0x42, 0xEB, 0xD2, 0x02, 0x68, + 0x8A, 0x42, 0xE8, 0xD2, 0x02, 0x68, 0x8A, 0x42, 0xE5, 0xD2, 0x02, 0x68, 0x8A, 0x42, 0xF3, 0xD3, + 0xE1, 0xE7, 0x40, 0x1E, 0xE8, 0x74, 0x01, 0x06, 0x03, 0xD1, 0x01, 0x20, 0x30, 0x73, 0x06, 0x20, + 0xE8, 0x74, 0x01, 0x21, 0x81, 0x43, 0xA9, 0x73, 0xEF, 0xF3, 0x10, 0x80, 0x72, 0xB6, 0xF0, 0x7B, + 0x00, 0x28, 0x02, 0xD1, 0xE8, 0x7C, 0xFC, 0xF7, 0xC1, 0xFA, 0x62, 0xB6, 0xFC, 0xF7, 0x9E, 0xFA, + 0x38, 0x68, 0x19, 0x49, 0x88, 0x42, 0x01, 0xD3, 0x01, 0x20, 0xE8, 0x72, 0xF4, 0x76, 0x34, 0x77, + 0xB4, 0x75, 0xB8, 0x68, 0x41, 0x1C, 0xB9, 0x60, 0xE8, 0x7C, 0x40, 0x00, 0xC2, 0x19, 0x28, 0x6D, + 0x50, 0x82, 0x26, 0x22, 0x11, 0x4B, 0x9A, 0x5C, 0xD2, 0xB2, 0x5B, 0x7F, 0x13, 0x43, 0x7D, 0x22, + 0x12, 0x01, 0x00, 0x2B, 0x05, 0xD0, 0x14, 0x29, 0x08, 0xD3, 0x51, 0x1C, 0x88, 0x42, 0x02, 0xD3, + 0x04, 0xE0, 0x90, 0x42, 0x02, 0xD2, 0xEC, 0x72, 0xFD, 0xF7, 0xEC, 0xF8, 0x01, 0xB0, 0xF0, 0xBD, + 0x24, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0xFE, 0xFF, 0x00, 0x00, + 0x7C, 0x05, 0x00, 0x20, 0x2C, 0x20, 0x00, 0x40, 0xC5, 0x09, 0x00, 0x00, 0xDC, 0x06, 0x00, 0x20, + 0x02, 0xE0, 0x08, 0xC8, 0x12, 0x1F, 0x08, 0xC1, 0x00, 0x2A, 0xFA, 0xD1, 0x70, 0x47, 0x70, 0x47, + 0x00, 0x20, 0x01, 0xE0, 0x01, 0xC1, 0x12, 0x1F, 0x00, 0x2A, 0xFB, 0xD1, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x01, 0x02, 0x0B, 0x02, 0xBD, 0x46, 0x69, 0x72, + 0x65, 0x66, 0x6C, 0x79, 0x20, 0x47, 0x32, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, + 0x19, 0x64, 0x18, 0x0E, 0x00, 0x00, 0x0A, 0x00, 0x91, 0x69, 0x7E, 0x32, 0x00, 0x32, 0x00, 0x00, + 0x0F, 0x0A, 0x0A, 0xFF, 0x66, 0x06, 0x00, 0x01, 0x00, 0x78, 0x04, 0x04, 0x19, 0xBE, 0x7D, 0x00, + 0x83, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1B, 0x12, 0x13, 0x1D, 0x15, 0x16, 0x17, + 0x1A, 0x09, 0x0A, 0x0B, 0x1E, 0x0D, 0x0E, 0x0F, 0x28, 0x5E, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x20, + 0xC0, 0x03, 0x00, 0x00, 0xF4, 0x11, 0x00, 0x08, 0x10, 0x61, 0x00, 0x08, 0x80, 0x04, 0x00, 0x20, + 0x80, 0x08, 0x00, 0x00, 0x10, 0x5D, 0x00, 0x08, 0x10, 0x1A, 0x02, 0x1E, 0x01, 0x18, 0x64, 0x01, + 0x01, 0x0A, 0x01, 0x02, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0xD4, 0x03, + 0x64, 0x19, 0xB4, 0x10, 0x08, 0x4C, 0x04, 0x6C, 0x07, 0xDC, 0x05, 0xC8, 0x1A, 0xD0, 0x06, 0x12, + 0x6E, 0x12, 0x78, 0x12, 0xC8, 0x1A, 0x18, 0x02, 0x10, 0x08, 0xCF, 0x07, 0xCF, 0x07, 0xD0, 0x07, + 0x14, 0x12, 0x46, 0x1E, 0x90, 0x01, 0xD0, 0x07, 0x64, 0x12, 0x21, 0x23, 0x10, 0x27, 0x33, 0xE8, + 0x03, 0x12, 0x7C, 0x64, 0x08, 0xD4, 0x30, 0x72, 0x0A, 0x02, 0x13, 0x64, 0x29, 0x30, 0x23, 0x50, + 0xC3, 0x12, 0x20, 0x2B, 0x20, 0x4E, 0x08, 0x40, 0x09, 0x23, 0x01, 0x67, 0x45, 0xAB, 0x89, 0xEF, + 0xCD, 0x63, 0x90, 0x01, 0x39, 0x50, 0xF1, 0x23, 0x20, 0x4E, 0x4B, 0xA0, 0x86, 0x21, 0x59, 0x27, + 0x11, 0x0A, 0x19, 0x32, 0x60, 0x11, 0x13, 0x12, 0x7A, 0x12, 0x1C, 0x34, 0x01, 0x40, 0x08, 0x32, + 0xFA, 0x12, 0xB4, 0x12, 0xB7, 0x12, 0xBA, 0x12, 0xBD, 0x12, 0xC1, 0x12, 0xC4, 0x12, 0xC7, 0x12, + 0xCA, 0x12, 0xCD, 0x12, 0xD0, 0x12, 0xD3, 0x12, 0xD6, 0x12, 0xD9, 0x12, 0xDC, 0x12, 0xE0, 0x12, + 0xE3, 0x12, 0xE6, 0x12, 0xE9, 0x12, 0xEC, 0x12, 0xEF, 0x12, 0xF2, 0x12, 0xF5, 0x1A, 0xF7, 0x32, + 0x1A, 0xFD, 0x67, 0x18, 0x66, 0x03, 0x01, 0x06, 0x01, 0x09, 0x01, 0x0B, 0x01, 0x0E, 0x01, 0x11, + 0x01, 0x13, 0x01, 0x16, 0x01, 0x19, 0x01, 0x1B, 0x01, 0x1E, 0x01, 0x20, 0x01, 0x23, 0x01, 0x25, + 0x01, 0x28, 0x01, 0x2A, 0x01, 0x2C, 0x01, 0x2F, 0x01, 0x31, 0x01, 0x33, 0x01, 0x35, 0x01, 0x38, + 0x01, 0x3A, 0x01, 0x3C, 0x01, 0x3E, 0x01, 0x40, 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x47, + 0x01, 0x49, 0x01, 0x4B, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x50, 0x01, 0x51, 0x01, 0x53, 0x01, 0x54, + 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x5C, 0x01, 0x5D, 0x01, 0x5E, + 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x02, 0x1C, 0x64, 0x01, 0x65, 0x02, + 0x1A, 0x66, 0x02, 0x3A, 0x67, 0x02, 0xFA, 0x68, 0x02, 0x49, 0x18, 0x29, 0x22, 0x29, 0x2A, 0x3A, + 0x64, 0x36, 0x1A, 0x62, 0x40, 0x1A, 0x60, 0x48, 0x1A, 0x5E, 0x50, 0x1A, 0x5C, 0x58, 0x1A, 0x5A, + 0x60, 0x1A, 0x57, 0x68, 0x1A, 0x54, 0x70, 0x1A, 0x51, 0x78, 0x1A, 0x4E, 0x80, 0x1A, 0x4B, 0x88, + 0x1A, 0x47, 0x90, 0x1A, 0x44, 0x98, 0x1A, 0x40, 0xA0, 0x1A, 0x3C, 0xA8, 0x1A, 0x38, 0xB0, 0x1A, + 0x33, 0xB8, 0x1A, 0x2F, 0xC0, 0x1A, 0x2A, 0xC8, 0x1A, 0x25, 0xD0, 0x1A, 0x20, 0xD8, 0x1A, 0x1B, + 0xE0, 0x1A, 0x16, 0xE8, 0x1A, 0x11, 0xF0, 0x1A, 0x0B, 0xF8, 0x15, 0x06, 0x01, 0x03, 0x01, 0x13, + 0x01, 0xFD, 0x12, 0xFA, 0x12, 0xF7, 0x12, 0xF5, 0x12, 0xF2, 0x12, 0xEF, 0x12, 0xEC, 0x12, 0xE9, + 0x12, 0xE6, 0x12, 0xE3, 0x12, 0xE0, 0x12, 0xDC, 0x12, 0xD9, 0x12, 0xD6, 0x12, 0xD3, 0x12, 0xD0, + 0x12, 0xCD, 0x12, 0xCA, 0x12, 0xC7, 0x12, 0xC4, 0x12, 0xC1, 0x12, 0xBD, 0x12, 0xBA, 0x12, 0xB7, + 0x12, 0xB4, 0x12, 0xB1, 0x12, 0xAE, 0x12, 0xAB, 0x12, 0xA7, 0x12, 0xA4, 0x12, 0xA1, 0x12, 0x9E, + 0x12, 0x9B, 0x12, 0x98, 0x12, 0x95, 0x12, 0x92, 0x12, 0x8F, 0x12, 0x8C, 0x12, 0x88, 0x12, 0x85, + 0x12, 0x82, 0x12, 0x7F, 0x12, 0x7C, 0x12, 0x79, 0x12, 0x76, 0x12, 0x73, 0x12, 0x71, 0x12, 0x6E, + 0x12, 0x6B, 0x12, 0x68, 0x12, 0x65, 0x12, 0x62, 0x12, 0x5F, 0x12, 0x5D, 0x12, 0x5A, 0x12, 0x57, + 0x12, 0x55, 0x12, 0x52, 0x12, 0x4F, 0x12, 0x4D, 0x12, 0x4A, 0x12, 0x48, 0x12, 0x45, 0x12, 0x43, + 0x12, 0x40, 0x12, 0x3E, 0x12, 0x3C, 0x12, 0x39, 0x12, 0x37, 0x12, 0x35, 0x12, 0x33, 0x12, 0x30, + 0x12, 0x2E, 0x12, 0x2C, 0x12, 0x2A, 0x12, 0x28, 0x12, 0x26, 0x12, 0x24, 0x12, 0x22, 0x12, 0x21, + 0x12, 0x1F, 0x12, 0x1D, 0x12, 0x1B, 0x12, 0x1A, 0x12, 0x18, 0x12, 0x17, 0x12, 0x15, 0x12, 0x14, + 0x12, 0x12, 0x12, 0x11, 0x12, 0x10, 0x12, 0x0E, 0x12, 0x0D, 0x12, 0x0C, 0x12, 0x0B, 0x12, 0x0A, + 0x12, 0x09, 0x12, 0x08, 0x12, 0x07, 0x12, 0x06, 0x1A, 0x05, 0x02, 0x12, 0x04, 0x1A, 0x03, 0x02, + 0x1A, 0x02, 0x02, 0x19, 0xD9, 0x19, 0x02, 0x01, 0x12, 0x49, 0x18, 0x29, 0x22, 0x29, 0x2A, 0x3A, + 0x04, 0x36, 0x1A, 0x06, 0x40, 0x1A, 0x08, 0x48, 0x1A, 0x0A, 0x50, 0x1A, 0x0C, 0x58, 0x1A, 0x0E, + 0x60, 0x1A, 0x11, 0x68, 0x1A, 0x14, 0x70, 0x1A, 0x17, 0x78, 0x1A, 0x1A, 0x80, 0x1A, 0x1D, 0x88, + 0x1A, 0x21, 0x90, 0x1A, 0x24, 0x98, 0x1A, 0x28, 0xA0, 0x1A, 0x2C, 0xA8, 0x1A, 0x30, 0xB0, 0x1A, + 0x35, 0xB8, 0x1A, 0x39, 0xC0, 0x1A, 0x3E, 0xC8, 0x1A, 0x43, 0xD0, 0x1A, 0x48, 0xD8, 0x1A, 0x4D, + 0xE0, 0x1A, 0x52, 0xE8, 0x1A, 0x57, 0xF0, 0x1A, 0x5D, 0xF8, 0x12, 0x62, 0x12, 0x65, 0x12, 0x68, + 0x12, 0x6B, 0x12, 0x6E, 0x12, 0x71, 0x12, 0x73, 0x12, 0x76, 0x12, 0x79, 0x12, 0x7C, 0x12, 0x7F, + 0x12, 0x82, 0x12, 0x85, 0x12, 0x88, 0x12, 0x8C, 0x12, 0x8F, 0x12, 0x92, 0x12, 0x95, 0x12, 0x98, + 0x12, 0x9B, 0x12, 0x9E, 0x12, 0xA1, 0x12, 0xA4, 0x12, 0xA7, 0x12, 0xAB, 0x12, 0xAE, 0x52, 0xB1 +}; + +/* D:\Firefly\AM32\FIRMWARE BYTES\0x08007BE0.bin (5/2/2025 1:59:24 PM) + StartOffset(h): 00000000, EndOffset(h): 0000000F, Length(h): 00000010 */ + +const unsigned char am32_firmware_tag[16] = { + 0x46, 0x4F, 0x52, 0x45, 0x46, 0x4C, 0x49, 0x5F, 0x47, 0x32, 0x30, 0x5F, 0x46, 0x30, 0x35, 0x31 +}; + +#endif // INCLUDE_AM32_FIRMWARE diff --git a/src/modules/esc_flasher/AM32Firmware.h b/src/modules/esc_flasher/AM32Firmware.h new file mode 100644 index 0000000000..b6b0c5cf7d --- /dev/null +++ b/src/modules/esc_flasher/AM32Firmware.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +#define INCLUDE_AM32_FIRMWARE + +#define AM32_FIRMWARE_ADDR (0x08001000) +#define AM32_FIRMWARE_TAG_ADDR (0x08007BE0) + +__EXPORT extern const uint8_t am32_fw_version_major; +__EXPORT extern const uint8_t am32_fw_version_minor; + +__EXPORT extern const uint8_t am32_firmware[20752]; +__EXPORT extern const uint8_t am32_firmware_tag[16]; diff --git a/src/modules/esc_flasher/CMakeLists.txt b/src/modules/esc_flasher/CMakeLists.txt new file mode 100644 index 0000000000..78ea60508a --- /dev/null +++ b/src/modules/esc_flasher/CMakeLists.txt @@ -0,0 +1,42 @@ +############################################################################ +# +# Copyright (c) 2020 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +px4_add_module( + MODULE modules__esc_flasher + MAIN esc_flasher + COMPILE_FLAGS + SRCS + EscFlasher.cpp + EscFlasher.hpp + AM32Firmware.c + ) diff --git a/src/modules/esc_flasher/EscFlasher.cpp b/src/modules/esc_flasher/EscFlasher.cpp new file mode 100644 index 0000000000..45bb5a6139 --- /dev/null +++ b/src/modules/esc_flasher/EscFlasher.cpp @@ -0,0 +1,1456 @@ +#include "EscFlasher.hpp" + +/* + * The ESC Flasher module will allow configuring of some ESC features, over DSHOT. + * It will enable ESC reflashing for AM32 using bit-banging UART 19200 on the signal line. +*/ + +#include "AM32Firmware.h" +#include + +using namespace time_literals; + +#define ESC_FLASHER_RET_OK (0) +#define ESC_FLASHER_RET_NOK (-1) + +static const uint32_t SECONDS_TO_MICROSECONDS = 1000000; + +ESC_Flasher::ESC_Flasher() : ModuleParams(nullptr), _loop_perf(perf_alloc(PC_ELAPSED, "esc_flasher")) { + // New instance created, set all initial values + subscribe_orb_messages(); + + run_calls = 0; + print_flag = false; + time_now = 0; + time_1s = 0; + time_flash_start = 0; + time_delayed_start = 0; + + start_flash = 0; + motor_flags = 0; + cancel_flash = 0; + + // Get ESC type, needs to be set via param ESC_TYPE + _esc_type = (ESCType)_param_esc_type.get(); + set_esc_type(true); + + // Get ESC update param at boot, check if it is pending + _esc_update = (ESCUpdate)_param_esc_update.get(); + if (_esc_update != ESCUpdate::Disabled) { + // Don't allow update at boot, must be set some time after startup + _param_esc_update.reset(); + _esc_update = ESCUpdate::Disabled; + PX4_ERR("Cannot update ESCs at boot, try again after startup"); + } + + esc_update_state = 0; + prev_esc_update_state = 0; + flashing_result = 0; + memset(esc_update_motors, 0, sizeof(esc_update_motors)); + memset(&esc_flashing_state, 0, sizeof(esc_flashing_state)); + + memset(&esc_versions, 0, sizeof(esc_versions)); + memset(&esc_gpios, 0, sizeof(esc_gpios)); + gpio_high = 0; + time_gpio_set = 0; + + update_params(); + + msg_id = 0; + + load_firmware_source(); + + // Set to run at 1 Hz + run_delay = run_delay_max; + wake = false; +} + +ESC_Flasher::~ESC_Flasher() { + // Instance deleted, clean up + unsubscribe_orb_messages(); + perf_free(_loop_perf); +} + +void ESC_Flasher::load_firmware_source(void) { + esc_flasher_status_s status{0}; + // Default to mem_array + _am32_fw_source = AM32_FIRMWARE_SOURCE::MEM_ARRAY; + _am32_fw_ver_major = 0; + _am32_fw_ver_minor = 0; + + // TODO option for changing source via parameter, looking for firmware from that source + + switch (_am32_fw_source) { + case AM32_FIRMWARE_SOURCE::MEM_ARRAY: +#ifdef INCLUDE_AM32_FIRMWARE + _am32_fw_ver_major = am32_fw_version_major; + _am32_fw_ver_minor = am32_fw_version_minor; + + // This is temporary so compile includes the array + if (sizeof(am32_firmware) > 1234) { + PX4_DEBUG("Sample byte from am32_firmware[1234] %d", (int)am32_firmware[1234]); + } + + // Publish status with included firmware version + status.esc_flashing_in_progress = false; + status.version_major = _am32_fw_ver_major; + status.version_minor = _am32_fw_ver_minor; + status.timestamp = hrt_absolute_time(); + _esc_flasher_status_pub.publish(status); +#endif + break; + case AM32_FIRMWARE_SOURCE::SD_CARD: + _am32_fw_ver_major = 0; + _am32_fw_ver_minor = 0; + break; + case AM32_FIRMWARE_SOURCE::STREAM_HEAP: + _am32_fw_ver_major = 0; + _am32_fw_ver_minor = 0; + break; + } +} + +void ESC_Flasher::set_esc_type(bool print) { + if (_esc_type == ESCType::Unknown) { + if (print) PX4_INFO("ESC Flasher starting, ESC Type is DEFAULT"); + } + else if (_esc_type == ESCType::AM32) { + if (print) PX4_INFO("ESC Flasher starting, ESC Type is AM32"); + } + else if (_esc_type == ESCType::BLHELI32) { + if (print) PX4_INFO("ESC Flasher starting, ESC Type is BLHeli32"); + } + else if (_esc_type == ESCType::AM32) { + if (print) PX4_INFO("ESC Flasher starting, ESC Type is AM32_Old"); + } + else if (_esc_type == ESCType::BlueJay) { + if (print) PX4_INFO("ESC Flasher starting, ESC Type is BlueJay"); + } + else { + _esc_type = ESCType::Unknown; + _param_esc_type.reset(); + PX4_ERR("Invalid ESC Type, parameter ESC_TYPE has been reset"); + } +} + +void ESC_Flasher::update_params(void) { + // check for parameter updates + if (_parameter_update_sub.updated()) { + // clear update + parameter_update_s pupdate; + _parameter_update_sub.copy(&pupdate); + + // update parameters from storage + updateParams(); + + // Get ESC type, needs to be set via param ESC_TYPE + _esc_type = (ESCType)_param_esc_type.get(); + set_esc_type(false); + + ESCUpdate esc_update = (ESCUpdate)_param_esc_update.get(); + if (esc_update != ESCUpdate::Disabled && esc_update != ESCUpdate::Recover2) { + if (_esc_type == ESCType::AM32) { + // Start the update process + _esc_update = esc_update; + // Flag all motors for update + memset(esc_update_motors, 1, sizeof(esc_update_motors)); + // Clear param ESC_UPDATE + _param_esc_update.reset(); + + // Start flashing state machine + esc_update_state = 1; + prev_esc_update_state = 0; + + // Set a 2 second delay before bit-banging + time_delayed_start = hrt_absolute_time() + 2_s; + + if (esc_update == ESCUpdate::Recover) { + PX4_INFO("Starting recovery on motors 1 2 3 4"); + } + else { + PX4_INFO("Starting flash on motors 1 2 3 4"); + } + } + else { + // ESC Type not supported + _esc_update = ESCUpdate::Disabled; + _param_esc_update.reset(); + + PX4_ERR("ESC type %d not supported by esc_flasher", (int)_esc_type); + } + } + else if (esc_update == ESCUpdate::Recover2) { + if (_esc_type == ESCType::AM32) { + if (_esc_update == ESCUpdate::Recover) { + // Proceed with the recovery, battery should be in by now + _esc_update = esc_update; + esc_update_state = 31; + PX4_INFO("Proceeding with recovery step 2"); + } + } + else { + // ESC Type not supported + _esc_update = ESCUpdate::Disabled; + _param_esc_update.reset(); + + PX4_ERR("ESC type %d not supported by esc_flasher", (int)_esc_type); + } + } + } +} + +void ESC_Flasher::play_tune(int tune) { + tune_control_s tune_control{0}; + if (tune == 1) { + tune_control.tune_id = tune_control_s::TUNE_ID_PROG_PX4IO; // PROG_PX4IO + } + else if (tune == 2) { + tune_control.tune_id = tune_control_s::TUNE_ID_PROG_PX4IO_OK; // PROG_PX4IO_OK + } + else if (tune == 3) { + tune_control.tune_id = tune_control_s::TUNE_ID_PROG_PX4IO_ERR; // PROG_PX4IO_ERR + } + tune_control.volume = tune_control_s::VOLUME_LEVEL_MAX; + tune_control.tune_override = true; + tune_control.timestamp = hrt_absolute_time(); + _tune_control_pub.publish(tune_control); +} + +void ESC_Flasher::stop_tune(void) { + tune_control_s tune_control{0}; + tune_control.tune_override = true; + tune_control.timestamp = hrt_absolute_time(); + _tune_control_pub.publish(tune_control); +} + +void ESC_Flasher::subscribe_orb_messages(void) { + _sensor_gps_sub.subscribe(); + _vehicle_status_sub.subscribe(); +} + +void ESC_Flasher::unsubscribe_orb_messages(void) { + _sensor_gps_sub.unsubscribe(); + _vehicle_status_sub.unsubscribe(); +} + +void ESC_Flasher::run() { + while (!should_exit()) { + perf_begin(_loop_perf); + + update_params(); + RunLoop(); + + perf_end(_loop_perf); + + // Sleep so our task can yield to other tasks + //px4_usleep(run_delay); + delay_loops = run_delay / run_delay_min; + while (!wake && delay_loops--) { + px4_usleep(run_delay_min); + } + wake = false; + } +} + +// ESC Flasher work loop +void ESC_Flasher::RunLoop() { + static esc_flasher_request_s request; + static esc_flasher_request_ack_s update; + static esc_flasher_status_s status; + static uint32_t gpio; + int retval = 0; + + run_calls++; + + time_now = hrt_absolute_time(); + + // Get vehicle armed state + vehicle_armed = get_current_arming_state(); + + // Check update flags from command 'esc_flasher flash' + if (start_flash) { + if (_esc_type == ESCType::AM32) { + if (_esc_update == ESCUpdate::Disabled) { + if (motor_flags) { + _esc_update = ESCUpdate::ForceUpdate; + esc_update_state = 1; + prev_esc_update_state = 0; + // Start immediately, no need to wait for param response + time_delayed_start = time_now; + // Set motor update flags + memset(esc_update_motors, 0, sizeof(esc_update_motors)); + char motors_string[16] = "1 2 3 4"; + int motors_index = 0; + for (uint32_t i = 0; i < ESC_COUNT; i++) { + esc_update_motors[i] = (motor_flags & (1 << i)); + if (esc_update_motors[i]) { + motors_string[motors_index * 2] = (0x30 + i + 1); + motors_index++; + } + } + // Terminate string + motors_string[(motors_index * 2) - 1] = 0; + + if (motors_index == 1) PX4_INFO("Starting flash on motor %s", motors_string); + else PX4_INFO("Starting flash on motors %s", motors_string); + } + else { + PX4_ERR("Invalid motor flags for flashing"); + } + } + else { + PX4_ERR("ESC flashing already in progress"); + } + } + else { + // ESC Type not supported + _esc_update = ESCUpdate::Disabled; + + PX4_ERR("ESC type %d not supported by esc_flasher", (int)_esc_type); + } + + start_flash = 0; + motor_flags = 0; + } + + if (cancel_flash) { + // Send request to DShot to cancel any pending requests + _esc_update = ESCUpdate::Cancel; + esc_update_state = 96; + prev_esc_update_state = 0; + + cancel_flash = 0; + } + + // Check update parameter + if (_esc_update != ESCUpdate::Disabled) { + if (_esc_update != ESCUpdate::Cancel && vehicle_armed != vehicle_status_s::ARMING_STATE_DISARMED) { + PX4_ERR("Cannot update ESCs while vehicle is armed!"); + _esc_update = ESCUpdate::Disabled; + } + else { + switch (esc_update_state) { + case 0: + // Idle state + + break; + case 1: + // Set loop to run fast 200 Hz + run_delay = run_delay_min; + + if (time_now >= time_delayed_start) { + PX4_INFO("ESC Flasher starting update"); + esc_update_state = 2; + time_flash_start = time_now; + flashing_result = 0; + + // Play start flashing tune + esc_flasher_tune = 1; + + // RECOVERY CASE + if (_esc_update == ESCUpdate::Recover) { + // Skip to state 4 disable DShot + esc_update_state = 4; + } + } + + break; + case 2: + // Send ESC_INFO request to DShot + // First, read any pending ack + _esc_flasher_request_ack_sub.copy(&update); + + // Send ESC_INFO request to DShot driver + memset(&request, 0, sizeof(request)); + request.timestamp = hrt_absolute_time(); + request.msg_id = ++msg_id; + request.request = esc_flasher_request_s::REQUEST_ESC_INFO; + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (esc_update_motors[i]) request.motor_flags |= (1 << i); + } + _esc_flasher_request_pub.publish(request); + + esc_info_timeout = 0; + esc_update_state = 3; + + break; + case 3: + // Wait for response from DShot driver to REQUEST_ESC_INFO request + if (_esc_flasher_request_ack_sub.updated()) { + esc_flasher_request_ack_s response; + _esc_flasher_request_ack_sub.copy(&response); + + // Save/print response + if (response.msg_id == msg_id && response.request == esc_flasher_request_ack_s::REQUEST_ESC_INFO && + response.result == esc_flasher_request_ack_s::ESC_FLASHER_CMD_RESULT_ACCEPTED) { + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (response.fw_flags & (1 << i)) { + esc_versions[i].major = response.fw_major[i]; + esc_versions[i].minor = response.fw_minor[i]; + PX4_INFO("ESC_INFO request filled, ESC %d firmware version: %d.%d", + (int)i, (int)esc_versions[i].major, (int)esc_versions[i].minor); + } + } + } + else if (response.msg_id == msg_id && response.request == esc_flasher_request_ack_s::REQUEST_ESC_INFO && + response.result == esc_flasher_request_ack_s::ESC_FLASHER_CMD_RESULT_UNSUPPORTED) { + // Unsupported ESC detected + PX4_ERR("Unsupported ESC detected, cancelling ESC flasher"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 9; + } + else { + // Mismatch somewhere + PX4_ERR("Response from DShot mismatch! Response: %d, msg_id: %d, response msg_id: %d", + (int)response.result, (int)msg_id, (int)response.msg_id); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 10; + + break; + } + + // If we are in mode ESCUpdate::Update, only flash motors that aren't on the correct fw version + // Mode ESCUpdate:ForceUpdate should flash the new firmware always + if (_esc_update == ESCUpdate::Update) { + // If firmware versions match, clear the update flag for that motor + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (esc_update_motors[i] && (esc_versions[i].major == _am32_fw_ver_major) && + (esc_versions[i].minor == _am32_fw_ver_minor)) { + esc_update_motors[i] = 0; + } + } + } + + // Check that we still have ESCs to flash, if not then cancel state machine + bool flash_required = false; + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (esc_update_motors[i]) { + flash_required = true; + break; + } + } + if (!flash_required) { + // No ESCs need flashing, go to completion state + prev_esc_update_state = esc_update_state; + esc_update_state = 20; + flashing_result = 1; + + break; + } + + esc_update_state = 4; + } + else { + esc_info_timeout++; + if (esc_info_timeout > (1_s / run_delay) * 5) { + // Wait 5 seconds for response, then timeout + PX4_ERR("Timeout waiting for response from DShot driver"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 11; + + break; + } + } + + break; + case 4: + // Received fw versions, next ask DShot for flashing + // DShot should disable its outputs until we send another request + // First, read any pending ack + _esc_flasher_request_ack_sub.copy(&update); + + // Send REQUEST_FLASHING request to DShot driver + memset(&request, 0, sizeof(request)); + request.timestamp = hrt_absolute_time(); + request.msg_id = ++msg_id; + request.request = esc_flasher_request_s::REQUEST_FLASHING; + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (esc_update_motors[i]) request.motor_flags |= (1 << i); + } + _esc_flasher_request_pub.publish(request); + + esc_info_timeout = 0; + esc_update_state = 5; + + break; + case 5: + // Wait for response from DShot driver to REQUEST_FLASHING request + if (_esc_flasher_request_ack_sub.updated()) { + esc_flasher_request_ack_s response; + _esc_flasher_request_ack_sub.copy(&response); + + // Save/print response + if (response.msg_id == msg_id && response.request == esc_flasher_request_ack_s::REQUEST_FLASHING && + response.result == esc_flasher_request_ack_s::ESC_FLASHER_CMD_RESULT_ACCEPTED) { + for (uint32_t i = 0; i < ESC_COUNT; i++) { + if (response.gpio_flags & (1 << i)) { + esc_gpios[i] = response.gpio_pins[i]; + PX4_INFO("ESC_INFO request filled, ESC %d GPIO %d", + (int)i, (int)esc_gpios[i]); + } + } + PX4_INFO("REQUEST_FLASHING response received"); + } + else { + // Mismatch somewhere + PX4_ERR("Response from DShot mismatch! Response: %d, msg_id: %d, response msg_id: %d", + (int)response.result, (int)msg_id, (int)response.msg_id); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 12; + + break; + } + + esc_update_state = 6; + } + else { + esc_info_timeout++; + if (esc_info_timeout > (1_s / run_delay) * 5) { + // Wait 5 seconds for response, then timeout + PX4_ERR("Timeout waiting for response from DShot driver"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 13; + + break; + } + } + + break; + case 6: + // Start bit-banging! + // First set GPIOs as outputs and set high '1' + for (uint32_t i = 0; i < ESC_COUNT; i++) { + gpio = esc_gpios[i]; + if (gpio) { + gpio &= ~(GPIO_MODE_MASK); + gpio |= GPIO_OUTPUT; + gpio |= GPIO_OUTPUT_SET; + px4_arch_configgpio(gpio); + + // If we have set any GPIO to high, set a flag that can be checked during Cancel request + gpio_high = 1; + } + } + + PX4_INFO("Set motor GPIOs to output '1'"); + + time_gpio_set = time_now; + esc_update_state = 7; + + if (_esc_update == ESCUpdate::Recover) { + // Special state for holding until Recover2 is sent + esc_update_state = 30; + PX4_INFO("Insert battery, then set param ESC_UPDATE to 4 to continue"); + } + + break; + case 30: + // Wait for ESC_UPDATE 4 + + break; + case 31: + // Recovery2 has been sent, battery should be in + esc_update_motor_index = 0; + time_gpio_set = time_now; + esc_update_state = 7; + + break; + case 7: + // Wait > 0.5 seconds for ESCs to reboot to bootloader + if (time_now - time_gpio_set > 600_ms) { + esc_update_motor_index = 0; + esc_update_state = 8; + } + + break; + case 8: + // Send AM32 bootloader init packet + if (esc_update_motor_index >= ESC_COUNT) { + // How did we get here? + // We are done, for now + esc_update_state = 20; + flashing_result = 2; + + break; + } + if (esc_update_motors[esc_update_motor_index]) { + //int bitbang_send_packet(uint32_t gpio, uint8_t* packet, uint16_t length, uint8_t* response, uint8_t response_length); + retval = bitbang_send_packet(esc_gpios[esc_update_motor_index], (uint8_t*)am32_boot_init, sizeof(am32_boot_init), + response_data, am32_boot_init_resp_len); + if (retval == am32_boot_init_resp_len) { + // Yay! + PX4_INFO("Response received from AM32 Bootloader %d: %d %d %d %d %d %d %d %d %d", (int)(esc_update_motor_index + 1), + (int)response_data[0], (int)response_data[1], (int)response_data[2], (int)response_data[3], (int)response_data[4], + (int)response_data[5], (int)response_data[6], (int)response_data[7], (int)response_data[8]); + + // Move on to next motor + esc_update_motor_index++; + if (esc_update_motor_index >= ESC_COUNT) { + // Begin the flashing process + memset(&esc_flashing_state, 0, sizeof(esc_flashing_state)); + esc_update_state = 10; + } + } + else { + // Oh no + PX4_ERR("Wrong or no response received from AM32 Bootloader"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 14; + } + } + else { + esc_update_motor_index++; + } + + break; + case 9: + // Unused state + + break; + case 10: + // Flashing order is: + // Setup next write locally - Get address, size of next chunk + // Set address of the next write chunk (CMD 0xFF), check ACK + // Set buffer size of the next chunk (CMD 0xFE) + // Send buffer (no CMD, just data), check ACK + // Send write command (CMD 0x01), check ACK + // Go back to Set address and loop until write all firmware bytes + // Send run app command (CMD 0x00 0x00 0x00 0x00) + // Success! + + // Use esc_flashing_state struct to flash 1 ESC at a time + // Get first motor + for (uint32_t i = esc_flashing_state.current_motor; i < ESC_COUNT; i++) { + if (esc_update_motors[i]) { + esc_flashing_state.current_motor = i; + esc_flashing_state.current_gpio = esc_gpios[i]; + break; + } + } + + if (esc_flashing_state.current_motor >= ESC_COUNT) { + // All motors complete, move on to finishing state + PX4_INFO("All motors flashed successfully!"); + esc_update_state = 16; + break; + } + + esc_update_state = 11; + + break; + case 11: + // Setup firmware flash next part (am32_firmware or am32_firmware_tag) + if (esc_flashing_state.fw_part == 0) { + esc_flashing_state.fw_length = sizeof(am32_firmware); + esc_flashing_state.fw_bytes_sent = 0; + esc_flashing_state.fw_bytes_left = esc_flashing_state.fw_length; + esc_flashing_state.base_address = AM32_FIRMWARE_ADDR & (0xFFFF); + } + else if (esc_flashing_state.fw_part == 1) { + esc_flashing_state.fw_length = sizeof(am32_firmware_tag); + esc_flashing_state.fw_bytes_sent = 0; + esc_flashing_state.fw_bytes_left = esc_flashing_state.fw_length; + esc_flashing_state.base_address = AM32_FIRMWARE_TAG_ADDR & (0xFFFF); + } + + esc_update_state = 12; + + break; + case 12: + // Copy next chunk to tx_buffer + esc_flashing_state.tx_length = esc_flashing_state.fw_bytes_left; + if (esc_flashing_state.tx_length > max_chunk_length) { + esc_flashing_state.tx_length = max_chunk_length; + } + + // Copy data and set next address + if (esc_flashing_state.fw_part == 0) { + memcpy(esc_flashing_state.tx_buffer, &am32_firmware[esc_flashing_state.fw_bytes_sent], esc_flashing_state.tx_length); + esc_flashing_state.next_address = esc_flashing_state.base_address + esc_flashing_state.fw_bytes_sent; + } + else { + memcpy(esc_flashing_state.tx_buffer, &am32_firmware_tag[esc_flashing_state.fw_bytes_sent], esc_flashing_state.tx_length); + esc_flashing_state.next_address = esc_flashing_state.base_address + esc_flashing_state.fw_bytes_sent; + } + + // Make CRC, append it on to the tx packet + esc_flashing_state.crc = make_crc(esc_flashing_state.tx_buffer, esc_flashing_state.tx_length); + esc_flashing_state.tx_buffer[esc_flashing_state.tx_length] = (uint8_t)(esc_flashing_state.crc & 0x00FF); + esc_flashing_state.tx_buffer[esc_flashing_state.tx_length + 1] = (uint8_t)(((esc_flashing_state.crc & 0xFF00) >> 8)); + + // Send set address command + am32_set_addr[0] = 0xFF; + am32_set_addr[1] = 0x00; + am32_set_addr[2] = (esc_flashing_state.next_address & 0xFF00) >> 8; + am32_set_addr[3] = (esc_flashing_state.next_address & 0x00FF); + esc_flashing_state.crc = make_crc(am32_set_addr, 4); + am32_set_addr[4] = (uint8_t)(esc_flashing_state.crc & 0x00FF); + am32_set_addr[5] = (uint8_t)((esc_flashing_state.crc & 0xFF00) >> 8); + + retval = bitbang_send_packet(esc_flashing_state.current_gpio, am32_set_addr, sizeof(am32_set_addr), + response_data, am32_set_addr_resp_len); + if (retval == am32_set_addr_resp_len && response_data[0] == 0x30) { + // Received ACK, continue to next step + esc_update_state = 13; + } + else { + // Something went wrong + PX4_ERR("Error in Set Address command for motor %d", (int)esc_flashing_state.current_motor + 1); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 15; + + break; + } + + break; + case 13: + // Sent set buffer size command + am32_set_buff_size[0] = 0xFE; + am32_set_buff_size[1] = 0x00; + if (esc_flashing_state.tx_length == max_chunk_length) { + am32_set_buff_size[2] = 1; + am32_set_buff_size[3] = 0; + } + else { + am32_set_buff_size[2] = 0; + am32_set_buff_size[3] = esc_flashing_state.tx_length; + } + esc_flashing_state.crc = make_crc(am32_set_buff_size, 4); + am32_set_buff_size[4] = (uint8_t)(esc_flashing_state.crc & 0x00FF); + am32_set_buff_size[5] = (uint8_t)((esc_flashing_state.crc & 0xFF00) >> 8); + + retval = bitbang_send_packet(esc_flashing_state.current_gpio, am32_set_buff_size, sizeof(am32_set_buff_size), + response_data, am32_set_buff_size_resp_len); + + // There is no expected response to this command, so proceed to send the buffer + retval = bitbang_send_packet(esc_flashing_state.current_gpio, esc_flashing_state.tx_buffer, esc_flashing_state.tx_length + 2, + response_data, am32_send_buff_resp_len); + if (retval == am32_send_buff_resp_len && response_data[0] == 0x30) { + // Received ACK, continue to next step + esc_update_state = 14; + } + else { + // Something went wrong + PX4_ERR("Error in Send Buffer command for motor %d", (int)esc_flashing_state.current_motor + 1); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 16; + + break; + } + + break; + case 14: + // Send Write command + am32_write[0] = 0x01; + am32_write[1] = 0; + esc_flashing_state.crc = make_crc(am32_write, 2); + am32_write[2] = (uint8_t)(esc_flashing_state.crc & 0x00FF); + am32_write[3] = (uint8_t)((esc_flashing_state.crc & 0xFF00) >> 8); + + retval = bitbang_send_packet(esc_flashing_state.current_gpio, am32_write, sizeof(am32_write), + response_data, am32_write_resp_len); + if (retval == am32_write_resp_len && response_data[0] == 0x30) { + // Received ACK, continue to next step + if (esc_flashing_state.fw_part == 0) { + PX4_INFO("Sent firmware packet %d of %d to motor %d", (int)(esc_flashing_state.fw_bytes_sent / max_chunk_length) + 1, + (int)(esc_flashing_state.fw_length / max_chunk_length) + 1, (int)esc_flashing_state.current_motor + 1); + } + else { + PX4_INFO("Sent firmware tag section to motor %d", (int)esc_flashing_state.current_motor + 1); + } + // Set byte counts after latest write + esc_flashing_state.fw_bytes_sent += esc_flashing_state.tx_length; + esc_flashing_state.fw_bytes_left -= esc_flashing_state.tx_length; + + if (esc_flashing_state.fw_bytes_left) { + // Go back to setup next chunk + esc_update_state = 12; + } + else { + // Done with firmware part, check states + if (esc_flashing_state.fw_part == 0) { + esc_flashing_state.fw_part = 1; + esc_update_state = 11; + } + else { + // Flashed all parts, run app and move to next motor + PX4_INFO("Firmware update complete on motor %d", (int)esc_flashing_state.current_motor + 1); + esc_update_state = 15; + } + } + } + else { + // Something went wrong + PX4_ERR("Error in Write command for motor %d", (int)esc_flashing_state.current_motor); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 17; + + break; + } + + break; + case 15: + // Send Run App command and move on to next motor + retval = bitbang_send_packet(esc_flashing_state.current_gpio, (uint8_t*)am32_run_app, sizeof(am32_run_app), + response_data, am32_run_app_resp_len); + + esc_flashing_state.current_motor++; + esc_flashing_state.fw_part = 0; + esc_update_state = 10; + + break; + case 16: + // All motors should be flashed by this state, notify DShot so it can re-enable + memset(&request, 0, sizeof(request)); + request.timestamp = hrt_absolute_time(); + request.msg_id = ++msg_id; + request.request = esc_flasher_request_s::REQUEST_FLASHING_COMPLETE; + _esc_flasher_request_pub.publish(request); + + esc_info_timeout = 0; + esc_update_state = 17; + + break; + case 17: + // Wait for response from DShot driver to REQUEST_FLASHING_COMPLETE request + if (_esc_flasher_request_ack_sub.updated()) { + esc_flasher_request_ack_s response; + _esc_flasher_request_ack_sub.copy(&response); + + // Save/print response + if (response.msg_id == msg_id && response.request == esc_flasher_request_ack_s::REQUEST_FLASHING_COMPLETE && + response.result == esc_flasher_request_ack_s::ESC_FLASHER_CMD_RESULT_ACCEPTED) { + PX4_INFO("REQUEST_FLASHING_COMPLETE response received"); + } + else { + // Mismatch somewhere + PX4_ERR("Response from DShot mismatch! Response: %d, msg_id: %d, response msg_id: %d", + (int)response.result, (int)msg_id, (int)response.msg_id); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 18; + + break; + } + + esc_update_state = 20; + flashing_result = 2; + } + else { + esc_info_timeout++; + if (esc_info_timeout > (1_s / run_delay) * 5) { + // Wait 5 seconds for response, then timeout + PX4_ERR("Timeout waiting for response from DShot driver"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 19; + + break; + } + } + + break; + case 20: + // Complete + if (flashing_result == 1) { + //PX4_ERR("No ESCs need flashing, returning to idle state"); + mavlink_log_critical(&_mavlink_log_pub, "ESCs are already up-to-date, %d.%d\t", + (int)am32_fw_version_major, (int)am32_fw_version_minor); + } + else { + //PX4_INFO("ESC Flasher finished in %d seconds! Returning to idle state", (int)((time_now - time_flash_start) / 1_s)); + mavlink_log_critical(&_mavlink_log_pub, "ESC flash finished in %d seconds, %d.%d\t", + (int)((time_now - time_flash_start) / 1_s), (int)am32_fw_version_major, (int)am32_fw_version_minor); + } + + _esc_update = ESCUpdate::Disabled; + esc_update_state = 0; + time_flash_start = 0; + // Clear motor update flags + memset(esc_update_motors, 0, sizeof(esc_update_motors)); + + // Play success tune + esc_flasher_tune = 2; + + // Set loop to run slow 1 Hz + run_delay = run_delay_max; + + break; + case 96: + // CANCEL command, reset any GPIOs, wait > 20 ms, send Cancel request to DShot + if (gpio_high) { + for (uint32_t i = 0; i < ESC_COUNT; i++) { + gpio = esc_gpios[i]; + if (gpio) { + gpio &= ~(GPIO_MODE_MASK); + gpio |= GPIO_OUTPUT; + //gpio |= GPIO_OUTPUT_SET; + px4_arch_configgpio(gpio); + } + } + gpio_high = 0; + time_gpio_set = time_now; + } + else { + time_gpio_set = 0; + } + esc_update_state = 97; + + // Set loop to run fast 200 Hz + run_delay = run_delay_min; + + break; + case 97: + // Send REQUEST_CANCEL request to DShot driver + // All state variables will be reset in error state + if (time_now - time_gpio_set > 30_ms) { + memset(&request, 0, sizeof(request)); + request.timestamp = hrt_absolute_time(); + request.msg_id = ++msg_id; + request.request = esc_flasher_request_s::REQUEST_CANCEL; + _esc_flasher_request_pub.publish(request); + + esc_info_timeout = 0; + esc_update_state = 98; + } + + break; + case 98: + // Wait for response from DShot driver to REQUEST_CANCEL request + if (_esc_flasher_request_ack_sub.updated()) { + esc_flasher_request_ack_s response; + _esc_flasher_request_ack_sub.copy(&response); + + // Save/print response + if (response.msg_id == msg_id && response.request == esc_flasher_request_ack_s::REQUEST_CANCEL && + response.result == esc_flasher_request_ack_s::ESC_FLASHER_CMD_RESULT_ACCEPTED) { + PX4_INFO("REQUEST_CANCEL response received"); + } + else { + // Mismatch somewhere + PX4_ERR("Response from DShot mismatch! Response: %d, msg_id: %d, response msg_id: %d", + (int)response.result, (int)msg_id, (int)response.msg_id); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 20; + + break; + } + + esc_update_state = 99; + } + else { + esc_info_timeout++; + if (esc_info_timeout > (1_s / run_delay) * 5) { + // Wait 5 seconds for response, then timeout + PX4_ERR("Timeout waiting for response from DShot driver"); + prev_esc_update_state = esc_update_state; + esc_update_state = 99; + flashing_result = 21; + + break; + } + } + + break; + case 99: + // Error/reset case + //PX4_ERR("ESC Flasher error state, returning to idle state"); + mavlink_log_critical(&_mavlink_log_pub, "ESC Flash failed, state %d, result %d\t", + (int)prev_esc_update_state, (int)flashing_result); + + // Play error tune + esc_flasher_tune = 3; + + // SHOULD WE SEND CANCEL COMMAND TO DSHOT HERE??? + + _esc_update = ESCUpdate::Disabled; + esc_update_state = 0; + prev_esc_update_state = 0; + flashing_result = 0; + time_flash_start = 0; + // Clear motor update flags + memset(esc_update_motors, 0, sizeof(esc_update_motors)); + + // Set loop to run slow 1 Hz + run_delay = run_delay_max; + + break; + } + } + } + + // Always publish esc_flasher_status while flashing + { + flashing_in_progress = (_esc_update == ESCUpdate::Disabled) ? false : true; + if (!flashing_in_progress) { + if (flashing_in_progress_last) { + // Send ESC Flasher status uORB message, try to send it only once + memset(&status, 0, sizeof(status)); + status.esc_flashing_in_progress = false; + status.version_major = _am32_fw_ver_major; + status.version_minor = _am32_fw_ver_minor; + status.timestamp = hrt_absolute_time(); + _esc_flasher_status_pub.publish(status); + // Send vehicle command for LEDs, so Commander will update LEDs with correct blink color + send_vehicle_command_leds(); + // Reset parameter ESC_UPDATE again, this might update Commander also + _param_esc_update.reset(); + } + flashing_in_progress_last = flashing_in_progress; + } + else { + // Send in progress message and LED color at 4 Hz during flashing + if (flashing_in_progress_last != flashing_in_progress) { + // Force to send message right now + time_250ms = 0; + last_color = 0; + } + if (time_now - time_250ms >= 250_ms) { + time_250ms = time_now; + memset(&status, 0, sizeof(status)); + + if (last_color != led_control_s::COLOR_GREEN) { + last_color = led_control_s::COLOR_GREEN; + } + else { + last_color = led_control_s::COLOR_BLUE; + } + + status.esc_flashing_in_progress = true; + status.timestamp = hrt_absolute_time(); + _esc_flasher_status_pub.publish(status); + + set_physical_led_outputs(last_color); + } + flashing_in_progress_last = flashing_in_progress; + } + } + + if (time_now - time_1s > 1_s) { + // 1 second loop + time_1s = time_now; + + if (print_flag) { + PX4_INFO("ESC Flasher status:"); + PX4_INFO(" Time: %llu, run calls: %lu", time_now, run_calls); + PX4_INFO(" Loop rate: %d", (int)(1_s / run_delay)); + PX4_INFO(" ESC Type: %s", esc_types_strings[(uint8_t)_esc_type]); + PX4_INFO(" ESC Update: %d", (int)_esc_update); + } + + if (esc_flasher_stop_tune) { + stop_tune(); + esc_flasher_stop_tune = 0; + } + if (esc_flasher_tune) { + if (esc_flasher_tune == 1) { + // This will STOP tune from playing during flashing + //esc_flasher_tune = 0; + } + play_tune(esc_flasher_tune); + //if (esc_flasher_tune == 2 || esc_flasher_tune == 3) { + if (esc_flasher_tune) { + // Stop any tune in the next second loop + esc_flasher_stop_tune = 1; + } + esc_flasher_tune = 0; + } + } +} + +int ESC_Flasher::bitbang_send_packet(uint32_t gpio, uint8_t* packet, uint16_t length, uint8_t* response, uint8_t response_length) { + static const uint32_t bit_time = 52; + static const uint32_t half_bit_time = bit_time / 2; + static uint8_t read_data[16]; + + uint16_t write_index = 0; + uint8_t read_index = 0; + uint8_t bit_count = 0; + uint8_t read_bits = 0; + + // Configure GPIO pin as output, set high '1' + gpio &= ~(GPIO_MODE_MASK); + gpio |= GPIO_OUTPUT; + gpio |= GPIO_OUTPUT_SET; + gpio &= ~(GPIO_PUPD_MASK); + gpio |= GPIO_PULLUP; + px4_arch_configgpio(gpio); + + // Enter critical section, disable interrupts + static irqstate_t irq_state; + irq_state = px4_enter_critical_section(); + + uint8_t nextb; + uint64_t start; + uint64_t now; + + for (uint16_t k = 0; k < length; k++) { + nextb = packet[write_index++]; + + px4_arch_gpiowrite(gpio, 0); + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= bit_time) { + break; + } + } + + for (uint32_t i = 0; i < 8; i++) { + if (nextb & 1) px4_arch_gpiowrite(gpio, 1); + else px4_arch_gpiowrite(gpio, 0); + nextb >>= 1; + + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= bit_time) { + break; + } + } + } + + px4_arch_gpiowrite(gpio, 1); + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= bit_time) { + break; + } + } + } + + // Set GPIO to input + gpio &= ~(GPIO_MODE_MASK); + gpio |= GPIO_INPUT; + gpio &= ~(GPIO_PUPD_MASK); + gpio |= GPIO_PULLUP; + px4_arch_configgpio(gpio); + + // Read response bytes, if any + read_index = 0; + if (response_length && response) { + memset(read_data, 0, sizeof(read_data)); + + for (uint32_t i = 0; i < response_length; i++) { + start = hrt_absolute_time(); + while (px4_arch_gpioread(gpio)) { + // Wait for pin to go low + now = hrt_absolute_time(); + if (now - start > 100000) { + // Timeout 100ms waiting for start bit + + // Leave critical section, re-enable interrupts + px4_leave_critical_section(irq_state); + return -2; + } + } + + // Wait 1/2 bit-time for start bit + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= half_bit_time) { + break; + } + } + + // Read 8 bits + bit_count = 0; + read_bits = 0; + while (bit_count < 8) { + // Wait 1 bit-time to read next bit + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= bit_time) { + break; + } + } + read_bits |= (px4_arch_gpioread(gpio) << (bit_count++)); + } + + read_data[read_index++] = read_bits; + + // Now wait 1 more bit-time until we get to stop bit + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + if (now - start >= bit_time) { + break; + } + } + } + + // Copy data to out buffer + memcpy(response, read_data, read_index); + } + + // Put pin back into output mode, set high + gpio &= ~(GPIO_MODE_MASK); + gpio |= GPIO_OUTPUT; + gpio |= GPIO_OUTPUT_SET; + px4_arch_configgpio(gpio); + + // Delay here to give some time before next command + start = hrt_absolute_time(); + while (true) { + now = hrt_absolute_time(); + // Delay 1 bit time, for 8 bits + if (now - start >= bit_time * 8) { + break; + } + } + + // Leave critical section, re-enable interrupts + px4_leave_critical_section(irq_state); + + return read_index; +} + +// CRC struct +typedef union { + uint8_t bytes[2]; + uint16_t word; +} uint8_16_u; + +uint16_t ESC_Flasher::make_crc(uint8_t* buffer, uint16_t length) { + static uint8_16_u CRC_16; + CRC_16.word=0; + + for(int i = 0; i < length; i++) { + uint8_t xb = buffer[i]; + for (uint8_t j = 0; j < 8; j++) { + if (((xb & 0x01) ^ (CRC_16.word & 0x0001)) !=0 ) { + CRC_16.word = CRC_16.word >> 1; + CRC_16.word = CRC_16.word ^ 0xA001; + } + else { + CRC_16.word = CRC_16.word >> 1; + } + xb = xb >> 1; + } + } + + return CRC_16.word; +} + +uint8_t ESC_Flasher::get_current_arming_state(void) { + if (_vehicle_status_sub.updated()) { + _vehicle_status_sub.copy(&_vehicle_status); + } + + return _vehicle_status.arming_state; +} + +void ESC_Flasher::set_physical_led_outputs(uint8_t color) +{ +#ifdef FIREFLY_ESC + // Control I2C LEDs + led_control_s led_control_msg{0}; + led_control_msg.mode = led_control_s::MODE_MANUAL_RGB; + led_control_msg.color = led_control_s::COLOR_MANUAL; + led_control_msg.priority = led_control_s::MAX_PRIORITY; + if (color == 2) { + led_control_msg.rgb_manual[0] = 0; + led_control_msg.rgb_manual[1] = 255; + led_control_msg.rgb_manual[2] = 0; + } + else if (color == 3) { + led_control_msg.rgb_manual[0] = 0; + led_control_msg.rgb_manual[1] = 0; + led_control_msg.rgb_manual[2] = 255; + } + led_control_msg.timestamp = hrt_absolute_time(); + _led_control_pub.publish(led_control_msg); +#else + // Control I2C LEDs + led_control_s led_control_msg{0}; + led_control_msg.mode = led_control_s::MODE_BREATHE; + led_control_msg.color = led_control_s::COLOR_CYAN; + led_control_msg.priority = led_control_s::MAX_PRIORITY; + led_control_msg.timestamp = hrt_absolute_time(); + _led_control_pub.publish(led_control_msg); +#endif +} + +void ESC_Flasher::send_vehicle_command_leds(void) { + vehicle_command_s vcmd{0}; + + // Turn LEDs off when done flashing (-1.f) + vcmd.param1 = -1.f; + vcmd.param2 = -1.f; + vcmd.param3 = -1.f; + vcmd.target_system = 1; + vcmd.target_component = 1; + vcmd.source_system = 1; + vcmd.source_component = 1; + vcmd.confirmation = 0; + vcmd.from_external = false; + vcmd.timestamp = hrt_absolute_time(); + _vehicle_command_pub.publish(vcmd); +} + +ESC_Flasher *ESC_Flasher::instantiate(int argc, char *argv[]) { + ESC_Flasher *instance = new ESC_Flasher(); + + if (instance == nullptr) { + PX4_ERR("alloc failed"); + } + + return instance; +} + +int ESC_Flasher::task_spawn(int argc, char *argv[]) { + _task_id = px4_task_spawn_cmd("esc_flasher", + SCHED_DEFAULT, + SCHED_PRIORITY_FAST_DRIVER, + PX4_STACK_ADJUSTED(2048), + (px4_main_t)&run_trampoline, + (char *const *)argv); + + if (_task_id < 0) { + _task_id = -1; + return -errno; + } + + return 0; +} + +int ESC_Flasher::print_status() +{ + PX4_INFO("ESC Flasher status:"); + PX4_INFO(" Time: %llu, run calls: %lu", time_now, run_calls); + PX4_INFO(" Loop rate: %d", (int)(1_s / run_delay)); + PX4_INFO(" ESC Type: %s", esc_types_strings[(uint8_t)_esc_type]); + PX4_INFO(" ESC Update: %d", (int)_esc_update); + + perf_print_counter(_loop_perf); + + return 0; +} + +int ESC_Flasher::print_usage(const char *reason) { + if (reason) { + PX4_ERR("%s\n", reason); + } + + PRINT_MODULE_DESCRIPTION( + R"DESCR_STR( +### Description +ESC Flasher module allows configuration and reflashing +of supported ESCs +)DESCR_STR"); + + PRINT_MODULE_USAGE_NAME("esc_flasher", "system"); + PRINT_MODULE_USAGE_COMMAND_DESCR("start", "Start the background task"); + PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); + return 0; +} + +int ESC_Flasher::custom_command(int argc, char *argv[]) { + if (argc < 1) { + PX4_INFO("Usage: esc_flasher "); + return ESC_FLASHER_RET_NOK; + } + + // Get our current object + ESC_Flasher* mESC_Flasher = NULL; + (void)mESC_Flasher; + if (is_running()) { + mESC_Flasher = (ESC_Flasher*)_object.load(); + } + else { + return ESC_FLASHER_RET_NOK; + } + + int ret = ESC_FLASHER_RET_OK; + + int myoptind = 1; + int ch; + const char *myoptarg = nullptr; + + // Get motor index + int motor_index = -1; + uint16_t motor_flags = 0; + bool found_m = false; + bool found_a = false; + while ((ch = px4_getopt(argc, argv, "am:", &myoptind, &myoptarg)) != EOF) { + switch (ch) { + case 'a': + if (found_m) { + return print_usage("Conflicting flags, use only -m <1 2 3 4> or -a"); + } + // Flash all 4 motors + motor_flags = 0b0000000000001111; + found_a = true; + break; + case 'm': + if (found_a) { + return print_usage("Conflicting flags, use only -m <1 2 3 4> or -a"); + } + motor_index = strtol(myoptarg, nullptr, 10); + if (motor_index < 1 || motor_index > 4) { + return print_usage("Motor index out of range. Acceptable values are 1-4"); + } + motor_flags |= (1 << (motor_index - 1)); + found_m = true; + break; + default: + return print_usage("unrecognized flag"); + } + } + + const char *command = argv[0]; + + // Handle various commands issued via the command line + if (strcmp(command, "print") == 0) { + // Print status every second + if (argc < 2) { + PX4_ERR("Usage: esc_flasher print <0 for off, 1 for on>"); + ret = ESC_FLASHER_RET_NOK; + } + + int enable = strtol(argv[1], NULL, 10); + mESC_Flasher->print_flag = (bool)enable; + + return ret; + } + else if (strcmp(command, "flash") == 0) { + // Flash a specific motor + if (motor_flags == 0) { + return print_usage("Usage: esc_flasher flash -m <1 2 3 4>"); + } + + mESC_Flasher->start_flash = 1; + mESC_Flasher->motor_flags = motor_flags; + // Wake it from the sleep-loop, this helps if we are running at 1 Hz + mESC_Flasher->wake = true; + + return ret; + } + else if (strcmp(command, "cancel") == 0) { + // Cancel any current request, return control to DShot + mESC_Flasher->cancel_flash = 1; + // Wake it from the sleep-loop, this helps if we are running at 1 Hz + mESC_Flasher->wake = true; + + return ret; + } + + return print_usage("Unknown command"); +} + +extern "C" __EXPORT int esc_flasher_main(int argc, char *argv[]) { + return ESC_Flasher::main(argc, argv); +} diff --git a/src/modules/esc_flasher/EscFlasher.hpp b/src/modules/esc_flasher/EscFlasher.hpp new file mode 100644 index 0000000000..e1ad59025e --- /dev/null +++ b/src/modules/esc_flasher/EscFlasher.hpp @@ -0,0 +1,229 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Firefly drones have 4 ESCs +#define ESC_COUNT (4) + +class ESC_Flasher : public ModuleBase, public ModuleParams +{ +public: + + ESC_Flasher(); + ~ESC_Flasher() override; + + ESC_Flasher(const ESC_Flasher &) = delete; + ESC_Flasher operator=(const ESC_Flasher &) = delete; + + /** @see ModuleBase */ + static int task_spawn(int argc, char *argv[]); + + /** @see ModuleBase */ + static ESC_Flasher *instantiate(int argc, char *argv[]); + + /** @see ModuleBase::run() */ + void run() override; + + /** @see ModuleBase */ + static int custom_command(int argc, char *argv[]); + + /** @see ModuleBase */ + static int print_usage(const char *reason = nullptr); + + /** @see ModuleBase::print_status() */ + int print_status() override; + +private: + + void RunLoop(); + + void subscribe_orb_messages(void); + void unsubscribe_orb_messages(void); + + void update_params(void); + uint8_t get_current_arming_state(void); + + void set_esc_type(bool print); + + void load_firmware_source(void); + + int bitbang_send_packet(uint32_t gpio, uint8_t* packet, uint16_t length, uint8_t* response, uint8_t response_length); + + uint16_t make_crc(uint8_t* buffer, uint16_t length); + + void play_tune(int tune); + void stop_tune(void); + + void set_physical_led_outputs(uint8_t color); + + void send_vehicle_command_leds(void); + + perf_counter_t _loop_perf; /**< loop performance counter */ + + uint32_t run_delay{10000}; + const uint32_t run_delay_min = 5000; //wait 0.005 sec between running the work loop (200 Hz) + const uint32_t run_delay_max = 1000000; //wait 1 sec between running the work loop (1 Hz) + volatile bool wake{false}; + uint32_t delay_loops; + + hrt_abstime time_now; + hrt_abstime time_1s; + hrt_abstime time_250ms; + hrt_abstime time_flash_start; + hrt_abstime time_delayed_start; + + uint32_t run_calls; + + bool print_flag; // Turn this on to enable continuous status printing + + bool flashing_in_progress{false}; + bool flashing_in_progress_last{false}; + + uint8_t vehicle_armed; // Indicates if the vehicle is armed + + uint8_t last_color{0}; + + uint8_t _am32_fw_ver_major; + uint8_t _am32_fw_ver_minor; + enum class AM32_FIRMWARE_SOURCE { + MEM_ARRAY, + SD_CARD, + STREAM_HEAP + }; + AM32_FIRMWARE_SOURCE _am32_fw_source{AM32_FIRMWARE_SOURCE::MEM_ARRAY}; + + enum class ESCType { + Unknown = 0, + AM32 = 1, + BLHELI32 = 2, + AM32_Old = 3, + BlueJay = 4 + }; + ESCType _esc_type{ESCType::Unknown}; + + const char *esc_type_unknown = "Unknown"; + const char *esc_type_am32 = "AM32"; + const char *esc_type_blheli32 = "BLHeli32"; + const char *esc_type_am32_old = "AM32_Old"; + const char *esc_type_bluejay = "BlueJay"; + + const char* esc_types_strings[5] = {esc_type_unknown, esc_type_am32, esc_type_blheli32, esc_type_am32_old, esc_type_bluejay}; + + enum class ESCUpdate { + Disabled, + Update, + ForceUpdate, + Recover, + Recover2, + Cancel + }; + ESCUpdate _esc_update{ESCUpdate::Disabled}; + uint32_t esc_update_state{0}; + uint32_t prev_esc_update_state{0}; + uint8_t esc_update_motors[ESC_COUNT]; + uint32_t esc_update_motor_index; + uint32_t flashing_result; + + // Struct to track flashing progress for a single ESC + typedef struct { + uint8_t current_motor; + uint32_t current_gpio; + uint32_t fw_length; + uint32_t fw_bytes_sent; + uint32_t fw_bytes_left; + uint16_t base_address; + uint16_t next_address; + uint8_t fw_part; // We have 2 parts to write for AM32 firmware, am32_firmware and am32_firmware_tag + uint16_t crc; + uint32_t tx_length; + uint8_t tx_buffer[258]; + } ESC_FLASHING_STATE; + ESC_FLASHING_STATE esc_flashing_state; + + const uint16_t max_chunk_length = 256; + + // Variables to save responses from DShot + typedef struct { + uint8_t major; + uint8_t minor; + } ESC_FW_VERSIONS; + ESC_FW_VERSIONS esc_versions[ESC_COUNT]; + + uint32_t esc_gpios[ESC_COUNT]; + uint32_t gpio_high; + hrt_abstime time_gpio_set; + + // AM32 Bootloader commands + uint8_t response_data[16]; + const uint8_t am32_boot_init[17] = {0, 0, 0, 0, 0, 0, 0, 0, 0x0D, 'B', 'L', 'H', 'e', 'l', 'i', 0xF4, 0x7D}; + const uint8_t am32_boot_init_resp_len = 9; + uint8_t am32_set_addr[6] = {0xFF, 0, 0x10, 0x00, 0, 0}; + const uint8_t am32_set_addr_resp_len = 1; + uint8_t am32_set_buff_size[6] = {0xFE, 0, 1, 0, 0, 0}; + const uint8_t am32_set_buff_size_resp_len = 0; + const uint8_t am32_send_buff_resp_len = 1; + uint8_t am32_write[4] = {0x01, 0, 0, 0}; + const uint8_t am32_write_resp_len = 1; + const uint8_t am32_run_app[4] = {0x00, 0, 0, 0}; + const uint8_t am32_run_app_resp_len = 0; + + // These variables are useful for starting a flash from command-line + volatile uint32_t start_flash; + volatile uint16_t motor_flags; + volatile uint32_t cancel_flash; + + // Request/Ack variables + uint32_t msg_id; + uint32_t esc_info_timeout; + + // Tune control + uint32_t esc_flasher_tune{0}; // Play some different tunes during flashing + uint32_t esc_flasher_stop_tune{0}; // Stop tune 1 second after starting + + // Publication variables + uORB::Publication _esc_flasher_request_pub{ORB_ID(esc_flasher_request)}; + uORB::Publication _esc_flasher_status_pub{ORB_ID(esc_flasher_status)}; + uORB::Publication _tune_control_pub{ORB_ID(tune_control)}; + uORB::PublicationData _led_control_pub{ORB_ID(led_control)}; + uORB::Publication _vehicle_command_pub{ORB_ID(vehicle_command)}; + + // Subscription variables + uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)}; + uORB::Subscription _esc_flasher_request_ack_sub{ORB_ID(esc_flasher_request_ack)}; + uORB::Subscription _sensor_gps_sub {ORB_ID(sensor_gps)}; + uORB::Subscription _vehicle_status_sub {ORB_ID(vehicle_status)}; + + // MAVLink + orb_advert_t _mavlink_log_pub{nullptr}; + + sensor_gps_s _sensor_gps {}; /**< gps sensor */ + vehicle_status_s _vehicle_status {}; /**< vehicle status */ + + DEFINE_PARAMETERS( + (ParamInt) _param_esc_type, + (ParamInt) _param_esc_update + ) + +}; diff --git a/src/modules/esc_flasher/Kconfig b/src/modules/esc_flasher/Kconfig new file mode 100644 index 0000000000..6e9cb19ec2 --- /dev/null +++ b/src/modules/esc_flasher/Kconfig @@ -0,0 +1,5 @@ +menuconfig MODULES_ESC_FLASHER + bool "esc_flasher" + default n + ---help--- + Enable support for ESC Flasher module diff --git a/src/modules/esc_flasher/esc_params.c b/src/modules/esc_flasher/esc_params.c new file mode 100644 index 0000000000..97a66f52aa --- /dev/null +++ b/src/modules/esc_flasher/esc_params.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file esc_params.c + * + * Parameters defined for ESCs. + * + */ + +/** + * ESC type + * + * @reboot_required true + * + * @group ESC Flasher + * @value 0 - Default + * @value 1 - AM32 + * @value 2 - BLHeli32 + * @value 3 - AM32_Old + * @value 4 - BlueJay + * + * @min 0 + * @max 4 + */ +PARAM_DEFINE_INT32(ESC_TYPE, 0); + +/** + * ESC update + * + * @reboot_required false + * + * @group ESC Flasher + * @value 0 - Disabled + * @value 1 - Update if version is outdated + * @value 2 - Force update all ESCs + * @value 3 - Start recovery process + * @value 4 - Continue recovery process + * + * @min 0 + * @max 4 + */ +PARAM_DEFINE_INT32(ESC_UPDATE, 0);