diff options
author | Sylvain Miermont <smiermont@semtech.com> | 2015-02-05 15:03:10 +0100 |
---|---|---|
committer | Sylvain Miermont <smiermont@semtech.com> | 2015-02-05 15:03:10 +0100 |
commit | be5c8ac770bc5b142e2c6a47702d9ac653141371 (patch) | |
tree | 37f69650eb68db46e127aa7fbcc62f68150778bc | |
parent | 23127d92c2c2cbef1b870686c4fc2dd5ba05daec (diff) | |
download | lora_gateway-be5c8ac770bc5b142e2c6a47702d9ac653141371.tar.gz lora_gateway-be5c8ac770bc5b142e2c6a47702d9ac653141371.tar.bz2 lora_gateway-be5c8ac770bc5b142e2c6a47702d9ac653141371.zip |
v1.7.0v1.7.0
- Added TX “start delay” compensation for timestamp mode (fix time window alignment issue at low SF and/or high BW)
- Added adaptive narrowband/wideband TX filtering for LoRa
- Added a command-line option to set CR in util_tx_test
- Added notes for TX “start delay” in immediate and triggered mode
/!\ warning: due to start delay compensation being implemented, TX that were
previously 1.5ms late will be sent on time. At low datarate, this is not an
issue. At high LoRa data rate (and FSK) you might have to adjust your timing.
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | libloragw/inc/loragw_hal.h | 5 | ||||
-rw-r--r-- | libloragw/readme.md | 16 | ||||
-rw-r--r-- | libloragw/src/agc_fw.var | 360 | ||||
-rw-r--r-- | libloragw/src/loragw_hal.c | 32 | ||||
-rw-r--r-- | readme.md | 11 | ||||
-rw-r--r-- | util_tx_test/readme.md | 22 | ||||
-rw-r--r-- | util_tx_test/src/util_tx_test.c | 59 |
8 files changed, 290 insertions, 217 deletions
@@ -1 +1 @@ -1.6.0
\ No newline at end of file +1.7.0
\ No newline at end of file diff --git a/libloragw/inc/loragw_hal.h b/libloragw/inc/loragw_hal.h index 1ddbd0f..1516b65 100644 --- a/libloragw/inc/loragw_hal.h +++ b/libloragw/inc/loragw_hal.h @@ -343,6 +343,11 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data); @brief Schedule a packet to be send immediately or after a delay depending on tx_mode @param pkt_data structure containing the data and metadata for the packet to send @return LGW_HAL_ERROR id the operation failed, LGW_HAL_SUCCESS else + +/!\ When sending a packet, there is a 1.5 ms delay for the analog circuitry to start and be stable (TX_START_DELAY). +In 'timestamp' mode, this is transparent: the modem is started 1.5ms before the user-set timestamp value is reached, the preamble of the packet start right when the internal timestamp counter reach target value. +In 'immediate' mode, the packet is emitted as soon as possible: transferring the packet (and its parameters) from the host to the concentrator takes some time, then there is the TX_START_DELAY, then the packet is emitted. +In 'triggered' mode (aka PPS/GPS mode), the packet, typically a beacon, is emitted 1.5ms after a rising edge of the trigger signal. Because there is no way to anticipate the triggering event and start the analog circuitry beforehand, that delay must be taken into account in the protocol. */ int lgw_send(struct lgw_pkt_tx_s pkt_data); diff --git a/libloragw/readme.md b/libloragw/readme.md index 337ad5b..7d398ee 100644 --- a/libloragw/readme.md +++ b/libloragw/readme.md @@ -48,6 +48,22 @@ use the LoRa concentrator: For an standard application, include only this module. The use of this module is detailed on the usage section. +/!\ When sending a packet, there is a 1.5 ms delay for the analog circuitry to +start and be stable (TX_START_DELAY). + +In 'timestamp' mode, this is transparent: the modem is started 1.5ms before the +user-set timestamp value is reached, the preamble of the packet start right when +the internal timestamp counter reach target value. + +In 'immediate' mode, the packet is emitted as soon as possible: transferring the +packet (and its parameters) from the host to the concentrator takes some time, +then there is the TX_START_DELAY, then the packet is emitted. + +In 'triggered' mode (aka PPS/GPS mode), the packet, typically a beacon, is +emitted 1.5ms after a rising edge of the trigger signal. Because there is no +way to anticipate the triggering event and start the analog circuitry +beforehand, that delay must be taken into account in the protocol. + ### 2.2. loragw_reg ### This module is used to access to the LoRa concentrator registers by name instead diff --git a/libloragw/src/agc_fw.var b/libloragw/src/agc_fw.var index 4c3f17f..626f172 100644 --- a/libloragw/src/agc_fw.var +++ b/libloragw/src/agc_fw.var @@ -16,186 +16,186 @@ Maintainer: Matthieu Leurent static uint8_t agc_firmware[MCU_AGC_FW_BYTE] = { 0x8A, 0x51, 0x11, 0x28, 0xFF, 0xBF, 0xFF, 0xBF, 0x80, 0x40, 0x03, 0x4E, 0x83, 0x52, 0x03, 0x53, 0xAC, 0x00, 0x04, 0x88, 0xAD, 0x40, 0x0A, 0xC8, 0xAE, 0x40, 0x01, 0x88, 0xAF, 0x80, 0x8A, 0x51, -0x13, 0x68, 0x8A, 0x51, 0xCB, 0x2C, 0x8B, 0xDC, 0x1C, 0x68, 0x9E, 0xA0, 0x8A, 0x51, 0x29, 0x20, -0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0x10, 0xF0, 0x8B, 0x00, 0x2F, 0x88, 0x81, 0x80, -0x2E, 0x48, 0x8A, 0xC0, 0x2D, 0x48, 0x84, 0x80, 0x2C, 0x8E, 0x83, 0xC0, 0x80, 0x0E, 0x00, 0xCE, -0x09, 0x80, 0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, -0x9C, 0x41, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40, 0x19, 0x54, 0x19, 0x95, 0x8B, 0x41, -0xD6, 0x81, 0x02, 0xF0, 0x56, 0x42, 0x03, 0x18, 0x5D, 0xE8, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, -0x83, 0x93, 0x80, 0x81, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x56, 0x48, -0x73, 0xA0, 0x8A, 0x51, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, -0x56, 0xDC, 0x56, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x59, 0xA8, 0x83, 0x52, 0x03, 0x53, -0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD6, 0xCA, 0x39, 0xA8, 0xD5, 0x81, 0x08, 0xF0, 0x55, 0x42, -0x03, 0x18, 0x08, 0x40, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, -0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x55, 0x48, 0x95, 0x00, 0x98, 0x54, -0x98, 0x10, 0xD5, 0xCA, 0x5E, 0xE8, 0xAB, 0x40, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, -0x23, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x8F, 0xE4, 0x8A, 0x51, 0xA7, 0x40, 0x05, 0x30, 0x03, 0xD0, -0xA7, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x7F, 0x68, 0x2A, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, -0x8F, 0xE4, 0x8A, 0x51, 0xA8, 0xC0, 0x28, 0x47, 0x27, 0x44, 0x01, 0x38, 0xA9, 0x00, 0x2B, 0x48, -0x22, 0xFE, 0x84, 0x80, 0x29, 0x08, 0x80, 0x40, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, -0xA4, 0xC0, 0x2B, 0x48, 0xA5, 0x00, 0x0C, 0x30, 0x90, 0x21, 0x08, 0x40, 0x18, 0x12, 0x80, 0xF0, -0x9B, 0x40, 0x08, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0xA9, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, -0xAC, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x13, 0x08, 0xA9, 0x00, 0x0F, 0xB0, 0xA9, 0x85, -0x29, 0x08, 0x41, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xAA, 0x00, -0x3F, 0x30, 0xAA, 0x85, 0x2A, 0x08, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, -0x08, 0xF0, 0x90, 0x21, 0x8A, 0x51, 0x21, 0xDF, 0xC9, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, -0xCC, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xD2, 0xA8, 0x83, 0x52, 0x03, 0x53, -0x99, 0xD6, 0xD5, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x10, 0x1C, 0xE2, 0xA8, 0x6C, 0xB0, -0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x0A, 0x30, 0x90, 0x21, 0x8A, 0x51, -0x04, 0xF0, 0xEC, 0xE8, 0x60, 0x30, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, -0x0A, 0x30, 0x90, 0x21, 0x8A, 0x51, 0x05, 0x30, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, -0xA5, 0x00, 0x0B, 0x70, 0x90, 0x21, 0x8A, 0x51, 0x12, 0xC8, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, -0x01, 0xF0, 0xA5, 0x00, 0x04, 0xF0, 0x90, 0x21, 0x8A, 0x51, 0x11, 0xC8, 0xA4, 0xC0, 0x00, 0xB0, -0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x05, 0x30, 0x90, 0x21, 0x8A, 0x51, 0x10, 0x88, 0xA4, 0xC0, -0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x06, 0x30, 0x90, 0x21, 0x8A, 0x51, 0x00, 0xB0, -0xA4, 0x01, 0xA4, 0x4A, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x00, 0xB0, 0x90, 0x21, 0x8A, 0x51, -0x35, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x1A, 0xA9, 0x05, 0x30, 0x83, 0x52, 0x03, 0x53, 0xA4, 0xC0, -0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x00, 0xB0, 0x90, 0x21, 0x8A, 0x51, 0x03, 0x30, -0xA8, 0xC0, 0x7D, 0x30, 0xA7, 0x40, 0xA7, 0x0B, 0x2B, 0xE9, 0xA8, 0x8B, 0x2B, 0xE9, 0x83, 0x52, -0x03, 0x53, 0x13, 0x1F, 0x35, 0xE9, 0x19, 0x51, 0x36, 0xE9, 0x19, 0x10, 0x05, 0x30, 0xA7, 0x40, -0xA7, 0x0B, 0x38, 0xA9, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x40, 0x29, 0x99, 0xD5, 0x41, 0x69, -0x99, 0x94, 0x15, 0x70, 0xA8, 0xC0, 0xC6, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x45, 0xA9, 0xA8, 0x8B, -0x45, 0xA9, 0x00, 0x00, 0x0D, 0x70, 0x83, 0x52, 0x03, 0x53, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, -0x01, 0xF0, 0xA5, 0x00, 0x00, 0xB0, 0x90, 0x21, 0x8A, 0x51, 0x10, 0xF0, 0x9E, 0x40, 0x93, 0x1B, -0x57, 0x29, 0x08, 0xF0, 0x9E, 0x40, 0x99, 0x92, 0x19, 0x52, 0x00, 0xB0, 0xA4, 0x01, 0xA4, 0x4A, -0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, 0x00, 0xB0, 0x90, 0x21, 0x8A, 0x51, 0x13, 0x1F, 0x6A, 0xE9, -0x99, 0x91, 0x6B, 0x29, 0x99, 0x50, 0xE4, 0xB0, 0xA7, 0x40, 0x6E, 0x29, 0x6F, 0x69, 0xA7, 0x0B, -0x6D, 0x29, 0x72, 0xE9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x79, 0x29, 0x19, 0x95, -0x7A, 0x29, 0x19, 0x54, 0x03, 0x30, 0xA4, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xA5, 0x00, -0x00, 0xB0, 0x90, 0x21, 0x8A, 0x51, 0x05, 0x30, 0xA8, 0xC0, 0x26, 0x70, 0xA7, 0x40, 0xA7, 0x0B, -0x87, 0xE9, 0xA8, 0x8B, 0x87, 0xE9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0x08, 0x40, -0xA6, 0x00, 0x25, 0x08, 0x03, 0x59, 0x9A, 0xE9, 0x24, 0xC8, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, -0x86, 0xC0, 0x08, 0x40, 0x24, 0xC8, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, -0x11, 0x30, 0xC0, 0x80, 0x03, 0x30, 0xA0, 0x80, 0x8A, 0x51, 0x19, 0xA3, 0x8A, 0x51, 0xBF, 0x01, -0x10, 0xF0, 0x3F, 0xC2, 0x03, 0x18, 0xDD, 0x69, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xB5, 0x29, -0x8A, 0x51, 0xF8, 0xE4, 0x8A, 0x51, 0xC0, 0x80, 0xAC, 0xE9, 0x3F, 0xC8, 0x20, 0x38, 0x9B, 0x40, -0x02, 0xF0, 0x9E, 0x40, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xC3, 0xE9, 0x8A, 0x51, 0xF8, 0xE4, -0x8A, 0x51, 0xC0, 0x80, 0xBA, 0x29, 0x40, 0x88, 0x11, 0xBA, 0x03, 0x9D, 0xCC, 0xE9, 0x30, 0x30, -0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0xDD, 0x69, 0x3F, 0xC8, 0x41, 0xFE, 0x84, 0x80, 0x40, 0x88, -0x83, 0x93, 0x80, 0x40, 0x3F, 0xC8, 0x30, 0x78, 0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0xBF, 0x4A, -0xA8, 0xA9, 0x8A, 0x51, 0xF8, 0xE4, 0x8A, 0x51, 0xC0, 0x80, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x9D, -0xD9, 0x29, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x9D, -0xEE, 0x69, 0x8A, 0x51, 0xF8, 0xE4, 0x8A, 0x51, 0xC0, 0x80, 0xE5, 0x29, 0x40, 0x88, 0xBE, 0x80, -0x30, 0x78, 0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xFD, 0xA9, -0x8A, 0x51, 0xF8, 0xE4, 0x8A, 0x51, 0xC0, 0x80, 0xF4, 0x29, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, -0x9E, 0x40, 0x40, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0x0A, 0x6A, 0x8A, 0x51, 0xF8, 0xE4, 0x8A, 0x51, -0xC0, 0x80, 0x01, 0x2A, 0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0x93, 0x5F, 0x17, 0xEA, -0x8A, 0x51, 0x8D, 0xE3, 0x8A, 0x51, 0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0xD5, 0x81, -0x08, 0xF0, 0x55, 0x42, 0x03, 0x18, 0x4F, 0x2A, 0x55, 0x48, 0x95, 0x00, 0x85, 0x70, 0x0D, 0x02, -0x03, 0x5C, 0x2F, 0x2A, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x0E, 0x70, 0x83, 0x93, 0x00, 0x42, -0x03, 0x18, 0x2F, 0x2A, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x00, 0x8A, 0x40, 0x2A, 0x34, 0x70, -0x0D, 0x02, 0x03, 0x18, 0x4D, 0xEA, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x05, 0x30, 0x83, 0x93, -0x00, 0x42, 0x03, 0x5C, 0x4D, 0xEA, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, -0xB8, 0x00, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x38, 0x08, 0x80, 0x40, 0x55, 0x48, 0x57, 0xBE, -0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD5, 0xCA, 0x18, 0x6A, 0xD6, 0x81, -0x02, 0xF0, 0x56, 0x42, 0x03, 0x18, 0xC3, 0xEA, 0x56, 0xDC, 0x5A, 0xEA, 0x83, 0x52, 0x03, 0x53, -0x18, 0x14, 0x5D, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, -0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0x66, 0xEA, 0x64, 0x70, 0x67, 0x2A, 0x73, 0xF0, 0xB9, 0x40, -0x0E, 0x08, 0x39, 0x42, 0x03, 0x18, 0x78, 0xEA, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x0B, 0x70, -0x00, 0x42, 0x03, 0x18, 0x78, 0xEA, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x00, 0x8A, 0x88, 0x6A, -0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18, 0x96, 0xEA, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x08, 0xF0, -0x00, 0x42, 0x03, 0x5C, 0x96, 0xEA, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, -0xB8, 0x00, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x38, 0x08, 0x80, 0x40, 0x56, 0x48, 0x5F, 0xFE, -0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, -0x03, 0x5C, 0xA6, 0xEA, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, 0x09, 0x30, 0x00, 0x42, 0x03, 0x18, -0xA6, 0xEA, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0xB5, 0x2A, 0x10, 0xF0, 0x0F, 0x42, -0x03, 0x18, 0xC1, 0xAA, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, 0x80, 0x88, 0x03, 0x59, 0xC1, 0xAA, -0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xB8, 0x00, 0x56, 0x48, 0x53, 0x7E, -0x84, 0x80, 0x38, 0x08, 0x80, 0x40, 0x56, 0x48, 0x8A, 0x51, 0x63, 0xE3, 0x8A, 0x51, 0x98, 0x95, -0x98, 0x51, 0xD6, 0xCA, 0x50, 0x6A, 0x53, 0x48, 0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x8F, 0xE4, -0x8A, 0x51, 0xBC, 0x40, 0x06, 0x30, 0xB0, 0xC0, 0x5F, 0xC8, 0xF9, 0xFE, 0x8A, 0x51, 0x07, 0xA5, -0x8A, 0x51, 0xBD, 0x80, 0x3C, 0xC7, 0x97, 0x40, 0x54, 0x08, 0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x8F, 0xE4, 0x8A, 0x51, 0xBC, 0x40, 0x06, 0x30, 0xB0, 0xC0, 0x60, 0xC8, 0xF9, 0xFE, 0x8A, 0x51, -0x07, 0xA5, 0x8A, 0x51, 0xBD, 0x80, 0x3C, 0xC7, 0x9C, 0x00, 0x3E, 0x88, 0x95, 0x00, 0x0D, 0x08, -0xB8, 0x00, 0x03, 0xD0, 0xB8, 0x8C, 0x03, 0xD0, 0xB8, 0x8C, 0x03, 0xD0, 0xB8, 0x8C, 0x38, 0x08, -0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x8F, 0xE4, 0x8A, 0x51, 0xBB, 0x80, 0x06, 0x30, 0xB0, 0xC0, -0x3E, 0x88, 0x57, 0xBE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xFC, 0xFE, 0x8A, 0x51, 0x07, 0xA5, -0x8A, 0x51, 0xBA, 0x40, 0x01, 0xF0, 0xB8, 0x00, 0x3E, 0xCA, 0x08, 0x6B, 0x03, 0xD0, 0xB8, 0xCD, -0xFF, 0x7E, 0x03, 0x9D, 0x06, 0xAB, 0x38, 0x08, 0x14, 0x05, 0x03, 0x59, 0x12, 0xAB, 0x3A, 0x48, -0x1C, 0x87, 0x14, 0xAB, 0x3A, 0x48, 0x17, 0xC7, 0xB8, 0x00, 0x3B, 0x88, 0x38, 0x87, 0x9A, 0x00, -0x0E, 0xAA, 0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, -0x9C, 0x41, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40, 0x19, 0x54, 0x19, 0x95, 0x8B, 0x41, -0xD6, 0x81, 0x02, 0xF0, 0x56, 0x42, 0x03, 0x18, 0x4D, 0x2B, 0x56, 0x48, 0x53, 0x7E, 0x84, 0x80, -0x83, 0x93, 0x80, 0x81, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x56, 0x48, -0x63, 0xE3, 0x8A, 0x51, 0x56, 0x48, 0x5F, 0xFE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, -0x56, 0xDC, 0x46, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x49, 0xEB, 0x83, 0x52, 0x03, 0x53, -0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD6, 0xCA, 0x29, 0xEB, 0xD5, 0x81, 0x08, 0xF0, 0x55, 0x42, -0x03, 0x18, 0x08, 0x40, 0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, -0x55, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x55, 0x48, 0x95, 0x00, 0x98, 0x54, -0x98, 0x10, 0xD5, 0xCA, 0x4E, 0x2B, 0xB7, 0x80, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xB6, 0x40, -0x23, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x8F, 0xE4, 0x8A, 0x51, 0xB3, 0x40, 0x05, 0x30, 0x03, 0xD0, -0xB3, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x6F, 0xAB, 0x36, 0x48, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, -0x8F, 0xE4, 0x8A, 0x51, 0xB4, 0x00, 0x34, 0x87, 0x33, 0x44, 0x01, 0x38, 0xB5, 0x40, 0x37, 0x88, -0x22, 0xFE, 0x84, 0x80, 0x35, 0x48, 0x80, 0x40, 0x37, 0x88, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, -0xB0, 0xC0, 0x37, 0x88, 0xB1, 0x00, 0x0C, 0x30, 0x7F, 0xAC, 0x18, 0x12, 0x80, 0xF0, 0x9B, 0x40, -0x08, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0x98, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x9B, 0x6B, -0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x13, 0x08, 0xB5, 0x40, 0x0F, 0xB0, 0xB5, 0xC5, 0x35, 0x48, -0x41, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xB6, 0x40, 0x3F, 0x30, -0xB6, 0xC5, 0x36, 0x48, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x08, 0xF0, -0x7F, 0x64, 0x8A, 0x51, 0x21, 0xDF, 0xB8, 0x2B, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xBB, 0xAB, -0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xC1, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, -0xC4, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x10, 0x1C, 0xD1, 0x2B, 0x6C, 0xB0, 0xB0, 0xC0, -0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x0A, 0x30, 0x7F, 0x64, 0x8A, 0x51, 0x04, 0xF0, -0xDB, 0xAB, 0x60, 0x30, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x0A, 0x30, -0x7F, 0x64, 0x8A, 0x51, 0x05, 0x30, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, -0x0B, 0x70, 0x7F, 0x64, 0x8A, 0x51, 0x12, 0xC8, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, -0xB1, 0x00, 0x04, 0xF0, 0x7F, 0x64, 0x8A, 0x51, 0x11, 0xC8, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, -0x01, 0xF0, 0xB1, 0x00, 0x05, 0x30, 0x7F, 0x64, 0x8A, 0x51, 0x10, 0x88, 0xB0, 0xC0, 0x00, 0xB0, -0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x06, 0x30, 0x7F, 0x64, 0x8A, 0x51, 0x00, 0xB0, 0xB0, 0x01, -0xB0, 0x4A, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x00, 0xB0, 0x7F, 0x64, 0x8A, 0x51, 0x35, 0xB0, -0xB3, 0x40, 0xB3, 0x0B, 0x09, 0x6C, 0x05, 0x30, 0x83, 0x52, 0x03, 0x53, 0xB0, 0xC0, 0x00, 0xB0, -0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x00, 0xB0, 0x7F, 0x64, 0x8A, 0x51, 0x03, 0x30, 0xB4, 0x00, -0x7D, 0x30, 0xB3, 0x40, 0xB3, 0x0B, 0x1A, 0xAC, 0xB4, 0xCB, 0x1A, 0xAC, 0x83, 0x52, 0x03, 0x53, -0x13, 0x1F, 0x24, 0x6C, 0x19, 0x51, 0x25, 0xAC, 0x19, 0x10, 0x05, 0x30, 0xB3, 0x40, 0xB3, 0x0B, -0x27, 0xEC, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x2F, 0x2C, 0x99, 0xD5, 0x30, 0x6C, 0x99, 0x94, -0x15, 0x70, 0xB4, 0x00, 0xC6, 0xB0, 0xB3, 0x40, 0xB3, 0x0B, 0x34, 0xAC, 0xB4, 0xCB, 0x34, 0xAC, -0x00, 0x00, 0x0D, 0x70, 0x83, 0x52, 0x03, 0x53, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, -0xB1, 0x00, 0x00, 0xB0, 0x7F, 0x64, 0x8A, 0x51, 0x10, 0xF0, 0x9E, 0x40, 0x93, 0x1B, 0x46, 0xAC, -0x08, 0xF0, 0x9E, 0x40, 0x99, 0x92, 0x19, 0x52, 0x00, 0xB0, 0xB0, 0x01, 0xB0, 0x4A, 0x13, 0xDB, -0x01, 0xF0, 0xB1, 0x00, 0x00, 0xB0, 0x7F, 0x64, 0x8A, 0x51, 0x13, 0x1F, 0x59, 0xEC, 0x99, 0x91, -0x5A, 0xEC, 0x99, 0x50, 0xE4, 0xB0, 0xB3, 0x40, 0x5D, 0x2C, 0x5E, 0x2C, 0xB3, 0x0B, 0x5C, 0xEC, -0x61, 0xAC, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x68, 0xAC, 0x19, 0x95, 0x69, 0xEC, -0x19, 0x54, 0x03, 0x30, 0xB0, 0xC0, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB1, 0x00, 0x00, 0xB0, -0x7F, 0x64, 0x8A, 0x51, 0x05, 0x30, 0xB4, 0x00, 0x26, 0x70, 0xB3, 0x40, 0xB3, 0x0B, 0x76, 0x2C, -0xB4, 0xCB, 0x76, 0x2C, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0x08, 0x40, 0xB2, 0x00, -0x31, 0x08, 0x03, 0x59, 0x89, 0xAC, 0x30, 0xC8, 0x88, 0x80, 0x32, 0x08, 0x80, 0x38, 0x86, 0xC0, -0x08, 0x40, 0x30, 0xC8, 0x88, 0x80, 0x32, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x04, 0xF0, -0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, -0x00, 0xF4, 0x00, 0xF4, 0x02, 0x34, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x08, 0x34, -0x09, 0x74, 0x0A, 0x74, 0x0A, 0x74, 0x0B, 0xB4, 0x0B, 0xB4, 0x0C, 0x74, 0x0D, 0xB4, 0x0D, 0xB4, -0x0E, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, 0x0F, 0xF4, 0x0F, 0xF4, 0x00, 0xF4, 0x06, 0x74, 0x0C, 0x74, -0x12, 0x74, 0x18, 0x74, 0x1E, 0xF4, 0x24, 0x74, 0x2A, 0xB4, 0x30, 0x74, 0x36, 0xF4, 0x01, 0x34, -0x01, 0x34, 0x01, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x05, 0x74, 0x06, 0x74, -0x06, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x09, 0x74, 0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, -0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x83, 0x93, 0x53, 0xB0, 0x84, 0x80, 0x61, 0x70, 0x8A, 0x51, -0x15, 0xA5, 0x38, 0x70, 0xC1, 0xC0, 0x3A, 0xB0, 0xC2, 0xC0, 0x3C, 0xB0, 0xC3, 0x00, 0x78, 0xB0, -0xC4, 0xC0, 0x7A, 0xF0, 0xC5, 0x00, 0x7C, 0xF0, 0xC6, 0x00, 0x7D, 0x30, 0xC7, 0x40, 0x7F, 0x70, -0xC8, 0xC0, 0xB9, 0xF0, 0xC9, 0x00, 0xBA, 0xF0, 0xCA, 0x00, 0xBB, 0x30, 0xCB, 0x40, 0xFA, 0x30, -0xCC, 0x00, 0xFB, 0x70, 0xCD, 0x40, 0xFC, 0x30, 0xCE, 0x40, 0xFD, 0x70, 0xCF, 0x80, 0xFF, 0xB0, -0xD0, 0xC0, 0x00, 0xB0, 0xD1, 0x00, 0x01, 0xF0, 0xD2, 0x00, 0x83, 0x01, 0x8A, 0x51, 0xA0, 0x69, -0x52, 0x08, 0xB1, 0x00, 0x51, 0x08, 0xB0, 0xC0, 0x31, 0x08, 0x30, 0x06, 0x03, 0x59, 0x05, 0xAD, -0x14, 0xC8, 0xB0, 0xC0, 0x14, 0xC8, 0xB1, 0x00, 0xFC, 0x6C, 0x31, 0x08, 0x08, 0x40, 0xB2, 0x00, -0xB1, 0x41, 0x30, 0xC8, 0x32, 0x58, 0xB1, 0xC7, 0x03, 0xD0, 0xB0, 0x8D, 0x03, 0xD0, 0xB2, 0x8C, -0xB2, 0x48, 0x03, 0x9D, 0x09, 0xAD, 0x31, 0x08, 0x08, 0x40, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, -0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0x16, 0xED, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0x13, 0x68, 0x8A, 0x51, 0x57, 0x6D, 0x8B, 0xDC, 0x1A, 0x68, 0x9F, 0xE0, 0x8A, 0x51, 0x27, 0x60, +0x40, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x8B, 0x00, 0x2F, 0x88, 0x81, 0x80, 0x2E, 0x48, 0x8A, 0xC0, +0x2D, 0x48, 0x84, 0x80, 0x2C, 0x8E, 0x83, 0xC0, 0x80, 0x0E, 0x00, 0xCE, 0x09, 0x80, 0x95, 0x41, +0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, +0x19, 0x54, 0x19, 0x95, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0x58, 0x68, +0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, +0x07, 0x70, 0x80, 0x40, 0x54, 0x08, 0x71, 0x60, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, +0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x51, 0x68, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, +0x54, 0x68, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, 0x34, 0x68, +0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x6E, 0xE8, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, +0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, +0x53, 0x48, 0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x59, 0xA8, 0x10, 0xF0, 0x9B, 0x40, +0x08, 0x40, 0xAB, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x23, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xA7, 0x40, 0x05, 0x30, 0x03, 0xD0, 0xA7, 0x0D, 0xFF, 0x7E, +0x03, 0x9D, 0x7D, 0x28, 0x2A, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, +0xA8, 0xC0, 0x28, 0x47, 0x27, 0x44, 0x01, 0x38, 0xA9, 0x00, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, +0x29, 0x08, 0x80, 0x40, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, 0xA0, 0x80, +0x83, 0x52, 0x2B, 0x48, 0x83, 0x96, 0xA1, 0xC0, 0x0C, 0x30, 0xD2, 0xA1, 0x08, 0x40, 0x18, 0x12, +0x80, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0xAA, 0xA8, 0x83, 0x52, 0x03, 0x53, +0x18, 0x14, 0xAD, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0xB3, 0xE8, 0x83, 0x96, +0x03, 0x53, 0xA4, 0x54, 0xB6, 0xE8, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, 0x12, 0xDF, +0xBD, 0x28, 0x83, 0x96, 0x03, 0x53, 0x24, 0x14, 0xC0, 0x28, 0x83, 0x96, 0x03, 0x53, 0x24, 0xD0, +0x83, 0x52, 0x5F, 0xC8, 0xA7, 0x40, 0x06, 0x30, 0x03, 0xD0, 0xA7, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, +0xC4, 0x68, 0x12, 0xC8, 0x3F, 0xB9, 0x27, 0x44, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, 0xD2, 0xA8, +0x83, 0x52, 0x9E, 0x15, 0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, 0x83, 0x93, +0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xA9, 0x00, 0x3F, 0x30, 0xA9, 0x85, 0x29, 0x08, 0x83, 0x96, +0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x08, 0xF0, +0xD2, 0xA1, 0x8A, 0x51, 0x21, 0xDF, 0xF0, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xF3, 0x28, +0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xF9, 0x28, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, +0xFC, 0x28, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0x0C, 0x69, 0x6C, 0xB0, +0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x0A, 0x30, +0xD2, 0xA1, 0x8A, 0x51, 0x04, 0xF0, 0x18, 0x69, 0x60, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x0A, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x05, 0x30, +0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, +0x0B, 0x70, 0xD2, 0xA1, 0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x04, 0xF0, 0xD2, 0xA1, 0x8A, 0x51, 0x11, 0xC8, +0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, +0x05, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x06, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x83, 0x96, +0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, +0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x35, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x55, 0xE9, 0x05, 0x30, +0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x03, 0x30, 0xA8, 0xC0, 0x7D, 0x30, 0xA7, 0x40, +0xA7, 0x0B, 0x68, 0xA9, 0xA8, 0x8B, 0x68, 0xA9, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x72, 0xE9, +0x19, 0x51, 0x73, 0x29, 0x19, 0x10, 0x05, 0x30, 0xA7, 0x40, 0xA7, 0x0B, 0x75, 0x29, 0x83, 0x52, +0x03, 0x53, 0x13, 0x1F, 0x7D, 0x69, 0x99, 0xD5, 0x7E, 0x69, 0x99, 0x94, 0x15, 0x70, 0xA8, 0xC0, +0xC6, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x82, 0x69, 0xA8, 0x8B, 0x82, 0x69, 0x00, 0x00, 0x0D, 0x70, +0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x93, 0x1B, 0x94, 0xA9, 0x99, 0x92, 0x19, 0x52, +0x83, 0x96, 0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x13, 0x1F, 0xA8, 0xA9, 0x99, 0x91, 0xA9, 0xE9, +0x99, 0x50, 0xE4, 0xB0, 0xA7, 0x40, 0xAC, 0xE9, 0xAD, 0x29, 0xA7, 0x0B, 0xAB, 0x29, 0xB0, 0xA9, +0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0xB7, 0x69, 0x19, 0x95, 0xB8, 0xE9, 0x19, 0x54, +0x03, 0x30, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x05, 0x30, 0xA8, 0xC0, 0x26, 0x70, 0xA7, 0x40, +0xA7, 0x0B, 0xC8, 0xA9, 0xA8, 0x8B, 0xC8, 0xA9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, +0x9E, 0x81, 0x08, 0x40, 0x83, 0x52, 0xA6, 0x00, 0x83, 0x96, 0x21, 0xC8, 0x03, 0x59, 0xDF, 0xA9, +0x20, 0x88, 0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x20, 0x88, +0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x95, 0x41, 0x96, 0x41, +0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, 0x19, 0x54, +0x19, 0x95, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0x17, 0xEA, 0x54, 0x08, +0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x07, 0x70, +0x80, 0x40, 0x54, 0x08, 0x30, 0x22, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0xCE, +0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x10, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x13, 0xAA, +0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, 0xF3, 0x69, 0xD3, 0x81, +0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x2D, 0xEA, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x04, 0xF0, +0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x53, 0x48, +0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x18, 0x6A, 0x10, 0xF0, 0x9B, 0x40, 0x08, 0x40, +0xB5, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB4, 0x00, 0x23, 0x3E, 0x84, 0x80, 0x8A, 0x51, +0x1B, 0xE5, 0x8A, 0x51, 0xB1, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xB1, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, +0x3C, 0xEA, 0x34, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xB2, 0x00, +0x32, 0x87, 0x31, 0x04, 0x01, 0x38, 0xB3, 0x40, 0x35, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x33, 0x48, +0x80, 0x40, 0x35, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, 0xA2, 0xC0, 0x83, 0x52, +0x35, 0x48, 0x83, 0x96, 0xA3, 0x00, 0x0C, 0x30, 0x90, 0xAB, 0x18, 0x12, 0x80, 0xF0, 0x9B, 0x40, +0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0x68, 0xAA, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x6B, 0x2A, +0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0x71, 0xEA, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x54, +0x74, 0xEA, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, 0x12, 0xDF, 0x7B, 0x6A, 0x83, 0x96, +0x03, 0x53, 0x24, 0x14, 0x7E, 0x6A, 0x83, 0x96, 0x03, 0x53, 0x24, 0xD0, 0x83, 0x52, 0x5F, 0xC8, +0xB1, 0x00, 0x06, 0x30, 0x03, 0xD0, 0xB1, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, 0x82, 0x6A, 0x12, 0xC8, +0x3F, 0xB9, 0x31, 0x04, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, 0x90, 0x6A, 0x83, 0x52, 0x9E, 0x15, +0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, +0x21, 0xC8, 0xB3, 0x40, 0x3F, 0x30, 0xB3, 0xC5, 0x33, 0x48, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, +0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x08, 0xF0, 0x90, 0x63, 0x8A, 0x51, +0x21, 0xDF, 0xAE, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xB1, 0xEA, 0x83, 0x52, 0x03, 0x53, +0x19, 0x52, 0xA1, 0x1F, 0xB7, 0x6A, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, 0xBA, 0x2A, 0x83, 0x52, +0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0xCA, 0xEA, 0x6C, 0xB0, 0xA2, 0xC0, 0x00, 0xB0, +0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, 0x90, 0x63, 0x8A, 0x51, +0x04, 0xF0, 0xD6, 0x2A, 0x60, 0x30, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, 0x90, 0x63, 0x8A, 0x51, 0x05, 0x30, 0x83, 0x96, 0xA2, 0xC0, +0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0B, 0x70, 0x90, 0x63, +0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA3, 0x00, 0x04, 0xF0, 0x90, 0x63, 0x8A, 0x51, 0x11, 0xC8, 0x83, 0x96, 0xA2, 0xC0, +0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x05, 0x30, 0x90, 0x63, +0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA3, 0x00, 0x06, 0x30, 0x90, 0x63, 0x8A, 0x51, 0x83, 0x96, 0x00, 0xB0, 0xA2, 0x01, +0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, 0x90, 0x63, +0x8A, 0x51, 0x35, 0xB0, 0xB1, 0x00, 0xB1, 0xCB, 0x13, 0xEB, 0x05, 0x30, 0x83, 0x96, 0x03, 0x53, +0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, +0x90, 0x63, 0x8A, 0x51, 0x03, 0x30, 0xB2, 0x00, 0x7D, 0x30, 0xB1, 0x00, 0xB1, 0xCB, 0x26, 0xEB, +0xB2, 0xCB, 0x26, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x30, 0xAB, 0x19, 0x51, 0x31, 0xEB, +0x19, 0x10, 0x05, 0x30, 0xB1, 0x00, 0xB1, 0xCB, 0x33, 0x2B, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, +0x3B, 0x6B, 0x99, 0xD5, 0x3C, 0x2B, 0x99, 0x94, 0x15, 0x70, 0xB2, 0x00, 0xC6, 0xB0, 0xB1, 0x00, +0xB1, 0xCB, 0x40, 0x6B, 0xB2, 0xCB, 0x40, 0x6B, 0x00, 0x00, 0x0D, 0x70, 0x83, 0x96, 0x03, 0x53, +0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, +0x90, 0x63, 0x8A, 0x51, 0x93, 0x1B, 0x52, 0xEB, 0x99, 0x92, 0x19, 0x52, 0x83, 0x96, 0x00, 0xB0, +0xA2, 0x01, 0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, +0x90, 0x63, 0x8A, 0x51, 0x13, 0x1F, 0x66, 0x2B, 0x99, 0x91, 0x67, 0x6B, 0x99, 0x50, 0xE4, 0xB0, +0xB1, 0x00, 0x6A, 0x2B, 0x6B, 0x6B, 0xB1, 0xCB, 0x69, 0x2B, 0x6E, 0x6B, 0x00, 0x00, 0x83, 0x52, +0x03, 0x53, 0x13, 0x1F, 0x75, 0x6B, 0x19, 0x95, 0x76, 0x6B, 0x19, 0x54, 0x03, 0x30, 0x83, 0x96, +0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, +0x90, 0x63, 0x8A, 0x51, 0x05, 0x30, 0xB2, 0x00, 0x26, 0x70, 0xB1, 0x00, 0xB1, 0xCB, 0x86, 0xEB, +0xB2, 0xCB, 0x86, 0xEB, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0x9E, 0x81, 0x08, 0x40, +0x83, 0x52, 0xB0, 0xC0, 0x83, 0x96, 0x23, 0x08, 0x03, 0x59, 0x9D, 0x6B, 0x22, 0xC8, 0x83, 0x52, +0x88, 0x80, 0x30, 0xC8, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x22, 0xC8, 0x83, 0x52, 0x88, 0x80, +0x30, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x11, 0x30, 0xBE, 0x80, 0x03, 0x30, 0xA0, 0x80, +0x8A, 0x51, 0xE6, 0xE1, 0x8A, 0x51, 0xBD, 0xC1, 0x10, 0xF0, 0x3D, 0x82, 0x03, 0x18, 0xDB, 0xAB, +0x3E, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xB9, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, +0xB0, 0xEB, 0x3D, 0x88, 0x20, 0x38, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xC5, 0x2B, +0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0xBC, 0x6B, 0x3E, 0x88, 0x11, 0xBA, 0x03, 0x9D, +0xCC, 0x2B, 0x30, 0x30, 0x9B, 0x40, 0xDB, 0xAB, 0x3D, 0x88, 0x3F, 0xFE, 0x84, 0x80, 0x3E, 0x88, +0x83, 0x93, 0x80, 0x40, 0x3D, 0x88, 0x30, 0x78, 0x9B, 0x40, 0xBD, 0x0A, 0xAC, 0x2B, 0x8A, 0x51, +0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xD7, 0xAB, 0x20, 0xF0, +0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xEA, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, +0xBE, 0x80, 0xE1, 0x2B, 0x3E, 0x88, 0xDF, 0xC0, 0x5F, 0xC8, 0x30, 0x78, 0x9B, 0x40, 0x3E, 0x88, +0x10, 0x7A, 0x03, 0x59, 0xF8, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0xEF, 0xEB, +0x20, 0xF0, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0x03, 0x6C, 0x8A, 0x51, 0x88, 0x65, +0x8A, 0x51, 0xBE, 0x80, 0xFA, 0xAB, 0x3E, 0x88, 0xBC, 0x40, 0x30, 0x78, 0x9B, 0x40, 0x3E, 0x88, +0x10, 0x7A, 0x03, 0x59, 0x10, 0x2C, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0x07, 0xAC, +0x40, 0xF0, 0x9B, 0x40, 0x93, 0x5F, 0x19, 0xAC, 0x8A, 0x51, 0x5D, 0xE2, 0x8A, 0x51, 0x40, 0xF0, +0x9B, 0x40, 0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x51, 0xAC, 0x53, 0x48, 0x95, 0x00, +0x85, 0x70, 0x0D, 0x02, 0x03, 0x5C, 0x31, 0xAC, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x0E, 0x70, +0x83, 0x93, 0x00, 0x42, 0x03, 0x18, 0x31, 0xAC, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x8A, +0x42, 0x6C, 0x34, 0x70, 0x0D, 0x02, 0x03, 0x18, 0x4F, 0x2C, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, +0x05, 0x30, 0x83, 0x93, 0x00, 0x42, 0x03, 0x5C, 0x4F, 0x2C, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, +0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, +0x1A, 0xAC, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0xC5, 0xEC, 0x54, 0x9C, 0x5C, 0xEC, +0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x5F, 0x6C, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x54, 0x08, +0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0x68, 0xAC, 0x64, 0x70, 0x69, 0xEC, +0x73, 0xF0, 0xB7, 0x80, 0x0E, 0x08, 0x37, 0x82, 0x03, 0x18, 0x7A, 0x2C, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x0B, 0x70, 0x00, 0x42, 0x03, 0x18, 0x7A, 0x2C, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, +0x00, 0x8A, 0x8A, 0xAC, 0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18, 0x98, 0xAC, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x08, 0xF0, 0x00, 0x42, 0x03, 0x5C, 0x98, 0xAC, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, +0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, +0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, +0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C, 0xA8, 0xAC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x09, 0x30, +0x00, 0x42, 0x03, 0x18, 0xA8, 0xAC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x8A, 0xB7, 0x6C, +0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0xC3, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x80, 0x88, +0x03, 0x59, 0xC3, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, +0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, 0x54, 0x08, 0x8A, 0x51, 0x30, 0x22, +0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0xD4, 0x8A, 0x52, 0xAC, 0x51, 0x08, 0x19, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, 0xE0, 0xC0, 0x5D, 0x88, 0xF9, 0xFE, +0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, 0x97, 0x40, 0x52, 0x08, 0x19, 0x3E, +0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, 0xE0, 0xC0, 0x5E, 0x88, +0xF9, 0xFE, 0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, 0x9C, 0x00, 0x3C, 0x48, +0x95, 0x00, 0x0D, 0x08, 0xB6, 0x40, 0x03, 0xD0, 0xB6, 0xCC, 0x03, 0xD0, 0xB6, 0xCC, 0x03, 0xD0, +0xB6, 0xCC, 0x36, 0x48, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xB9, 0x40, +0x06, 0x30, 0xE0, 0xC0, 0x3C, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xFC, 0xFE, +0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xB8, 0x00, 0x01, 0xF0, 0xB6, 0x40, 0x3C, 0x8A, 0x0A, 0xAD, +0x03, 0xD0, 0xB6, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x08, 0x6D, 0x36, 0x48, 0x14, 0x05, 0x03, 0x59, +0x14, 0xAD, 0x38, 0x08, 0x1C, 0x87, 0x16, 0xED, 0x38, 0x08, 0x17, 0xC7, 0xB6, 0x40, 0x39, 0x48, +0x36, 0xC7, 0x9A, 0x00, 0x12, 0x6C, 0x05, 0x30, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, +0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x02, 0x34, 0x04, 0x34, +0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x08, 0x34, 0x09, 0x74, 0x0A, 0x74, 0x0A, 0x74, 0x0B, 0xB4, +0x0B, 0xB4, 0x0C, 0x74, 0x0D, 0xB4, 0x0D, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, 0x0F, 0xF4, +0x0F, 0xF4, 0x00, 0xF4, 0x06, 0x74, 0x0C, 0x74, 0x12, 0x74, 0x18, 0x74, 0x1E, 0xF4, 0x24, 0x74, +0x2A, 0xB4, 0x30, 0x74, 0x36, 0xF4, 0x01, 0x34, 0x01, 0x34, 0x01, 0x34, 0x02, 0x34, 0x03, 0x74, +0x04, 0x34, 0x05, 0x74, 0x05, 0x74, 0x06, 0x74, 0x06, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x09, 0x74, +0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x83, 0x93, +0x51, 0x70, 0x84, 0x80, 0x60, 0x30, 0x8A, 0x51, 0xA5, 0xE5, 0x8A, 0x51, 0x83, 0x96, 0xA4, 0x01, +0x83, 0x52, 0x38, 0x70, 0xBF, 0xC0, 0x3A, 0xB0, 0xC0, 0x80, 0x3C, 0xB0, 0xC1, 0xC0, 0x78, 0xB0, +0xC2, 0xC0, 0x7A, 0xF0, 0xC3, 0x00, 0x7C, 0xF0, 0xC4, 0xC0, 0x7D, 0x30, 0xC5, 0x00, 0x7F, 0x70, +0xC6, 0x00, 0xB9, 0xF0, 0xC7, 0x40, 0xBA, 0xF0, 0xC8, 0xC0, 0xBB, 0x30, 0xC9, 0x00, 0xFA, 0x30, +0xCA, 0x00, 0xFB, 0x70, 0xCB, 0x40, 0xFC, 0x30, 0xCC, 0x00, 0xFD, 0x70, 0xCD, 0x40, 0xFF, 0xB0, +0xCE, 0x40, 0x00, 0xB0, 0xCF, 0x80, 0x01, 0xF0, 0xD0, 0xC0, 0x83, 0x01, 0x8A, 0x51, 0xA4, 0xEB, +0x50, 0xC8, 0xB1, 0x00, 0x4F, 0x88, 0xB0, 0xC0, 0x31, 0x08, 0x30, 0x06, 0x03, 0x59, 0x95, 0x2D, +0x14, 0xC8, 0xB0, 0xC0, 0x14, 0xC8, 0xB1, 0x00, 0x8C, 0xED, 0x31, 0x08, 0x08, 0x40, 0xB1, 0x00, +0xB0, 0x01, 0x60, 0xC8, 0x31, 0x58, 0xB0, 0x87, 0x03, 0xD0, 0xE0, 0x8D, 0x03, 0xD0, 0xB1, 0x8C, +0xB1, 0x48, 0x03, 0x9D, 0x99, 0x2D, 0x30, 0xC8, 0x08, 0x40, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, +0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0xA6, 0x2D, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c index 96ab391..5dbdf45 100644 --- a/libloragw/src/loragw_hal.c +++ b/libloragw/src/loragw_hal.c @@ -1252,7 +1252,7 @@ int lgw_start(void) { wait_ms(1); lgw_reg_r(LGW_MCU_AGC_STATUS, &read_val); - if (read_val != 0x20) { + if (read_val != 0x10) { DEBUG_PRINTF("ERROR: AGC FIRMWARE INITIALIZATION FAILURE, STATUS 0x%02X\n", (uint8_t)read_val); return LGW_HAL_ERROR; } @@ -1287,6 +1287,12 @@ int lgw_start(void) { } #endif + /* Load Tx freq MSBs (always 3 if f > 768 for SX1257 or f > 384 for SX1255 */ + lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT); + wait_ms(1); + lgw_reg_w(LGW_RADIO_SELECT, 3); + wait_ms(1); + /* Load chan_select firmware option */ lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT); wait_ms(1); @@ -1552,6 +1558,7 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) { int payload_offset = 0; /* start of the payload content in the databuffer */ uint8_t pow_index = 0; /* 4-bit value to set the firmware TX power */ uint8_t target_mix_gain = 0; /* used to select the proper I/Q offset correction */ + uint32_t count_trig; /* timestamp value in trigger mode corrected for TX start delay */ /* check if the concentrator is running */ if (lgw_is_started == false) { @@ -1657,10 +1664,15 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) { buff[2] = 0xFF & part_frac; /* Least Significant Byte */ /* metadata 3 to 6, timestamp trigger value */ - buff[3] = 0xFF & (pkt_data.count_us >> 24); - buff[4] = 0xFF & (pkt_data.count_us >> 16); - buff[5] = 0xFF & (pkt_data.count_us >> 8); - buff[6] = 0xFF & pkt_data.count_us; + /* TX state machine must be triggered at T0 - TX_START_DELAY for packet to start being emitted at T0 */ + if (pkt_data.tx_mode == TIMESTAMPED) + { + count_trig = pkt_data.count_us - TX_START_DELAY; + buff[3] = 0xFF & (count_trig >> 24); + buff[4] = 0xFF & (count_trig >> 16); + buff[5] = 0xFF & (count_trig >> 8); + buff[6] = 0xFF & count_trig; + } /* parameters depending on modulation */ if (pkt_data.modulation == MOD_LORA) { @@ -1726,11 +1738,11 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) { buff[14] = 0; buff[15] = 0; - /* LSB of RF frequency is now used in AGC firmware to implement large/narrow filtering in SX1257/55 */ + /* MSB of RF frequency is now used in AGC firmware to implement large/narrow filtering in SX1257/55 */ if (pkt_data.bandwidth == BW_500KHZ) { - buff[2] |= 0x01; /* Enlarge filter for 500kHz BW */ + buff[0] |= 0x80; /* Enlarge filter for 500kHz BW */ } else { - buff[2] &= 0xFE; + buff[0] &= 0x7F; } } else if (pkt_data.modulation == MOD_FSK) { @@ -1769,8 +1781,8 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) { ++transfer_size; /* one more byte to transfer to the TX modem */ ++payload_offset; /* start the payload with one more byte of offset */ - /* LSB of RF frequency is now used in AGC firmware to implement large/narrow filtering in SX1257/55*/ - buff[2] &= 0xFE; /* Always use narrow band for FSK (force LSB to 0) */ + /* MSB of RF frequency is now used in AGC firmware to implement large/narrow filtering in SX1257/55 */ + buff[0] &= 0x7F; /* Always use narrow band for FSK (force MSB to 0) */ } else { DEBUG_MSG("ERROR: INVALID TX MODULATION..\n"); @@ -56,6 +56,17 @@ gateways as receivers. 3. Changelog ------------- +### v1.7.0 ### + +* Added TX start delay compensation for timestamp mode (fix time window alignment issue at low SF and/or high BW) +* Added adaptive narrowband/wideband TX filtering for LoRa +* Added a command-line option to set CR in util_tx_test +* Added notes for TX start delay in immediate and triggered mode + +/!\ warning: due to start delay compensation being implemented, TX that were +previously 1.5ms late will be sent on time. At low datarate, this is not an +issue. At high LoRa data rate (and FSK) you might have to adjust your timing. + ### v1.6.0 ### * Fixed bug with 250kHz and 500 kHz TX filtering diff --git a/util_tx_test/readme.md b/util_tx_test/readme.md index 5450f18..9fb7b22 100644 --- a/util_tx_test/readme.md +++ b/util_tx_test/readme.md @@ -41,30 +41,38 @@ Press Ctrl+C to stop the application before that. Use the -f option followed by a real number (decimal point and scientific 'E notation' are OK) to specify the modulation central frequency. +Use the -b option to set LoRa modulation bandwidth in kHz (accepted values: 125, +250 or 500). + Use the -s option to specify the Spreading Factor of LoRa modulation (values 7 to 12 are valid). -Use the -b option to set LoRa modulation bandwidth in kHz (accepted values: 125, -250 or 500). +Use the -c option to specify the Coding Rate of LoRa modulation ( 1 = 4/5, 2 = +4/6, 3 = 4/7, 4 = 4/8 ). Use the -p option to set the concentrator TX power in dBm. Not all values are supported by hardware (typically 14 et 20 dBm are supported, other values might not give expected power). Check with a RF power meter before connecting any sensitive equipment. +Use the -r option to set LoRa preamble size. A minimum preamble length of 6 +symbols is enforced. + +Use the -z option to set the payload size in bytes. + Use the -t option to specify the number of milliseconds of pause between packets. Using zero will result in a quasi-continuous emission. -Use the -x option to specify how many packets should be sent. +Use the -x option to specify how many packets should be sent. The value -1 cause +the program to send packet indefinitely, until stopped (using Ctrl-C). Use the -i option to invert the LoRa modulation polarity. -The packets are 20 bytes long, and protected by the smallest supported ECC. - The payload content is: [T][E][S][T][packet counter MSB][packet counter LSB] followed by ASCII padding. -All LoRa data is whitened, so the padding has no influence whatsoever on the -packet error rate. + +All LoRa data is scrambled and whitened, so the padding has no influence +whatsoever on the packet error rate. 4. License ----------- diff --git a/util_tx_test/src/util_tx_test.c b/util_tx_test/src/util_tx_test.c index bb7672b..e684d07 100644 --- a/util_tx_test/src/util_tx_test.c +++ b/util_tx_test/src/util_tx_test.c @@ -79,17 +79,18 @@ static void sig_handler(int sigio) { /* describe command line options */ void usage(void) { printf("*** Library version information ***\n%s\n\n", lgw_version_info()); - printf( "Available options:\n"); - printf( " -h print this help\n"); - printf( " -f <float> target frequency in MHz\n"); - printf( " -s <uint> Spreading Factor\n"); - printf( " -b <uint> Modulation bandwidth in kHz\n"); - printf( " -p <int> RF power (dBm)\n"); - printf( " -r <uint> LoRa preamble length (symbols)\n"); - printf( " -z <uint> payload size (bytes)\n"); - printf( " -t <uint> pause between packets (ms)\n"); - printf( " -x <int> numbers of times the sequence is repeated (-1 for continuous)\n"); - printf( " -i send packet using inverted modulation polarity \n"); + printf("Available options:\n"); + printf(" -h print this help\n"); + printf(" -f <float> target frequency in MHz\n"); + printf(" -b <uint> LoRa bandwidth in kHz [125, 250, 500]\n"); + printf(" -s <uint> LoRa Spreading Factor [7-12]\n"); + printf(" -c <uint> LoRa Coding Rate [1-4]\n"); + printf(" -p <int> RF power (dBm)\n"); + printf(" -r <uint> LoRa preamble length (symbols)\n"); + printf(" -z <uint> payload size (bytes, <256)\n"); + printf(" -t <uint> pause between packets (ms)\n"); + printf(" -x <int> nb of times the sequence is repeated (-1 loop until stopped)\n"); + printf(" -i send packet using inverted modulation polarity\n"); } /* -------------------------------------------------------------------------- */ @@ -109,6 +110,7 @@ int main(int argc, char **argv) /* application parameters */ uint32_t f_target = lowfreq[RF_CHAIN]/2 + upfreq[RF_CHAIN]/2; /* target frequency */ int sf = 10; /* SF10 by default */ + int cr = 1; /* CR1 aka 4/5 by default */ int bw = 125; /* 125kHz bandwidth by default */ int pow = 14; /* 14 dBm by default */ int preamb = 8; /* 8 symbol preamble by default */ @@ -127,7 +129,7 @@ int main(int argc, char **argv) uint16_t cycle_count = 0; /* parse command line options */ - while ((i = getopt (argc, argv, "hf:s:b:p:r:z:t:x:i")) != -1) { + while ((i = getopt (argc, argv, "hf:b:s:c:p:r:z:t:x:i")) != -1) { switch (i) { case 'h': usage(); @@ -145,6 +147,17 @@ int main(int argc, char **argv) } break; + case 'b': /* -b <int> Modulation bandwidth in kHz */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || ((xi != 125)&&(xi != 250)&&(xi != 500))) { + MSG("ERROR: invalid LoRa bandwidth\n"); + usage(); + return EXIT_FAILURE; + } else { + bw = xi; + } + break; + case 's': /* -s <int> Spreading Factor */ i = sscanf(optarg, "%i", &xi); if ((i != 1) || (xi < 7) || (xi > 12)) { @@ -156,14 +169,14 @@ int main(int argc, char **argv) } break; - case 'b': /* -b <int> Modulation bandwidth in kHz */ + case 'c': /* -c <int> Coding Rate */ i = sscanf(optarg, "%i", &xi); - if ((i != 1) || ((xi != 125)&&(xi != 250)&&(xi != 500))) { - MSG("ERROR: invalid LoRa bandwidth\n"); + if ((i != 1) || (xi < 1) || (xi > 4)) { + MSG("ERROR: invalid coding rate\n"); usage(); return EXIT_FAILURE; } else { - bw = xi; + cr = xi; } break; @@ -240,7 +253,7 @@ int main(int argc, char **argv) MSG("ERROR: frequency out of authorized band (accounting for modulation bandwidth)\n"); return EXIT_FAILURE; } - printf("Sending %i packets on %u Hz (BW %i kHz, SF %i, %i bytes payload, %i symbols preamble) at %i dBm, with %i ms between each\n", repeat, f_target, bw, sf, pl_size, preamb, pow, delay); + printf("Sending %i packets on %u Hz (BW %i kHz, SF %i, CR %i, %i bytes payload, %i symbols preamble) at %i dBm, with %i ms between each\n", repeat, f_target, bw, sf, cr, pl_size, preamb, pow, delay); /* configure signal handling */ sigemptyset(&sigact.sa_mask); @@ -286,11 +299,19 @@ int main(int argc, char **argv) MSG("ERROR: invalid 'sf' variable\n"); return EXIT_FAILURE; } - txpkt.coderate = CR_LORA_4_5; + switch (cr) { + case 1: txpkt.coderate = CR_LORA_4_5; break; + case 2: txpkt.coderate = CR_LORA_4_6; break; + case 3: txpkt.coderate = CR_LORA_4_7; break; + case 4: txpkt.coderate = CR_LORA_4_8; break; + default: + MSG("ERROR: invalid 'cr' variable\n"); + return EXIT_FAILURE; + } txpkt.invert_pol = invert; txpkt.preamble = preamb; txpkt.size = pl_size; - strcpy((char *)txpkt.payload, "TEST**abcdefghijklmnopqrstuvwxyz0123456789" ); /* abc.. is for padding */ + strcpy((char *)txpkt.payload, "TEST**abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#" ); /* abc.. is for padding */ /* main loop */ cycle_count = 0; |