summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Miermont <smiermont@semtech.com>2014-05-15 13:09:47 +0200
committerSylvain Miermont <smiermont@semtech.com>2014-05-15 13:09:47 +0200
commit3f22bb77f120f27fad71b6c47d4eb17936fc42a7 (patch)
treee73789fb025ac2d9e14663781271ef8034906c02
parentf991b0e35ad1bd3b999c70e68c518bae91bd36a6 (diff)
downloadlora_gateway-3f22bb77f120f27fad71b6c47d4eb17936fc42a7.tar.gz
lora_gateway-3f22bb77f120f27fad71b6c47d4eb17936fc42a7.tar.bz2
lora_gateway-3f22bb77f120f27fad71b6c47d4eb17936fc42a7.zip
v1.4.0v1.4.0
- Added calibration routine to optimize RF performance - Added support for SX1301 433 MHz reference board - Improved AGC firmware - Improved RSSI accuracy - Improved utilities Makefile
-rw-r--r--VERSION2
-rw-r--r--libloragw/Makefile11
-rw-r--r--libloragw/inc/loragw_hal.h5
-rw-r--r--libloragw/library.cfg5
-rw-r--r--libloragw/src/agc_fw.var218
-rw-r--r--libloragw/src/cal_fw.var529
-rw-r--r--libloragw/src/loragw_hal.c252
-rw-r--r--libloragw/tst/test_loragw_hal.c18
-rw-r--r--readme.md8
-rw-r--r--util_band_survey/Makefile11
-rw-r--r--util_pkt_logger/Makefile11
-rw-r--r--util_spi_stress/Makefile11
-rw-r--r--util_tx_test/Makefile11
13 files changed, 908 insertions, 184 deletions
diff --git a/VERSION b/VERSION
index 589268e..e21e727 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.0 \ No newline at end of file
+1.4.0 \ No newline at end of file
diff --git a/libloragw/Makefile b/libloragw/Makefile
index 9d5660b..6db5764 100644
--- a/libloragw/Makefile
+++ b/libloragw/Makefile
@@ -83,9 +83,12 @@ endif
ifeq ($(CFG_BRD),dev_nano_868)
CFG_BRD_MSG := FPGA-based nano-concentrator, with 868 MHz SAW filter
CFG_BRD_OPT := CFG_BRD_NANO868
-else ifeq ($(CFG_BRD),ref_1301_57nf)
- CFG_BRD_MSG := SX1301 reference board with SX1257 radios, no filters
- CFG_BRD_OPT := CFG_BRD_REF1301
+else ifeq ($(CFG_BRD),ref_1301_868)
+ CFG_BRD_MSG := SX1301 reference board with SX1257 radios, 868 MHz filters
+ CFG_BRD_OPT := CFG_BRD_1301REF868
+else ifeq ($(CFG_BRD),ref_1301_433)
+ CFG_BRD_MSG := SX1301 reference board with SX1255 radios, 433 MHz filters
+ CFG_BRD_OPT := CFG_BRD_1301REF433
else
$(info [Info] No specific board selected.)
CFG_BRD_MSG := None
@@ -162,7 +165,7 @@ endif
obj/loragw_reg.o: src/loragw_reg.c inc/loragw_reg.h inc/loragw_spi.h inc/config.h
$(CC) -c $(CFLAGS) $< -o $@
-obj/loragw_hal.o: src/loragw_hal.c inc/loragw_hal.h inc/loragw_reg.h inc/loragw_aux.h src/arb_fw.var src/agc_fw.var inc/config.h
+obj/loragw_hal.o: src/loragw_hal.c inc/loragw_hal.h inc/loragw_reg.h inc/loragw_aux.h src/arb_fw.var src/agc_fw.var src/cal_fw.var inc/config.h
$(CC) -c $(CFLAGS) $< -o $@
obj/loragw_gps.o: src/loragw_gps.c inc/loragw_gps.h inc/config.h
diff --git a/libloragw/inc/loragw_hal.h b/libloragw/inc/loragw_hal.h
index 27ca1a2..f76e20e 100644
--- a/libloragw/inc/loragw_hal.h
+++ b/libloragw/inc/loragw_hal.h
@@ -136,9 +136,12 @@ Maintainer: Sylvain Miermont
#if (CFG_BRD_NANO868 == 1)
#define LGW_RF_TX_ENABLE { true, true} /* both radio A and B are usable in TX */
#define LGW_RF_CLKOUT { true, true} /* both radios have clkout enabled */
-#elif (CFG_BRD_REF1301 == 1)
+#elif ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1))
#define LGW_RF_TX_ENABLE { true,false} /* radio B TX output is disconnected */
#define LGW_RF_CLKOUT {false, true} /* radio A clkout disabled for spur optimization */
+/* === ADD CUSTOMIZATION FOR YOUR OWN BOARD HERE ===
+#elif (CFG_BRD_MYBOARD == 1)
+*/
#elif (CFG_BRD_NONE == 1)
#define LGW_RF_TX_ENABLE { true, true} /* both radio A and B are usable in TX */
#define LGW_RF_CLKOUT { true, true} /* both radios have clkout enabled */
diff --git a/libloragw/library.cfg b/libloragw/library.cfg
index 5751cb5..afcf80d 100644
--- a/libloragw/library.cfg
+++ b/libloragw/library.cfg
@@ -38,10 +38,11 @@ CFG_BAND= eu868
# and RF front-ends, and must be calibrated for each new board design.
# Available calibration parameters:
# dev_nano_868 FPGA-based nano-concentrator, with 868 MHz SAW filter
-# ref_1301_57nf SX1301 reference board with SX1257 radios, no filters
+# ref_1301_868 SX1301 reference board with SX1257 radios, 868 MHz filters
+# ref_1301_433 SX1301 reference board with SX1255 radios, 433 MHz filters
# Keep empty for no calibration parameters (neutral values will be used).
-CFG_BRD= ref_1301_57nf
+CFG_BRD= ref_1301_868
### Debug options ###
# Set the DEBUG_* to 1 to activate debug mode in individual modules.
diff --git a/libloragw/src/agc_fw.var b/libloragw/src/agc_fw.var
index b285954..45955f7 100644
--- a/libloragw/src/agc_fw.var
+++ b/libloragw/src/agc_fw.var
@@ -14,11 +14,14 @@ Maintainer: Matthieu Leurent
*/
static uint8_t agc_firmware[MCU_AGC_FW_BYTE] = {
-0x8A, 0x51, 0x57, 0x6D, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4,
-0x0F, 0xF4, 0x0C, 0x74, 0x09, 0x74, 0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74,
-0x0F, 0xF4, 0x0C, 0x74, 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, 0xFF, 0xBF, 0xFF, 0xBF,
+0x8A, 0x51, 0x03, 0xAD, 0x00, 0xB0, 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, 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,
@@ -166,110 +169,107 @@ static uint8_t agc_firmware[MCU_AGC_FW_BYTE] = {
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, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF,
-0xFF, 0xBF, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6,
-0x42, 0xAD, 0xC3, 0x00, 0xC2, 0x01, 0x4E, 0x48, 0x43, 0x58, 0xC2, 0x87, 0x03, 0xD0, 0xCE, 0x0D,
-0x03, 0xD0, 0xC3, 0x8C, 0xC3, 0x48, 0x03, 0x9D, 0x4B, 0x2D, 0x42, 0xC8, 0x08, 0x40, 0x83, 0x93,
-0x34, 0x70, 0x84, 0x80, 0x42, 0x30, 0x8A, 0x51, 0x41, 0x65, 0x38, 0x70, 0xA2, 0xC0, 0x3A, 0xB0,
-0xA3, 0x00, 0x3C, 0xB0, 0xA4, 0xC0, 0x78, 0xB0, 0xA5, 0x00, 0x7A, 0xF0, 0xA6, 0x00, 0x7C, 0xF0,
-0xA7, 0x40, 0x7D, 0x30, 0xA8, 0xC0, 0x7F, 0x70, 0xA9, 0x00, 0xB9, 0xF0, 0xAA, 0x00, 0xBA, 0xF0,
-0xAB, 0x40, 0xBB, 0x30, 0xAC, 0x00, 0xFA, 0x30, 0xAD, 0x40, 0xFB, 0x70, 0xAE, 0x40, 0xFC, 0x30,
-0xAF, 0x80, 0xFD, 0x70, 0xB0, 0xC0, 0xFF, 0xB0, 0xB1, 0x00, 0x00, 0xB0, 0xB2, 0x00, 0x01, 0xF0,
-0xB3, 0x40, 0x83, 0x01, 0x8A, 0x51, 0x84, 0xAD, 0x8A, 0x51, 0x63, 0xE6, 0x8A, 0x51, 0x93, 0x5F,
-0x94, 0xED, 0x80, 0xF0, 0x9B, 0x40, 0x08, 0xF0, 0x9E, 0x40, 0x8A, 0x51, 0x21, 0xA7, 0x8A, 0x51,
-0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0xBE, 0xC1, 0x08, 0xF0, 0x3E, 0x82, 0x03, 0x18,
-0xCC, 0x2D, 0x3E, 0x88, 0x95, 0x00, 0x85, 0x70, 0x0D, 0x02, 0x03, 0x5C, 0xAC, 0x2D, 0x3E, 0x88,
-0x34, 0x3E, 0x84, 0x80, 0x0E, 0x70, 0x83, 0x93, 0x00, 0x42, 0x03, 0x18, 0xAC, 0x2D, 0x3E, 0x88,
-0x34, 0x3E, 0x84, 0x80, 0x00, 0x8A, 0xBD, 0xAD, 0x34, 0x70, 0x0D, 0x02, 0x03, 0x18, 0xCA, 0x2D,
-0x3E, 0x88, 0x34, 0x3E, 0x84, 0x80, 0x05, 0x30, 0x83, 0x93, 0x00, 0x42, 0x03, 0x5C, 0xCA, 0x2D,
-0x3E, 0x88, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xCA, 0x00, 0x3E, 0x88, 0x34, 0x3E,
-0x84, 0x80, 0x4A, 0x08, 0x80, 0x40, 0x3E, 0x88, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00,
-0x98, 0x54, 0x98, 0x10, 0xBE, 0x0A, 0x95, 0x2D, 0xBF, 0x01, 0x02, 0xF0, 0x3F, 0xC2, 0x03, 0x18,
-0x40, 0x6E, 0x3F, 0x5C, 0xD7, 0xAD, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0xDA, 0x6D, 0x83, 0x52,
-0x03, 0x53, 0x18, 0xD0, 0x3F, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D,
-0xE3, 0x6D, 0x64, 0x70, 0xE4, 0x2D, 0x73, 0xF0, 0xCB, 0x40, 0x0E, 0x08, 0x4B, 0x42, 0x03, 0x18,
-0xF5, 0xAD, 0x3F, 0xC8, 0x40, 0xBE, 0x84, 0x80, 0x0B, 0x70, 0x00, 0x42, 0x03, 0x18, 0xF5, 0xAD,
-0x3F, 0xC8, 0x40, 0xBE, 0x84, 0x80, 0x00, 0x8A, 0x05, 0xAE, 0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18,
-0x13, 0xEE, 0x3F, 0xC8, 0x40, 0xBE, 0x84, 0x80, 0x08, 0xF0, 0x00, 0x42, 0x03, 0x5C, 0x13, 0xEE,
-0x3F, 0xC8, 0x40, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xCA, 0x00, 0x3F, 0xC8, 0x40, 0xBE,
-0x84, 0x80, 0x4A, 0x08, 0x80, 0x40, 0x3F, 0xC8, 0x40, 0xBE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39,
-0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C, 0x23, 0xEE, 0x3F, 0xC8,
-0x3C, 0x7E, 0x84, 0x80, 0x09, 0x30, 0x00, 0x42, 0x03, 0x18, 0x23, 0xEE, 0x3F, 0xC8, 0x3C, 0x7E,
-0x84, 0x80, 0x00, 0x8A, 0x32, 0xEE, 0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0x3E, 0x6E, 0x3F, 0xC8,
-0x3C, 0x7E, 0x84, 0x80, 0x80, 0x88, 0x03, 0x59, 0x3E, 0x6E, 0x3F, 0xC8, 0x3C, 0x7E, 0x84, 0x80,
-0x00, 0x48, 0xFF, 0x7E, 0xCA, 0x00, 0x3F, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x4A, 0x08, 0x80, 0x40,
-0x3F, 0xC8, 0x8A, 0x51, 0x00, 0x27, 0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0xBF, 0x4A, 0xCD, 0x6D,
-0x3C, 0x48, 0x0B, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xCC, 0x00, 0x06, 0x30,
-0xCE, 0x40, 0x40, 0x88, 0xF9, 0xFE, 0x8A, 0x51, 0x49, 0xA5, 0x8A, 0x51, 0xCD, 0x40, 0x4C, 0x87,
-0x97, 0x40, 0x3D, 0x88, 0x0B, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xCC, 0x00,
-0x06, 0x30, 0xCE, 0x40, 0x41, 0xC8, 0xF9, 0xFE, 0x8A, 0x51, 0x49, 0xA5, 0x8A, 0x51, 0xCD, 0x40,
-0x4C, 0x87, 0x9C, 0x00, 0x87, 0x2D, 0x02, 0xF0, 0xC9, 0x00, 0x01, 0xF0, 0xA0, 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, 0xBF, 0x01, 0x3F, 0xC2,
-0x03, 0x18, 0x9B, 0x6E, 0x3F, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x3F, 0xC8,
-0x40, 0xBE, 0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x3F, 0xC8, 0x00, 0x27, 0x8A, 0x51, 0x3F, 0xC8,
-0x40, 0xBE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x3F, 0x5C, 0x93, 0x2E, 0x83, 0x52,
-0x03, 0x53, 0x18, 0x14, 0x96, 0x2E, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11,
-0x02, 0xF0, 0xBF, 0x4A, 0x77, 0xAE, 0xBE, 0xC1, 0x08, 0xF0, 0x3E, 0x82, 0x03, 0x18, 0xB1, 0x2E,
-0x3E, 0x88, 0x34, 0x3E, 0x84, 0x80, 0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, 0x3E, 0x88, 0x34, 0x3E,
-0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x3E, 0x88, 0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xBE, 0x0A,
-0x9C, 0x2E, 0xC8, 0x01, 0x10, 0xF0, 0x48, 0xC2, 0x03, 0x18, 0xE0, 0xEE, 0xBA, 0x6E, 0xF1, 0x26,
-0x8A, 0x51, 0xC9, 0x00, 0x49, 0x8B, 0xB7, 0xAE, 0x48, 0xC8, 0x20, 0x38, 0x9B, 0x40, 0x02, 0xF0,
-0x9E, 0x40, 0x49, 0x8B, 0xC7, 0x6E, 0xF1, 0x26, 0x8A, 0x51, 0xC9, 0x00, 0xC1, 0xEE, 0x49, 0x08,
-0x02, 0x7A, 0x03, 0x9D, 0xD0, 0xEE, 0x30, 0x30, 0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0xE0, 0xEE,
-0x48, 0xC8, 0x22, 0xFE, 0x84, 0x80, 0x49, 0x08, 0x83, 0x93, 0x80, 0x40, 0x48, 0xC8, 0x30, 0x78,
-0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0xC8, 0x4A, 0xB2, 0x2E, 0xF1, 0x26, 0x8A, 0x51, 0xC9, 0x00,
-0x49, 0x8B, 0xDD, 0xAE, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40, 0x49, 0x8B, 0xEC, 0x6E,
-0xF1, 0x26, 0x8A, 0x51, 0xC9, 0x00, 0xE6, 0x6E, 0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40,
-0x08, 0x40, 0x33, 0x48, 0xC3, 0x00, 0x32, 0x08, 0xC2, 0xC0, 0x43, 0x08, 0x42, 0x06, 0x03, 0x59,
-0xFE, 0xEE, 0x14, 0xC8, 0xC2, 0xC0, 0x14, 0xC8, 0xC3, 0x00, 0xF5, 0xAE, 0x43, 0x08, 0x08, 0x40,
-0xC6, 0x00, 0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xC7, 0x40, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51,
-0x02, 0xA0, 0x8A, 0x51, 0xC4, 0xC0, 0x47, 0x48, 0x15, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0,
-0x8A, 0x51, 0xC5, 0x00, 0xC3, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xC3, 0xCD, 0xFF, 0x7E, 0x03, 0xD0,
-0x03, 0x9D, 0x15, 0x2F, 0x44, 0x4D, 0x43, 0x04, 0xCE, 0x40, 0x46, 0x08, 0xCF, 0x80, 0x0C, 0x30,
-0xF0, 0x6F, 0x18, 0x12, 0x13, 0x1F, 0x28, 0xEF, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x2B, 0x6F,
-0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x13, 0x08, 0xC5, 0x00, 0x0F, 0xB0, 0xC5, 0x85, 0x45, 0x08,
-0x22, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xC6, 0x00, 0x3F, 0x30,
-0xC6, 0x85, 0x46, 0x08, 0xCE, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x08, 0xF0,
-0xF0, 0x27, 0x8A, 0x51, 0x21, 0xDF, 0x48, 0xEF, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0x4B, 0x6F,
-0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0x51, 0x2F, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6,
-0x54, 0x2F, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x12, 0xC8, 0xCE, 0x40, 0x00, 0xB0, 0x13, 0xDB,
-0x01, 0xF0, 0xCF, 0x80, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x11, 0xC8, 0xCE, 0x40, 0x00, 0xB0,
-0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x10, 0x88, 0xCE, 0x40,
-0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x00, 0xB0,
-0xCE, 0x81, 0xCE, 0xCA, 0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51,
-0x35, 0xB0, 0xC3, 0x00, 0xC3, 0xCB, 0x7A, 0xAF, 0x05, 0x30, 0x83, 0x52, 0x03, 0x53, 0xCE, 0x40,
-0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51, 0x03, 0x30,
-0xC4, 0xC0, 0x7D, 0x30, 0xC3, 0x00, 0xC3, 0xCB, 0x8B, 0x6F, 0xC4, 0x8B, 0x8B, 0x6F, 0x83, 0x52,
-0x03, 0x53, 0x13, 0x1F, 0x95, 0x6F, 0x19, 0x51, 0x96, 0x6F, 0x19, 0x10, 0x05, 0x30, 0xC3, 0x00,
-0xC3, 0xCB, 0x98, 0x2F, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0xA0, 0xEF, 0x99, 0xD5, 0xA1, 0x2F,
-0x99, 0x94, 0x15, 0x70, 0xC4, 0xC0, 0xC6, 0xB0, 0xC3, 0x00, 0xC3, 0xCB, 0xA5, 0x6F, 0xC4, 0x8B,
-0xA5, 0x6F, 0x00, 0x00, 0x0D, 0x70, 0x83, 0x52, 0x03, 0x53, 0xCE, 0x40, 0x00, 0xB0, 0x13, 0xDB,
-0x01, 0xF0, 0xCF, 0x80, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51, 0x10, 0xF0, 0x9E, 0x40, 0x93, 0x1B,
-0xB7, 0xEF, 0x08, 0xF0, 0x9E, 0x40, 0x99, 0x92, 0x19, 0x52, 0x00, 0xB0, 0xCE, 0x81, 0xCE, 0xCA,
-0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51, 0x13, 0x1F, 0xCA, 0x6F,
-0x99, 0x91, 0xCB, 0xAF, 0x99, 0x50, 0xE4, 0xB0, 0xC3, 0x00, 0xCE, 0xAF, 0xCF, 0xEF, 0xC3, 0xCB,
-0xCD, 0xAF, 0xD2, 0x6F, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0xD9, 0xAF, 0x19, 0x95,
-0xDA, 0xAF, 0x19, 0x54, 0x03, 0x30, 0xCE, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xCF, 0x80,
-0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51, 0x05, 0x30, 0xC4, 0xC0, 0x26, 0x70, 0xC3, 0x00, 0xC3, 0xCB,
-0xE7, 0xEF, 0xC4, 0x8B, 0xE7, 0xEF, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0x08, 0x40,
-0xC2, 0xC0, 0x4F, 0x88, 0x03, 0x59, 0xFA, 0xEF, 0x4E, 0x48, 0x88, 0x80, 0x42, 0xC8, 0x80, 0x38,
-0x86, 0xC0, 0x08, 0x40, 0x4E, 0x48, 0x88, 0x80, 0x42, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40,
+0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0x64, 0xC0, 0x80, 0x81,
+0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0xDF, 0xAC, 0xB8, 0x00, 0xB7, 0xC1,
+0x36, 0x48, 0x38, 0x58, 0xB7, 0x47, 0x03, 0xD0, 0xB6, 0x0D, 0x03, 0xD0, 0xB8, 0x8C, 0xB8, 0x48,
+0x03, 0x9D, 0xE8, 0xEC, 0x37, 0x88, 0x08, 0x40, 0x35, 0x48, 0xB7, 0x80, 0x34, 0x08, 0xB6, 0x40,
+0x37, 0x88, 0x36, 0x86, 0x03, 0x59, 0x01, 0x6D, 0x14, 0xC8, 0xB6, 0x40, 0x14, 0xC8, 0xB7, 0x80,
+0xF8, 0x2C, 0x37, 0x88, 0x08, 0x40, 0x83, 0x93, 0x47, 0xB0, 0x84, 0x80, 0x55, 0xB0, 0x8A, 0x51,
+0xDE, 0x24, 0x38, 0x70, 0xA4, 0xC0, 0x3A, 0xB0, 0xA5, 0x00, 0x3C, 0xB0, 0xA6, 0x00, 0x78, 0xB0,
+0xA7, 0x40, 0x7A, 0xF0, 0xA8, 0xC0, 0x7C, 0xF0, 0xA9, 0x00, 0x7D, 0x30, 0xAA, 0x00, 0x7F, 0x70,
+0xAB, 0x40, 0xB9, 0xF0, 0xAC, 0x00, 0xBA, 0xF0, 0xAD, 0x40, 0xBB, 0x30, 0xAE, 0x40, 0xFA, 0x30,
+0xAF, 0x80, 0xFB, 0x70, 0xB0, 0xC0, 0xFC, 0x30, 0xB1, 0x00, 0xFD, 0x70, 0xB2, 0x00, 0xFF, 0xB0,
+0xB3, 0x40, 0x00, 0xB0, 0xB4, 0x00, 0x01, 0xF0, 0xB5, 0x40, 0x83, 0x01, 0x8A, 0x51, 0x89, 0xEE,
+0x02, 0xF0, 0xA0, 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, 0xCA, 0x41, 0x4A, 0x02, 0x03, 0x18, 0x66, 0x2D, 0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80,
+0x83, 0x93, 0x80, 0x81, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x4A, 0x08,
+0x7C, 0x25, 0x8A, 0x51, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00,
+0x4A, 0x9C, 0x5E, 0x6D, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x61, 0xED, 0x83, 0x52, 0x03, 0x53,
+0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0x02, 0xF0, 0xCA, 0x8A, 0x42, 0xAD, 0xC9, 0x41, 0x08, 0xF0,
+0x49, 0x02, 0x03, 0x18, 0x08, 0x40, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x04, 0xF0, 0x83, 0x93,
+0x80, 0x40, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x49, 0x08, 0x95, 0x00,
+0x98, 0x54, 0x98, 0x10, 0xC9, 0x8A, 0x67, 0x6D, 0xBD, 0x80, 0x47, 0x7E, 0x84, 0x80, 0x00, 0x48,
+0xBC, 0x40, 0x23, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xB9, 0x40, 0x05, 0x30,
+0x03, 0xD0, 0xB9, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x88, 0xAD, 0x3C, 0x48, 0x2D, 0x7E, 0x84, 0x80,
+0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xBA, 0x40, 0x3A, 0xC7, 0x39, 0x44, 0x01, 0x38, 0xBB, 0x80,
+0x3D, 0x88, 0x22, 0xFE, 0x84, 0x80, 0x3B, 0x88, 0x80, 0x40, 0x3D, 0x88, 0x22, 0xFE, 0x84, 0x80,
+0x00, 0x48, 0xB6, 0x40, 0x3D, 0x88, 0xB7, 0x80, 0x0C, 0x30, 0x79, 0x6E, 0x18, 0x12, 0x80, 0xF0,
+0x9B, 0x40, 0x08, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0xB1, 0x2D, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14,
+0xB4, 0x2D, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x13, 0x08, 0xBB, 0x80, 0x0F, 0xB0, 0xBB, 0x05,
+0x3B, 0x88, 0x24, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xBC, 0x40,
+0x3F, 0x30, 0xBC, 0xC5, 0x3C, 0x48, 0xB6, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80,
+0x08, 0xF0, 0x79, 0x26, 0x8A, 0x51, 0x21, 0xDF, 0xD1, 0x2D, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96,
+0xD4, 0x2D, 0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xDA, 0x6D, 0x83, 0x52, 0x03, 0x53,
+0x99, 0xD6, 0xDD, 0xAD, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x12, 0xC8, 0xB6, 0x40, 0x00, 0xB0,
+0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x04, 0xF0, 0x79, 0x26, 0x8A, 0x51, 0x11, 0xC8, 0xB6, 0x40,
+0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x05, 0x30, 0x79, 0x26, 0x8A, 0x51, 0x10, 0x88,
+0xB6, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x06, 0x30, 0x79, 0x26, 0x8A, 0x51,
+0x00, 0xB0, 0xB6, 0x81, 0xB6, 0xCA, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x00, 0xB0, 0x79, 0x26,
+0x8A, 0x51, 0x35, 0xB0, 0xB9, 0x40, 0xB9, 0x0B, 0x03, 0xAE, 0x05, 0x30, 0x83, 0x52, 0x03, 0x53,
+0xB6, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x00, 0xB0, 0x79, 0x26, 0x8A, 0x51,
+0x03, 0x30, 0xBA, 0x40, 0x7D, 0x30, 0xB9, 0x40, 0xB9, 0x0B, 0x14, 0xAE, 0xBA, 0x0B, 0x14, 0xAE,
+0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x1E, 0x2E, 0x19, 0x51, 0x1F, 0x6E, 0x19, 0x10, 0x05, 0x30,
+0xB9, 0x40, 0xB9, 0x0B, 0x21, 0xAE, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x29, 0xEE, 0x99, 0xD5,
+0x2A, 0xEE, 0x99, 0x94, 0x15, 0x70, 0xBA, 0x40, 0xC6, 0xB0, 0xB9, 0x40, 0xB9, 0x0B, 0x2E, 0x2E,
+0xBA, 0x0B, 0x2E, 0x2E, 0x00, 0x00, 0x0D, 0x70, 0x83, 0x52, 0x03, 0x53, 0xB6, 0x40, 0x00, 0xB0,
+0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x00, 0xB0, 0x79, 0x26, 0x8A, 0x51, 0x10, 0xF0, 0x9E, 0x40,
+0x93, 0x1B, 0x40, 0x6E, 0x08, 0xF0, 0x9E, 0x40, 0x99, 0x92, 0x19, 0x52, 0x00, 0xB0, 0xB6, 0x81,
+0xB6, 0xCA, 0x13, 0xDB, 0x01, 0xF0, 0xB7, 0x80, 0x00, 0xB0, 0x79, 0x26, 0x8A, 0x51, 0x13, 0x1F,
+0x53, 0x2E, 0x99, 0x91, 0x54, 0xEE, 0x99, 0x50, 0xE4, 0xB0, 0xB9, 0x40, 0x57, 0x6E, 0x58, 0xEE,
+0xB9, 0x0B, 0x56, 0x2E, 0x5B, 0x6E, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x62, 0xEE,
+0x19, 0x95, 0x63, 0x2E, 0x19, 0x54, 0x03, 0x30, 0xB6, 0x40, 0x00, 0xB0, 0x13, 0xDB, 0x01, 0xF0,
+0xB7, 0x80, 0x00, 0xB0, 0x79, 0x26, 0x8A, 0x51, 0x05, 0x30, 0xBA, 0x40, 0x26, 0x70, 0xB9, 0x40,
+0xB9, 0x0B, 0x70, 0xEE, 0xBA, 0x0B, 0x70, 0xEE, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56,
+0x08, 0x40, 0xB8, 0x00, 0x37, 0x88, 0x03, 0x59, 0x83, 0xEE, 0x36, 0x48, 0x88, 0x80, 0x38, 0x08,
+0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x36, 0x48, 0x88, 0x80, 0x38, 0x08, 0x80, 0x38, 0x85, 0xC0,
+0x08, 0x40, 0x11, 0x30, 0xC6, 0x00, 0x8A, 0x51, 0x30, 0x65, 0x8A, 0x51, 0xC5, 0x41, 0x10, 0xF0,
+0x45, 0x02, 0x03, 0x18, 0xC4, 0xEE, 0x46, 0x08, 0x10, 0x7A, 0x03, 0x59, 0x9C, 0x2E, 0x8A, 0x51,
+0xF4, 0xE4, 0x8A, 0x51, 0xC6, 0x00, 0x93, 0x2E, 0x45, 0x08, 0x20, 0x38, 0x9B, 0x40, 0x02, 0xF0,
+0x9E, 0x40, 0x46, 0x08, 0x10, 0x7A, 0x03, 0x9D, 0xAA, 0x2E, 0x8A, 0x51, 0xF4, 0xE4, 0x8A, 0x51,
+0xC6, 0x00, 0xA1, 0xEE, 0x46, 0x08, 0x11, 0xBA, 0x03, 0x9D, 0xB3, 0x6E, 0x30, 0x30, 0x9B, 0x40,
+0x03, 0x30, 0x9E, 0x40, 0xC4, 0xEE, 0x45, 0x08, 0x24, 0xFE, 0x84, 0x80, 0x46, 0x08, 0x83, 0x93,
+0x80, 0x40, 0x45, 0x08, 0x30, 0x78, 0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0xC5, 0x8A, 0x8F, 0x6E,
+0x8A, 0x51, 0xF4, 0xE4, 0x8A, 0x51, 0xC6, 0x00, 0x46, 0x08, 0x10, 0x7A, 0x03, 0x9D, 0xC0, 0xAE,
+0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40, 0x46, 0x08, 0x10, 0x7A, 0x03, 0x9D, 0xD5, 0x6E,
+0x8A, 0x51, 0xF4, 0xE4, 0x8A, 0x51, 0xC6, 0x00, 0xCC, 0x2E, 0x46, 0x08, 0xC4, 0xC0, 0x30, 0x78,
+0x9B, 0x40, 0x03, 0x30, 0x9E, 0x40, 0x46, 0x08, 0x10, 0x7A, 0x03, 0x59, 0xE4, 0x2E, 0x8A, 0x51,
+0xF4, 0xE4, 0x8A, 0x51, 0xC6, 0x00, 0xDB, 0xAE, 0x20, 0xF0, 0x9B, 0x40, 0x02, 0xF0, 0x9E, 0x40,
+0x46, 0x08, 0x10, 0x7A, 0x03, 0x9D, 0xF1, 0x6E, 0x8A, 0x51, 0xF4, 0xE4, 0x8A, 0x51, 0xC6, 0x00,
+0xE8, 0x2E, 0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0x93, 0x5F, 0xFE, 0xEE, 0x8A, 0x51,
+0xA6, 0xE5, 0x8A, 0x51, 0x40, 0xF0, 0x9B, 0x40, 0x04, 0xF0, 0x9E, 0x40, 0xC9, 0x41, 0x08, 0xF0,
+0x49, 0x02, 0x03, 0x18, 0x36, 0x6F, 0x49, 0x08, 0x95, 0x00, 0x85, 0x70, 0x0D, 0x02, 0x03, 0x5C,
+0x16, 0x2F, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x0E, 0x70, 0x83, 0x93, 0x00, 0x42, 0x03, 0x18,
+0x16, 0x2F, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0x27, 0x6F, 0x34, 0x70, 0x0D, 0x02,
+0x03, 0x18, 0x34, 0x2F, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x05, 0x30, 0x83, 0x93, 0x00, 0x42,
+0x03, 0x5C, 0x34, 0x2F, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xBE, 0x80,
+0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80, 0x3E, 0x88, 0x80, 0x40, 0x49, 0x08, 0x4B, 0x7E, 0x84, 0x80,
+0x00, 0x48, 0x96, 0x00, 0x98, 0x54, 0x98, 0x10, 0xC9, 0x8A, 0xFF, 0x2E, 0xCA, 0x41, 0x02, 0xF0,
+0x4A, 0x02, 0x03, 0x18, 0xAA, 0x6F, 0x4A, 0x9C, 0x41, 0xEF, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14,
+0x44, 0xEF, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80, 0x83, 0x93,
+0x00, 0x48, 0x03, 0x9D, 0x4D, 0x6F, 0x64, 0x70, 0x4E, 0x6F, 0x73, 0xF0, 0xBF, 0xC0, 0x0E, 0x08,
+0x3F, 0xC2, 0x03, 0x18, 0x5F, 0xEF, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x0B, 0x70, 0x00, 0x42,
+0x03, 0x18, 0x5F, 0xEF, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0x6F, 0xEF, 0x2D, 0xB0,
+0x0E, 0x02, 0x03, 0x18, 0x7D, 0xEF, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x08, 0xF0, 0x00, 0x42,
+0x03, 0x5C, 0x7D, 0xEF, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xBE, 0x80,
+0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x3E, 0x88, 0x80, 0x40, 0x4A, 0x08, 0x53, 0x7E, 0x84, 0x80,
+0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C,
+0x8D, 0x6F, 0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80, 0x09, 0x30, 0x00, 0x42, 0x03, 0x18, 0x8D, 0x6F,
+0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0x9C, 0x6F, 0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18,
+0xA8, 0x2F, 0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80, 0x80, 0x88, 0x03, 0x59, 0xA8, 0x2F, 0x4A, 0x08,
+0x47, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xBE, 0x80, 0x4A, 0x08, 0x47, 0x7E, 0x84, 0x80,
+0x3E, 0x88, 0x80, 0x40, 0x4A, 0x08, 0x8A, 0x51, 0x7C, 0x25, 0x8A, 0x51, 0x98, 0x95, 0x98, 0x51,
+0xCA, 0x8A, 0x37, 0xAF, 0x47, 0x48, 0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51,
+0xC2, 0xC0, 0x06, 0x30, 0xB6, 0x40, 0x53, 0x48, 0xF9, 0xFE, 0x8A, 0x51, 0xE6, 0xE4, 0x8A, 0x51,
+0xC3, 0x00, 0x42, 0x47, 0x97, 0x40, 0x48, 0xC8, 0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0,
+0x8A, 0x51, 0xC2, 0xC0, 0x06, 0x30, 0xB6, 0x40, 0x54, 0x08, 0xF9, 0xFE, 0x8A, 0x51, 0xE6, 0xE4,
+0x8A, 0x51, 0xC3, 0x00, 0x42, 0x47, 0x9C, 0x00, 0x44, 0xC8, 0x95, 0x00, 0x0D, 0x08, 0xBE, 0x80,
+0x03, 0xD0, 0xBE, 0x0C, 0x03, 0xD0, 0xBE, 0x0C, 0x03, 0xD0, 0xBE, 0x0C, 0x3E, 0x88, 0x01, 0xBE,
+0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xC1, 0xC0, 0x06, 0x30, 0xB6, 0x40, 0x44, 0xC8,
+0x4B, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xFC, 0xFE, 0x8A, 0x51, 0xE6, 0xE4, 0x8A, 0x51,
+0xC0, 0x80, 0x01, 0xF0, 0xBE, 0x80, 0x44, 0x0A, 0xEF, 0x2F, 0x03, 0xD0, 0xBE, 0x4D, 0xFF, 0x7E,
+0x03, 0x9D, 0xED, 0xEF, 0x3E, 0x88, 0x14, 0x05, 0x03, 0x59, 0xF9, 0xEF, 0x40, 0x88, 0x1C, 0x87,
+0xFB, 0x2F, 0x40, 0x88, 0x17, 0xC7, 0xBE, 0x80, 0x41, 0xC8, 0x3E, 0x07, 0x9A, 0x00, 0xF5, 0xAE,
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/cal_fw.var b/libloragw/src/cal_fw.var
new file mode 100644
index 0000000..e1aa570
--- /dev/null
+++ b/libloragw/src/cal_fw.var
@@ -0,0 +1,529 @@
+/*
+ / _____) _ | |
+( (____ _____ ____ _| |_ _____ ____| |__
+ \____ \| ___ | (_ _) ___ |/ ___) _ \
+ _____) ) ____| | | || |_| ____( (___| | | |
+(______/|_____)_|_|_| \__)_____)\____)_| |_|
+ (C)2013 Semtech-Cycleo
+
+Description:
+ Calibration firmware
+
+License: Revised BSD License, see LICENSE.TXT file include in the project
+Maintainer: Matthieu Leurent
+*/
+
+static uint8_t cal_firmware[MCU_AGC_FW_BYTE] = {
+0x8A, 0x51, 0xB7, 0x28, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4,
+0x18, 0x74, 0x1C, 0xB4, 0x1E, 0xF4, 0x20, 0x34, 0x22, 0x74, 0x23, 0xB4, 0x24, 0x74, 0x25, 0xB4,
+0x26, 0xB4, 0x27, 0xF4, 0x28, 0x74, 0x28, 0x74, 0x29, 0xB4, 0x2A, 0xB4, 0x2A, 0xB4, 0x2B, 0xF4,
+0x2B, 0xF4, 0x2C, 0xB4, 0x2C, 0xB4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2E, 0xF4, 0x2E, 0xF4,
+0x2E, 0xF4, 0x2F, 0x34, 0x2F, 0x34, 0x2F, 0x34, 0x30, 0x74, 0x30, 0x74, 0x00, 0xF4, 0x00, 0xF4,
+0x06, 0x74, 0x0A, 0x74, 0x0C, 0x74, 0x0E, 0xB4, 0x10, 0x34, 0x11, 0x74, 0x12, 0x74, 0x13, 0xB4,
+0x14, 0x74, 0x15, 0xB4, 0x16, 0xB4, 0x16, 0xB4, 0x17, 0xF4, 0x18, 0x74, 0x02, 0x34, 0x02, 0x34,
+0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x40, 0x34, 0x20, 0x34, 0x10, 0x34,
+0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, 0x06, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x07, 0xB4,
+0x07, 0xB4, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, 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, 0x64, 0xC0,
+0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0x98, 0x68, 0xA1, 0xC0,
+0x10, 0xF0, 0x21, 0xC2, 0x21, 0xC8, 0x03, 0x18, 0xAA, 0xA8, 0x1F, 0xBE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x08, 0x40, 0xA0, 0x80, 0x03, 0xD0, 0xA0, 0x0C, 0x03, 0xD0, 0xA0, 0x0C, 0x03, 0xD0,
+0xA0, 0x0C, 0x20, 0x88, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x08, 0x40, 0xEE, 0xC1,
+0xEF, 0x01, 0x83, 0x93, 0x54, 0x70, 0x84, 0x80, 0x64, 0x70, 0x8A, 0x51, 0x97, 0xA0, 0x8A, 0x51,
+0xDA, 0xF0, 0x84, 0x80, 0xED, 0x30, 0x8A, 0x51, 0x97, 0xA0, 0x01, 0xF0, 0xE4, 0x00, 0x01, 0xF0,
+0xE5, 0x40, 0x07, 0x70, 0xE6, 0x40, 0x06, 0x30, 0xE7, 0x80, 0x0F, 0xB0, 0xE8, 0x00, 0x01, 0xF0,
+0xE9, 0x40, 0x05, 0x30, 0xEA, 0x40, 0x01, 0xF0, 0xEB, 0x80, 0x03, 0x30, 0xEC, 0x40, 0x08, 0xF0,
+0xED, 0x80, 0x83, 0x01, 0x8A, 0x51, 0x6A, 0xEC, 0xA2, 0x01, 0x22, 0xC8, 0xDE, 0xFE, 0x84, 0x80,
+0x22, 0xC8, 0xA0, 0x80, 0x01, 0xF0, 0x3E, 0xE1, 0x8A, 0x51, 0x83, 0x93, 0x80, 0x40, 0x22, 0xC8,
+0x54, 0x3E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x02, 0xF0, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40,
+0x22, 0xC8, 0xDC, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x03, 0x30, 0x3E, 0xE1, 0x8A, 0x51,
+0x80, 0x40, 0x22, 0xC8, 0xEA, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x08, 0xF0, 0x3E, 0xE1,
+0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE6, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0A, 0x30,
+0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE8, 0x7E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80,
+0x0B, 0x70, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE0, 0x3E, 0x84, 0x80, 0x22, 0xC8,
+0xA0, 0x80, 0x0C, 0x30, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE2, 0x7E, 0x84, 0x80,
+0x22, 0xC8, 0xA0, 0x80, 0x0D, 0x70, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE4, 0x7E,
+0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0E, 0x70, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8,
+0xDA, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x10, 0xF0, 0x3E, 0xE1, 0x8A, 0x51, 0x80, 0x40,
+0x02, 0xF0, 0xA2, 0x4A, 0x22, 0xC2, 0x03, 0x18, 0x08, 0x40, 0xDD, 0x28, 0xA1, 0xC0, 0x20, 0x88,
+0x03, 0x59, 0x47, 0xE9, 0x21, 0xC8, 0x86, 0xC0, 0x21, 0xC8, 0x86, 0xC0, 0x4B, 0xE9, 0x21, 0xC8,
+0x85, 0xC0, 0x21, 0xC8, 0x85, 0xC0, 0x08, 0x88, 0x08, 0x40, 0xB3, 0x40, 0x33, 0xCE, 0xF0, 0x39,
+0x0C, 0x78, 0xB7, 0x80, 0xBA, 0x81, 0x37, 0x88, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70,
+0xC2, 0xA3, 0x8A, 0x51, 0x37, 0x88, 0x02, 0xBE, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70,
+0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x54, 0x70, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40,
+0xE3, 0x9F, 0x62, 0xA9, 0x02, 0xF0, 0xA0, 0x80, 0x57, 0xF0, 0x4E, 0xA4, 0x8A, 0x51, 0xB4, 0x00,
+0x02, 0xF0, 0xA0, 0x80, 0x58, 0x70, 0x4E, 0xA4, 0x8A, 0x51, 0xB5, 0x40, 0x3A, 0x48, 0x24, 0xFE,
+0x84, 0x80, 0x34, 0x08, 0x62, 0x64, 0x8A, 0x51, 0xA3, 0x00, 0x35, 0x48, 0x62, 0x64, 0x8A, 0x51,
+0x23, 0x87, 0x80, 0x40, 0x0F, 0xB0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0x53, 0xE9, 0xB9, 0x81,
+0x24, 0xC8, 0xB8, 0x00, 0xB6, 0x81, 0xBA, 0x81, 0x3A, 0x48, 0x24, 0xFE, 0x84, 0x80, 0x38, 0x08,
+0x00, 0x42, 0x03, 0x18, 0x9A, 0xE9, 0x3A, 0x48, 0x24, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xB8, 0x00,
+0x3A, 0x48, 0xB6, 0x40, 0x0F, 0xB0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0x8C, 0xA9, 0x36, 0x48,
+0x24, 0xFE, 0x84, 0x80, 0xFF, 0xB0, 0x80, 0x40, 0x08, 0xF0, 0xB9, 0xCA, 0x39, 0x42, 0x03, 0x5C,
+0x88, 0x69, 0x38, 0x08, 0x08, 0x40, 0xB1, 0x00, 0xC8, 0x01, 0xC9, 0x41, 0xA0, 0x80, 0x02, 0xF0,
+0xA1, 0xC0, 0x53, 0xB0, 0xC2, 0xA3, 0xC6, 0x41, 0x48, 0xC8, 0xB2, 0x00, 0x49, 0x08, 0xBB, 0x80,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x48, 0x47, 0xB3, 0x40,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xBC, 0x40,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x48, 0x47, 0xB4, 0x00,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xBD, 0x80,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x48, 0xC2, 0xB5, 0x40,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xBE, 0x80,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x48, 0xC2, 0xB6, 0x40,
+0x46, 0x08, 0x36, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xBF, 0xC0,
+0xC7, 0x81, 0x47, 0x48, 0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01,
+0xA1, 0x4A, 0xC2, 0xA3, 0x8A, 0x51, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80,
+0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0xC2, 0xA3, 0x46, 0x08, 0x2F, 0xBE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0xED, 0x63, 0x8A, 0x51, 0xC5, 0x00, 0x47, 0x48, 0x03, 0x59, 0x1C, 0xAA,
+0x44, 0xC8, 0x45, 0x02, 0x03, 0x18, 0x28, 0x6A, 0x45, 0x08, 0xC4, 0xC0, 0x47, 0x48, 0x32, 0x3E,
+0x84, 0x80, 0x00, 0x48, 0xC8, 0xC0, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xC9, 0x00,
+0x05, 0x30, 0xC7, 0xCA, 0x47, 0x42, 0x03, 0x5C, 0xF9, 0x69, 0x07, 0x70, 0xC6, 0x8A, 0x46, 0x02,
+0x48, 0xC8, 0xB2, 0x00, 0x49, 0x08, 0xBB, 0x80, 0x03, 0x5C, 0xB8, 0xE9, 0x48, 0x0A, 0xB3, 0x40,
+0x49, 0x4A, 0xBC, 0x40, 0x48, 0x0A, 0xB4, 0x00, 0x49, 0x43, 0xBD, 0x80, 0x48, 0x03, 0xB5, 0x40,
+0x49, 0x4A, 0xBE, 0x80, 0x48, 0x03, 0xB6, 0x40, 0x49, 0x43, 0xBF, 0xC0, 0x48, 0xC8, 0xB7, 0x80,
+0x49, 0x4A, 0xC0, 0x80, 0x48, 0xC8, 0xB8, 0x00, 0x49, 0x43, 0xC1, 0xC0, 0x48, 0x0A, 0xB9, 0x40,
+0x49, 0x08, 0xC2, 0xC0, 0x48, 0x03, 0xBA, 0x40, 0x49, 0x08, 0xC3, 0x00, 0xC7, 0x81, 0x47, 0x48,
+0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0xC2, 0xA3,
+0x8A, 0x51, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01,
+0xA1, 0x4A, 0xC2, 0xA3, 0x8A, 0x51, 0x07, 0x70, 0xED, 0x63, 0x8A, 0x51, 0xC5, 0x00, 0x47, 0x48,
+0x03, 0x59, 0x76, 0x2A, 0x44, 0xC8, 0x45, 0x02, 0x03, 0x18, 0x82, 0x6A, 0x45, 0x08, 0xC4, 0xC0,
+0x47, 0x48, 0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xC8, 0xC0, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80,
+0x00, 0x48, 0xC9, 0x00, 0x09, 0x30, 0xC7, 0xCA, 0x47, 0x42, 0x03, 0x5C, 0x57, 0x2A, 0x48, 0xC8,
+0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0xC2, 0xA3, 0x8A, 0x51, 0x49, 0x08, 0xA0, 0x80,
+0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0xC2, 0xEB, 0xB2, 0x00, 0xCA, 0x41, 0xCB, 0x81, 0x32, 0x8B,
+0x9D, 0x2A, 0x74, 0xB0, 0xC6, 0x00, 0x75, 0xF0, 0xA0, 0x6A, 0x72, 0xB0, 0xC6, 0x00, 0x73, 0xF0,
+0xC7, 0x40, 0x32, 0x08, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x53, 0xB0, 0xC2, 0xA3, 0xC9, 0x41,
+0x4A, 0x08, 0xB4, 0x00, 0x4B, 0x48, 0xBD, 0x80, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xB5, 0x40, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4B, 0xC7, 0xBE, 0x80, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xB6, 0x40, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4B, 0x42, 0xBF, 0xC0, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xB7, 0x80, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4B, 0xC7, 0xC0, 0x80, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xB8, 0x00, 0x49, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x8A, 0x51,
+0x02, 0xA0, 0x8A, 0x51, 0x4B, 0x42, 0xC1, 0xC0, 0xCC, 0x41, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70,
+0xA1, 0xC0, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xD6, 0x23, 0x8A, 0x51, 0xB1, 0x00,
+0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70,
+0xA1, 0xC0, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xD6, 0x23, 0x8A, 0x51, 0xB1, 0x00,
+0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80,
+0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x46, 0x08, 0xC2, 0xA3, 0x8A, 0x51, 0x4C, 0x08, 0x3D, 0xBE,
+0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x47, 0x48, 0xC2, 0xA3, 0x49, 0x08, 0x3D, 0xBE,
+0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xED, 0x63, 0x8A, 0x51, 0xC8, 0xC0, 0x4C, 0x08,
+0x03, 0x59, 0x2E, 0x2B, 0x33, 0x48, 0x48, 0xC2, 0x03, 0x18, 0x3A, 0x2B, 0x48, 0xC8, 0xB3, 0x40,
+0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80,
+0x00, 0x48, 0xCB, 0x40, 0x05, 0x30, 0xCC, 0x8A, 0x4C, 0x02, 0x03, 0x5C, 0xED, 0x6A, 0x05, 0x30,
+0xC9, 0x8A, 0x49, 0x02, 0x4A, 0x08, 0xB4, 0x00, 0x4B, 0x48, 0xBD, 0x80, 0x03, 0x5C, 0xAC, 0xEA,
+0x4A, 0x4A, 0xB5, 0x40, 0x4B, 0x8A, 0xBE, 0x80, 0x4A, 0x4A, 0xB6, 0x40, 0x4B, 0x83, 0xBF, 0xC0,
+0x4A, 0x43, 0xB7, 0x80, 0x4B, 0x8A, 0xC0, 0x80, 0x4A, 0x43, 0xB8, 0x00, 0x4B, 0x83, 0xC1, 0xC0,
+0x4A, 0x08, 0xB9, 0x40, 0x4B, 0x8A, 0xC2, 0xC0, 0x4A, 0x08, 0xBA, 0x40, 0x4B, 0x83, 0xC3, 0x00,
+0x4A, 0x4A, 0xBB, 0x80, 0x4B, 0x48, 0xC4, 0xC0, 0x4A, 0x43, 0xBC, 0x40, 0x4B, 0x48, 0xC5, 0x00,
+0xCC, 0x41, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80,
+0x00, 0x48, 0xD6, 0x23, 0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x31, 0x08,
+0x80, 0x40, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80,
+0x00, 0x48, 0xD6, 0x23, 0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x31, 0x08,
+0x80, 0x40, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x46, 0x08,
+0xC2, 0xA3, 0x8A, 0x51, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01,
+0x47, 0x48, 0xC2, 0xA3, 0x8A, 0x51, 0x07, 0x70, 0xED, 0x63, 0x8A, 0x51, 0xC8, 0xC0, 0x4C, 0x08,
+0x03, 0x59, 0xA6, 0x2B, 0x33, 0x48, 0x48, 0xC2, 0x03, 0x18, 0xB2, 0x2B, 0x48, 0xC8, 0xB3, 0x40,
+0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80,
+0x00, 0x48, 0xCB, 0x40, 0x09, 0x30, 0xCC, 0x8A, 0x4C, 0x02, 0x03, 0x5C, 0x69, 0x2B, 0x4A, 0x08,
+0xA0, 0x80, 0xA1, 0x01, 0x46, 0x08, 0xC2, 0xA3, 0x8A, 0x51, 0x4B, 0x48, 0xA0, 0x80, 0xA1, 0x01,
+0x47, 0x48, 0xC2, 0xEB, 0xA2, 0xC0, 0x21, 0x0A, 0x03, 0x59, 0xD0, 0xEB, 0x21, 0xC8, 0x62, 0x46,
+0x03, 0x59, 0xD0, 0xEB, 0x21, 0xC8, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x21, 0xC8, 0xE2, 0x00,
+0x20, 0x88, 0x88, 0x80, 0x22, 0xC8, 0x80, 0x38, 0x8C, 0xC0, 0x08, 0x40, 0xA3, 0x00, 0x20, 0x88,
+0x80, 0x7A, 0xA2, 0xC0, 0x23, 0x08, 0x80, 0x7A, 0xA2, 0x02, 0x03, 0x18, 0xE1, 0x2B, 0x20, 0x88,
+0x08, 0x40, 0x23, 0x08, 0x80, 0x7A, 0xA2, 0xC0, 0x21, 0xC8, 0x80, 0x7A, 0xA2, 0x02, 0x03, 0x18,
+0xEB, 0xAB, 0x21, 0xC8, 0x08, 0x40, 0x23, 0x08, 0x08, 0x40, 0x83, 0x52, 0x03, 0x53, 0xA9, 0x00,
+0x29, 0x8E, 0xF0, 0x39, 0x0C, 0x78, 0xAD, 0x40, 0xB0, 0x01, 0x2D, 0x48, 0xA0, 0x80, 0x02, 0xF0,
+0xA1, 0xC0, 0x54, 0x70, 0xC2, 0xA3, 0x8A, 0x51, 0x2D, 0x48, 0x02, 0xBE, 0xA0, 0x80, 0x02, 0xF0,
+0xA1, 0xC0, 0x54, 0x70, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x54, 0x70, 0x4E, 0xA4,
+0x8A, 0x51, 0xE3, 0x40, 0xE3, 0x9F, 0x04, 0x2C, 0x02, 0xF0, 0xA0, 0x80, 0x57, 0xF0, 0x4E, 0xA4,
+0x8A, 0x51, 0xAA, 0x00, 0x02, 0xF0, 0xA0, 0x80, 0x58, 0x70, 0x4E, 0xA4, 0x8A, 0x51, 0xAB, 0x40,
+0x30, 0xC8, 0x24, 0xFE, 0x84, 0x80, 0x2A, 0x08, 0x62, 0x64, 0x8A, 0x51, 0xA3, 0x00, 0x2B, 0x48,
+0x62, 0x64, 0x8A, 0x51, 0x23, 0x87, 0x83, 0x93, 0x80, 0x40, 0x05, 0x30, 0xB0, 0x4A, 0x30, 0xC2,
+0x03, 0x5C, 0xF5, 0xAB, 0xAF, 0xC1, 0x24, 0xC8, 0xAE, 0x40, 0xAC, 0x41, 0xB0, 0x01, 0x30, 0xC8,
+0x24, 0xFE, 0x84, 0x80, 0x2E, 0x48, 0x00, 0x42, 0x03, 0x18, 0x3D, 0x2C, 0x30, 0xC8, 0x24, 0xFE,
+0x84, 0x80, 0x00, 0x48, 0xAE, 0x40, 0x30, 0xC8, 0xAC, 0x00, 0x05, 0x30, 0xB0, 0x4A, 0x30, 0xC2,
+0x03, 0x5C, 0x2F, 0x2C, 0x2C, 0x08, 0x24, 0xFE, 0x84, 0x80, 0xFF, 0xB0, 0x80, 0x40, 0x03, 0x30,
+0xAF, 0x0A, 0x2F, 0x82, 0x03, 0x5C, 0x2B, 0xEC, 0x2E, 0x48, 0x08, 0x40, 0xA1, 0xC0, 0x20, 0xCA,
+0x03, 0x59, 0x5C, 0xEC, 0x20, 0x88, 0x62, 0x46, 0x03, 0x59, 0x5C, 0xEC, 0x20, 0x88, 0x88, 0x80,
+0x80, 0xF0, 0x8C, 0xC0, 0x20, 0x88, 0xE2, 0x00, 0x21, 0xC8, 0x8C, 0xC0, 0x21, 0xC8, 0x8C, 0xC0,
+0x08, 0x88, 0x08, 0x40, 0xA0, 0x80, 0xA0, 0xDF, 0x68, 0xAC, 0x20, 0xC3, 0xFF, 0x3A, 0x08, 0x40,
+0x20, 0x88, 0x08, 0x40, 0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41,
+0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, 0x8B, 0x41, 0x83, 0x96, 0xD0, 0x01, 0xD1, 0x41, 0x83, 0x52,
+0xD3, 0x81, 0x53, 0x48, 0xA0, 0xFE, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xA8, 0x3E, 0x84, 0x80,
+0x80, 0x81, 0x53, 0x48, 0xB0, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xB8, 0x7E, 0x84, 0x80,
+0x80, 0x81, 0x53, 0x48, 0xC0, 0xFE, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80,
+0x80, 0x81, 0x53, 0x48, 0xD2, 0x7E, 0x84, 0x80, 0x08, 0xF0, 0x80, 0x81, 0xD3, 0xCA, 0x53, 0x42,
+0x03, 0x5C, 0x79, 0x2C, 0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x03, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51,
+0x03, 0xBA, 0x03, 0x9D, 0x9A, 0xEC, 0x03, 0x30, 0xE2, 0x00, 0xC8, 0x70, 0xA0, 0x80, 0x02, 0xF0,
+0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x56, 0xB0,
+0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40, 0xC8, 0xFA, 0x03, 0x59, 0x1B, 0x94, 0xC9, 0xB0,
+0xA0, 0x80, 0x04, 0xF0, 0xA1, 0x01, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0, 0xA0, 0xC1,
+0x8A, 0x51, 0x3E, 0xE1, 0x8A, 0x51, 0xE3, 0x40, 0xC9, 0x3A, 0x03, 0x59, 0x9B, 0xD4, 0xCA, 0xB0,
+0xA0, 0x80, 0x04, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0,
+0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, 0x3E, 0xE1, 0x8A, 0x51, 0xE3, 0x40, 0xCA, 0x3A, 0x03, 0x59,
+0x1B, 0xD5, 0x14, 0xC8, 0xCD, 0x40, 0x06, 0x30, 0x03, 0xD0, 0xCD, 0xCC, 0xFF, 0x7E, 0x03, 0x9D,
+0xDC, 0x2C, 0x4D, 0x48, 0xD0, 0xC0, 0x14, 0x5C, 0xE9, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x6E, 0x16,
+0xEC, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x6E, 0xD2, 0x94, 0x9C, 0xF2, 0x2C, 0x83, 0x52, 0x03, 0x53,
+0xEE, 0x56, 0xF5, 0x6C, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x12, 0x14, 0x9D, 0xFB, 0xAC, 0x83, 0x52,
+0x03, 0x53, 0xEE, 0x97, 0xFE, 0xAC, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x53, 0x94, 0xDD, 0x04, 0x6D,
+0x83, 0x52, 0x03, 0x53, 0x6F, 0x14, 0x07, 0xED, 0x83, 0x52, 0x03, 0x53, 0x6F, 0xD0, 0x14, 0x9E,
+0x0D, 0xED, 0x83, 0x52, 0x03, 0x53, 0x6E, 0xD4, 0x10, 0x6D, 0x83, 0x52, 0x03, 0x53, 0x6E, 0x90,
+0x94, 0xDE, 0x16, 0xED, 0x83, 0x52, 0x03, 0x53, 0x6E, 0x57, 0x19, 0xED, 0x83, 0x52, 0x03, 0x53,
+0x6E, 0x13, 0xD0, 0x08, 0x03, 0x9D, 0x20, 0x6D, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x55, 0x23, 0xED,
+0x83, 0x52, 0x03, 0x53, 0xEE, 0x11, 0x50, 0x4B, 0x29, 0xED, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x14,
+0x2C, 0xED, 0x83, 0x52, 0x03, 0x53, 0xEE, 0xD0, 0x50, 0xC8, 0x02, 0x7A, 0x03, 0x9D, 0x34, 0xED,
+0x83, 0x52, 0x03, 0x53, 0x6E, 0x15, 0x37, 0x6D, 0x83, 0x52, 0x03, 0x53, 0x6E, 0xD1, 0x8A, 0x51,
+0xDC, 0xA0, 0x8A, 0x51, 0x21, 0x30, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51,
+0xC2, 0xA3, 0x8A, 0x51, 0x21, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0xEE, 0x18, 0xE5, 0x81, 0x7F, 0x70, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x7F, 0x70, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x6E, 0x5E, 0x08, 0x6E, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0,
+0x53, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x14, 0x30, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0,
+0x56, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x0E, 0x70, 0xED, 0x80, 0x02, 0xF0, 0xEC, 0x40,
+0xEE, 0x9D, 0x6E, 0x19, 0x75, 0x6D, 0xEE, 0x5C, 0xAB, 0x6D, 0x07, 0x70, 0xA0, 0x80, 0x22, 0x30,
+0xA1, 0x01, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0xEE, 0x5C, 0xA3, 0x2D, 0x03, 0x30, 0xA0, 0x80,
+0x02, 0xF0, 0xA1, 0xC0, 0x2C, 0x70, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80,
+0x2B, 0xB0, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40, 0xE3, 0xD2, 0x63, 0x17, 0x63, 0x48,
+0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x2B, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x29, 0x70,
+0xCF, 0x80, 0x96, 0xB0, 0xCE, 0x40, 0xA6, 0xB0, 0xCD, 0x40, 0xCD, 0x0B, 0x9D, 0x6D, 0xCE, 0x0B,
+0x9D, 0x6D, 0xCF, 0x4B, 0x9D, 0x6D, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x00, 0xB0, 0x8A, 0x95,
+0x8B, 0xE6, 0x8A, 0x51, 0xBC, 0x6D, 0x6E, 0x9F, 0xAF, 0xAD, 0x08, 0xF0, 0xB0, 0xED, 0x07, 0x70,
+0xA0, 0x80, 0x22, 0x30, 0xA1, 0x01, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x18, 0xD0, 0x01, 0xF0,
+0xB1, 0x41, 0x8A, 0x95, 0x47, 0xE5, 0x8A, 0x51, 0x02, 0xF0, 0x8A, 0x51, 0x4D, 0xA1, 0x8A, 0x51,
+0xD1, 0x00, 0xEC, 0xF0, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x00, 0xB0, 0x8A, 0x51, 0x94, 0x62, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x4D, 0xA1,
+0x8A, 0x51, 0xD2, 0x00, 0xEE, 0x9D, 0x6E, 0x19, 0xD7, 0xAD, 0xEE, 0x5C, 0xEF, 0xED, 0xEE, 0x5C,
+0xE9, 0x6D, 0x02, 0xF0, 0xA0, 0x80, 0x2B, 0xB0, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40,
+0x63, 0xD3, 0x63, 0x48, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x2B, 0xB0, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0xF3, 0xAD, 0x03, 0x30,
+0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x51, 0x08, 0x8A, 0x51,
+0x9F, 0xE0, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, 0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51, 0x4D, 0x42,
+0x1E, 0x7E, 0x83, 0x96, 0xD0, 0xC0, 0x32, 0x70, 0x50, 0xC2, 0x83, 0x52, 0x03, 0x18, 0x9B, 0x15,
+0x83, 0x52, 0xEE, 0x9E, 0xB8, 0x2E, 0x02, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x53, 0xB0,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x14, 0x30, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x0E, 0x70, 0xED, 0x80, 0x02, 0xF0, 0xEC, 0x40, 0xEE, 0x9D,
+0x6E, 0x19, 0x24, 0xAE, 0xEE, 0x5C, 0x5A, 0x2E, 0x07, 0x70, 0xA0, 0x80, 0x22, 0x30, 0xA1, 0x01,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0xEE, 0x5C, 0x52, 0xEE, 0x03, 0x30, 0xA0, 0x80, 0x02, 0xF0,
+0xA1, 0xC0, 0x2C, 0x70, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x2B, 0xB0,
+0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40, 0xE3, 0xD1, 0x63, 0xD6, 0x63, 0x48, 0xA0, 0x80,
+0x02, 0xF0, 0xA1, 0xC0, 0x2B, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x29, 0x70, 0xCF, 0x80,
+0x96, 0xB0, 0xCE, 0x40, 0xA6, 0xB0, 0xCD, 0x40, 0xCD, 0x0B, 0x4C, 0xEE, 0xCE, 0x0B, 0x4C, 0xEE,
+0xCF, 0x4B, 0x4C, 0xEE, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x01, 0xF0, 0x8A, 0x95, 0x8B, 0xE6,
+0x8A, 0x51, 0x6C, 0x2E, 0x6E, 0x9F, 0x5E, 0x6E, 0x08, 0xF0, 0x5F, 0xAE, 0x07, 0x70, 0xA0, 0x80,
+0x22, 0x30, 0xA1, 0x01, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x18, 0x14, 0x01, 0xF0, 0xB1, 0x41,
+0xB1, 0x8A, 0x8A, 0x95, 0x47, 0xE5, 0x8A, 0x51, 0x02, 0xF0, 0x8A, 0x51, 0x4D, 0xA1, 0x8A, 0x51,
+0xD1, 0x00, 0xEC, 0xF0, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x01, 0xF0, 0x8A, 0x51, 0x94, 0x62, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x4D, 0xA1,
+0x8A, 0x51, 0xD2, 0x00, 0xEE, 0x9D, 0x6E, 0x19, 0x87, 0x2E, 0xEE, 0x5C, 0x9E, 0x6E, 0xEE, 0x5C,
+0x99, 0x2E, 0x02, 0xF0, 0xA0, 0x80, 0x2B, 0xB0, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0xE3, 0x40,
+0x63, 0x92, 0x63, 0x48, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x2B, 0xB0, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA3, 0x2E, 0x03, 0x30, 0xA0, 0x80,
+0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x51, 0x08, 0x8A, 0x51,
+0x9F, 0xE0, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, 0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51, 0x4D, 0x42,
+0x1E, 0x7E, 0x83, 0x96, 0xD1, 0x00, 0x32, 0x70, 0x51, 0x02, 0x83, 0x52, 0x03, 0x18, 0x1B, 0xD6,
+0x83, 0x52, 0x6E, 0x1C, 0xBD, 0xAE, 0x03, 0x30, 0xBE, 0xAE, 0x02, 0xF0, 0xEC, 0x40, 0x14, 0x30,
+0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0xEE, 0xDF,
+0x52, 0x2F, 0x6E, 0x9F, 0xCD, 0x6E, 0x08, 0xF0, 0xCE, 0x6E, 0x07, 0x70, 0xA0, 0x80, 0x22, 0x30,
+0xA1, 0x01, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x53, 0xB0,
+0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x18, 0xD0, 0x9B, 0x16, 0xD3, 0x81, 0x53, 0x48, 0x08, 0xBE,
+0xED, 0x80, 0x7F, 0x70, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x7F, 0x70, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x00, 0xB0, 0xB1, 0x41, 0xD3, 0x88, 0x03, 0x59, 0x01, 0xF0, 0x8A, 0x95, 0x47, 0xE5,
+0x8A, 0x51, 0x53, 0x48, 0xD2, 0x7E, 0x84, 0x80, 0x68, 0x08, 0x80, 0x40, 0x27, 0xB0, 0xA0, 0xC1,
+0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x28, 0x30, 0xA0, 0xC1, 0xA1, 0x01,
+0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x03, 0x30, 0x8A, 0x51, 0x4D, 0xA1, 0x8A, 0x51,
+0xD1, 0x00, 0x00, 0xB0, 0x8A, 0x51, 0xAB, 0xE1, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x4D, 0xA1,
+0x8A, 0x51, 0xD2, 0x00, 0x51, 0x08, 0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08,
+0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51, 0x4D, 0x42, 0x18, 0xFE, 0xCE, 0x40, 0x53, 0x48, 0xC0, 0xFE,
+0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x53, 0x48, 0xA0, 0xFE, 0x84, 0x80, 0x27, 0xB0, 0xA0, 0xC1,
+0xA0, 0x0A, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xA8, 0x3E, 0x84, 0x80,
+0x28, 0x30, 0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48,
+0xC0, 0xFE, 0x84, 0x80, 0x14, 0x30, 0x00, 0x42, 0x03, 0x5C, 0x9B, 0xD2, 0x08, 0xF0, 0xD3, 0xCA,
+0x53, 0x42, 0x03, 0x5C, 0xDE, 0xAE, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0x8A, 0x95,
+0xF0, 0x27, 0x8A, 0x51, 0x6F, 0x5C, 0xE0, 0x2F, 0x6E, 0x9F, 0x58, 0x2F, 0x08, 0xF0, 0x59, 0x6F,
+0x07, 0x70, 0xA0, 0x80, 0x22, 0x30, 0xA1, 0x01, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x02, 0xF0,
+0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x18, 0x14,
+0x1B, 0x17, 0xD3, 0x81, 0x53, 0x48, 0x08, 0xBE, 0xED, 0x80, 0x7F, 0x70, 0xA0, 0x80, 0x27, 0xB0,
+0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x7F, 0x70, 0xA0, 0x80, 0x28, 0x30,
+0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3, 0x8A, 0x51, 0x00, 0xB0, 0xB1, 0x41, 0xB1, 0x8A,
+0xD3, 0x88, 0x03, 0x59, 0x01, 0xF0, 0x8A, 0x95, 0x47, 0xE5, 0x8A, 0x51, 0x53, 0x48, 0xD2, 0x7E,
+0x84, 0x80, 0x68, 0x08, 0x80, 0x40, 0x27, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51,
+0xC2, 0xA3, 0x8A, 0x51, 0x28, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xC2, 0xA3,
+0x8A, 0x51, 0x03, 0x30, 0x8A, 0x51, 0x4D, 0xA1, 0x8A, 0x51, 0xD1, 0x00, 0x01, 0xF0, 0x8A, 0x51,
+0xAB, 0xE1, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x4D, 0xA1, 0x8A, 0x51, 0xD2, 0x00, 0x51, 0x08,
+0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, 0x8A, 0x51, 0x9F, 0xE0, 0x8A, 0x51,
+0x4D, 0x42, 0x18, 0xFE, 0xCE, 0x40, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80, 0x4E, 0x48, 0x80, 0x40,
+0x53, 0x48, 0xB0, 0x3E, 0x84, 0x80, 0x27, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, 0x4E, 0xA4,
+0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xB8, 0x7E, 0x84, 0x80, 0x28, 0x30, 0xA0, 0xC1, 0xA0, 0x0A,
+0x8A, 0x51, 0x4E, 0xA4, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80, 0x14, 0x30,
+0x00, 0x42, 0x03, 0x5C, 0x1B, 0xD3, 0x08, 0xF0, 0xD3, 0xCA, 0x53, 0x42, 0x03, 0x5C, 0x6A, 0x6F,
+0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51,
+0x18, 0x56, 0x8A, 0x95, 0x85, 0xE7, 0x8A, 0x51, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01,
+0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A,
+0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0xE4, 0xB0, 0xCD, 0x40, 0xF6, 0xEF, 0xF7, 0x2F, 0xCD, 0x0B,
+0xF5, 0xEF, 0xFA, 0xEF, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x12, 0x9B, 0x57, 0xFF, 0x6F,
+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, 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, 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, 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, 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, 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, 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, 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,
+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, 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, 0xB4, 0x00,
+0x01, 0xF0, 0xDC, 0x40, 0x31, 0x08, 0xFC, 0x65, 0x8A, 0x95, 0x34, 0x08, 0x03, 0x59, 0xCE, 0x6D,
+0x31, 0x08, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xB2, 0x00, 0x31, 0x08, 0x5A, 0x7E, 0x84, 0x80,
+0x32, 0x08, 0x80, 0x40, 0x6E, 0x9F, 0x62, 0xED, 0x31, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48,
+0x28, 0xFE, 0x67, 0x6D, 0x31, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x14, 0xFE, 0xB2, 0x00,
+0x31, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x32, 0x08, 0x80, 0x40, 0x31, 0x08, 0x54, 0x3E, 0x84, 0x80,
+0x00, 0x48, 0xB2, 0x00, 0x31, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB3, 0x40, 0x32, 0x08,
+0x33, 0x42, 0x31, 0x08, 0x03, 0x18, 0x86, 0xED, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0xB2, 0x00,
+0x31, 0x08, 0x5A, 0x7E, 0x84, 0x80, 0x32, 0x08, 0x80, 0x40, 0x31, 0x08, 0xDC, 0xBE, 0x84, 0x80,
+0x00, 0x48, 0xB2, 0x00, 0x31, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x32, 0x08, 0x80, 0x40, 0x31, 0x08,
+0x5A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x31, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0xF0, 0x27,
+0x8A, 0x95, 0x31, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x31, 0x08, 0xA1, 0xC0,
+0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x31, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80,
+0x31, 0x08, 0xA1, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, 0xA0, 0x0A, 0x31, 0x08,
+0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xB2, 0x00, 0xB7, 0xAD, 0xB8, 0x2D,
+0xB2, 0xCB, 0xB6, 0x6D, 0xBB, 0xAD, 0x00, 0x00, 0x0F, 0xB0, 0x83, 0x52, 0x03, 0x53, 0xA0, 0x80,
+0x31, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xB3, 0x40, 0xC9, 0xB0,
+0xB2, 0x00, 0xB2, 0xCB, 0xC9, 0x2D, 0xB3, 0x0B, 0xC9, 0x2D, 0xCE, 0x6D, 0x83, 0x52, 0x03, 0x53,
+0xB6, 0x81, 0x36, 0x48, 0x08, 0xBE, 0xE8, 0x00, 0x69, 0x48, 0xB2, 0x00, 0x05, 0x30, 0x03, 0xD0,
+0xB2, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0xD8, 0x2D, 0x68, 0x8D, 0x32, 0x04, 0x65, 0x44,
+0xA0, 0x80, 0x31, 0x08, 0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xC7, 0xF0, 0xB2, 0x00,
+0x00, 0x00, 0xB2, 0xCB, 0xE8, 0x2D, 0xEC, 0x6D, 0x00, 0x00, 0x02, 0xF0, 0x8A, 0x51, 0xED, 0x63,
+0x8A, 0x95, 0xB5, 0x40, 0x6F, 0x30, 0x35, 0x42, 0x03, 0x18, 0x08, 0x40, 0x08, 0xF0, 0xB6, 0xCA,
+0x36, 0x42, 0x03, 0x18, 0x08, 0x40, 0xD1, 0x2D, 0xA5, 0x00, 0x5A, 0x7E, 0x84, 0x80, 0x83, 0x93,
+0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x25, 0x08,
+0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x05, 0x30, 0xF0, 0x27,
+0x8A, 0x95, 0x25, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0,
+0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x6C, 0xCE, 0xF0, 0x39, 0x6D, 0x84, 0xA0, 0x80, 0x25, 0x08,
+0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x61, 0x08, 0xA3, 0x00, 0x04, 0xF0, 0x03, 0xD0,
+0xA3, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x28, 0xAE, 0x23, 0x8D, 0x60, 0xC4, 0xA0, 0x80,
+0x25, 0x08, 0xA1, 0xC0, 0x0A, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x6A, 0x48, 0xA0, 0x80, 0x25, 0x08,
+0xA1, 0xC0, 0x0B, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x69, 0x48, 0xA3, 0x00, 0x05, 0x30, 0x03, 0xD0,
+0xA3, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x40, 0x6E, 0x68, 0x8D, 0x23, 0x04, 0x65, 0x44,
+0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x66, 0x48, 0xA3, 0x00,
+0x05, 0x30, 0x03, 0xD0, 0xA3, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, 0x51, 0xEE, 0x67, 0x88, 0xA4, 0xC0,
+0x01, 0xF0, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x5A, 0x2E, 0x24, 0x4D,
+0x23, 0x04, 0x5E, 0x84, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95,
+0x03, 0xD0, 0x5F, 0x4D, 0x5D, 0x84, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0E, 0x70, 0xF0, 0x27,
+0x8A, 0x95, 0x83, 0x96, 0x6C, 0x48, 0x83, 0x52, 0xA3, 0x00, 0x03, 0xD0, 0xA3, 0xCD, 0x03, 0xD0,
+0xA3, 0xCD, 0x03, 0xD0, 0xA3, 0xCD, 0x5C, 0x48, 0xA4, 0xC0, 0x03, 0xD0, 0xA4, 0x8D, 0x03, 0xD0,
+0xA4, 0x8D, 0x03, 0xD0, 0x64, 0x8D, 0x24, 0xC4, 0x23, 0x04, 0x6B, 0x84, 0xA0, 0x80, 0x25, 0x08,
+0xA1, 0xC0, 0x10, 0xF0, 0xF0, 0x6F, 0xB3, 0x40, 0x33, 0x48, 0x03, 0x59, 0x93, 0x2E, 0xB6, 0x81,
+0xB6, 0xCA, 0xB7, 0xC1, 0x96, 0x2E, 0xB6, 0x81, 0xB7, 0xC1, 0xB7, 0x0A, 0xDC, 0x81, 0x0E, 0x70,
+0xED, 0x80, 0x02, 0xF0, 0xEC, 0x40, 0x36, 0x48, 0xFC, 0x65, 0x8A, 0x95, 0x37, 0x88, 0xFC, 0x65,
+0x8A, 0x95, 0x36, 0x48, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xB1, 0x00, 0x37, 0x88, 0x5A, 0x7E,
+0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x6E, 0x9F, 0xB3, 0x6E, 0x36, 0x48, 0x54, 0x3E, 0x84, 0x80,
+0x00, 0x48, 0x28, 0xFE, 0xB8, 0x2E, 0x36, 0x48, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x14, 0xFE,
+0xB1, 0x00, 0x37, 0x88, 0x58, 0x3E, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x36, 0x48, 0x54, 0x3E,
+0x84, 0x80, 0x00, 0x48, 0xB1, 0x00, 0x37, 0x88, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB2, 0x00,
+0x31, 0x08, 0x32, 0x02, 0x03, 0x18, 0xD6, 0x6E, 0x37, 0x88, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x8A,
+0xB1, 0x00, 0x37, 0x88, 0x5A, 0x7E, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x36, 0x48, 0xDC, 0xBE,
+0x84, 0x80, 0x00, 0x48, 0xB1, 0x00, 0x37, 0x88, 0x56, 0x7E, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40,
+0x37, 0x88, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x37, 0x88, 0xA1, 0xC0, 0x04, 0xF0,
+0xF0, 0x27, 0x8A, 0x95, 0x37, 0x88, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x37, 0x88,
+0xA1, 0xC0, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x37, 0x88, 0x56, 0x7E, 0x84, 0x80, 0x00, 0x48,
+0xA0, 0x80, 0x37, 0x88, 0xA1, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, 0xA0, 0x0A,
+0x36, 0x48, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, 0xA0, 0x0A, 0x37, 0x88,
+0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xB1, 0x00, 0x0F, 0x6F, 0x10, 0xAF,
+0xB1, 0xCB, 0x0E, 0x2F, 0x13, 0x2F, 0x00, 0x00, 0x03, 0x30, 0x83, 0x52, 0x03, 0x53, 0xA0, 0x80,
+0x36, 0x48, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0x0D, 0x70, 0xA0, 0x80, 0x37, 0x88,
+0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xB2, 0x00, 0xC9, 0xB0, 0xB1, 0x00,
+0xB1, 0xCB, 0x28, 0xEF, 0xB2, 0xCB, 0x28, 0xEF, 0x2D, 0x6F, 0x83, 0x52, 0x03, 0x53, 0xB4, 0x41,
+0x34, 0x08, 0x08, 0xBE, 0xE8, 0x00, 0x69, 0x48, 0xB1, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xB1, 0xCD,
+0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x37, 0xAF, 0x68, 0x8D, 0x31, 0x04, 0x65, 0x44, 0xA0, 0x80,
+0x36, 0x48, 0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xC7, 0xF0, 0xB1, 0x00, 0x00, 0x00,
+0xB1, 0xCB, 0x47, 0x6F, 0x4B, 0x6F, 0x00, 0x00, 0x02, 0xF0, 0x8A, 0x51, 0xED, 0x63, 0x8A, 0x95,
+0xB5, 0x40, 0x6F, 0x30, 0x35, 0x42, 0x03, 0x18, 0x5A, 0x6F, 0x08, 0xF0, 0xB4, 0x8A, 0x34, 0x02,
+0x03, 0x5C, 0x30, 0xEF, 0x6E, 0xF0, 0x35, 0x42, 0x03, 0x18, 0x08, 0x40, 0x0F, 0xB0, 0xED, 0x80,
+0x6C, 0xCE, 0xF0, 0x39, 0x6D, 0x84, 0xA0, 0x80, 0x37, 0x88, 0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x27,
+0x8A, 0x95, 0x15, 0x70, 0xB2, 0x00, 0xC6, 0xB0, 0xB1, 0x00, 0xB1, 0xCB, 0x6D, 0xAF, 0xB2, 0xCB,
+0x6D, 0xAF, 0x00, 0x00, 0x02, 0xF0, 0x8A, 0x51, 0xED, 0x63, 0x8A, 0x95, 0xB5, 0x40, 0x6E, 0xF0,
+0x35, 0x42, 0x03, 0x18, 0x08, 0x40, 0x03, 0x30, 0xEC, 0x40, 0x6C, 0xCE, 0xF0, 0x39, 0x6D, 0x84,
+0xA0, 0x80, 0x37, 0x88, 0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x6F, 0xA3, 0x41, 0x23, 0x08, 0xDE, 0xFE,
+0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x01, 0xF0, 0xF0, 0x27, 0x8A, 0x95,
+0x23, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x02, 0xF0,
+0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xDC, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08,
+0xA1, 0xC0, 0x03, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xEA, 0xBE, 0x84, 0x80, 0x00, 0x48,
+0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xE6, 0xBE,
+0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0A, 0x30, 0xF0, 0x27, 0x8A, 0x95,
+0x23, 0x08, 0xE8, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0B, 0x70,
+0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xE0, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08,
+0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xE2, 0x7E, 0x84, 0x80, 0x00, 0x48,
+0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xE4, 0x7E,
+0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x95,
+0x23, 0x08, 0xDA, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x10, 0xF0,
+0xF0, 0x27, 0x8A, 0x95, 0x02, 0xF0, 0xA3, 0x8A, 0x23, 0x02, 0x03, 0x18, 0x08, 0x40, 0x86, 0x2F,
+0xA2, 0xC0, 0x21, 0xC8, 0x03, 0x59, 0xFA, 0xEF, 0x20, 0x88, 0x88, 0x80, 0x22, 0xC8, 0x80, 0x38,
+0x86, 0xC0, 0x08, 0x40, 0x20, 0x88, 0x88, 0x80, 0x22, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40
+};
diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c
index e21c5a1..c7bd8db 100644
--- a/libloragw/src/loragw_hal.c
+++ b/libloragw/src/loragw_hal.c
@@ -58,6 +58,9 @@ Maintainer: Sylvain Miermont
#define TX_METADATA_NB 16
#define RX_METADATA_NB 16
+#define AGC_CMD_WAIT 16
+#define AGC_CMD_ABORT 17
+
#define MIN_LORA_PREAMBLE 4
#define STD_LORA_PREAMBLE 6
#define MIN_FSK_PREAMBLE 3
@@ -97,25 +100,23 @@ F_register(24bit) = F_rf (Hz) / F_step(Hz)
#define SX125x_XOSC_GM_STARTUP 13 /* (default 13) */
#define SX125x_XOSC_DISABLE 2 /* Disable of Xtal Oscillator blocks bit0:regulator, bit1:core(gm), bit2:amplifier */
+#define RSSI_MULTI_BIAS -34.5 /* difference between "multi" modem RSSI offset and "stand-alone" modem RSSI offset */
+#define RSSI_FSK_BIAS -37.0 /* difference between FSK modem RSSI offset and "stand-alone" modem RSSI offset */
+#define RSSI_FSK_REF -70.0 /* linearize FSK RSSI curve around -70 dBm */
+#define RSSI_FSK_SLOPE 0.8
+
/* Board-specific RSSI calibration constants */
#if (CFG_BRD_NANO868 == 1)
- #define RSSI_OFFSET_LORA_MULTI -128.0 /* calibrated value */
- #define RSSI_OFFSET_LORA_STD -167.0 /* calibrated for all bandwidth */
- #define RSSI_OFFSET_FSK -146.5 /* calibrated value */
- #define RSSI_SLOPE_FSK 1.2 /* calibrated value */
-#elif (CFG_BRD_REF1301 == 1)
- #define RSSI_OFFSET_LORA_MULTI -129.0 /* calibrated value */
- #define RSSI_OFFSET_LORA_STD -164.0 /* calibrated for all bandwidth */
- #define RSSI_OFFSET_FSK -146.5 /* todo */
- #define RSSI_SLOPE_FSK 1.2 /* todo */
+ #define RSSI_BOARD_OFFSET 176
+#elif (CFG_BRD_1301REF868 == 1)
+ #define RSSI_BOARD_OFFSET 166
+#elif (CFG_BRD_1301REF433 == 1)
+ #define RSSI_BOARD_OFFSET 176
/* === ADD CUSTOMIZATION FOR YOUR OWN BOARD HERE ===
#elif (CFG_BRD_MYBOARD == 1)
*/
#elif (CFG_BRD_NONE == 1)
- #define RSSI_OFFSET_LORA_MULTI 0.0
- #define RSSI_OFFSET_LORA_STD 0.0
- #define RSSI_OFFSET_FSK 0.0
- #define RSSI_SLOPE_FSK 1.0
+ #define RSSI_BOARD_OFFSET 0
#endif
/* constant arrays defining hardware capability */
@@ -168,35 +169,35 @@ typedef struct {
#if (CFG_BRD_NANO868 == 1)
#define CUSTOM_TX_POW_TABLE 1 /* is custom table loading sequence needed ? */
const tx_pow_t tx_pow_table[TX_POW_LUT_SIZE] = {\
- { 0, 3, 8, 2},\
- { 0, 3, 9, 3},\
- { 0, 3, 10, 5},\
- { 0, 3, 12, 7},\
- { 0, 3, 14, 9},\
+ { 0, 3, 8, 2},\
+ { 0, 3, 9, 3},\
+ { 0, 3, 10, 5},\
+ { 0, 3, 12, 7},\
+ { 0, 3, 14, 9},\
{ 0, 3, 15, 10},\
- { 1, 3, 8, 12},\
- { 1, 3, 9, 14},\
+ { 1, 3, 8, 12},\
+ { 1, 3, 9, 14},\
{ 1, 3, 10, 15},\
{ 1, 3, 11, 17},\
{ 1, 3, 12, 18},\
{ 1, 3, 13, 20},\
- { 2, 3, 8, 21},\
- { 2, 3, 9, 23},\
+ { 2, 3, 8, 21},\
+ { 2, 3, 9, 23},\
{ 2, 3, 11, 25},\
{ 2, 3, 13, 27},\
}; /* calibrated */
-#elif (CFG_BRD_REF1301 == 1)
+#elif (CFG_BRD_1301REF868 == 1)
#define CUSTOM_TX_POW_TABLE 1
const tx_pow_t tx_pow_table[TX_POW_LUT_SIZE] = {\
- { 0, 3, 8, -9},\
+ { 0, 3, 8, -9},\
{ 0, 3, 10, -6},\
{ 0, 3, 12, -3},\
- { 1, 3, 8, 0},\
- { 1, 3, 10, 4},\
- { 1, 3, 12, 7},\
- { 1, 3, 13, 8},\
- { 1, 3, 15, 9},\
- { 2, 3, 9, 10},\
+ { 1, 3, 8, 0},\
+ { 1, 3, 10, 4},\
+ { 1, 3, 12, 7},\
+ { 1, 3, 13, 8},\
+ { 1, 3, 15, 9},\
+ { 2, 3, 9, 10},\
{ 2, 3, 10, 12},\
{ 2, 3, 11, 13},\
{ 3, 3, 10, 21},\
@@ -205,6 +206,27 @@ typedef struct {
{ 3, 3, 13, 25},\
{ 3, 3, 15, 26},\
}; /* calibrated */
+#elif (CFG_BRD_1301REF433 == 1)
+ #define CUSTOM_TX_POW_TABLE 1
+ // WARNING: TABLE NO CALIBRATED, COPIED FOR 868
+ const tx_pow_t tx_pow_table[TX_POW_LUT_SIZE] = {\
+ { 0, 3, 8, -9},\
+ { 0, 3, 10, -6},\
+ { 0, 3, 12, -3},\
+ { 1, 3, 8, 0},\
+ { 1, 3, 10, 4},\
+ { 1, 3, 12, 7},\
+ { 1, 3, 13, 8},\
+ { 1, 3, 15, 9},\
+ { 2, 3, 9, 10},\
+ { 2, 3, 10, 12},\
+ { 2, 3, 11, 13},\
+ { 3, 3, 10, 21},\
+ { 3, 3, 12, 23},\
+ { 3, 3, 12, 24},\
+ { 3, 3, 13, 25},\
+ { 3, 3, 15, 26},\
+ }; /* TODO: calibration */
/* === ADD CUSTOMIZATION FOR YOUR OWN BOARD HERE ===
#elif (CFG_BRD_MYBOARD == 1)
*/
@@ -272,8 +294,10 @@ typedef struct {
#if (CFG_BRD_NANO868 == 1)
#define CFG_BRD_STR "dev_nano_868"
-#elif (CFG_BRD_REF1301 == 1)
- #define CFG_BRD_STR "ref_1301_57nf"
+#elif (CFG_BRD_1301REF868 == 1)
+ #define CFG_BRD_STR "ref_1301_868"
+#elif (CFG_BRD_1301REF433 == 1)
+ #define CFG_BRD_STR "ref_1301_433"
/* === ADD CUSTOMIZATION FOR YOUR OWN BOARD HERE ===
#elif (CFG_BRD_MYBOARD == 1)
*/
@@ -291,6 +315,7 @@ const char lgw_version_string[] = "Version: " LIBLORAGW_VERSION "; Options: " CF
#include "arb_fw.var" /* external definition of the variable */
#include "agc_fw.var" /* external definition of the variable */
+#include "cal_fw.var" /* external definition of the variable */
/*
The following static variables are the configuration set that the user can
@@ -319,6 +344,12 @@ static bool lora_rx_ppm_offset;
static uint8_t fsk_rx_bw; /* bandwidth setting of FSK modem */
static uint32_t fsk_rx_dr; /* FSK modem datarate in bauds */
+/* TX I/Q imbalance coefficients for mixer gain = 8 to 15 */
+static int8_t cal_offset_a_i[8]; /* TX I offset for radio A */
+static int8_t cal_offset_a_q[8]; /* TX Q offset for radio A */
+static int8_t cal_offset_b_i[8]; /* TX I offset for radio B */
+static int8_t cal_offset_b_q[8]; /* TX Q offset for radio B */
+
/* -------------------------------------------------------------------------- */
/* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */
@@ -828,6 +859,10 @@ int lgw_start(void) {
int32_t read_val;
uint8_t load_val;
+ uint8_t cal_cmd;
+ uint16_t cal_time;
+ uint8_t cal_status;
+
if (lgw_is_started == true) {
DEBUG_MSG("Note: LoRa concentrator already started, restarting it now\n");
}
@@ -841,13 +876,13 @@ int lgw_start(void) {
/* reset the registers (also shuts the radios down) */
lgw_soft_reset();
- /* Ungate clocks (gated by default) */
+ /* ungate clocks (gated by default) */
lgw_reg_w(LGW_GLOBAL_EN, 1);
/* switch on and reset the radios (also starts the 32 MHz XTAL) */
lgw_reg_w(LGW_RADIO_A_EN,1);
lgw_reg_w(LGW_RADIO_B_EN,1);
- wait_ms(500);
+ wait_ms(500); /* TODO: optimize */
lgw_reg_w(LGW_RADIO_RST,1);
wait_ms(5);
lgw_reg_w(LGW_RADIO_RST,0);
@@ -856,15 +891,97 @@ int lgw_start(void) {
setup_sx125x(0, rf_rx_freq[0]);
setup_sx125x(1, rf_rx_freq[1]);
- /* TODO load the calibration firmware and wait for calibration to end */
+ /* select calibration command */
+ cal_cmd = 0;
+ cal_cmd |= rf_enable[0] ? 0x01 : 0x00; /* Bit 0: Calibrate Rx IQ mismatch compensation on radio A */
+ cal_cmd |= rf_enable[1] ? 0x02 : 0x00; /* Bit 1: Calibrate Rx IQ mismatch compensation on radio B */
+ cal_cmd |= (rf_enable[0] && rf_tx_enable[0]) ? 0x04 : 0x00; /* Bit 2: Calibrate Tx DC offset on radio A */
+ cal_cmd |= (rf_enable[1] && rf_tx_enable[1]) ? 0x08 : 0x00; /* Bit 3: Calibrate Tx DC offset on radio B */
+ cal_cmd |= 0x10; /* Bit 4: 0: calibrate with DAC gain=2, 1: with DAC gain=3 (use 3) */
+
+ #if (CFG_RADIO_1257 == 1)
+ cal_cmd |= 0x00; /* Bit 5: 0: SX1257, 1: SX1255 */
+ #elif (CFG_RADIO_1255 == 1)
+ cal_cmd |= 0x20; /* Bit 5: 0: SX1257, 1: SX1255 */
+ #endif
+
+ #if ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1))
+ cal_cmd |= 0x00; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */
+ cal_time = 2300; /* measured between 2.1 and 2.2 sec, because 1 TX only */
+ #elif (CFG_BRD_NANO868 == 1)
+ cal_cmd |= 0x40; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */
+ cal_time = 5200; /* measured between 5.0 and 5.1 sec */
+ #else
+ cal_cmd |= 0xC0; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */
+ cal_time = 4200; /* measured between 4.0 and 4.1 sec */
+ #endif
+
+ /* Load the calibration firmware */
+ load_firmware(MCU_AGC, cal_firmware, MCU_AGC_FW_BYTE);
+ lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL,0); /* gives to AGC MCU the control of the radios */
+ lgw_reg_w(LGW_RADIO_SELECT,cal_cmd); /* send calibration configuration word */
+ lgw_reg_w(LGW_MCU_RST_1,0);
+ lgw_reg_w(LGW_PAGE_REG,3); /* Calibration will start on this condition as soon as MCU can talk to concentrator registers */
+ lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,0); /* Give control of concentrator registers to MCU */
+
+ /* Wait for calibration to end */
+ DEBUG_PRINTF("Note: calibration started (time: %u ms)\n", cal_time);
+ wait_ms(cal_time); /* Wait for end of calibration */
+ lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,1); /* Take back control */
+
+ /* Get calibration status */
+ lgw_reg_r(LGW_MCU_AGC_STATUS, &read_val);
+ cal_status = (uint8_t)read_val;
+ /*
+ bit 7: calibration finished
+ bit 0: could access SX1301 registers
+ bit 1: could access radio A registers
+ bit 2: could access radio B registers
+ bit 3: radio A RX image rejection successful
+ bit 4: radio B RX image rejection successful
+ bit 5: radio A TX imbalance correction successful
+ bit 6: radio B TX imbalance correction successful
+ */
+ if ((cal_status & 0x81) != 0x81) {
+ DEBUG_PRINTF("ERROR: CALIBRATION FAILURE (STATUS = %u)\n", cal_status);
+ return LGW_HAL_ERROR;
+ } else {
+ DEBUG_PRINTF("Note: calibration finished (status = %u)\n", cal_status);
+ }
+ if (rf_enable[0] && ((cal_status & 0x02) == 0)) {
+ DEBUG_MSG("WARNING: calibration could not access radio A\n");
+ }
+ if (rf_enable[1] && ((cal_status & 0x04) == 0)) {
+ DEBUG_MSG("WARNING: calibration could not access radio B\n");
+ }
+ if (rf_enable[0] && ((cal_status & 0x08) == 0)) {
+ DEBUG_MSG("WARNING: problem in calibration of radio A for image rejection\n");
+ }
+ if (rf_enable[1] && ((cal_status & 0x10) == 0)) {
+ DEBUG_MSG("WARNING: problem in calibration of radio B for image rejection\n");
+ }
+ if (rf_enable[0] && rf_tx_enable[0] && ((cal_status & 0x20) == 0)) {
+ DEBUG_MSG("WARNING: problem in calibration of radio A for TX imbalance\n");
+ }
+ if (rf_enable[1] && rf_tx_enable[1] && ((cal_status & 0x40) == 0)) {
+ DEBUG_MSG("WARNING: problem in calibration of radio B for TX imbalance\n");
+ }
- /* in the absence of calibration firmware, do a "manual" calibration */
- lgw_reg_w(LGW_TX_OFFSET_I,10);
- lgw_reg_w(LGW_TX_OFFSET_Q,5);
- lgw_reg_w(LGW_IQ_MISMATCH_A_AMP_COEFF,63);
- lgw_reg_w(LGW_IQ_MISMATCH_A_PHI_COEFF,9);
- lgw_reg_w(LGW_IQ_MISMATCH_B_AMP_COEFF,0);
- lgw_reg_w(LGW_IQ_MISMATCH_B_PHI_COEFF,0);
+ /* Get TX DC offset values */
+ for(i=0; i<=7; ++i) {
+ lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xA0+i);
+ lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val);
+ cal_offset_a_i[i] = (int8_t)read_val;
+ lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xA8+i);
+ lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val);
+ cal_offset_a_q[i] = (int8_t)read_val;
+ lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xB0+i);
+ lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val);
+ cal_offset_b_i[i] = (int8_t)read_val;
+ lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xB8+i);
+ lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val);
+ cal_offset_b_q[i] = (int8_t)read_val;
+ }
/* load adjusted parameters */
lgw_constant_adjust();
@@ -988,9 +1105,9 @@ int lgw_start(void) {
#if (CUSTOM_TX_POW_TABLE == 1)
DEBUG_MSG("Info: loading custom TX gain table\n");
for(i=0; i<TX_POW_LUT_SIZE; ++i) {
- load_val = tx_pow_table[i].mix_gain + (16 * tx_pow_table[i].dac_gain) + (64 * tx_pow_table[i].pa_gain);
- lgw_reg_w(LGW_RADIO_SELECT,1); /* 1 = start a transaction */
+ lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT); /* start a transaction */
wait_ms(1);
+ load_val = tx_pow_table[i].mix_gain + (16 * tx_pow_table[i].dac_gain) + (64 * tx_pow_table[i].pa_gain);
lgw_reg_w(LGW_RADIO_SELECT, load_val);
wait_ms(1);
lgw_reg_r(LGW_MCU_AGC_STATUS, &read_val);
@@ -1000,9 +1117,9 @@ int lgw_start(void) {
}
}
#else
- load_val = 2; /* 2 = abort LUT update */
- lgw_reg_w(LGW_RADIO_SELECT,1); /* 1 = start a transaction */
+ lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT); /* start a transaction */
wait_ms(1);
+ load_val = AGC_CMD_ABORT;
lgw_reg_w(LGW_RADIO_SELECT, load_val);
wait_ms(1);
DEBUG_MSG("Info: TX gain LUT update skipped, using default LUT\n");
@@ -1013,7 +1130,14 @@ int lgw_start(void) {
}
#endif
- lgw_reg_w(LGW_RADIO_SELECT,1);
+ /* Load chan_select firmware option */
+ lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT);
+ wait_ms(1);
+ lgw_reg_w(LGW_RADIO_SELECT, 0);
+ wait_ms(1);
+
+ /* End AGC firmware init and check status */
+ lgw_reg_w(LGW_RADIO_SELECT, AGC_CMD_WAIT);
wait_ms(1);
lgw_reg_w(LGW_RADIO_SELECT, radio_select); /* Load intended value of RADIO_SELECT */
wait_ms(1);
@@ -1030,6 +1154,13 @@ int lgw_start(void) {
/* enable LEDs */
lgw_reg_w(LGW_GPIO_MODE,31);
// lgw_reg_w(LGW_GPIO_SELECT_OUTPUT,0); /* default 0 */
+ /* LED table :
+ DGPIO0 -> packets waiting in the RX FIFO, ready to be fetched
+ DGPIO1 -> multi-SF RX LoRa modems activity (channels 0 to 7)
+ DGPIO2 -> stand-alone RX LoRa modem activity (channel 8))
+ DGPIO3 -> FSK RX modem activity (channel 9)
+ DGPIO4 -> TX modem active (either LoRa or FSK)
+ */
lgw_is_started = true;
return LGW_HAL_SUCCESS;
@@ -1102,6 +1233,7 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) {
p->if_chain = buff[sz+0];
ifmod = ifmod_config[p->if_chain];
DEBUG_PRINTF("[%d %d]\n", p->if_chain, ifmod);
+ p->rssi = (float)buff[sz+5] - RSSI_BOARD_OFFSET;
if ((ifmod == IF_LORA_MULTI) || (ifmod == IF_LORA_STD)) {
DEBUG_MSG("Note: LoRa packet\n");
@@ -1127,10 +1259,8 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) {
p->snr_min = ((float)((int8_t)buff[sz+3]))/4;
p->snr_max = ((float)((int8_t)buff[sz+4]))/4;
if (ifmod == IF_LORA_MULTI) {
- p->rssi = RSSI_OFFSET_LORA_MULTI + (float)buff[sz+5];
p->bandwidth = BW_125KHZ; /* fixed in hardware */
} else {
- p->rssi = RSSI_OFFSET_LORA_STD + (float)buff[sz+5];
p->bandwidth = lora_rx_bw; /* get the parameter from the config variable */
}
sf = (buff[sz+1] >> 4) & 0x0F;
@@ -1198,6 +1328,12 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) {
timestamp_correction = 0;
DEBUG_MSG("WARNING: invalid packet, no timestamp correction\n");
}
+
+ /* RSSI correction */
+ if (ifmod == IF_LORA_MULTI) {
+ p->rssi -= RSSI_MULTI_BIAS;
+ }
+
} else if (ifmod == IF_FSK_STD) {
DEBUG_MSG("Note: FSK packet\n");
switch(stat_fifo & 0x07) {
@@ -1207,7 +1343,6 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) {
default: p->status = STAT_UNDEFINED;
}
p->modulation = MOD_FSK;
- p->rssi = (RSSI_OFFSET_FSK + (float)buff[sz+5])/RSSI_SLOPE_FSK;
p->snr = -128.0;
p->snr_min = -128.0;
p->snr_max = -128.0;
@@ -1215,6 +1350,10 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) {
p->datarate = fsk_rx_dr;
p->coderate = CR_UNDEFINED;
timestamp_correction = 0; // TODO: implement FSK timestamp correction
+
+ /* RSSI correction */
+ p->rssi -= RSSI_FSK_BIAS;
+ p->rssi = ((p->rssi - RSSI_FSK_REF) * RSSI_FSK_SLOPE) + RSSI_FSK_REF;
} else {
DEBUG_MSG("ERROR: UNEXPECTED PACKET ORIGIN\n");
p->status = STAT_UNDEFINED;
@@ -1255,6 +1394,7 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) {
int transfer_size = 0; /* data to transfer from host to TX databuffer */
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 */
/* check if the concentrator is running */
if (lgw_is_started == false) {
@@ -1330,6 +1470,18 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) {
}
}
+ /* loading TX imbalance correction */
+ target_mix_gain = tx_pow_table[pow_index].mix_gain;
+ target_mix_gain = (target_mix_gain < 8)? 8 : target_mix_gain;
+ target_mix_gain = (target_mix_gain > 15)? 15 : target_mix_gain;
+ if (pkt_data.rf_chain == 0) { /* use radio A calibration table */
+ lgw_reg_w(LGW_TX_OFFSET_I, cal_offset_a_i[target_mix_gain - 8]);
+ lgw_reg_w(LGW_TX_OFFSET_Q, cal_offset_a_q[target_mix_gain - 8]);
+ } else { /* use radio B calibration table */
+ lgw_reg_w(LGW_TX_OFFSET_I, cal_offset_b_i[target_mix_gain - 8]);
+ lgw_reg_w(LGW_TX_OFFSET_Q, cal_offset_b_q[target_mix_gain - 8]);
+ }
+
/* fixed metadata, useful payload and misc metadata compositing */
transfer_size = TX_METADATA_NB + pkt_data.size; /* */
payload_offset = TX_METADATA_NB; /* start the payload just after the metadata */
diff --git a/libloragw/tst/test_loragw_hal.c b/libloragw/tst/test_loragw_hal.c
index 2cc30d4..b7b8962 100644
--- a/libloragw/tst/test_loragw_hal.c
+++ b/libloragw/tst/test_loragw_hal.c
@@ -43,21 +43,21 @@ Maintainer: Sylvain Miermont
/* --- PRIVATE CONSTANTS ---------------------------------------------------- */
#if ((CFG_BAND_868 == 1) || ((CFG_BAND_FULL == 1) && (CFG_RADIO_1257 == 1)))
- #define F_RX_0 866000000
- #define F_RX_1 868000000
- #define F_TX 867000000
+ #define F_RX_0 868500000
+ #define F_RX_1 869500000
+ #define F_TX 869000000
#elif (CFG_BAND_915 == 1)
- #define F_RX_0 914000000
- #define F_RX_1 916000000
+ #define F_RX_0 914500000
+ #define F_RX_1 915500000
#define F_TX 915000000
#elif ((CFG_BAND_470 == 1) || ((CFG_BAND_FULL == 1) && (CFG_RADIO_1255 == 1)))
- #define F_RX_0 471000000
- #define F_RX_1 473000000
+ #define F_RX_0 471500000
+ #define F_RX_1 472500000
#define F_TX 472000000
#elif (CFG_BAND_433 == 1)
#define F_RX_0 433500000
- #define F_RX_1 434300000
- #define F_TX 433900000
+ #define F_RX_1 434500000
+ #define F_TX 434000000
#endif
/* -------------------------------------------------------------------------- */
diff --git a/readme.md b/readme.md
index b830e37..418cf57 100644
--- a/readme.md
+++ b/readme.md
@@ -56,6 +56,14 @@ gateways as receivers.
3. Changelog
-------------
+### v1.4.0 ###
+
+* Added calibration routine to optimize RF performance
+* Added support for SX1301 433 MHz reference board
+* Improved AGC firmware
+* Improved RSSI accuracy
+* Improved utilities Makefile
+
### v1.3.0 ###
* Added TX power management.
diff --git a/util_band_survey/Makefile b/util_band_survey/Makefile
index 4597ad4..4371fc0 100644
--- a/util_band_survey/Makefile
+++ b/util_band_survey/Makefile
@@ -43,10 +43,17 @@ clean:
rm -f obj/*.o
rm -f $(APP_NAME)
-### HAL library
+### HAL library (do no force multiple library rebuild even with 'make -B')
+
+$(LGW_PATH)/inc/config.h:
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
$(LGW_PATH)/libloragw.a: $(LGW_INC)
- $(MAKE) all -C $(LGW_PATH)
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
### Main program compilation and assembly
diff --git a/util_pkt_logger/Makefile b/util_pkt_logger/Makefile
index 2c99dde..af6ac37 100644
--- a/util_pkt_logger/Makefile
+++ b/util_pkt_logger/Makefile
@@ -42,10 +42,17 @@ clean:
rm -f $(APP_NAME)
find . -name global_conf.json -exec rm -i {} \;
-### HAL library
+### HAL library (do no force multiple library rebuild even with 'make -B')
+
+$(LGW_PATH)/inc/config.h:
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
$(LGW_PATH)/libloragw.a: $(LGW_INC)
- $(MAKE) all -C $(LGW_PATH)
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
### Sub-modules compilation
diff --git a/util_spi_stress/Makefile b/util_spi_stress/Makefile
index 14cc8cb..94e6cc4 100644
--- a/util_spi_stress/Makefile
+++ b/util_spi_stress/Makefile
@@ -41,10 +41,17 @@ clean:
rm -f obj/*.o
rm -f $(APP_NAME)
-### HAL library
+### HAL library (do no force multiple library rebuild even with 'make -B')
+
+$(LGW_PATH)/inc/config.h:
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
$(LGW_PATH)/libloragw.a: $(LGW_INC)
- $(MAKE) all -C $(LGW_PATH)
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
### Main program compilation and assembly
diff --git a/util_tx_test/Makefile b/util_tx_test/Makefile
index 2c457e7..f1b50a8 100644
--- a/util_tx_test/Makefile
+++ b/util_tx_test/Makefile
@@ -42,10 +42,17 @@ clean:
rm -f obj/*.o
rm -f $(APP_NAME)
-### HAL library
+### HAL library (do no force multiple library rebuild even with 'make -B')
+
+$(LGW_PATH)/inc/config.h:
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
$(LGW_PATH)/libloragw.a: $(LGW_INC)
- $(MAKE) all -C $(LGW_PATH)
+ @if test ! -f $@; then \
+ $(MAKE) all -C $(LGW_PATH); \
+ fi
### Main program compilation and assembly