summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiano Barezzi <barezzisebastiano@gmail.com>2020-11-23 19:36:19 +0100
committerSebastiano Barezzi <barezzisebastiano@gmail.com>2021-03-12 21:12:12 +0100
commit40ec6194de378a84ee0e93a98cbd8af9bb7850ef (patch)
tree6b63daa1c24ad684bcef014c3929461e1f410b4a
parent21b0850786a301ddae3b01ef71d7ec8de1c65bda (diff)
drivers: touchscreen: Import platina drivers
* From nitrogen-q-oss Change-Id: Ib7e86526d81daebdb731922205e1d3e430319c94
-rw-r--r--drivers/input/touchscreen/Kconfig30
-rw-r--r--drivers/input/touchscreen/Makefile3
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/Kconfig16
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/Makefile17
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h161
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h226
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c2314
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h283
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c554
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c1040
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c381
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c1783
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h171
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile7
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c172
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c606
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c242
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c135
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile12
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c1526
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h425
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c1903
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h108
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c431
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h56
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile6
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c968
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore1
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i6304
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i4774
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i0
-rw-r--r--drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i233
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/Makefile7
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c2626
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h225
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c1070
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c1136
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h233
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c1882
-rw-r--r--drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h1154
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig113
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/Makefile17
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c3878
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h681
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c708
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c567
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c536
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c603
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c900
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c2262
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c684
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c2046
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h418
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c1355
-rw-r--r--drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c975
-rw-r--r--firmware/Makefile2
-rw-r--r--firmware/novatek_nt36672_d2t.fw.ihex7426
-rw-r--r--firmware/synaptics_boe_4320.fw.ihex7447
-rw-r--r--include/linux/input/synaptics_tcm.h11
59 files changed, 63850 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 7d4f3a0823ae..08732d7894bf 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -27,6 +27,9 @@ source "drivers/input/touchscreen/synaptics_dsx_e7s/Kconfig"
source "drivers/input/touchscreen/nvt_touch_f7a/Kconfig"
source "drivers/input/touchscreen/synaptics_tcm_f7a/Kconfig"
+source "drivers/input/touchscreen/focal_ft8719_d2t/Kconfig"
+source "drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig"
+
config OF_TOUCHSCREEN
def_tristate INPUT
depends on INPUT
@@ -1187,6 +1190,18 @@ config TOUCHSCREEN_NVT_F7A
To compile this driver as a module, choose M here: the
module will be called nvt.
+config TOUCHSCREEN_NVT_D2T
+ tristate "novatek touchscreens"
+ help
+ Say Y here if you have a nvt touchscreen.
+ nvt controllers are multi touch controllers which can
+ report 5 touches at a time.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called nvt.
+
config TOUCHSCREEN_ROHM_BU21023
tristate "ROHM BU21023/24 Dual touch support resistive touchscreens"
depends on I2C
@@ -1282,6 +1297,14 @@ config TOUCHSCREEN_COMMON
If unsure, say N.
+config TOUCHSCREEN_FOCAL_FT8719_D2T
+ bool "Focaltech Touchscreen"
+ depends on I2C
+ default n
+ help
+ Say Y here if you have Focaltech touch panel.
+ If unsure, say N.
+
config TOUCHSCREEN_FOCAL_FT8719_E7T
bool "Focaltech Touchscreen"
depends on I2C
@@ -1290,6 +1313,13 @@ config TOUCHSCREEN_FOCAL_FT8719_E7T
Say Y here if you have Focaltech touch panel.
If unsure, say N.
+config TOUCHSCREEN_SYNAPTICS_TCM_D2T
+ bool "Synaptics TCM touchscreen"
+ default n
+ help
+ Say Y here, if you have a Synaptics TCM touchscreen connected.
+ If unsure, say N.
+
config TOUCHSCREEN_SYNAPTICS_TCM_F7A
bool "Synaptics TCM touchscreen"
default n
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index a46bfb9b9b10..17656ed03dd3 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -70,11 +70,14 @@ obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o
obj-$(CONFIG_TOUCHSCREEN_SUN4I) += sun4i-ts.o
obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_v21) += synaptics_dsx/
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T) += synaptics_tcm_d2t/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_F7A) += synaptics_tcm_f7a/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_dsx_force/
obj-$(CONFIG_TOUCHSCREEN_NVT_D2S) += nvt_touch_d2s/
+obj-$(CONFIG_TOUCHSCREEN_FOCAL_FT8719_D2T) += focal_ft8719_d2t/
obj-$(CONFIG_TOUCHSCREEN_FOCAL_FT8719_E7T) += focal_ft8719_e7t/
obj-$(CONFIG_TOUCHSCREEN_NVT_A) += nvt_touch_a/
+obj-$(CONFIG_TOUCHSCREEN_NVT_D2T) += nvt_touch_d2t/
obj-$(CONFIG_TOUCHSCREEN_NVT_F7A) += nvt_touch_f7a/
obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o
obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig b/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig
new file mode 100644
index 000000000000..e1ec3b91202e
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/Kconfig
@@ -0,0 +1,16 @@
+#
+# Focaltech Touchscreen driver configuration
+#
+
+config TOUCHSCREEN_FTS
+ bool "Focaltech Touchscreen"
+ depends on I2C
+ default n
+ help
+ Say Y here if you have Focaltech touch panel.
+ If unsure, say N.
+
+config TOUCHSCREEN_FTS_DIRECTORY
+ string "Focaltech ts directory name"
+ default "focaltech_touch"
+ depends on TOUCHSCREEN_FTS
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/Makefile
new file mode 100644
index 000000000000..66acd75cfa30
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/Makefile
@@ -0,0 +1,17 @@
+#
+# Makefile for the focaltech touchscreen drivers.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_core.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_fun.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_mode.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_gesture.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_esdcheck.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_i2c.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_point_report_check.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash/
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test/
+
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h
new file mode 100644
index 000000000000..0caaca4de5ae
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_common.h
@@ -0,0 +1,161 @@
+/*
+ *
+ * FocalTech fts TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+/*****************************************************************************
+*
+* File Name: focaltech_common.h
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-16
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+#ifndef __LINUX_FOCALTECH_COMMON_H__
+#define __LINUX_FOCALTECH_COMMON_H__
+
+#include "focaltech_config.h"
+
+/*****************************************************************************
+* Macro definitions using #define
+*****************************************************************************/
+#define FTS_DRIVER_VERSION "Focaltech V2.1 20171229"
+
+#define BYTE_OFF_0(x) (u8)((x) & 0xFF)
+#define BYTE_OFF_8(x) (u8)((x >> 8) & 0xFF)
+#define BYTE_OFF_16(x) (u8)((x >> 16) & 0xFF)
+#define BYTE_OFF_24(x) (u8)((x >> 24) & 0xFF)
+#define FLAGBIT(x) (0x00000001 << (x))
+#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x))
+
+#define FLAG_ICSERIALS_LEN 8
+#define FLAG_HID_BIT 10
+#define FLAG_IDC_BIT 11
+
+#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
+#define IC_TO_SERIALS(x) ((x) & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
+#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT))
+#define FTS_HID_SUPPORTTED ((FTS_CHIP_TYPE & FLAGBIT(FLAG_HID_BIT)) == FLAGBIT(FLAG_HID_BIT))
+
+#define FTS_CHIP_TYPE_MAPPING { {0x0D, 0x87, 0x19, 0x87, 0x19, 0x87, 0xA9, 0x87, 0xB9} }
+
+#define I2C_BUFFER_LENGTH_MAXINUM 256
+#define FILE_NAME_LENGTH 128
+#define ENABLE 1
+#define DISABLE 0
+#define VALID 1
+#define INVALID 0
+#define FTS_CMD_START1 0x55
+#define FTS_CMD_START2 0xAA
+#define FTS_CMD_START_DELAY 10
+#define FTS_CMD_READ_ID 0x90
+#define FTS_CMD_READ_ID_LEN 4
+#define FTS_CMD_READ_ID_LEN_INCELL 1
+/*register address*/
+#define FTS_REG_INT_CNT 0x8F
+#define FTS_REG_FLOW_WORK_CNT 0x91
+#define FTS_REG_WORKMODE 0x00
+#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40
+#define FTS_REG_WORKMODE_WORK_VALUE 0x00
+#define FTS_REG_DYNAMIC_EGDE_RESTRAIN 0X8C
+#define FTS_REG_ESDCHECK_DISABLE 0x8D
+#define FTS_REG_CHIP_ID 0xA3
+#define FTS_REG_CHIP_ID2 0x9F
+#define FTS_REG_POWER_MODE 0xA5
+#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03
+#define FTS_REG_FW_VER 0xA6
+#define FTS_REG_VENDOR_ID 0xA8
+#define FTS_REG_LCD_BUSY_NUM 0xAB
+#define FTS_REG_FACE_DEC_MODE_EN 0xB0
+#define FTS_REG_FACE_DEC_MODE_STATUS 0x01
+#define FTS_REG_IDE_PARA_VER_ID 0xB5
+#define FTS_REG_IDE_PARA_STATUS 0xB6
+#define FTS_REG_GLOVE_MODE_EN 0xC0
+#define FTS_REG_COVER_MODE_EN 0xC1
+#define FTS_REG_CHARGER_MODE_EN 0x8B
+#define FTS_REG_GESTURE_EN 0xD0
+#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3
+#define FTS_REG_MODULE_ID 0xE3
+#define FTS_REG_LIC_VER 0xE4
+#define FTS_REG_ESD_SATURATE 0xED
+
+#define FTS_SYSFS_ECHO_ON(buf) (buf[0] == '1')
+#define FTS_SYSFS_ECHO_OFF(buf) (buf[0] == '0')
+
+#define kfree_safe(pbuf) do {\
+ if (pbuf) {\
+ kfree(pbuf);\
+ pbuf = NULL;\
+ } \
+} while (0)
+
+/*****************************************************************************
+* Alternative mode (When something goes wrong, the modules may be able to solve the problem.)
+*****************************************************************************/
+/*
+ * point report check
+ * default: disable
+ */
+#define FTS_POINT_REPORT_CHECK_EN 0
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+struct ft_chip_t {
+ u64 type;
+ u8 chip_idh;
+ u8 chip_idl;
+ u8 rom_idh;
+ u8 rom_idl;
+ u8 pb_idh;
+ u8 pb_idl;
+ u8 bl_idh;
+ u8 bl_idl;
+};
+
+struct ts_ic_info {
+ bool is_incell;
+ bool hid_supported;
+ struct ft_chip_t ids;
+};
+
+/*****************************************************************************
+* DEBUG function define here
+*****************************************************************************/
+#if FTS_DEBUG_EN
+#define FTS_DEBUG_LEVEL 1
+#if (FTS_DEBUG_LEVEL == 2)
+#define FTS_DEBUG(fmt, args...) printk("[FTS][%s]"fmt"\n", __func__, ##args)
+#else
+#define FTS_DEBUG(fmt, args...) printk("[FTS]"fmt"\n", ##args)
+#endif
+#define FTS_FUNC_ENTER() printk("[FTS]%s: Enter\n", __func__)
+#define FTS_FUNC_EXIT() printk("[FTS]%s: Exit(%d)\n", __func__, __LINE__)
+#else /* #if FTS_DEBUG_EN */
+#define FTS_DEBUG(fmt, args...)
+#define FTS_FUNC_ENTER()
+#define FTS_FUNC_EXIT()
+#endif
+
+#define FTS_INFO(fmt, args...) printk(KERN_INFO "[FTS][Info]"fmt"\n", ##args)
+#define FTS_ERROR(fmt, args...) printk(KERN_ERR "[FTS][Error]"fmt"\n", ##args)
+
+#endif /* __LINUX_FOCALTECH_COMMON_H__ */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h
new file mode 100644
index 000000000000..975adc6ead33
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_config.h
@@ -0,0 +1,226 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+/************************************************************************
+*
+* File Name: focaltech_config.h
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract: global configurations
+*
+* Version: v1.0
+*
+************************************************************************/
+#ifndef _LINUX_FOCLATECH_CONFIG_H_
+#define _LINUX_FOCLATECH_CONFIG_H_
+
+/**************************************************/
+/****** G: A, I: B, S: C, U: D ******************/
+/****** chip type defines, do not modify *********/
+#define _FT8716 0x87160805
+#define _FT8736 0x87360806
+#define _FT8006M 0x80060807
+#define _FT8201 0x82010807
+#define _FT7250 0x72500807
+#define _FT8606 0x86060808
+#define _FT8607 0x86070809
+#define _FTE716 0xE716080A
+#define _FT8006U 0x8006D80B
+#define _FT8613 0x8613080C
+#define _FT8719 0x8719080D
+
+#define _FT5416 0x54160402
+#define _FT5426 0x54260402
+#define _FT5435 0x54350402
+#define _FT5436 0x54360402
+#define _FT5526 0x55260402
+#define _FT5526I 0x5526B402
+#define _FT5446 0x54460402
+#define _FT5346 0x53460402
+#define _FT5446I 0x5446B402
+#define _FT5346I 0x5346B402
+#define _FT7661 0x76610402
+#define _FT7511 0x75110402
+#define _FT7421 0x74210402
+#define _FT7681 0x76810402
+#define _FT3C47U 0x3C47D402
+#define _FT3417 0x34170402
+#define _FT3517 0x35170402
+#define _FT3327 0x33270402
+#define _FT3427 0x34270402
+#define _FT7311 0x73110402
+
+#define _FT5626 0x56260401
+#define _FT5726 0x57260401
+#define _FT5826B 0x5826B401
+#define _FT5826S 0x5826C401
+#define _FT7811 0x78110401
+#define _FT3D47 0x3D470401
+#define _FT3617 0x36170401
+#define _FT3717 0x37170401
+#define _FT3817B 0x3817B401
+#define _FT3517U 0x3517D401
+
+#define _FT6236U 0x6236D003
+#define _FT6336G 0x6336A003
+#define _FT6336U 0x6336D003
+#define _FT6436U 0x6436D003
+
+#define _FT3267 0x32670004
+#define _FT3367 0x33670004
+#define _FT5422U 0x5422D482
+#define _FT3327DQQ_001 0x3327D482
+
+/*************************************************/
+
+/*
+ * choose your ic chip type of focaltech
+ */
+#define FTS_CHIP_TYPE _FT8719
+
+/******************* Enables *********************/
+/*********** 1 to enable, 0 to disable ***********/
+
+/*
+ * show debug log info
+ * enable it for debug, disable it for release
+ */
+#define FTS_DEBUG_EN 1
+
+/*
+ * Linux MultiTouch Protocol
+ * 1: Protocol B(default), 0: Protocol A
+ */
+#define FTS_MT_PROTOCOL_B_EN 1
+
+/*
+ * Report Pressure in multitouch
+ * 1:enable(default),0:disable
+*/
+#define FTS_REPORT_PRESSURE_EN 1
+
+/*
+ * Gesture function enable
+ * default: disable
+ */
+#define FTS_GESTURE_EN 1
+
+/*
+ * ESD check & protection
+ * default: disable
+ */
+#define FTS_ESDCHECK_EN 0
+
+/*
+ * Production test enable
+ * 1: enable, 0:disable(default)
+ */
+#define FTS_TEST_EN 1
+
+/*
+ * Glove mode enable
+ * 1: enable, 0:disable(default)
+ */
+#define FTS_GLOVE_EN 0
+/*
+ * cover enable
+ * 1: enable, 0:disable(default)
+ */
+#define FTS_COVER_EN 0
+/*
+ * Charger enable
+ * 1: enable, 0:disable(default)
+ */
+#define FTS_CHARGER_EN 0
+
+/*
+ * Nodes for tools, please keep enable
+ */
+#define FTS_SYSFS_NODE_EN 1
+#define FTS_APK_NODE_EN 1
+
+/*
+ * Pinctrl enable
+ * default: disable
+ */
+#define FTS_PINCTRL_EN 1
+
+/*
+ * Customer power enable
+ * enable it when customer need control TP power
+ * default: disable
+ */
+#define FTS_POWER_SOURCE_CUST_EN 1
+
+/****************************************************/
+
+/********************** Upgrade ****************************/
+/*
+ * auto upgrade, please keep enable
+ */
+#define FTS_AUTO_UPGRADE_EN 1
+
+/*
+ * auto upgrade for lcd cfg
+ */
+#define FTS_AUTO_LIC_UPGRADE_EN 0
+
+/*
+ * Check vendor_id number
+ * 0:No check vendor_id (default)
+ * 1/2/3: Check vendor_id for vendor compatibility
+ */
+#define FTS_GET_VENDOR_ID_NUM 0
+
+/*
+ * vendor_id(s) for vendor(s) to be compatible with.
+ * a confirmation of vendor_id(s) is recommended.
+ * FTS_VENDOR_ID = PANEL_ID << 8 + VENDOR_ID
+ * FTS_GET_VENDOR_ID_NUM == 0/1, no check vendor id, you may ignore them
+ * FTS_GET_VENDOR_ID_NUM > 1, compatible with FTS_VENDOR_ID
+ * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_ID2
+ * FTS_GET_VENDOR_ID_NUM >= 3, compatible with FTS_VENDOR_ID3
+ */
+#define FTS_VENDOR_ID 0x0000
+#define FTS_VENDOR_ID2 0x0000
+#define FTS_VENDOR_ID3 0x0000
+
+/*
+ * FW.i file for auto upgrade, you must replace it with your own
+ * define your own fw_file, the sample one to be replaced is invalid
+ * NOTE: if FTS_GET_VENDOR_ID_NUM > 1, it's the fw corresponding with FTS_VENDOR_ID
+ */
+#define FTS_UPGRADE_FW_FILE "include/firmware/fw_ft8719_d2t.i"
+
+/*
+ * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_ID2
+ * define your own fw_file, the sample one is invalid
+ */
+#define FTS_UPGRADE_FW2_FILE "include/firmware/fw_sample.i"
+
+/*
+ * if FTS_GET_VENDOR_ID_NUM >= 3, fw corrsponding with FTS_VENDOR_ID3
+ * define your own fw_file, the sample one is invalid
+ */
+#define FTS_UPGRADE_FW3_FILE "include/firmware/fw_sample.i"
+
+/*********************************************************/
+
+#endif /* _LINUX_FOCLATECH_CONFIG_H_ */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c
new file mode 100644
index 000000000000..66920a465142
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.c
@@ -0,0 +1,2314 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+/*****************************************************************************
+*
+* File Name: focaltech_core.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract: entrance for focaltech ts driver
+*
+* Version: V1.0
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+#include <linux/notifier.h>
+#include <linux/fb.h>
+#ifdef CONFIG_DRM
+#include <drm/drm_notifier.h>
+#include <drm/drm_panel.h>
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+#include <linux/earlysuspend.h>
+#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */
+#endif
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define FTS_DRIVER_NAME "fts_ts"
+#define INTERVAL_READ_REG 100 /* unit:ms */
+#define TIMEOUT_READ_REG 1000 /* unit:ms */
+#if FTS_POWER_SOURCE_CUST_EN
+#define FTS_VTG_MIN_UV 2600000
+#define FTS_VTG_MAX_UV 3300000
+#define FTS_I2C_VTG_MIN_UV 1800000
+#define FTS_I2C_VTG_MAX_UV 1800000
+#endif
+
+#define INPUT_EVENT_START 0
+#define INPUT_EVENT_SENSITIVE_MODE_OFF 0
+#define INPUT_EVENT_SENSITIVE_MODE_ON 1
+#define INPUT_EVENT_STYLUS_MODE_OFF 2
+#define INPUT_EVENT_STYLUS_MODE_ON 3
+#define INPUT_EVENT_WAKUP_MODE_OFF 4
+#define INPUT_EVENT_WAKUP_MODE_ON 5
+#define INPUT_EVENT_COVER_MODE_OFF 6
+#define INPUT_EVENT_COVER_MODE_ON 7
+#define INPUT_EVENT_SLIDE_FOR_VOLUME 8
+#define INPUT_EVENT_DOUBLE_TAP_FOR_VOLUME 9
+#define INPUT_EVENT_SINGLE_TAP_FOR_VOLUME 10
+#define INPUT_EVENT_LONG_SINGLE_TAP_FOR_VOLUME 11
+#define INPUT_EVENT_PALM_OFF 12
+#define INPUT_EVENT_PALM_ON 13
+#define INPUT_EVENT_END 13
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+struct fts_ts_data *fts_data;
+static bool gesture_enabled_when_resume;
+static bool gesture_disabled_when_resume;
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+static void fts_release_all_finger(void);
+static int fts_ts_suspend(struct device *dev);
+static int fts_ts_resume(struct device *dev);
+static void fts_resume_work(struct work_struct *work);
+static void fts_suspend_work(struct work_struct *work);
+#ifdef CONFIG_FB
+extern void mdss_panel_reset_skip_enable(bool enable);
+extern bool mdss_panel_is_prim(void *fbinfo);
+#endif
+/*****************************************************************************
+* Name: fts_wait_tp_to_valid
+* Brief: Read chip id until TP FW become valid(Timeout: TIMEOUT_READ_REG),
+* need call when reset/power on/resume...
+* Input:
+* Output:
+* Return: return 0 if tp valid, otherwise return error code
+*****************************************************************************/
+int fts_wait_tp_to_valid(struct i2c_client *client)
+{
+ int ret = 0;
+ int cnt = 0;
+ u8 reg_value = 0;
+ u8 chip_id = fts_data->ic_info.ids.chip_idh;
+
+ do {
+ ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, &reg_value);
+ if ((ret < 0) || (reg_value != chip_id)) {
+ FTS_DEBUG("TP Not Ready, ReadData = 0x%x", reg_value);
+ } else if (reg_value == chip_id) {
+ FTS_INFO("TP Ready, Device ID = 0x%x", reg_value);
+ return 0;
+ }
+ cnt++;
+ msleep(INTERVAL_READ_REG);
+ } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG);
+
+ return -EIO;
+}
+
+/************************************************************************
+* Name: fts_get_chip_types
+* Brief: verity chip id and get chip type data
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+static int fts_get_chip_types(struct fts_ts_data *ts_data, u8 id_h, u8 id_l, bool fw_valid)
+{
+ int i = 0;
+ struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING;
+ u32 ctype_entries = sizeof(ctype) / sizeof(struct ft_chip_t);
+
+ if ((0x0 == id_h) || (0x0 == id_l)) {
+ FTS_ERROR("id_h/id_l is 0");
+ return -EINVAL;
+ }
+
+ FTS_DEBUG("verify id:0x%02x%02x", id_h, id_l);
+ for (i = 0; i < ctype_entries; i++) {
+ if (VALID == fw_valid) {
+ if ((id_h == ctype[i].chip_idh) && (id_l == ctype[i].chip_idl))
+ break;
+ } else {
+ if (((id_h == ctype[i].rom_idh) && (id_l == ctype[i].rom_idl))
+ || ((id_h == ctype[i].pb_idh) && (id_l == ctype[i].pb_idl))
+ || ((id_h == ctype[i].bl_idh) && (id_l == ctype[i].bl_idl)))
+ break;
+ }
+ }
+
+ if (i >= ctype_entries) {
+ return -ENODATA;
+ }
+
+ ts_data->ic_info.ids = ctype[i];
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_get_ic_information
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+*****************************************************************************/
+static int fts_get_ic_information(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ int cnt = 0;
+ u8 chip_id[2] = { 0 };
+ u8 id_cmd[4] = { 0 };
+ u32 id_cmd_len = 0;
+ struct i2c_client *client = ts_data->client;
+
+ ts_data->ic_info.is_incell = FTS_CHIP_IDC;
+ ts_data->ic_info.hid_supported = FTS_HID_SUPPORTTED;
+ do {
+ ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id[0]);
+ ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id[1]);
+ FTS_DEBUG("CHIP ID=: 0x%02x%02x", chip_id[0], chip_id[1]);
+ if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) {
+ FTS_DEBUG("i2c read invalid, read:0x%02x%02x", chip_id[0], chip_id[1]);
+ } else {
+ ret = fts_get_chip_types(ts_data, chip_id[0], chip_id[1], VALID);
+ if (!ret)
+ break;
+ else
+ FTS_DEBUG("TP not ready, read:0x%02x%02x", chip_id[0], chip_id[1]);
+ }
+
+ cnt++;
+ msleep(INTERVAL_READ_REG);
+ } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG);
+
+ if ((cnt * INTERVAL_READ_REG) >= TIMEOUT_READ_REG) {
+ FTS_INFO("fw is invalid, need read boot id");
+ if (ts_data->ic_info.hid_supported) {
+ fts_i2c_hid2std(client);
+ }
+
+ id_cmd[0] = FTS_CMD_START1;
+ id_cmd[1] = FTS_CMD_START2;
+ ret = fts_i2c_write(client, id_cmd, 2);
+ if (ret < 0) {
+ FTS_ERROR("start cmd write fail");
+ return ret;
+ }
+
+ msleep(FTS_CMD_START_DELAY);
+ id_cmd[0] = FTS_CMD_READ_ID;
+ id_cmd[1] = id_cmd[2] = id_cmd[3] = 0x00;
+ if (ts_data->ic_info.is_incell)
+ id_cmd_len = FTS_CMD_READ_ID_LEN_INCELL;
+ else
+ id_cmd_len = FTS_CMD_READ_ID_LEN;
+ ret = fts_i2c_read(client, id_cmd, id_cmd_len, chip_id, 2);
+ if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) {
+ FTS_ERROR("read boot id fail");
+ return -EIO;
+ }
+ ret = fts_get_chip_types(ts_data, chip_id[0], chip_id[1], INVALID);
+ if (ret < 0) {
+ FTS_ERROR("can't get ic informaton");
+ return ret;
+ }
+ }
+ ts_data->chipid = (short)(chip_id[0] << 8 | chip_id[1]);
+ FTS_INFO("get ic information, chip id = 0x%02x%02x", ts_data->ic_info.ids.chip_idh,
+ ts_data->ic_info.ids.chip_idl);
+
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_tp_state_recovery
+* Brief: Need execute this function when reset
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_tp_state_recovery(struct i2c_client *client)
+{
+ FTS_FUNC_ENTER();
+ /* wait tp stable */
+ fts_wait_tp_to_valid(client);
+ /* recover TP charger state 0x8B */
+ /* recover TP glove state 0xC0 */
+ /* recover TP cover state 0xC1 */
+ fts_ex_mode_recovery(client);
+ /* recover TP gesture state 0xD0 */
+#if FTS_GESTURE_EN
+ fts_gesture_recovery(client);
+#endif
+ FTS_FUNC_EXIT();
+}
+
+/*****************************************************************************
+* Name: fts_reset_proc
+* Brief: Execute reset operation
+* Input: hdelayms - delay time unit:ms
+* Output:
+* Return:
+*****************************************************************************/
+int fts_reset_proc(int hdelayms)
+{
+ FTS_FUNC_ENTER();
+ gpio_direction_output(fts_data->pdata->reset_gpio, 0);
+ msleep(20);
+ gpio_direction_output(fts_data->pdata->reset_gpio, 1);
+ if (hdelayms) {
+ msleep(hdelayms);
+ }
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_irq_disable
+* Brief: disable irq
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_irq_disable(void)
+{
+ unsigned long irqflags;
+
+ FTS_FUNC_ENTER();
+ spin_lock_irqsave(&fts_data->irq_lock, irqflags);
+
+ if (!fts_data->irq_disabled) {
+ disable_irq_nosync(fts_data->irq);
+ fts_data->irq_disabled = true;
+ }
+
+ spin_unlock_irqrestore(&fts_data->irq_lock, irqflags);
+ FTS_FUNC_EXIT();
+}
+
+/*****************************************************************************
+* Name: fts_irq_disable sync
+* Brief: disable irq sync
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_irq_disable_sync(void)
+{
+ FTS_FUNC_ENTER();
+
+ if (!fts_data->irq_disabled) {
+ disable_irq(fts_data->irq);
+ fts_data->irq_disabled = true;
+ }
+
+ FTS_FUNC_EXIT();
+}
+
+
+/*****************************************************************************
+* Name: fts_irq_enable
+* Brief: enable irq
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_irq_enable(void)
+{
+ unsigned long irqflags = 0;
+
+ FTS_FUNC_ENTER();
+ spin_lock_irqsave(&fts_data->irq_lock, irqflags);
+
+ if (fts_data->irq_disabled) {
+ enable_irq(fts_data->irq);
+ fts_data->irq_disabled = false;
+ }
+
+ spin_unlock_irqrestore(&fts_data->irq_lock, irqflags);
+ FTS_FUNC_EXIT();
+}
+#if FTS_POWER_SOURCE_CUST_EN
+/*****************************************************************************
+* Power Control
+*****************************************************************************/
+static int fts_power_source_init(struct fts_ts_data *data)
+{
+ int ret = 0;
+
+ FTS_FUNC_ENTER();
+
+ data->vddio = regulator_get(&data->client->dev, "vddio");
+ if (IS_ERR(data->vddio)) {
+ ret = PTR_ERR(data->vddio);
+ FTS_ERROR("get vddio regulator failed,ret=%d", ret);
+ return ret;
+ }
+
+ if (regulator_count_voltages(data->vddio) > 0) {
+ ret = regulator_set_voltage(data->vddio, FTS_I2C_VTG_MIN_UV, FTS_I2C_VTG_MAX_UV);
+ if (ret) {
+ FTS_ERROR("vdd regulator set_vddio failed ret=%d", ret);
+ goto err_set_vtg_vdd;
+ }
+ }
+
+ data->vsp = regulator_get(&data->client->dev, "lab");
+ if (IS_ERR(data->vsp)) {
+ ret = PTR_ERR(data->vsp);
+ FTS_ERROR("ret vsp regulator failed,ret=%d", ret);
+ goto err_get_vsp;
+ }
+
+ data->vsn = regulator_get(&data->client->dev, "ibb");
+ if (IS_ERR(data->vsn)) {
+ ret = PTR_ERR(data->vsn);
+ FTS_ERROR("ret vsn regulator failed,ret=%d", ret);
+ goto err_get_vsn;
+ }
+
+
+ data->i2c = regulator_get(&data->client->dev, "i2c");
+ if (IS_ERR(data->i2c)) {
+ ret = PTR_ERR(data->i2c);
+ FTS_ERROR("ret i2c regulator failed,ret=%d", ret);
+ return ret;
+ }
+
+ if (regulator_count_voltages(data->i2c) > 0) {
+ ret = regulator_set_voltage(data->i2c, FTS_I2C_VTG_MIN_UV, FTS_I2C_VTG_MAX_UV);
+ if (ret) {
+ FTS_ERROR("vdd regulator set_i2c failed ret=%d", ret);
+ goto err_set_vtg_i2c;
+ }
+ }
+ FTS_FUNC_EXIT();
+ return 0;
+
+err_get_vsn:
+ regulator_put(data->vsp);
+err_get_vsp:
+err_set_vtg_vdd:
+ regulator_put(data->vddio);
+
+err_set_vtg_i2c:
+ regulator_put(data->i2c);
+
+
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+static int fts_power_source_release(struct fts_ts_data *data)
+{
+
+ if (regulator_count_voltages(data->vddio) > 0)
+ regulator_set_voltage(data->vddio, 0, FTS_I2C_VTG_MAX_UV);
+ regulator_put(data->vddio);
+
+ regulator_put(data->vsp);
+
+ regulator_put(data->vsn);
+
+
+ if (regulator_count_voltages(data->i2c) > 0)
+ regulator_set_voltage(data->i2c, 0, FTS_I2C_VTG_MAX_UV);
+ return 0;
+}
+
+static int fts_power_source_ctrl(struct fts_ts_data *data, int enable)
+{
+ int ret = 0;
+
+ FTS_FUNC_ENTER();
+ if (enable) {
+ if (data->power_disabled) {
+
+ ret = regulator_enable(data->vddio);
+ if (ret) {
+ FTS_ERROR("enable vddio regulator failed,ret=%d", ret);
+ }
+
+ ret = regulator_enable(data->i2c);
+ if (ret) {
+ FTS_ERROR("enable i2c regulator failed,ret=%d", ret);
+ }
+
+ ret = regulator_enable(data->vsp);
+ if (ret) {
+ FTS_ERROR("enable vsp regulator failed,ret=%d", ret);
+ }
+
+ ret = regulator_enable(data->vsn);
+ if (ret) {
+ FTS_ERROR("enable vsn regulator failed,ret=%d", ret);
+ }
+
+ data->power_disabled = false;
+ }
+ } else {
+ if (!data->power_disabled) {
+
+ ret = regulator_disable(data->vsp);
+ if (ret) {
+ FTS_ERROR("disable vsp regulator failed,ret=%d", ret);
+ }
+
+ ret = regulator_disable(data->vsn);
+ if (ret) {
+ FTS_ERROR("disable vsn regulator failed,ret=%d", ret);
+ }
+
+ msleep(20);
+ ret = regulator_disable(data->vddio);
+ if (ret) {
+ FTS_ERROR("disable vddio regulator failed,ret=%d", ret);
+ }
+
+ ret = regulator_disable(data->i2c);
+ if (ret) {
+ FTS_ERROR("disable i2c regulator failed,ret=%d", ret);
+ }
+ data->power_disabled = true;
+ }
+ }
+
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+#if FTS_PINCTRL_EN
+/*****************************************************************************
+* Name: fts_pinctrl_init
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_pinctrl_init(struct fts_ts_data *ts)
+{
+ int ret = 0;
+ struct i2c_client *client = ts->client;
+
+ ts->pinctrl = devm_pinctrl_get(&client->dev);
+ if (IS_ERR_OR_NULL(ts->pinctrl)) {
+ FTS_ERROR("Failed to get pinctrl, please check dts");
+ ret = PTR_ERR(ts->pinctrl);
+ goto err_pinctrl_get;
+ }
+
+ ts->pins_active = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_active");
+ if (IS_ERR_OR_NULL(ts->pins_active)) {
+ FTS_ERROR("Pin state[active] not found");
+ ret = PTR_ERR(ts->pins_active);
+ goto err_pinctrl_lookup;
+ }
+
+ ts->pins_suspend = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_suspend");
+ if (IS_ERR_OR_NULL(ts->pins_suspend)) {
+ FTS_ERROR("Pin state[suspend] not found");
+ ret = PTR_ERR(ts->pins_suspend);
+ goto err_pinctrl_lookup;
+ }
+
+ ts->pins_release = pinctrl_lookup_state(ts->pinctrl, "pmx_ts_release");
+ if (IS_ERR_OR_NULL(ts->pins_release)) {
+ FTS_ERROR("Pin state[release] not found");
+ ret = PTR_ERR(ts->pins_release);
+ }
+
+ return 0;
+err_pinctrl_lookup:
+ if (ts->pinctrl) {
+ devm_pinctrl_put(ts->pinctrl);
+ }
+err_pinctrl_get:
+ ts->pinctrl = NULL;
+ ts->pins_release = NULL;
+ ts->pins_suspend = NULL;
+ ts->pins_active = NULL;
+ return ret;
+}
+
+static int fts_pinctrl_select_normal(struct fts_ts_data *ts)
+{
+ int ret = 0;
+
+ if (ts->pinctrl && ts->pins_active) {
+ ret = pinctrl_select_state(ts->pinctrl, ts->pins_active);
+ if (ret < 0) {
+ FTS_ERROR("Set normal pin state error:%d", ret);
+ }
+ }
+
+ return ret;
+}
+
+static int fts_pinctrl_select_suspend(struct fts_ts_data *ts)
+{
+ int ret = 0;
+
+ if (ts->pinctrl && ts->pins_suspend) {
+ ret = pinctrl_select_state(ts->pinctrl, ts->pins_suspend);
+ if (ret < 0) {
+ FTS_ERROR("Set suspend pin state error:%d", ret);
+ }
+ }
+
+ return ret;
+}
+
+static int fts_pinctrl_select_release(struct fts_ts_data *ts)
+{
+ int ret = 0;
+
+ if (ts->pinctrl) {
+ if (IS_ERR_OR_NULL(ts->pins_release)) {
+ devm_pinctrl_put(ts->pinctrl);
+ ts->pinctrl = NULL;
+ } else {
+ ret = pinctrl_select_state(ts->pinctrl, ts->pins_release);
+ if (ret < 0)
+ FTS_ERROR("Set gesture pin state error:%d", ret);
+ }
+ }
+
+ return ret;
+}
+#endif /* FTS_PINCTRL_EN */
+#endif /* FTS_POWER_SOURCE_CUST_EN */
+
+/*****************************************************************************
+* Reprot related
+*****************************************************************************/
+#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2))
+char g_sz_debug[1024] = { 0 };
+
+static void fts_show_touch_buffer(u8 *buf, int point_num)
+{
+ int len = point_num * FTS_ONE_TCH_LEN;
+ int count = 0;
+ int i;
+
+ memset(g_sz_debug, 0, 1024);
+ if (len > (fts_data->pnt_buf_size - 3)) {
+ len = fts_data->pnt_buf_size - 3;
+ } else if (len == 0) {
+ len += FTS_ONE_TCH_LEN;
+ }
+ count += snprintf(g_sz_debug, PAGE_SIZE, "%02X,%02X,%02X", buf[0], buf[1], buf[2]);
+ for (i = 0; i < len; i++) {
+ count += snprintf(g_sz_debug + count, PAGE_SIZE, ",%02X", buf[i + 3]);
+ }
+ FTS_DEBUG("buffer: %s", g_sz_debug);
+}
+#endif
+
+/*****************************************************************************
+ * Name: fts_release_all_finger
+ * Brief: report all points' up events, release touch
+ * Input:
+ * Output:
+ * Return:
+ *****************************************************************************/
+static void fts_release_all_finger(void)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+#if FTS_MT_PROTOCOL_B_EN
+ u32 finger_count = 0;
+#endif
+
+ FTS_FUNC_ENTER();
+ mutex_lock(&fts_data->report_mutex);
+#if FTS_MT_PROTOCOL_B_EN
+ for (finger_count = 0; finger_count < fts_data->pdata->max_touch_number; finger_count++) {
+ input_mt_slot(input_dev, finger_count);
+ input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false);
+ }
+#else
+ input_mt_sync(input_dev);
+#endif
+ input_report_key(input_dev, BTN_TOUCH, 0);
+ input_sync(input_dev);
+
+ mutex_unlock(&fts_data->report_mutex);
+ FTS_FUNC_EXIT();
+}
+
+/************************************************************************
+ * Name: fts_input_report_key
+ * Brief: report key event
+ * Input: events info
+ * Output:
+ * Return: return 0 if success
+ ***********************************************************************/
+static int fts_input_report_key(struct fts_ts_data *data, int index)
+{
+ u32 ik;
+ int id = data->events[index].id;
+ int x = data->events[index].x;
+ int y = data->events[index].y;
+ int flag = data->events[index].flag;
+ u32 key_num = data->pdata->key_number;
+
+ if (!KEY_EN(data)) {
+ return -EINVAL;
+ }
+ for (ik = 0; ik < key_num; ik++) {
+ if (TOUCH_IN_KEY(x, data->pdata->key_x_coords[ik])) {
+ if (EVENT_DOWN(flag)) {
+ data->key_down = true;
+ input_report_key(data->input_dev, data->pdata->keys[ik], 1);
+ FTS_DEBUG("Key%d(%d, %d) DOWN!", ik, x, y);
+ } else {
+ data->key_down = false;
+ input_report_key(data->input_dev, data->pdata->keys[ik], 0);
+ FTS_DEBUG("Key%d(%d, %d) Up!", ik, x, y);
+ }
+ return 0;
+ }
+ }
+
+ FTS_ERROR("invalid touch for key, [%d](%d, %d)", id, x, y);
+ return -EINVAL;
+}
+
+#if FTS_MT_PROTOCOL_B_EN
+static int fts_input_report_b(struct fts_ts_data *data)
+{
+ int i = 0;
+ int uppoint = 0;
+ int touchs = 0;
+ bool va_reported = false;
+ u32 max_touch_num = data->pdata->max_touch_number;
+ u32 key_y_coor = data->pdata->key_y_coord;
+ struct ts_event *events = data->events;
+
+ for (i = 0; i < data->touch_point; i++) {
+ if (KEY_EN(data) && TOUCH_IS_KEY(events[i].y, key_y_coor)) {
+ fts_input_report_key(data, i);
+ continue;
+ }
+
+ if (events[i].id >= max_touch_num)
+ break;
+
+ va_reported = true;
+ input_mt_slot(data->input_dev, events[i].id);
+
+ if (EVENT_DOWN(events[i].flag)) {
+ input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true);
+
+#if FTS_REPORT_PRESSURE_EN
+ if (events[i].p <= 0) {
+ events[i].p = 0x3f;
+ }
+ input_report_abs(data->input_dev, ABS_MT_PRESSURE, events[i].p);
+#endif
+ if (events[i].area <= 0) {
+ events[i].area = 0x09;
+ }
+ input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, events[i].area);
+ input_report_abs(data->input_dev, ABS_MT_POSITION_X, events[i].x);
+ input_report_abs(data->input_dev, ABS_MT_POSITION_Y, events[i].y);
+
+ touchs |= BIT(events[i].id);
+ data->touchs |= BIT(events[i].id);
+
+ /*FTS_DEBUG("[B]P%d(%d, %d)[p:%d,tm:%d] DOWN!", events[i].id, events[i].x,
+ events[i].y, events[i].p, events[i].area); */
+ } else {
+ uppoint++;
+ input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false);
+ data->touchs &= ~BIT(events[i].id);
+ /*FTS_DEBUG("[B]P%d UP!", events[i].id); */
+ }
+ }
+
+ if (unlikely(data->touchs ^ touchs)) {
+ for (i = 0; i < max_touch_num; i++) {
+ if (BIT(i) & (data->touchs ^ touchs)) {
+ /*FTS_DEBUG("[B]P%d UP!", i); */
+ va_reported = true;
+ input_mt_slot(data->input_dev, i);
+ input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false);
+ }
+ }
+ }
+ data->touchs = touchs;
+
+ if (va_reported) {
+ /* touchs==0, there's no point but key */
+ if (EVENT_NO_DOWN(data) || (!touchs)) {
+ /*FTS_DEBUG("[B]Points All Up!"); */
+ input_report_key(data->input_dev, BTN_TOUCH, 0);
+ } else {
+ input_report_key(data->input_dev, BTN_TOUCH, 1);
+ }
+ }
+
+ input_sync(data->input_dev);
+ return 0;
+}
+
+#else
+static int fts_input_report_a(struct fts_ts_data *data)
+{
+ int i = 0;
+ int touchs = 0;
+ bool va_reported = false;
+ u32 key_y_coor = data->pdata->key_y_coord;
+ struct ts_event *events = data->events;
+
+ for (i = 0; i < data->touch_point; i++) {
+ if (KEY_EN(data) && TOUCH_IS_KEY(events[i].y, key_y_coor)) {
+ fts_input_report_key(data, i);
+ continue;
+ }
+
+ va_reported = true;
+ if (EVENT_DOWN(events[i].flag)) {
+ input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, events[i].id);
+#if FTS_REPORT_PRESSURE_EN
+ if (events[i].p <= 0) {
+ events[i].p = 0x3f;
+ }
+ input_report_abs(data->input_dev, ABS_MT_PRESSURE, events[i].p);
+#endif
+ if (events[i].area <= 0) {
+ events[i].area = 0x09;
+ }
+ input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, events[i].area);
+
+ input_report_abs(data->input_dev, ABS_MT_POSITION_X, events[i].x);
+ input_report_abs(data->input_dev, ABS_MT_POSITION_Y, events[i].y);
+
+ input_mt_sync(data->input_dev);
+
+ FTS_DEBUG("[A]P%d(%d, %d)[p:%d,tm:%d] DOWN!", events[i].id, events[i].x, events[i].y,
+ events[i].p, events[i].area);
+ touchs++;
+ }
+ }
+
+ /* last point down, current no point but key */
+ if (data->touchs && !touchs) {
+ va_reported = true;
+ }
+ data->touchs = touchs;
+
+ if (va_reported) {
+ if (EVENT_NO_DOWN(data)) {
+ FTS_DEBUG("[A]Points All Up!");
+ input_report_key(data->input_dev, BTN_TOUCH, 0);
+ input_mt_sync(data->input_dev);
+ } else {
+ input_report_key(data->input_dev, BTN_TOUCH, 1);
+ }
+ }
+
+ input_sync(data->input_dev);
+ return 0;
+}
+#endif
+
+/*****************************************************************************
+* Name: fts_read_touchdata
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if succuss
+*****************************************************************************/
+static int fts_read_touchdata(struct fts_ts_data *data)
+{
+ int ret = 0;
+ int i = 0;
+ u8 pointid;
+ int base;
+ struct ts_event *events = data->events;
+ int max_touch_num = data->pdata->max_touch_number;
+ u8 *buf = data->point_buf;
+ struct i2c_client *client = data->client;
+
+#if FTS_GESTURE_EN
+ if (0 == fts_gesture_readdata(data)) {
+ FTS_INFO("succuss to get gesture data in irq handler");
+ return 1;
+ }
+#endif
+
+#if FTS_POINT_REPORT_CHECK_EN
+ fts_prc_queue_work(data);
+#endif
+
+ data->point_num = 0;
+ data->touch_point = 0;
+
+ memset(buf, 0xFF, data->pnt_buf_size);
+ buf[0] = 0x00;
+
+ ret = fts_i2c_read(data->client, buf, 1, buf, data->pnt_buf_size);
+ if (ret < 0) {
+ FTS_ERROR("read touchdata failed, ret:%d", ret);
+ return ret;
+ }
+ data->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F;
+
+ if (data->ic_info.is_incell) {
+ if ((data->point_num == 0x0F) && (buf[1] == 0xFF) && (buf[2] == 0xFF)
+ && (buf[3] == 0xFF) && (buf[4] == 0xFF) && (buf[5] == 0xFF) && (buf[6] == 0xFF)) {
+ FTS_INFO("touch buff is 0xff, need recovery state");
+ fts_tp_state_recovery(client);
+ return -EIO;
+ }
+ }
+
+ if (data->point_num > max_touch_num) {
+ FTS_INFO("invalid point_num(%d)", data->point_num);
+ return -EIO;
+ }
+#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2))
+ fts_show_touch_buffer(buf, data->point_num);
+#endif
+
+ for (i = 0; i < max_touch_num; i++) {
+ base = FTS_ONE_TCH_LEN * i;
+
+ pointid = (buf[FTS_TOUCH_ID_POS + base]) >> 4;
+ if (pointid >= FTS_MAX_ID)
+ break;
+ else if (pointid >= max_touch_num) {
+ FTS_ERROR("ID(%d) beyond max_touch_number", pointid);
+ return -EINVAL;
+ }
+
+ data->touch_point++;
+
+ events[i].x = ((buf[FTS_TOUCH_X_H_POS + base] & 0x0F) << 8) + (buf[FTS_TOUCH_X_L_POS + base] & 0xFF);
+ events[i].y = ((buf[FTS_TOUCH_Y_H_POS + base] & 0x0F) << 8) + (buf[FTS_TOUCH_Y_L_POS + base] & 0xFF);
+ events[i].flag = buf[FTS_TOUCH_EVENT_POS + base] >> 6;
+ events[i].id = buf[FTS_TOUCH_ID_POS + base] >> 4;
+ events[i].area = buf[FTS_TOUCH_AREA_POS + base] >> 4;
+ events[i].p = buf[FTS_TOUCH_PRE_POS + base];
+
+ if (EVENT_DOWN(events[i].flag) && (data->point_num == 0)) {
+ FTS_INFO("abnormal touch data from fw");
+ return -EIO;
+ }
+ }
+ if (data->touch_point == 0) {
+ FTS_INFO("no touch point information");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_report_event
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void fts_report_event(struct fts_ts_data *data)
+{
+#if FTS_MT_PROTOCOL_B_EN
+ fts_input_report_b(data);
+#else
+ fts_input_report_a(data);
+#endif
+}
+
+/*****************************************************************************
+* Name: fts_ts_interrupt
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static irqreturn_t fts_ts_interrupt(int irq, void *data)
+{
+ int ret = 0;
+ struct fts_ts_data *ts_data = (struct fts_ts_data *)data;
+
+ if (!ts_data) {
+ FTS_ERROR("[INTR]: Invalid fts_ts_data");
+ return IRQ_HANDLED;
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_set_intr(1);
+#endif
+
+ if (ts_data->dev_pm_suspend) {
+ ret = wait_for_completion_timeout(&ts_data->dev_pm_suspend_completion, msecs_to_jiffies(700));
+ if (!ret) {
+ FTS_ERROR("system(i2c) can't finished resuming procedure, skip it");
+ return IRQ_HANDLED;
+ }
+ }
+
+ ret = fts_read_touchdata(ts_data);
+ if (ret == 0) {
+ mutex_lock(&ts_data->report_mutex);
+ fts_report_event(ts_data);
+ mutex_unlock(&ts_data->report_mutex);
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_set_intr(0);
+#endif
+
+ return IRQ_HANDLED;
+}
+
+/*****************************************************************************
+* Name: fts_irq_registration
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if succuss, otherwise return error code
+*****************************************************************************/
+static int fts_irq_registration(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ struct fts_ts_platform_data *pdata = ts_data->pdata;
+
+ ts_data->irq = gpio_to_irq(pdata->irq_gpio);
+ FTS_INFO("irq in ts_data:%d irq in client:%d", ts_data->irq, ts_data->client->irq);
+ if (ts_data->irq != ts_data->client->irq)
+ FTS_ERROR("IRQs are inconsistent, please check <interrupts> & <focaltech,irq-gpio> in DTS");
+
+ if (0 == pdata->irq_gpio_flags)
+ pdata->irq_gpio_flags = IRQF_TRIGGER_FALLING;
+ FTS_INFO("irq flag:%x", pdata->irq_gpio_flags);
+ ret =
+ request_threaded_irq(ts_data->irq, NULL, fts_ts_interrupt, pdata->irq_gpio_flags | IRQF_ONESHOT,
+ ts_data->client->name, ts_data);
+
+ return ret;
+}
+
+#if FTS_GESTURE_EN
+static void fts_switch_mode_work(struct work_struct *work)
+{
+ struct fts_mode_switch *ms = container_of(work, struct fts_mode_switch, switch_mode_work);
+ unsigned char value = ms->mode;
+ bool enable = false;
+ FTS_INFO("%s mode %d", __func__, value);
+
+ if (value >= INPUT_EVENT_WAKUP_MODE_OFF && value <= INPUT_EVENT_WAKUP_MODE_ON) {
+ enable = !!(value - INPUT_EVENT_WAKUP_MODE_OFF);
+ fts_gesture_enable(enable);
+ ms->ts_data->lpwg_mode = enable;
+ }
+
+ if (ms != NULL) {
+ kfree(ms);
+ ms = NULL;
+ }
+}
+
+static int fts_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ struct fts_ts_data *ts_data = input_get_drvdata(dev);
+ struct fts_mode_switch *ms;
+
+ FTS_INFO("set input event value = %d", value);
+
+ if (!ts_data) {
+ FTS_ERROR("fts_ts_data is NULL");
+ return 0;
+ }
+
+ if (type == EV_SYN && code == SYN_CONFIG) {
+ if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) {
+ ms = (struct fts_mode_switch *)
+ kmalloc(sizeof(struct fts_mode_switch), GFP_ATOMIC);
+
+ if (ms != NULL) {
+ ms->ts_data = ts_data;
+ ms->mode = (unsigned char)value;
+ INIT_WORK(&ms->switch_mode_work, fts_switch_mode_work);
+ schedule_work(&ms->switch_mode_work);
+ } else {
+ FTS_ERROR("failed in allocating memory for switching mode");
+ return -ENOMEM;
+ }
+ } else {
+ FTS_ERROR("%s Invalid event value\n", __func__);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+#endif
+
+/*****************************************************************************
+* Name: fts_input_init
+* Brief: input device init
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_input_init(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ int key_num = 0;
+ struct fts_ts_platform_data *pdata = ts_data->pdata;
+ struct input_dev *input_dev;
+ int point_num;
+
+ FTS_FUNC_ENTER();
+
+ input_dev = input_allocate_device();
+ if (!input_dev) {
+ FTS_ERROR("Failed to allocate memory for input device");
+ return -ENOMEM;
+ }
+
+ /* Init and register Input device */
+ input_dev->name = FTS_DRIVER_NAME;
+ input_dev->id.bustype = BUS_I2C;
+ input_dev->dev.parent = &ts_data->client->dev;
+#if FTS_GESTURE_EN
+ input_dev->event = fts_input_event;
+#endif
+ input_set_drvdata(input_dev, ts_data);
+
+ __set_bit(EV_SYN, input_dev->evbit);
+ __set_bit(EV_ABS, input_dev->evbit);
+ __set_bit(EV_KEY, input_dev->evbit);
+ __set_bit(BTN_TOUCH, input_dev->keybit);
+ __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
+
+ if (pdata->have_key) {
+ FTS_INFO("set key capabilities");
+ for (key_num = 0; key_num < pdata->key_number; key_num++)
+ input_set_capability(input_dev, EV_KEY, pdata->keys[key_num]);
+ }
+#if FTS_MT_PROTOCOL_B_EN
+ input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT);
+#else
+ input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0);
+#endif
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max - 1, 0, 0);
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max - 1, 0, 0);
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0);
+#if FTS_REPORT_PRESSURE_EN
+ input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0);
+#endif
+ point_num = pdata->max_touch_number;
+ ts_data->pnt_buf_size = point_num * FTS_ONE_TCH_LEN + 3;
+ ts_data->point_buf = (u8 *) kzalloc(ts_data->pnt_buf_size, GFP_KERNEL);
+ if (!ts_data->point_buf) {
+ FTS_ERROR("failed to alloc memory for point buf!");
+ ret = -ENOMEM;
+ goto err_point_buf;
+ }
+
+ ts_data->events = (struct ts_event *)kzalloc(point_num * sizeof(struct ts_event), GFP_KERNEL);
+ if (!ts_data->events) {
+
+ FTS_ERROR("failed to alloc memory for point events!");
+ ret = -ENOMEM;
+ goto err_event_buf;
+ }
+ ret = input_register_device(input_dev);
+ if (ret) {
+ FTS_ERROR("Input device registration failed");
+ goto err_input_reg;
+ }
+
+ ts_data->input_dev = input_dev;
+
+ FTS_FUNC_EXIT();
+ return 0;
+
+err_input_reg:
+ kfree_safe(ts_data->events);
+
+err_event_buf:
+ kfree_safe(ts_data->point_buf);
+
+err_point_buf:
+ input_set_drvdata(input_dev, NULL);
+ input_free_device(input_dev);
+ input_dev = NULL;
+
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+/*****************************************************************************
+* Name: fts_gpio_configure
+* Brief: Configure IRQ&RESET GPIO
+* Input:
+* Output:
+* Return: return 0 if succuss
+*****************************************************************************/
+static int fts_gpio_configure(struct fts_ts_data *data)
+{
+ int ret = 0;
+
+ FTS_FUNC_ENTER();
+ /* request irq gpio */
+ if (gpio_is_valid(data->pdata->irq_gpio)) {
+ ret = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio");
+ if (ret) {
+ FTS_ERROR("[GPIO]irq gpio request failed");
+ goto err_irq_gpio_req;
+ }
+
+ ret = gpio_direction_input(data->pdata->irq_gpio);
+ if (ret) {
+ FTS_ERROR("[GPIO]set_direction for irq gpio failed");
+ goto err_irq_gpio_dir;
+ }
+ }
+
+ /* request reset gpio */
+ if (gpio_is_valid(data->pdata->reset_gpio)) {
+ ret = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio");
+ if (ret) {
+ FTS_ERROR("[GPIO]reset gpio request failed");
+ goto err_irq_gpio_dir;
+ }
+
+ ret = gpio_direction_output(data->pdata->reset_gpio, 0);
+ if (ret) {
+ FTS_ERROR("[GPIO]set_direction for reset gpio failed");
+ goto err_reset_gpio_dir;
+ }
+
+ msleep(20);
+
+ ret = gpio_direction_output(data->pdata->reset_gpio, 1);
+ if (ret) {
+ FTS_ERROR("[GPIO]set_direction for reset gpio failed");
+ goto err_reset_gpio_dir;
+ }
+ }
+
+ FTS_FUNC_EXIT();
+ return 0;
+
+err_reset_gpio_dir:
+ if (gpio_is_valid(data->pdata->reset_gpio))
+ gpio_free(data->pdata->reset_gpio);
+err_irq_gpio_dir:
+ if (gpio_is_valid(data->pdata->irq_gpio))
+ gpio_free(data->pdata->irq_gpio);
+err_irq_gpio_req:
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+/*****************************************************************************
+* Name: fts_get_dt_coords
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if succuss, otherwise return error code
+*****************************************************************************/
+static int fts_get_dt_coords(struct device *dev, char *name, struct fts_ts_platform_data *pdata)
+{
+ int ret = 0;
+ u32 coords[FTS_COORDS_ARR_SIZE] = { 0 };
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+ int coords_size;
+
+ prop = of_find_property(np, name, NULL);
+ if (!prop)
+ return -EINVAL;
+ if (!prop->value)
+ return -ENODATA;
+
+ coords_size = prop->length / sizeof(u32);
+ if (coords_size != FTS_COORDS_ARR_SIZE) {
+ FTS_ERROR("invalid:%s, size:%d", name, coords_size);
+ return -EINVAL;
+ }
+
+ ret = of_property_read_u32_array(np, name, coords, coords_size);
+ if (ret && (ret != -EINVAL)) {
+ FTS_ERROR("Unable to read %s", name);
+ return -ENODATA;
+ }
+
+ if (!strcmp(name, "focaltech,display-coords")) {
+ pdata->x_min = coords[0];
+ pdata->y_min = coords[1];
+ pdata->x_max = coords[2];
+ pdata->y_max = coords[3];
+ } else {
+ FTS_ERROR("unsupported property %s", name);
+ return -EINVAL;
+ }
+
+ FTS_INFO("display x(%d %d) y(%d %d)", pdata->x_min, pdata->x_max, pdata->y_min, pdata->y_max);
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_parse_dt
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata)
+{
+ int ret = 0;
+ struct device_node *np = dev->of_node;
+ u32 temp_val;
+
+ FTS_FUNC_ENTER();
+
+ ret = fts_get_dt_coords(dev, "focaltech,display-coords", pdata);
+ if (ret < 0)
+ FTS_ERROR("Unable to get display-coords");
+
+ /* key */
+ pdata->have_key = of_property_read_bool(np, "focaltech,have-key");
+ if (pdata->have_key) {
+ ret = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number);
+ if (ret)
+ FTS_ERROR("Key number undefined!");
+
+ ret = of_property_read_u32_array(np, "focaltech,keys", pdata->keys, pdata->key_number);
+ if (ret)
+ FTS_ERROR("Keys undefined!");
+ else if (pdata->key_number > FTS_MAX_KEYS)
+ pdata->key_number = FTS_MAX_KEYS;
+
+ ret = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord);
+ if (ret)
+ FTS_ERROR("Key Y Coord undefined!");
+
+ ret = of_property_read_u32_array(np, "focaltech,key-x-coords", pdata->key_x_coords, pdata->key_number);
+ if (ret)
+ FTS_ERROR("Key X Coords undefined!");
+
+ FTS_INFO("VK(%d): (%d, %d, %d), [%d, %d, %d][%d]",
+ pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], pdata->key_x_coords[0],
+ pdata->key_x_coords[1], pdata->key_x_coords[2], pdata->key_y_coord);
+ }
+ /*lcd_reset gpio info*/
+ pdata->lcd_reset_gpio = of_get_named_gpio_flags(np, "focaltech,lcd-reset-gpio", 0, &pdata->lcd_reset_gpio_flags);
+ if (pdata->lcd_reset_gpio < 0)
+ FTS_ERROR("Unable to get lcd_reset_gpio");
+ /* reset, irq gpio info */
+ pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags);
+ if (pdata->reset_gpio < 0)
+ FTS_ERROR("Unable to get reset_gpio");
+
+ pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags);
+ if (pdata->irq_gpio < 0)
+ FTS_ERROR("Unable to get irq_gpio");
+
+ ret = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val);
+ if (0 == ret) {
+ if (temp_val < 2)
+ pdata->max_touch_number = 2;
+ else if (temp_val > FTS_MAX_POINTS_SUPPORT)
+ pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT;
+ else
+ pdata->max_touch_number = temp_val;
+ } else {
+ FTS_ERROR("Unable to get max-touch-number");
+ pdata->max_touch_number = FTS_MAX_POINTS_SUPPORT;
+ }
+
+ FTS_INFO("max touch number:%d, irq gpio:%d, reset gpio:%d", pdata->max_touch_number, pdata->irq_gpio,
+ pdata->reset_gpio);
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+static ssize_t fts_lockdown_info_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ if (!ts_data)
+ return -EINVAL;
+
+ return snprintf(buf, PAGE_SIZE, "0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
+ (int)ts_data->lockdown_info[0], (int)ts_data->lockdown_info[1],
+ (int)ts_data->lockdown_info[2], (int)ts_data->lockdown_info[3],
+ (int)ts_data->lockdown_info[4], (int)ts_data->lockdown_info[5], (int)ts_data->lockdown_info[6],
+ (int)ts_data->lockdown_info[7]);
+}
+
+static ssize_t fts_panel_color_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ if (!ts_data)
+ return -EINVAL;
+
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[2]);
+}
+
+static ssize_t fts_panel_vendor_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ if (!ts_data)
+ return -EINVAL;
+
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[0]);
+}
+
+static ssize_t fts_panel_display_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ if (!ts_data)
+ return -EINVAL;
+
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts_data->lockdown_info[1]);
+}
+
+static DEVICE_ATTR(panel_vendor, 0644, fts_panel_vendor_show, NULL);
+static DEVICE_ATTR(panel_color, 0644, fts_panel_color_show, NULL);
+static DEVICE_ATTR(panel_display, 0644, fts_panel_display_show, NULL);
+static DEVICE_ATTR(lockdown_info, 0644, fts_lockdown_info_show, NULL);
+
+static struct attribute *fts_attrs[] = {
+ &dev_attr_lockdown_info.attr,
+ &dev_attr_panel_color.attr,
+ &dev_attr_panel_vendor.attr,
+ &dev_attr_panel_display.attr,
+ NULL
+};
+
+static const struct attribute_group fts_attr_group = {
+ .attrs = fts_attrs
+};
+
+#define TP_INFO_MAX_LENGTH 50
+static ssize_t fts_lockdown_info_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ int cnt = 0, ret = 0;
+ char tmp[TP_INFO_MAX_LENGTH];
+
+ if (*pos != 0)
+ return 0;
+
+ cnt =
+ snprintf(tmp, TP_INFO_MAX_LENGTH,
+ "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n",
+ fts_data->lockdown_info[0], fts_data->lockdown_info[1],
+ fts_data->lockdown_info[2], fts_data->lockdown_info[3], fts_data->lockdown_info[4],
+ fts_data->lockdown_info[5], fts_data->lockdown_info[6], fts_data->lockdown_info[7]);
+ ret = copy_to_user(buf, tmp, cnt);
+
+ *pos += cnt;
+ if (ret != 0)
+ return 0;
+ else
+ return cnt;
+}
+
+static const struct file_operations fts_lockdown_info_ops = {
+ .read = fts_lockdown_info_read,
+};
+
+static ssize_t fts_fw_version_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ int cnt = 0, ret = 0;
+ u8 fw_ver_in_tp = 0;
+ char tmp[TP_INFO_MAX_LENGTH];
+ if (*pos != 0)
+ return 0;
+ ret = fts_i2c_read_reg(fts_data->client, FTS_REG_FW_VER, &fw_ver_in_tp);
+ fts_data->fw_ver_in_tp = (int)fw_ver_in_tp;
+ cnt = snprintf(tmp, TP_INFO_MAX_LENGTH, "%x\n", fts_data->fw_ver_in_tp);
+ ret = copy_to_user(buf, tmp, cnt);
+ FTS_INFO("get fw version in tp:%x", fts_data->fw_ver_in_tp);
+ *pos += cnt;
+ if (ret != 0)
+ return 0;
+ else
+ return cnt;
+}
+
+static const struct file_operations fts_fw_version_ops = {
+ .read = fts_fw_version_read,
+};
+
+static void tpdbg_suspend(struct fts_ts_data *ts_data, bool enable)
+{
+ if (enable)
+ fts_ts_suspend(&ts_data->client->dev);
+ else
+ fts_ts_resume(&ts_data->client->dev);
+}
+
+static int tpdbg_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+
+ return 0;
+}
+
+static ssize_t tpdbg_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
+{
+
+ const char *str = "cmd support as below:\n \
+ \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \
+ \necho \"tp-suspend-en\" or \"tp-suspend-off\" to ctrl panel in or off suspend status\n \
+ \necho \"tp-sd-en\" or \"tp-sd-off\" to ctrl panel in or off sleep status\n";
+
+ loff_t pos = *ppos;
+ int len = strlen(str);
+
+ if (pos < 0)
+ return -EINVAL;
+ if (pos >= len)
+ return 0;
+
+ if (copy_to_user(buf, str, len))
+ return -EFAULT;
+
+ *ppos = pos + len;
+
+ return len;
+}
+
+static ssize_t tpdbg_write(struct file *file, const char __user *buf, size_t size, loff_t
+*ppos)
+{
+ struct fts_ts_data *ts_data = file->private_data;
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = size;
+
+ if (!cmd)
+ return -ENOMEM;
+
+ if (copy_from_user(cmd, buf, size)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ cmd[size] = '\0';
+
+ if (!strncmp(cmd, "irq-disable", 11))
+ fts_irq_disable();
+ else if (!strncmp(cmd, "irq-enable", 10))
+ fts_irq_enable();
+ else if (!strncmp(cmd, "tp-suspend-en", 13))
+ tpdbg_suspend(ts_data, true);
+ else if (!strncmp(cmd, "tp-suspend-off", 14))
+ tpdbg_suspend(ts_data, false);
+ else if (!strncmp(cmd, "tp-sd-en", 8))
+ tpdbg_suspend(ts_data, true);
+ else if (!strncmp(cmd, "tp-sd-off", 9)) {
+ tpdbg_suspend(ts_data, false);
+ }
+out:
+ kfree(cmd);
+
+ return ret;
+}
+
+static int tpdbg_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+
+ return 0;
+}
+
+static const struct file_operations tpdbg_operations = {
+ .owner = THIS_MODULE,
+ .open = tpdbg_open,
+ .read = tpdbg_read,
+ .write = tpdbg_write,
+ .release = tpdbg_release,
+};
+
+static int grip_area_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+
+static ssize_t grip_area_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
+{
+ struct fts_ts_data *ts_data = file->private_data;
+ u8 reg_value;
+ int ret;
+ char tmp[5];
+ int cnt;
+ if (*ppos!=0)
+ return 0;
+ ret = fts_i2c_read_reg(ts_data->client, FTS_REG_DYNAMIC_EGDE_RESTRAIN, &reg_value);
+ cnt = snprintf(tmp, 5, "%d\n", reg_value);
+ if (cnt <= 0) {
+ FTS_ERROR("Copy data error");
+ return cnt;
+ }
+ if (copy_to_user(buf, tmp, cnt))
+ return -EFAULT;
+
+ *ppos = *ppos + cnt;
+
+ return cnt;
+}
+
+
+static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size,
+loff_t *ppos)
+{
+ struct fts_ts_data *ts_data = file->private_data;
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = -EIO;
+ int mode;
+ u8 command;
+
+ if (!ts_data) {
+ FTS_ERROR("ts data NULL\n");
+ return ret;
+ }
+ if (!cmd)
+ return ret;
+
+ if (copy_from_user(cmd, buf, size))
+ goto out;
+
+ FTS_INFO("Receive command from init\n");
+ cmd[size] = '\0';
+ if (ts_data->suspended) {
+ FTS_INFO("Panel in suspend,no need to set grip_area\n");
+ ret = 0;
+ goto out;
+ }
+ sscanf(cmd, "%u", &mode);
+ FTS_INFO("%s current mode : %d\n", __func__, mode);
+
+ if (mode == 90 || mode == 270)
+ command = 1;
+ else
+ command = 0;
+ ret = fts_i2c_write_reg(ts_data->client, FTS_REG_DYNAMIC_EGDE_RESTRAIN, command);
+ if (ret < 0)
+ FTS_ERROR("%s failed to write command to 0x8C reg\n", __func__);
+ else
+ ret = size;
+out:
+ kfree(cmd);
+
+ return ret;
+}
+
+
+static int grip_area_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ return 0;
+}
+
+static const struct file_operations grip_area_operations = {
+ .owner = THIS_MODULE,
+ .open = grip_area_open,
+ .read = grip_area_read,
+ .write = grip_area_write,
+ .release = grip_area_release,
+};
+
+/************************************************************************
+*pull down and up lcd reset gpio when lpwg mode on
+*************************************************************************/
+static void mdss_lcd_reset(struct fts_ts_data *fts_data)
+{
+ if (gpio_is_valid(fts_data->pdata->lcd_reset_gpio)) {
+ gpio_direction_output(fts_data->pdata->lcd_reset_gpio, 0);
+ msleep(1);
+ gpio_direction_output(fts_data->pdata->lcd_reset_gpio, 1);
+ msleep(15);
+ } else {
+ FTS_INFO("lcd reset gpio is invalid!");
+ }
+ return;
+}
+
+#ifdef CONFIG_FB
+/*****************************************************************************
+* Name: fb_notifier_callback
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data)
+{
+ struct fb_event *evdata = data;
+ int *blank;
+ struct fts_ts_data *fts_data = container_of(self, struct fts_ts_data, fb_notif);
+
+ if (evdata && evdata->data && mdss_panel_is_prim(evdata->info)
+ && fts_data && fts_data->client) {
+ blank = evdata->data;
+
+ flush_workqueue(fts_data->event_wq);
+
+ FTS_INFO("repsonse notifier, enter touch suspend");
+ if (event == FB_EARLY_EVENT_BLANK) {
+ if (*blank == FB_BLANK_POWERDOWN) {
+ if (fts_data->lpwg_mode) {
+ mdss_panel_reset_skip_enable(true);
+ gesture_enabled_when_resume = true;
+ gesture_disabled_when_resume = false;
+ }
+ } else if (*blank == FB_BLANK_UNBLANK) {
+ if ((fts_data->lpwg_mode || !gesture_disabled_when_resume)
+ && gesture_enabled_when_resume) {
+ FTS_INFO("do lcd reset");
+ mdss_lcd_reset(fts_data);
+ }
+ }
+ } else if (event == FB_EVENT_BLANK) {
+ if (*blank == FB_BLANK_UNBLANK) {
+ if ((fts_data->lpwg_mode || !gesture_disabled_when_resume)
+ && gesture_enabled_when_resume) {
+ FTS_INFO("Enter gesture wakeup");
+ mdss_panel_reset_skip_enable(false);
+ }
+ queue_work(fts_data->event_wq, &fts_data->resume_work);
+ gesture_enabled_when_resume = false;
+ gesture_disabled_when_resume = true;
+ } else if (*blank == FB_BLANK_POWERDOWN) {
+ queue_work(fts_data->event_wq, &fts_data->suspend_work);
+ }
+ }
+ }
+
+ return 0;
+}
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+/*****************************************************************************
+* Name: fts_ts_early_suspend
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void fts_ts_early_suspend(struct early_suspend *handler)
+{
+ struct fts_ts_data *data = container_of(handler,
+ struct fts_ts_data,
+ early_suspend);
+
+ fts_ts_suspend(&data->client->dev);
+}
+
+/*****************************************************************************
+* Name: fts_ts_late_resume
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void fts_ts_late_resume(struct early_suspend *handler)
+{
+ struct fts_ts_data *data = container_of(handler,
+ struct fts_ts_data,
+ early_suspend);
+
+ fts_ts_resume(&data->client->dev);
+}
+#endif
+
+/*****************************************************************************
+* Name: fts_ts_probe
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fts_ts_platform_data *pdata;
+ struct fts_ts_data *ts_data;
+ struct dentry *tp_debugfs;
+ struct dentry *grip_debugfs;
+
+ FTS_FUNC_ENTER();
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+ FTS_ERROR("I2C not supported");
+ return -ENODEV;
+ }
+
+ if (client->dev.of_node) {
+ pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata) {
+ FTS_ERROR("Failed to allocate memory for platform data");
+ return -ENOMEM;
+ }
+ ret = fts_parse_dt(&client->dev, pdata);
+ if (ret)
+ FTS_ERROR("[DTS]DT parsing failed");
+ } else {
+ pdata = client->dev.platform_data;
+ }
+
+ if (!pdata) {
+ FTS_ERROR("no ts platform data found");
+ return -EINVAL;
+ }
+
+ ts_data = devm_kzalloc(&client->dev, sizeof(*ts_data), GFP_KERNEL);
+ if (!ts_data) {
+ FTS_ERROR("Failed to allocate memory for fts_data");
+ return -ENOMEM;
+ }
+
+ fts_data = ts_data;
+ ts_data->client = client;
+ ts_data->pdata = pdata;
+ i2c_set_clientdata(client, ts_data);
+
+ ts_data->ts_workqueue = create_singlethread_workqueue("fts_wq");
+ if (NULL == ts_data->ts_workqueue) {
+ FTS_ERROR("failed to create fts workqueue");
+ }
+
+ spin_lock_init(&ts_data->irq_lock);
+ mutex_init(&ts_data->report_mutex);
+#if (!FTS_CHIP_IDC)
+ fts_reset_proc(200);
+#endif
+
+ ret = fts_get_ic_information(ts_data);
+ if (ret) {
+ FTS_ERROR("not focal IC, unregister driver");
+ goto err_irq_req;
+ }
+ ret = fts_input_init(ts_data);
+ if (ret) {
+ FTS_ERROR("fts input initialize fail");
+ goto err_input_init;
+ }
+#if FTS_POWER_SOURCE_CUST_EN
+ ret = fts_power_source_init(ts_data);
+ if (ret) {
+ FTS_ERROR("fail to get vdd/vcc_i2c regulator");
+ goto err_power_init;
+ }
+
+ ts_data->power_disabled = true;
+ ret = fts_power_source_ctrl(ts_data, ENABLE);
+ if (ret) {
+ FTS_ERROR("fail to enable vdd/vcc_i2c regulator");
+ goto err_power_ctrl;
+ }
+#if FTS_PINCTRL_EN
+ ret = fts_pinctrl_init(ts_data);
+ if (0 == ret) {
+ fts_pinctrl_select_normal(ts_data);
+ }
+#endif
+#endif
+ ret = fts_gpio_configure(ts_data);
+ if (ret) {
+ FTS_ERROR("[GPIO]Failed to configure the gpios");
+ goto err_gpio_config;
+ }
+ ret = sysfs_create_group(&client->dev.kobj, &fts_attr_group);
+ if (ret) {
+ FTS_ERROR("fail to export sysfs entires\n");
+ goto err_irq_req;
+ }
+
+ ts_data->tp_lockdown_info_proc = proc_create("tp_lockdown_info", 0, NULL, &fts_lockdown_info_ops);
+ ts_data->tp_fw_version_proc = proc_create("tp_fw_version", 0, NULL, &fts_fw_version_ops);
+
+ gesture_enabled_when_resume = false;
+
+ ts_data->debugfs = debugfs_create_dir("tp_debug", NULL);
+ if (!ts_data->debugfs) {
+ FTS_ERROR("create tp_debug fail");
+ goto err_sysfs_create_group;
+ }
+ grip_debugfs = debugfs_create_file("grip_area", 0660, ts_data->debugfs, ts_data, &grip_area_operations);
+ if (!grip_debugfs) {
+ FTS_ERROR("create debugfs fail");
+ goto err_sysfs_create_group;
+ }
+ tp_debugfs = debugfs_create_file("switch_state", 0660, ts_data->debugfs, ts_data, &tpdbg_operations);
+ if (!tp_debugfs) {
+ FTS_ERROR("create debugfs fail");
+ goto err_grip_area_debugfs;
+ }
+
+ ts_data->dbclick_count = 0;
+#if FTS_APK_NODE_EN
+ ret = fts_create_apk_debug_channel(ts_data);
+ if (ret) {
+ FTS_ERROR("create apk debug node fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+#if FTS_SYSFS_NODE_EN
+ ret = fts_create_sysfs(client);
+ if (ret) {
+ FTS_ERROR("create sysfs node fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+#if FTS_POINT_REPORT_CHECK_EN
+ ret = fts_point_report_check_init(ts_data);
+ if (ret) {
+ FTS_ERROR("init point report check fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+ ret = fts_ex_mode_init(client);
+ if (ret) {
+ FTS_ERROR("init glove/cover/charger fail");
+ goto err_debugfs_create;
+ }
+#if FTS_GESTURE_EN
+ ret = fts_gesture_init(ts_data);
+ if (ret) {
+ FTS_ERROR("init gesture fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+#if FTS_TEST_EN
+ ret = fts_test_init(client);
+ if (ret) {
+ FTS_ERROR("init production test fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+#if FTS_ESDCHECK_EN
+ ret = fts_esdcheck_init(ts_data);
+ if (ret) {
+ FTS_ERROR("init esd check fail");
+ goto err_debugfs_create;
+ }
+#endif
+
+ ts_data->event_wq =
+ alloc_workqueue("fts-event-queue",
+ WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1);
+ if (!ts_data->event_wq) {
+ FTS_ERROR("ERROR: Cannot create work thread\n");
+ goto err_debugfs_create;
+ }
+ INIT_WORK(&ts_data->resume_work, fts_resume_work);
+ INIT_WORK(&ts_data->suspend_work, fts_suspend_work);
+
+ ret = fts_irq_registration(ts_data);
+ if (ret) {
+ FTS_ERROR("request irq failed");
+ goto err_event_wq;
+ }
+#if FTS_AUTO_UPGRADE_EN
+ ret = fts_fwupg_init(ts_data);
+ if (ret) {
+ FTS_ERROR("init fw upgrade fail");
+ }
+#endif
+
+ device_init_wakeup(&client->dev, 1);
+ ts_data->dev_pm_suspend = false;
+ init_completion(&ts_data->dev_pm_suspend_completion);
+
+#ifdef CONFIG_FB
+ ts_data->fb_notif.notifier_call = fb_notifier_callback;
+ ret = fb_register_client(&ts_data->fb_notif);
+ if (ret) {
+ FTS_ERROR("[FB]Unable to register fb_notifier: %d", ret);
+ }
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ ts_data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL;
+ ts_data->early_suspend.suspend = fts_ts_early_suspend;
+ ts_data->early_suspend.resume = fts_ts_late_resume;
+ register_early_suspend(&ts_data->early_suspend);
+#endif
+ FTS_FUNC_EXIT();
+ return 0;
+
+err_event_wq:
+ if (ts_data->event_wq)
+ destroy_workqueue(ts_data->event_wq);
+err_debugfs_create:
+ if (tp_debugfs)
+ debugfs_remove(tp_debugfs);
+err_grip_area_debugfs:
+ if (grip_debugfs)
+ debugfs_remove(grip_debugfs);
+err_sysfs_create_group:
+ sysfs_remove_group(&client->dev.kobj, &fts_attr_group);
+ if (gpio_is_valid(pdata->reset_gpio))
+ gpio_free(pdata->reset_gpio);
+ if (gpio_is_valid(pdata->irq_gpio))
+ gpio_free(pdata->irq_gpio);
+err_gpio_config:
+
+#if FTS_PINCTRL_EN
+ fts_pinctrl_select_release(ts_data);
+#if FTS_POWER_SOURCE_CUST_EN
+ fts_power_source_ctrl(ts_data, DISABLE);
+err_power_ctrl:
+ fts_power_source_release(ts_data);
+err_power_init:
+#endif
+#endif
+ kfree_safe(ts_data->point_buf);
+ kfree_safe(ts_data->events);
+ input_unregister_device(ts_data->input_dev);
+err_input_init:
+err_irq_req:
+ if (ts_data->ts_workqueue)
+ destroy_workqueue(ts_data->ts_workqueue);
+ devm_kfree(&client->dev, ts_data);
+
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+/*****************************************************************************
+* Name: fts_ts_remove
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_ts_remove(struct i2c_client *client)
+{
+ struct fts_ts_data *ts_data = i2c_get_clientdata(client);
+
+ FTS_FUNC_ENTER();
+
+ sysfs_remove_group(&client->dev.kobj, &fts_attr_group);
+
+#if FTS_POINT_REPORT_CHECK_EN
+ fts_point_report_check_exit(ts_data);
+#endif
+
+#if FTS_APK_NODE_EN
+ fts_release_apk_debug_channel(ts_data);
+#endif
+
+#if FTS_SYSFS_NODE_EN
+ fts_remove_sysfs(client);
+#endif
+ destroy_workqueue(ts_data->event_wq);
+
+ fts_ex_mode_exit(client);
+
+#if FTS_AUTO_UPGRADE_EN
+ fts_fwupg_exit(ts_data);
+#endif
+
+#if FTS_TEST_EN
+ fts_test_exit(client);
+#endif
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_exit(ts_data);
+#endif
+
+#ifdef CONFIG_FB
+ if (fb_unregister_client(&ts_data->fb_notif))
+ FTS_ERROR("Error occurred while unregistering fb_notifier.");
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ unregister_early_suspend(&ts_data->early_suspend);
+#endif
+
+ free_irq(client->irq, ts_data);
+ input_unregister_device(ts_data->input_dev);
+
+ if (gpio_is_valid(ts_data->pdata->reset_gpio))
+ gpio_free(ts_data->pdata->reset_gpio);
+
+ if (gpio_is_valid(ts_data->pdata->irq_gpio))
+ gpio_free(ts_data->pdata->irq_gpio);
+
+ if (ts_data->ts_workqueue)
+ destroy_workqueue(ts_data->ts_workqueue);
+
+
+#if FTS_PINCTRL_EN
+ fts_pinctrl_select_release(ts_data);
+#endif
+#if FTS_POWER_SOURCE_CUST_EN
+ fts_power_source_ctrl(ts_data, DISABLE);
+ fts_power_source_release(ts_data);
+#endif
+
+ kfree_safe(ts_data->point_buf);
+ kfree_safe(ts_data->events);
+
+ devm_kfree(&client->dev, ts_data);
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_ts_suspend
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_ts_suspend(struct device *dev)
+{
+#if FTS_POWER_SOURCE_CUST_EN
+ int ret = 0;
+#endif
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ FTS_FUNC_ENTER();
+ if (ts_data->suspended) {
+ FTS_INFO("Already in suspend state");
+ return 0;
+ }
+
+ if (ts_data->fw_loading) {
+ FTS_INFO("fw upgrade in process, can't suspend");
+ return 0;
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_suspend();
+#endif
+
+ fts_irq_disable_sync();
+
+#if FTS_GESTURE_EN
+ if (fts_gesture_suspend(ts_data->client) == 0) {
+ fts_irq_enable();
+ goto exit;
+ } else {
+ FTS_ERROR("Set tp dbclick gesture mode failed!");
+ FTS_INFO("Set tp state suspended true");
+ }
+#endif
+ if (!ts_data->lpwg_mode) {
+#if FTS_POWER_SOURCE_CUST_EN
+ ret = fts_power_source_ctrl(ts_data, DISABLE);
+ if (ret < 0) {
+ FTS_ERROR("power off fail, ret=%d", ret);
+ }
+#if FTS_PINCTRL_EN
+ fts_pinctrl_select_suspend(ts_data);
+#endif
+#else
+ /* TP enter sleep mode */
+ ret = fts_i2c_write_reg(ts_data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE);
+ if (ret < 0)
+ FTS_ERROR("set TP to sleep mode fail, ret=%d", ret);
+#endif
+ }
+exit:
+ fts_release_all_finger();
+ ts_data->suspended = true;
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_ts_resume
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_ts_resume(struct device *dev)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+
+ FTS_FUNC_ENTER();
+ if (!ts_data->suspended) {
+ FTS_DEBUG("Already in awake state");
+ return 0;
+ }
+
+ fts_release_all_finger();
+
+#if FTS_POWER_SOURCE_CUST_EN
+ fts_power_source_ctrl(ts_data, ENABLE);
+#if FTS_PINCTRL_EN
+ fts_pinctrl_select_normal(ts_data);
+
+#endif
+#endif
+
+ fts_tp_state_recovery(ts_data->client);
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_resume();
+#endif
+
+#if FTS_GESTURE_EN
+ if ((fts_gesture_resume(ts_data->client) == 0 || !gesture_disabled_when_resume)
+ && gesture_enabled_when_resume) {
+ FTS_INFO("gesture_enabled_when_resume, do gesture resume");
+ ts_data->suspended = false;
+ return 0;
+ } else {
+ FTS_ERROR("gesture resume process failed!");
+ FTS_INFO("Set tp state suspended false!");
+ }
+#endif
+
+ ts_data->suspended = false;
+ fts_irq_enable();
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+static int fts_pm_suspend(struct device *dev)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+ int ret = 0;
+
+ ts_data->dev_pm_suspend = true;
+
+ if (ts_data->lpwg_mode) {
+ ret = enable_irq_wake(ts_data->irq);
+ if (ret) {
+ FTS_INFO("enable_irq_wake(irq:%d) failed", ts_data->irq);
+ }
+ }
+
+ reinit_completion(&ts_data->dev_pm_suspend_completion);
+
+ return ret;
+}
+
+static int fts_pm_resume(struct device *dev)
+{
+ struct fts_ts_data *ts_data = dev_get_drvdata(dev);
+ int ret = 0;
+
+ ts_data->dev_pm_suspend = false;
+
+ if (ts_data->lpwg_mode) {
+ ret = disable_irq_wake(ts_data->irq);
+ if (ret) {
+ FTS_INFO("disable_irq_wake(irq:%d) failed", ts_data->irq);
+ }
+ }
+
+ complete(&ts_data->dev_pm_suspend_completion);
+
+ return 0;
+}
+
+static const struct dev_pm_ops fts_dev_pm_ops = {
+ .suspend = fts_pm_suspend,
+ .resume = fts_pm_resume,
+};
+
+static void fts_resume_work(struct work_struct *work)
+{
+ struct fts_ts_data *ts;
+ ts = container_of(work, struct fts_ts_data, resume_work);
+ fts_ts_resume(&ts->client->dev);
+}
+
+static void fts_suspend_work(struct work_struct *work)
+{
+ struct fts_ts_data *ts;
+ ts = container_of(work, struct fts_ts_data, suspend_work);
+ fts_ts_suspend(&ts->client->dev);
+}
+
+
+/*****************************************************************************
+* I2C Driver
+*****************************************************************************/
+static const struct i2c_device_id fts_ts_id[] = {
+ {FTS_DRIVER_NAME, 0},
+ {},
+};
+
+MODULE_DEVICE_TABLE(i2c, fts_ts_id);
+
+static struct of_device_id fts_match_table[] = {
+ {.compatible = "focaltech,fts",},
+ {},
+};
+
+static struct i2c_driver fts_ts_driver = {
+ .probe = fts_ts_probe,
+ .remove = fts_ts_remove,
+ .driver = {
+ .name = FTS_DRIVER_NAME,
+ .owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .pm = &fts_dev_pm_ops,
+#endif
+ .of_match_table = fts_match_table,
+ },
+ .id_table = fts_ts_id,
+};
+
+/*****************************************************************************
+* Name: fts_ts_init
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int __init fts_ts_init(void)
+{
+ int ret = 0;
+
+ FTS_FUNC_ENTER();
+ ret = i2c_add_driver(&fts_ts_driver);
+ if (ret != 0) {
+ FTS_ERROR("Focaltech touch screen driver init failed!");
+ }
+ FTS_FUNC_EXIT();
+ return ret;
+}
+
+/*****************************************************************************
+* Name: fts_ts_exit
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void __exit fts_ts_exit(void)
+{
+ i2c_del_driver(&fts_ts_driver);
+}
+
+module_init(fts_ts_init);
+module_exit(fts_ts_exit);
+
+MODULE_AUTHOR("FocalTech Driver Team");
+MODULE_DESCRIPTION("FocalTech Touchscreen Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h
new file mode 100644
index 000000000000..0118521cfc0f
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_core.h
@@ -0,0 +1,283 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+/*****************************************************************************
+*
+* File Name: focaltech_core.h
+
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+#ifndef __LINUX_FOCALTECH_CORE_H__
+#define __LINUX_FOCALTECH_CORE_H__
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/input/mt.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/regulator/consumer.h>
+#include <linux/firmware.h>
+#include <linux/debugfs.h>
+#include <linux/mutex.h>
+#include <linux/wait.h>
+#include <linux/time.h>
+#include <linux/workqueue.h>
+#include <linux/fs.h>
+#include <linux/proc_fs.h>
+#include <asm/uaccess.h>
+#include <linux/version.h>
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/kthread.h>
+#include <linux/init.h>
+#include <linux/cdev.h>
+#include <linux/device.h>
+#include <linux/mount.h>
+#include <linux/netdevice.h>
+#include <linux/unistd.h>
+#include <linux/ioctl.h>
+#include <linux/vmalloc.h>
+#include "focaltech_common.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define FTS_MAX_POINTS_SUPPORT 10 /* constant value, can't be changed */
+#define FTS_MAX_KEYS 4
+#define FTS_KEY_WIDTH 50
+#define FTS_ONE_TCH_LEN 6
+
+#define FTS_MAX_ID 0x0A
+#define FTS_TOUCH_X_H_POS 3
+#define FTS_TOUCH_X_L_POS 4
+#define FTS_TOUCH_Y_H_POS 5
+#define FTS_TOUCH_Y_L_POS 6
+#define FTS_TOUCH_PRE_POS 7
+#define FTS_TOUCH_AREA_POS 8
+#define FTS_TOUCH_POINT_NUM 2
+#define FTS_TOUCH_EVENT_POS 3
+#define FTS_TOUCH_ID_POS 5
+#define FTS_COORDS_ARR_SIZE 4
+
+#define FTS_TOUCH_DOWN 0
+#define FTS_TOUCH_UP 1
+#define FTS_TOUCH_CONTACT 2
+#define EVENT_DOWN(flag) ((FTS_TOUCH_DOWN == flag) || (FTS_TOUCH_CONTACT == flag))
+#define EVENT_UP(flag) (FTS_TOUCH_UP == flag)
+#define EVENT_NO_DOWN(data) (!data->point_num)
+#define KEY_EN(data) (data->pdata->have_key)
+#define TOUCH_IS_KEY(y, key_y) (y == key_y)
+#define TOUCH_IN_RANGE(val, key_val, half) ((val > (key_val - half)) && (val < (key_val + half)))
+#define TOUCH_IN_KEY(x, key_x) TOUCH_IN_RANGE(x, key_x, FTS_KEY_WIDTH)
+
+#define FTS_LOCKDOWN_INFO_SIZE 8
+#define LOCKDOWN_INFO_ADDR 0x1FA0
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+struct fts_ts_platform_data {
+ u32 irq_gpio;
+ u32 irq_gpio_flags;
+ u32 reset_gpio;
+ u32 reset_gpio_flags;
+ u32 lcd_reset_gpio;
+ u32 lcd_reset_gpio_flags;
+ bool have_key;
+ u32 key_number;
+ u32 keys[FTS_MAX_KEYS];
+ u32 key_y_coord;
+ u32 key_x_coords[FTS_MAX_KEYS];
+ u32 x_max;
+ u32 y_max;
+ u32 x_min;
+ u32 y_min;
+ u32 max_touch_number;
+};
+
+struct ts_event {
+ int x; /*x coordinate */
+ int y; /*y coordinate */
+ int p; /* pressure */
+ int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
+ int id; /*touch ID */
+ int area;
+};
+
+struct fts_ts_data {
+ struct i2c_client *client;
+ struct input_dev *input_dev;
+ struct fts_ts_platform_data *pdata;
+ struct ts_ic_info ic_info;
+ struct workqueue_struct *ts_workqueue;
+ struct work_struct fwupg_work;
+ struct delayed_work esdcheck_work;
+ struct delayed_work prc_work;
+ struct regulator *vsp;
+ struct regulator *vsn;
+ struct regulator *vddio;
+ struct regulator *i2c;
+ spinlock_t irq_lock;
+ struct mutex report_mutex;
+ int irq;
+ int dbclick_count;
+ bool suspended;
+ bool fw_loading;
+ bool irq_disabled;
+#if FTS_POWER_SOURCE_CUST_EN
+ bool power_disabled;
+#endif
+ /* multi-touch */
+ struct ts_event *events;
+ u8 *point_buf;
+ int pnt_buf_size;
+ int touchs;
+ bool key_down;
+ int touch_point;
+ int point_num;
+ int fw_ver_in_host;
+ int fw_ver_in_tp;
+ short chipid;
+ struct proc_dir_entry *proc;
+ u8 proc_opmode;
+ u8 lockdown_info[FTS_LOCKDOWN_INFO_SIZE];
+ bool dev_pm_suspend;
+ bool lpwg_mode;
+ struct work_struct suspend_work;
+ struct work_struct resume_work;
+ struct workqueue_struct *event_wq;
+ struct completion dev_pm_suspend_completion;
+#if FTS_PINCTRL_EN
+ struct pinctrl *pinctrl;
+ struct pinctrl_state *pins_active;
+ struct pinctrl_state *pins_suspend;
+ struct pinctrl_state *pins_release;
+#endif
+#ifdef CONFIG_FB
+ struct notifier_block fb_notif;
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ struct early_suspend early_suspend;
+#endif
+ struct dentry *debugfs;
+ struct proc_dir_entry *tp_selftest_proc;
+ struct proc_dir_entry *tp_data_dump_proc;
+ struct proc_dir_entry *tp_fw_version_proc;
+ struct proc_dir_entry *tp_lockdown_info_proc;
+
+};
+
+struct fts_mode_switch {
+ struct fts_ts_data *ts_data;
+ unsigned char mode;
+ struct work_struct switch_mode_work;
+};
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+extern struct fts_ts_data *fts_data;
+
+/* i2c communication*/
+int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue);
+int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue);
+int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen);
+int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen);
+void fts_i2c_hid2std(struct i2c_client *client);
+int fts_i2c_init(void);
+int fts_i2c_exit(void);
+
+/* Gesture functions */
+#if FTS_GESTURE_EN
+int fts_gesture_init(struct fts_ts_data *ts_data);
+int fts_gesture_exit(struct i2c_client *client);
+void fts_gesture_recovery(struct i2c_client *client);
+int fts_gesture_readdata(struct fts_ts_data *ts_data);
+int fts_gesture_suspend(struct i2c_client *i2c_client);
+int fts_gesture_resume(struct i2c_client *client);
+#endif
+
+/* Apk and functions */
+#if FTS_APK_NODE_EN
+int fts_create_apk_debug_channel(struct fts_ts_data *);
+void fts_release_apk_debug_channel(struct fts_ts_data *);
+#endif
+
+/* ADB functions */
+#if FTS_SYSFS_NODE_EN
+int fts_create_sysfs(struct i2c_client *client);
+int fts_remove_sysfs(struct i2c_client *client);
+#endif
+
+/* ESD */
+#if FTS_ESDCHECK_EN
+int fts_esdcheck_init(struct fts_ts_data *ts_data);
+int fts_esdcheck_exit(struct fts_ts_data *ts_data);
+int fts_esdcheck_switch(bool enable);
+int fts_esdcheck_proc_busy(bool proc_debug);
+int fts_esdcheck_set_intr(bool intr);
+int fts_esdcheck_suspend(void);
+int fts_esdcheck_resume(void);
+#endif
+
+/* Production test */
+#if FTS_TEST_EN
+int fts_test_init(struct i2c_client *client);
+int fts_test_exit(struct i2c_client *client);
+#endif
+
+/* Point Report Check*/
+#if FTS_POINT_REPORT_CHECK_EN
+int fts_point_report_check_init(struct fts_ts_data *ts_data);
+int fts_point_report_check_exit(struct fts_ts_data *ts_data);
+void fts_prc_queue_work(struct fts_ts_data *ts_data);
+#endif
+
+/* FW upgrade */
+int fts_upgrade_bin(struct i2c_client *client, char *fw_name, bool force);
+int fts_fwupg_init(struct fts_ts_data *ts_data);
+int fts_fwupg_exit(struct fts_ts_data *ts_data);
+
+/* Other */
+int fts_reset_proc(int hdelayms);
+int fts_wait_tp_to_valid(struct i2c_client *client);
+void fts_tp_state_recovery(struct i2c_client *client);
+int fts_ex_mode_init(struct i2c_client *client);
+int fts_ex_mode_exit(struct i2c_client *client);
+int fts_ex_mode_recovery(struct i2c_client *client);
+
+void fts_irq_disable(void);
+void fts_irq_enable(void);
+
+int fts_flash_read(struct i2c_client *client, u32 addr, u8 *buf, u32 len);
+int fts_flash_read_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len);
+void fts_gesture_enable(bool enable);
+
+#endif /* __LINUX_FOCALTECH_CORE_H__ */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c
new file mode 100644
index 000000000000..41053c2ca404
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_esdcheck.c
@@ -0,0 +1,554 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_esdcheck.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-03
+*
+* Abstract: ESD check function
+*
+* Version: v1.0
+*
+* Revision History:
+* v1.0:
+* First release. By luougojin 2016-08-03
+* v1.1: By luougojin 2017-02-15
+* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror
+*****************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+#if FTS_ESDCHECK_EN
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define ESDCHECK_WAIT_TIME 1000 /* ms */
+#define LCD_ESD_PATCH 0
+
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+struct fts_esdcheck_st {
+ u8 mode:1; /* 1- need check esd 0- no esd check */
+ u8 suspend:1;
+ u8 proc_debug:1; /* apk or adb is accessing I2C */
+ u8 intr:1; /* 1- Interrupt trigger */
+ u8 unused:4;
+ u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */
+ u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */
+ u32 hardware_reset_cnt;
+ u32 i2c_nack_cnt;
+ u32 i2c_dataerror_cnt;
+};
+
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+static struct fts_esdcheck_st fts_esdcheck_data;
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+
+/*****************************************************************************
+* functions body
+*****************************************************************************/
+#if LCD_ESD_PATCH
+/*****************************************************************************
+* Name: lcd_esdcheck
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int lcd_need_reset;
+static int tp_need_recovery; /* LCD reset cause Tp reset */
+int idc_esdcheck_lcderror(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ u8 val = 0;
+ struct i2c_client *client = ts_data->client;
+
+ FTS_DEBUG("[ESD]Check LCD ESD");
+ if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) {
+ tp_need_recovery = 0;
+ /* LCD reset, need recover TP state */
+ fts_tp_state_recovery(client);
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_ESD_SATURATE, &val);
+ if (ret < 0) {
+ FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret);
+ return -EIO;
+ }
+
+ if (val == 0xAA) {
+ /*
+ * 1. Set flag lcd_need_reset = 1;
+ * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0
+ * 3. recover TP state
+ */
+ FTS_INFO("LCD ESD, Execute LCD reset!");
+ lcd_need_reset = 1;
+ tp_need_recovery = 1;
+ }
+
+ return 0;
+}
+#endif
+
+/*****************************************************************************
+* Name: fts_esdcheck_tp_reset
+* Brief: esd check algorithm
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int fts_esdcheck_tp_reset(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+
+ fts_esdcheck_data.flow_work_hold_cnt = 0;
+ fts_esdcheck_data.hardware_reset_cnt++;
+
+ fts_reset_proc(200);
+ fts_tp_state_recovery(ts_data->client);
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: get_chip_id
+* Brief: Read Chip Id 3 times
+* Input:
+* Output:
+* Return: 1 - Read Chip Id 3 times failed
+* 0 - Read Chip Id pass
+*****************************************************************************/
+static bool get_chip_id(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ int i = 0;
+ u8 reg_value = 0;
+ u8 reg_addr = 0;
+ struct i2c_client *client = ts_data->client;
+ u8 chip_id = ts_data->ic_info.ids.chip_idh;
+
+ for (i = 0; i < 3; i++) {
+ reg_addr = FTS_REG_CHIP_ID;
+ ret = fts_i2c_read(client, &reg_addr, 1, &reg_value, 1);
+ if (ret < 0) {
+ FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", ret);
+ fts_esdcheck_data.i2c_nack_cnt++;
+ } else {
+ if (reg_value == chip_id) {
+ break;
+ } else {
+ fts_esdcheck_data.i2c_dataerror_cnt++;
+ }
+ }
+ msleep(10);
+ }
+
+ /* if can't get correct data in 3 times, then need hardware reset */
+ if (i >= 3) {
+ FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!");
+ return 1;
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+* Name: get_flow_cnt
+* Brief: Read flow cnt(0x91)
+* Input:
+* Output:
+* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times
+* 0 - Reg 0x91(flow cnt) normal
+*****************************************************************************/
+static bool get_flow_cnt(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ u8 reg_value = 0;
+ u8 reg_addr = 0;
+ struct i2c_client *client = ts_data->client;
+
+ reg_addr = FTS_REG_FLOW_WORK_CNT;
+ ret = fts_i2c_read(client, &reg_addr, 1, &reg_value, 1);
+ if (ret < 0) {
+ FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", ret);
+ fts_esdcheck_data.i2c_nack_cnt++;
+ } else {
+ if (reg_value == fts_esdcheck_data.flow_work_cnt_last) {
+ fts_esdcheck_data.flow_work_hold_cnt++;
+ } else {
+ fts_esdcheck_data.flow_work_hold_cnt = 0;
+ }
+
+ fts_esdcheck_data.flow_work_cnt_last = reg_value;
+ }
+
+ /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */
+ if (fts_esdcheck_data.flow_work_hold_cnt >= 5) {
+ FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!");
+ return 1;
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+* Name: esdcheck_algorithm
+* Brief: esd check algorithm
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static int esdcheck_algorithm(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ u8 reg_value = 0;
+ u8 reg_addr = 0;
+ bool hardware_reset = 0;
+ struct i2c_client *client = ts_data->client;
+
+ /* 1. esdcheck is interrupt, then return */
+ if (fts_esdcheck_data.intr == 1) {
+ FTS_DEBUG("[ESD]: In interrupt state, not check esd, return immediately!!");
+ return 0;
+ }
+
+ /* 2. check power state, if suspend, no need check esd */
+ if (fts_esdcheck_data.suspend == 1) {
+ FTS_DEBUG("[ESD]: In suspend, not check esd, return immediately!!");
+ /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1)
+ * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again
+ */
+ return 0;
+ }
+
+ /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd */
+ if (fts_esdcheck_data.proc_debug == 1) {
+ FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!");
+ return 0;
+ }
+
+ /* 4. In factory mode, can't check esd */
+ reg_addr = FTS_REG_WORKMODE;
+ ret = fts_i2c_read(client, &reg_addr, 1, &reg_value, 1);
+ if (ret < 0) {
+ fts_esdcheck_data.i2c_nack_cnt++;
+ } else if ((reg_value & 0x70) != FTS_REG_WORKMODE_WORK_VALUE) {
+ FTS_DEBUG("[ESD]: not in work mode, no check esd, return immediately!!");
+ return 0;
+ }
+
+ /* 5. IDC esd check lcd default:close */
+#if LCD_ESD_PATCH
+ idc_esdcheck_lcderror(ts_data);
+#endif
+
+ /* 6. Get Chip ID */
+ hardware_reset = get_chip_id(ts_data);
+
+ /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */
+ if (!hardware_reset) {
+ hardware_reset = get_flow_cnt(ts_data);
+ }
+
+ /* 8. If need hardware reset, then handle it here */
+ if (hardware_reset == 1) {
+ fts_esdcheck_tp_reset(ts_data);
+ }
+
+ FTS_DEBUG("[ESD]: NoACK=%d, Error Data=%d, Hardware Reset=%d", fts_esdcheck_data.i2c_nack_cnt,
+ fts_esdcheck_data.i2c_dataerror_cnt, fts_esdcheck_data.hardware_reset_cnt);
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_func
+* Brief: fts_esdcheck_func
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void esdcheck_func(struct work_struct *work)
+{
+ u8 val = 0;
+ struct fts_ts_data *ts_data = container_of(work,
+ struct fts_ts_data, esdcheck_work.work);
+
+ FTS_FUNC_ENTER();
+ if (ENABLE == fts_esdcheck_data.mode) {
+ if (ts_data->ic_info.is_incell) {
+ fts_i2c_read_reg(ts_data->client, FTS_REG_ESDCHECK_DISABLE, &val);
+ if (0xA5 == val) {
+ fts_esdcheck_data.mode = DISABLE;
+ return;
+ }
+ }
+ esdcheck_algorithm(ts_data);
+ queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work,
+ msecs_to_jiffies(ESDCHECK_WAIT_TIME));
+ }
+ FTS_FUNC_EXIT();
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_set_intr
+* Brief: interrupt flag (main used in interrupt tp report)
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_set_intr(bool intr)
+{
+ /* interrupt don't add debug message */
+ fts_esdcheck_data.intr = intr;
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_get_status(void)
+* Brief: get current status
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_get_status(void)
+{
+ /* interrupt don't add debug message */
+ return fts_esdcheck_data.mode;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_proc_busy
+* Brief: When APK or ADB command access TP via driver, then need set proc_debug,
+* then will not check ESD.
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_proc_busy(bool proc_debug)
+{
+ fts_esdcheck_data.proc_debug = proc_debug;
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_switch
+* Brief: FTS esd check function switch.
+* Input: enable: 1 - Enable esd check
+* 0 - Disable esd check
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_switch(bool enable)
+{
+ struct fts_ts_data *ts_data = fts_data;
+ FTS_FUNC_ENTER();
+ if (fts_esdcheck_data.mode == ENABLE) {
+ if (enable) {
+ FTS_DEBUG("[ESD]: ESD check start!!");
+ fts_esdcheck_data.flow_work_hold_cnt = 0;
+ fts_esdcheck_data.flow_work_cnt_last = 0;
+ queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work,
+ msecs_to_jiffies(ESDCHECK_WAIT_TIME));
+ } else {
+ FTS_DEBUG("[ESD]: ESD check stop!!");
+ cancel_delayed_work(&ts_data->esdcheck_work);
+ }
+ } else {
+ FTS_DEBUG("[ESD]: ESD should disable!!");
+ cancel_delayed_work(&ts_data->esdcheck_work);
+ }
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_suspend
+* Brief: Run when tp enter into suspend
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_suspend(void)
+{
+ FTS_FUNC_ENTER();
+ fts_esdcheck_switch(DISABLE);
+ fts_esdcheck_data.suspend = 1;
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_resume
+* Brief: Run when tp resume
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_resume(void)
+{
+ FTS_FUNC_ENTER();
+ fts_esdcheck_switch(ENABLE);
+ fts_esdcheck_data.suspend = 0;
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_esdcheck_store
+* Brief: no
+* Input: device, device attribute, char buf, char count
+* Output: no
+* Return: EPERM
+***********************************************************************/
+static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ FTS_DEBUG("enable esdcheck");
+ fts_esdcheck_data.mode = ENABLE;
+ fts_esdcheck_switch(ENABLE);
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ FTS_DEBUG("disable esdcheck");
+ fts_esdcheck_data.mode = DISABLE;
+ fts_esdcheck_switch(DISABLE);
+ }
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/************************************************************************
+* Name: fts_esdcheck_show
+* Brief: no
+* Input: device, device attribute, char buf
+* Output: no
+* Return: EPERM
+***********************************************************************/
+static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+ count = snprintf(buf, PAGE_SIZE, "Esd check: %s\n", fts_esdcheck_get_status() ? "On" : "Off");
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/* sysfs esd node
+ * read example: cat fts_esd_mode ---read esd mode
+ * write example:echo 01 > fts_esd_mode ---make esdcheck enable
+ *
+ */
+static DEVICE_ATTR(fts_esd_mode, S_IRUGO | S_IWUSR, fts_esdcheck_show, fts_esdcheck_store);
+
+static struct attribute *fts_esd_mode_attrs[] = {
+
+ &dev_attr_fts_esd_mode.attr,
+ NULL,
+};
+
+static struct attribute_group fts_esd_group = {
+ .attrs = fts_esd_mode_attrs,
+};
+
+/*****************************************************************************
+* Name: fts_create_gesture_sysfs
+* Brief:
+* Input:
+* Output:
+* Return: 0-success or others-error
+*****************************************************************************/
+int fts_create_esd_sysfs(struct i2c_client *client)
+{
+ int ret = 0;
+
+ ret = sysfs_create_group(&client->dev.kobj, &fts_esd_group);
+ if (ret != 0) {
+ FTS_ERROR("fts_create_esd_sysfs(sysfs) create failed!");
+ sysfs_remove_group(&client->dev.kobj, &fts_esd_group);
+ return ret;
+ }
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_init
+* Brief: Init and create a queue work to check esd
+* Input:
+* Output:
+* Return: < 0: Fail to create esd check queue
+*****************************************************************************/
+int fts_esdcheck_init(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+
+ if (ts_data->ts_workqueue) {
+ INIT_DELAYED_WORK(&ts_data->esdcheck_work, esdcheck_func);
+ } else {
+ FTS_ERROR("fts workqueue is NULL, can't run esd check function");
+ return -EINVAL;
+ }
+
+ memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st));
+
+ fts_esdcheck_data.mode = ENABLE;
+ fts_esdcheck_switch(ENABLE);
+ fts_create_esd_sysfs(ts_data->client);
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_esdcheck_exit
+* Brief: When FTS TP driver is removed, then call this function to destory work queue
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_esdcheck_exit(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+#endif /* FTS_ESDCHECK_EN */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c
new file mode 100644
index 000000000000..9f32a876cc75
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_fun.c
@@ -0,0 +1,1040 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: Focaltech_ex_fun.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+/*create apk debug channel*/
+#define PROC_UPGRADE 0
+#define PROC_READ_REGISTER 1
+#define PROC_WRITE_REGISTER 2
+#define PROC_AUTOCLB 4
+#define PROC_UPGRADE_INFO 5
+#define PROC_WRITE_DATA 6
+#define PROC_READ_DATA 7
+#define PROC_SET_TEST_FLAG 8
+#define PROC_SET_SLAVE_ADDR 10
+#define PROC_HW_RESET 11
+#define PROC_NAME "ftxxxx-debug"
+#define PROC_WRITE_BUF_SIZE 256
+#define PROC_READ_BUF_SIZE 256
+
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+enum {
+ RWREG_OP_READ = 0,
+ RWREG_OP_WRITE = 1,
+};
+static struct rwreg_operation_t {
+ int type; /* 0: read, 1: write */
+ int reg; /* register */
+ int len; /* read/write length */
+ int val; /* length = 1; read: return value, write: op return */
+ int res; /* 0: success, otherwise: fail */
+ char *opbuf; /* length >= 1, read return value, write: op return */
+} rw_op;
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
+/************************************************************************
+* Name: fts_debug_write
+* Brief:interface of write proc
+* Input: file point, data buf, data len, no use
+* Output: no
+* Return: data len
+***********************************************************************/
+static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos)
+{
+ u8 writebuf[PROC_WRITE_BUF_SIZE] = { 0 };
+ int buflen = count;
+ int writelen = 0;
+ int ret = 0;
+ char tmp[25];
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client = ts_data->client;
+
+ if ((count == 0) || (count > PROC_WRITE_BUF_SIZE)) {
+ FTS_ERROR("apk proc wirte count(%d) fail", (int)count);
+ return -EINVAL;
+ }
+
+ if (copy_from_user(&writebuf, buff, count)) {
+ FTS_ERROR("[APK]: copy from user error!!");
+ return -EFAULT;
+ }
+
+ ts_data->proc_opmode = writebuf[0];
+
+ switch (ts_data->proc_opmode) {
+ case PROC_SET_TEST_FLAG:
+ FTS_INFO("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]);
+#if FTS_ESDCHECK_EN
+ if (writebuf[1] == 0) {
+ fts_esdcheck_switch(ENABLE);
+ } else {
+ fts_esdcheck_switch(DISABLE);
+ }
+#endif
+ break;
+ case PROC_READ_REGISTER:
+ writelen = 1;
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!");
+ }
+ break;
+ case PROC_WRITE_REGISTER:
+ writelen = 2;
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!");
+ }
+ break;
+ case PROC_SET_SLAVE_ADDR:
+#if (FTS_CHIP_TYPE == _FT8201)
+ FTS_INFO("Original i2c addr 0x%x", client->addr << 1);
+ if (writebuf[1] != client->addr) {
+ client->addr = writebuf[1];
+ FTS_INFO("Change i2c addr 0x%x to 0x%x", client->addr << 1, writebuf[1] << 1);
+ }
+#endif
+ break;
+
+ case PROC_HW_RESET:
+ snprintf(tmp, PAGE_SIZE, "%s", writebuf + 1);
+ tmp[buflen - 1] = '\0';
+ if (strncmp(tmp, "focal_driver", 12) == 0) {
+ FTS_INFO("APK execute HW Reset");
+ fts_reset_proc(1);
+ }
+ break;
+
+ case PROC_READ_DATA:
+ case PROC_WRITE_DATA:
+ writelen = buflen - 1;
+ if (writelen > 0) {
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (ret < 0) {
+ return ret;
+ } else {
+ return count;
+ }
+}
+
+/************************************************************************
+* Name: fts_debug_read
+* Brief:interface of read proc
+* Input: point to the data, no use, no use, read len, no use, no use
+* Output: page point to data
+* Return: read char number
+***********************************************************************/
+static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos)
+{
+ int ret = 0;
+ int num_read_chars = 0;
+ int readlen = 0;
+ u8 buf[PROC_READ_BUF_SIZE] = { 0 };
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client = ts_data->client;
+
+ if ((count == 0) || (count > PROC_READ_BUF_SIZE)) {
+ FTS_ERROR("apk proc read count(%d) fail", (int)count);
+ return -EINVAL;
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(1);
+#endif
+
+ switch (ts_data->proc_opmode) {
+ case PROC_READ_REGISTER:
+ readlen = 1;
+ ret = fts_i2c_read(client, NULL, 0, buf, readlen);
+ if (ret < 0) {
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ FTS_ERROR("[APK]: read iic error!!");
+ return ret;
+ }
+ num_read_chars = 1;
+ break;
+ case PROC_READ_DATA:
+ readlen = count;
+ ret = fts_i2c_read(client, NULL, 0, buf, readlen);
+ if (ret < 0) {
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ FTS_ERROR("[APK]: read iic error!!");
+ return ret;
+ }
+
+ num_read_chars = readlen;
+ break;
+ case PROC_WRITE_DATA:
+ break;
+ default:
+ break;
+ }
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+
+ if (copy_to_user(buff, buf, num_read_chars)) {
+ FTS_ERROR("[APK]: copy to user error!!");
+ return -EFAULT;
+ }
+
+ return num_read_chars;
+}
+
+static const struct file_operations fts_proc_fops = {
+ .owner = THIS_MODULE,
+ .read = fts_debug_read,
+ .write = fts_debug_write,
+};
+#else
+/* interface of write proc */
+/************************************************************************
+* Name: fts_debug_write
+* Brief:interface of write proc
+* Input: file point, data buf, data len, no use
+* Output: no
+* Return: data len
+***********************************************************************/
+static int fts_debug_write(struct file *filp, const char __user *buff, unsigned long len, void *data)
+{
+ int ret = 0;
+ u8 writebuf[PROC_WRITE_BUF_SIZE] = { 0 };
+ int buflen = len;
+ int writelen = 0;
+ char tmp[25];
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client = ts_data->client;
+
+ if ((count == 0) || (count > PROC_WRITE_BUF_SIZE)) {
+ FTS_ERROR("apk proc wirte count(%d) fail", (int)count);
+ return -EINVAL;
+ }
+
+ if (copy_from_user(&writebuf, buff, buflen)) {
+ FTS_ERROR("[APK]: copy from user error!!");
+ return -EFAULT;
+ }
+
+ ts_data->proc_opmode = writebuf[0];
+
+ switch (ts_data->proc_opmode) {
+ case PROC_SET_TEST_FLAG:
+ FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]);
+#if FTS_ESDCHECK_EN
+ if (writebuf[1] == 0) {
+ fts_esdcheck_switch(ENABLE);
+ } else {
+ fts_esdcheck_switch(DISABLE);
+ }
+#endif
+ break;
+ case PROC_READ_REGISTER:
+ writelen = 1;
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!n");
+ }
+ break;
+ case PROC_WRITE_REGISTER:
+ writelen = 2;
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!");
+ }
+ break;
+ case PROC_SET_SLAVE_ADDR:
+#if (FTS_CHIP_TYPE == _FT8201)
+ ret = client->addr;
+ FTS_DEBUG("Original i2c addr 0x%x ", ret << 1);
+ if (writebuf[1] != client->addr) {
+ client->addr = writebuf[1];
+ FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret << 1, writebuf[1] << 1);
+ }
+#endif
+ break;
+
+ case PROC_HW_RESET:
+ snprintf(tmp, PAGE_SIZE, "%s", writebuf + 1);
+ tmp[buflen - 1] = '\0';
+ if (strncmp(tmp, "focal_driver", 12) == 0) {
+ FTS_INFO("Begin HW Reset");
+ fts_reset_proc(1);
+ }
+ break;
+
+ case PROC_READ_DATA:
+ case PROC_WRITE_DATA:
+ writelen = len - 1;
+ if (writelen > 0) {
+ ret = fts_i2c_write(client, writebuf + 1, writelen);
+ if (ret < 0) {
+ FTS_ERROR("[APK]: write iic error!!");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (ret < 0) {
+ return ret;
+ } else {
+ return len;
+ }
+}
+
+/* interface of read proc */
+/************************************************************************
+* Name: fts_debug_read
+* Brief:interface of read proc
+* Input: point to the data, no use, no use, read len, no use, no use
+* Output: page point to data
+* Return: read char number
+***********************************************************************/
+static int fts_debug_read(char *page, char **start, off_t off, int count, int *eof, void *data)
+{
+ int ret = 0;
+ u8 buf[PROC_READ_BUF_SIZE] = { 0 };
+ int num_read_chars = 0;
+ int readlen = 0;
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client = ts_data->client;
+
+ if ((count == 0) || (count > PROC_READ_BUF_SIZE)) {
+ FTS_ERROR("apk proc read count(%d) fail", (int)count);
+ return -EINVAL;
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(1);
+#endif
+ switch (ts_data->proc_opmode) {
+ case PROC_READ_REGISTER:
+ readlen = 1;
+ ret = fts_i2c_read(client, NULL, 0, buf, readlen);
+ if (ret < 0) {
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ FTS_ERROR("[APK]: read iic error!!");
+ return ret;
+ }
+ num_read_chars = 1;
+ break;
+ case PROC_READ_DATA:
+ readlen = count;
+ ret = fts_i2c_read(client, NULL, 0, buf, readlen);
+ if (ret < 0) {
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ FTS_ERROR("[APK]: read iic error!!");
+ return ret;
+ }
+
+ num_read_chars = readlen;
+ break;
+ case PROC_WRITE_DATA:
+ break;
+ default:
+ break;
+ }
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+
+ memcpy(page, buf, num_read_chars);
+ return num_read_chars;
+}
+#endif
+
+/************************************************************************
+* Name: fts_create_apk_debug_channel
+* Brief: create apk debug channel
+* Input: i2c info
+* Output:
+* Return: return 0 if success
+***********************************************************************/
+int fts_create_apk_debug_channel(struct fts_ts_data *ts_data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
+ ts_data->proc = proc_create(PROC_NAME, 0644, NULL, &fts_proc_fops);
+#else
+ ts_data->proc = create_proc_entry(PROC_NAME, 0666, NULL);
+#endif
+ if (NULL == ts_data->proc) {
+ FTS_ERROR("create proc entry fail");
+ return -ENOMEM;
+ } else {
+ FTS_INFO("Create proc entry success!");
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+ ts_data->proc->write_proc = fts_debug_write;
+ ts_data->proc->read_proc = fts_debug_read;
+#endif
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_release_apk_debug_channel
+* Brief: release apk debug channel
+* Input:
+* Output:
+* Return:
+***********************************************************************/
+void fts_release_apk_debug_channel(struct fts_ts_data *ts_data)
+{
+
+ if (ts_data->proc) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
+ proc_remove(ts_data->proc);
+#else
+ remove_proc_entry(PROC_NAME, NULL);
+#endif
+ }
+}
+
+/************************************************************************
+ * sysfs interface
+ ***********************************************************************/
+
+/*
+ * fts_hw_reset interface
+ */
+static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ return -EPERM;
+}
+
+static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+ ssize_t count = 0;
+
+ mutex_lock(&input_dev->mutex);
+ fts_reset_proc(1);
+ count = snprintf(buf, PAGE_SIZE, "hw reset executed\n");
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/*
+ * fts_irq interface
+ */
+static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ FTS_INFO("[EX-FUN]enable irq");
+ fts_irq_enable();
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ FTS_INFO("[EX-FUN]disable irq");
+ fts_irq_disable();
+ }
+ mutex_unlock(&input_dev->mutex);
+ return count;
+}
+
+static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return -EPERM;
+}
+
+/*
+ * fts_tpfwver interface
+ */
+static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct fts_ts_data *ts_data = fts_data;
+ struct input_dev *input_dev = ts_data->input_dev;
+ struct i2c_client *client = ts_data->client;
+ ssize_t num_read_chars = 0;
+ u8 fwver = 0;
+
+ mutex_lock(&input_dev->mutex);
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(1);
+#endif
+ if (fts_i2c_read_reg(client, FTS_REG_FW_VER, &fwver) < 0) {
+ num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n");
+ }
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ if ((fwver == 0xFF) || (fwver == 0x00))
+ num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n");
+ else
+ num_read_chars = snprintf(buf, PAGE_SIZE, "%02x\n", fwver);
+
+ mutex_unlock(&input_dev->mutex);
+ return num_read_chars;
+}
+
+static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ return -EPERM;
+}
+
+/************************************************************************
+* Name: fts_tprwreg_show
+* Brief: no
+* Input: device, device attribute, char buf
+* Output: no
+* Return: EPERM
+***********************************************************************/
+static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ int i;
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+
+ if (rw_op.len < 0) {
+ count = snprintf(buf, PAGE_SIZE, "Invalid cmd line\n");
+ } else if (rw_op.len == 1) {
+ if (RWREG_OP_READ == rw_op.type) {
+ if (rw_op.res == 0) {
+ count = snprintf(buf, PAGE_SIZE, "Read %02X: %02X\n", rw_op.reg, rw_op.val);
+ } else {
+ count = snprintf(buf, PAGE_SIZE, "Read %02X failed, ret: %d\n", rw_op.reg, rw_op.res);
+ }
+ } else {
+ if (rw_op.res == 0) {
+ count = snprintf(buf, PAGE_SIZE, "Write %02X, %02X success\n", rw_op.reg, rw_op.val);
+ } else {
+ count = snprintf(buf, PAGE_SIZE, "Write %02X failed, ret: %d\n", rw_op.reg, rw_op.res);
+ }
+ }
+ } else {
+ if (RWREG_OP_READ == rw_op.type) {
+ count = snprintf(buf, PAGE_SIZE, "Read Reg: [%02X]-[%02X]\n", rw_op.reg, rw_op.reg + rw_op.len);
+ count += snprintf(buf + count, PAGE_SIZE, "Result: ");
+ if (rw_op.res) {
+ count += snprintf(buf + count, PAGE_SIZE, "failed, ret: %d\n", rw_op.res);
+ } else {
+ if (rw_op.opbuf) {
+ for (i = 0; i < rw_op.len; i++) {
+ count += snprintf(buf + count, PAGE_SIZE, "%02X ", rw_op.opbuf[i]);
+ }
+ count += snprintf(buf + count, PAGE_SIZE, "\n");
+ }
+ }
+ } else {
+ ;
+ count =
+ snprintf(buf, PAGE_SIZE, "Write Reg: [%02X]-[%02X]\n", rw_op.reg,
+ rw_op.reg + rw_op.len - 1);
+ count += snprintf(buf + count, PAGE_SIZE, "Write Data: ");
+ if (rw_op.opbuf) {
+ for (i = 1; i < rw_op.len; i++) {
+ count += snprintf(buf + count, PAGE_SIZE, "%02X ", rw_op.opbuf[i]);
+ }
+ count += snprintf(buf + count, PAGE_SIZE, "\n");
+ }
+ if (rw_op.res) {
+ count += snprintf(buf + count, PAGE_SIZE, "Result: failed, ret: %d\n", rw_op.res);
+ } else {
+ count += snprintf(buf + count, PAGE_SIZE, "Result: success\n");
+ }
+ }
+ /*if (rw_op.opbuf) {
+ kfree(rw_op.opbuf);
+ rw_op.opbuf = NULL;
+ } */
+ }
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+static int shex_to_int(const char *hex_buf, int size)
+{
+ int i;
+ int base = 1;
+ int value = 0;
+ char single;
+
+ for (i = size - 1; i >= 0; i--) {
+ single = hex_buf[i];
+
+ if ((single >= '0') && (single <= '9')) {
+ value += (single - '0') * base;
+ } else if ((single >= 'a') && (single <= 'z')) {
+ value += (single - 'a' + 10) * base;
+ } else if ((single >= 'A') && (single <= 'Z')) {
+ value += (single - 'A' + 10) * base;
+ } else {
+ return -EINVAL;
+ }
+
+ base *= 16;
+ }
+
+ return value;
+}
+
+static u8 shex_to_u8(const char *hex_buf, int size)
+{
+ return (u8) shex_to_int(hex_buf, size);
+}
+
+/*
+ * Format buf:
+ * [0]: '0' write, '1' read(reserved)
+ * [1-2]: addr, hex
+ * [3-4]: length, hex
+ * [5-6]...[n-(n+1)]: data, hex
+ */
+static int fts_parse_buf(const char *buf, size_t cmd_len)
+{
+ int length;
+ int i;
+ char *tmpbuf;
+
+ rw_op.reg = shex_to_u8(buf + 1, 2);
+ length = shex_to_int(buf + 3, 2);
+
+ if (buf[0] == '1') {
+ rw_op.len = length;
+ rw_op.type = RWREG_OP_READ;
+ FTS_DEBUG("read %02X, %d bytes", rw_op.reg, rw_op.len);
+ } else {
+ if (cmd_len < (length * 2 + 5)) {
+ pr_err("data invalided!\n");
+ return -EINVAL;
+ }
+ FTS_DEBUG("write %02X, %d bytes", rw_op.reg, length);
+
+ /* first byte is the register addr */
+ rw_op.type = RWREG_OP_WRITE;
+ rw_op.len = length + 1;
+ }
+
+ if (rw_op.len > 0) {
+ tmpbuf = (char *)kzalloc(rw_op.len, GFP_KERNEL);
+ if (!tmpbuf) {
+ FTS_ERROR("allocate memory failed!\n");
+ return -ENOMEM;
+ }
+
+ if (RWREG_OP_WRITE == rw_op.type) {
+ tmpbuf[0] = rw_op.reg & 0xFF;
+ FTS_DEBUG("write buffer: ");
+ for (i = 1; i < rw_op.len; i++) {
+ tmpbuf[i] = shex_to_u8(buf + 5 + i * 2 - 2, 2);
+ FTS_DEBUG("buf[%d]: %02X", i, tmpbuf[i] & 0xFF);
+ }
+ }
+ rw_op.opbuf = tmpbuf;
+ }
+
+ return rw_op.len;
+}
+
+/************************************************************************
+* Name: fts_tprwreg_store
+* Brief: read/write register
+* Input: device, device attribute, char buf, char count
+* Output: print register value
+* Return: char count
+***********************************************************************/
+static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+ ssize_t cmd_length = 0;
+
+ mutex_lock(&input_dev->mutex);
+ cmd_length = count - 1;
+
+ if (rw_op.opbuf) {
+ kfree(rw_op.opbuf);
+ rw_op.opbuf = NULL;
+ }
+
+ FTS_DEBUG("cmd len: %d, buf: %s", (int)cmd_length, buf);
+ /* compatible old ops */
+ if (2 == cmd_length) {
+ rw_op.type = RWREG_OP_READ;
+ rw_op.len = 1;
+
+ rw_op.reg = shex_to_int(buf, 2);
+ } else if (4 == cmd_length) {
+ rw_op.type = RWREG_OP_WRITE;
+ rw_op.len = 1;
+ rw_op.reg = shex_to_int(buf, 2);
+ rw_op.val = shex_to_int(buf + 2, 2);
+
+ } else if (cmd_length < 5) {
+ FTS_ERROR("Invalid cmd buffer");
+ mutex_unlock(&input_dev->mutex);
+ return -EINVAL;
+ } else {
+ rw_op.len = fts_parse_buf(buf, cmd_length);
+ }
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(1);
+#endif
+ if (rw_op.len < 0) {
+ FTS_ERROR("cmd buffer error!");
+
+ } else {
+ if (RWREG_OP_READ == rw_op.type) {
+ if (rw_op.len == 1) {
+ u8 reg, val;
+ reg = rw_op.reg & 0xFF;
+ rw_op.res = fts_i2c_read_reg(client, reg, &val);
+ rw_op.val = val;
+ } else {
+ char reg;
+ reg = rw_op.reg & 0xFF;
+
+ rw_op.res = fts_i2c_read(client, &reg, 1, rw_op.opbuf, rw_op.len);
+ }
+
+ if (rw_op.res < 0) {
+ FTS_ERROR("Could not read 0x%02x", rw_op.reg);
+ } else {
+ FTS_INFO("read 0x%02x, %d bytes successful", rw_op.reg, rw_op.len);
+ rw_op.res = 0;
+ }
+
+ } else {
+ if (rw_op.len == 1) {
+ u8 reg, val;
+ reg = rw_op.reg & 0xFF;
+ val = rw_op.val & 0xFF;
+ rw_op.res = fts_i2c_write_reg(client, reg, val);
+ } else {
+ rw_op.res = fts_i2c_write(client, rw_op.opbuf, rw_op.len);
+ }
+ if (rw_op.res < 0) {
+ FTS_ERROR("Could not write 0x%02x", rw_op.reg);
+
+ } else {
+ FTS_INFO("Write 0x%02x, %d bytes successful", rw_op.val, rw_op.len);
+ rw_op.res = 0;
+ }
+ }
+ }
+
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/*
+ * fts_upgrade_bin interface
+ */
+#if 0
+static ssize_t fts_fwupgradebin_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return -EPERM;
+}
+
+static ssize_t fts_fwupgradebin_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ char fwname[FILE_NAME_LENGTH];
+ struct fts_ts_data *ts_data = fts_data;
+ struct input_dev *input_dev = ts_data->input_dev;
+ struct i2c_client *client = ts_data->client;
+ if ((count <= 1) || (count >= FILE_NAME_LENGTH - 32)) {
+ FTS_ERROR("fw bin name's length(%d) fail", (int)count);
+ return -EINVAL;
+ }
+ memset(fwname, 0, sizeof(fwname));
+ snprintf(fwname, PAGE_SIZE, "%s", buf);
+ fwname[count - 1] = '\0';
+
+ FTS_INFO("upgrade with bin file through sysfs node");
+ mutex_lock(&input_dev->mutex);
+ ts_data->fw_loading = 1;
+ fts_irq_disable();
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(DISABLE);
+#endif
+ fts_upgrade_bin(client, fwname, 0);
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(ENABLE);
+#endif
+ fts_irq_enable();
+ ts_data->fw_loading = 0;
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+#endif
+/*
+ * fts_force_upgrade interface
+ */
+static ssize_t fts_fwforceupg_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return -EPERM;
+}
+
+static ssize_t fts_fwforceupg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ char fwname[FILE_NAME_LENGTH];
+ struct fts_ts_data *ts_data = fts_data;
+ struct input_dev *input_dev = ts_data->input_dev;
+#if 0
+ struct i2c_client *client = ts_data->client;
+#endif
+ if ((count <= 1) || (count >= FILE_NAME_LENGTH - 32)) {
+ FTS_ERROR("fw bin name's length(%d) fail", (int)count);
+ return -EINVAL;
+ }
+ memset(fwname, 0, sizeof(fwname));
+ snprintf(fwname, PAGE_SIZE, "%s", buf);
+ fwname[count - 1] = '\0';
+
+ FTS_INFO("force upgrade through sysfs node");
+ mutex_lock(&input_dev->mutex);
+ ts_data->fw_loading = 1;
+ fts_irq_disable();
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(DISABLE);
+#endif
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(ENABLE);
+#endif
+ fts_irq_enable();
+ ts_data->fw_loading = 0;
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/*
+ * fts_driver_version interface
+ */
+static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+ count = snprintf(buf, PAGE_SIZE, FTS_DRIVER_VERSION "\n");
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ return -EPERM;
+}
+
+/*
+ * fts_dump_reg interface
+ */
+static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ return -EPERM;
+}
+
+static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count = 0;
+ u8 val = 0;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(1);
+#endif
+ fts_i2c_read_reg(client, FTS_REG_POWER_MODE, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "Power Mode:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_FW_VER, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "FW Ver:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_LIC_VER, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "LCD Initcode Ver:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_IDE_PARA_VER_ID, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "Param Ver:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_IDE_PARA_STATUS, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "Param status:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "Vendor ID:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "LCD Busy Number:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "Gesture Mode:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "charge stat:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_INT_CNT, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "INT count:0x%02x\n", val);
+
+ fts_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, &val);
+ count += snprintf(buf + count, PAGE_SIZE, "ESD count:0x%02x\n", val);
+#if FTS_ESDCHECK_EN
+ fts_esdcheck_proc_busy(0);
+#endif
+
+ mutex_unlock(&input_dev->mutex);
+ return count;
+}
+
+/* get the fw version example:cat fw_version */
+static DEVICE_ATTR(fts_fw_version, S_IRUGO | S_IWUSR, fts_tpfwver_show, fts_tpfwver_store);
+
+/* read and write register(s)
+* All data type is **HEX**
+* Single Byte:
+* read: echo 88 > rw_reg ---read register 0x88
+* write: echo 8807 > rw_reg ---write 0x07 into register 0x88
+* Multi-bytes:
+* [0:rw-flag][1-2: reg addr, hex][3-4: length, hex][5-6...n-n+1: write data, hex]
+* rw-flag: 0, write; 1, read
+* read: echo 10005 > rw_reg ---read reg 0x00-0x05
+* write: echo 000050102030405 > rw_reg ---write reg 0x00-0x05 as 01,02,03,04,05
+* Get result:
+* cat rw_reg
+*/
+static DEVICE_ATTR(fts_rw_reg, S_IRUGO | S_IWUSR, fts_tprwreg_show, fts_tprwreg_store);
+/* upgrade from fw bin file example:echo "*.bin" > fts_upgrade_bin */
+#if 0
+static DEVICE_ATTR(fts_upgrade_bin, S_IRUGO | S_IWUSR, fts_fwupgradebin_show, fts_fwupgradebin_store);
+#endif
+static DEVICE_ATTR(fts_force_upgrade, S_IRUGO | S_IWUSR, fts_fwforceupg_show, fts_fwforceupg_store);
+static DEVICE_ATTR(fts_driver_version, S_IRUGO | S_IWUSR, fts_driverversion_show, fts_driverversion_store);
+static DEVICE_ATTR(fts_dump_reg, S_IRUGO | S_IWUSR, fts_dumpreg_show, fts_dumpreg_store);
+static DEVICE_ATTR(fts_hw_reset, S_IRUGO | S_IWUSR, fts_hw_reset_show, fts_hw_reset_store);
+static DEVICE_ATTR(fts_irq, S_IRUGO | S_IWUSR, fts_irq_show, fts_irq_store);
+
+/* add your attr in here*/
+static struct attribute *fts_attributes[] = {
+
+ &dev_attr_fts_fw_version.attr,
+ &dev_attr_fts_rw_reg.attr,
+ &dev_attr_fts_dump_reg.attr,
+#if 0
+ &dev_attr_fts_upgrade_bin.attr,
+#endif
+ &dev_attr_fts_force_upgrade.attr,
+ &dev_attr_fts_driver_version.attr,
+ &dev_attr_fts_hw_reset.attr,
+ &dev_attr_fts_irq.attr,
+ NULL
+};
+
+static struct attribute_group fts_attribute_group = {
+ .attrs = fts_attributes
+};
+
+/************************************************************************
+* Name: fts_create_sysfs
+* Brief: create sysfs interface
+* Input:
+* Output:
+* Return: return 0 if success
+***********************************************************************/
+int fts_create_sysfs(struct i2c_client *client)
+{
+ int ret = 0;
+
+ ret = sysfs_create_group(&client->dev.kobj, &fts_attribute_group);
+ if (ret) {
+ FTS_ERROR("[EX]: sysfs_create_group() failed!!");
+ sysfs_remove_group(&client->dev.kobj, &fts_attribute_group);
+ return -ENOMEM;
+ } else {
+ FTS_INFO("[EX]: sysfs_create_group() succeeded!!");
+ }
+
+ return ret;
+}
+
+/************************************************************************
+* Name: fts_remove_sysfs
+* Brief: remove sysfs interface
+* Input:
+* Output:
+* Return:
+***********************************************************************/
+int fts_remove_sysfs(struct i2c_client *client)
+{
+ sysfs_remove_group(&client->dev.kobj, &fts_attribute_group);
+ return 0;
+}
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c
new file mode 100644
index 000000000000..a34a97725973
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_ex_mode.c
@@ -0,0 +1,381 @@
+/*
+ *
+ * FocalTech ftxxxx TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_ex_mode.c
+*
+* Author: Liu WeiGuang
+*
+* Created: 2016-08-31
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+/*****************************************************************************
+* 2.Private constant and macro definitions using #define
+*****************************************************************************/
+
+/*****************************************************************************
+* 3.Private enumerations, structures and unions using typedef
+*****************************************************************************/
+struct fts_mode_flag {
+ int fts_glove_mode_flag;
+ int fts_cover_mode_flag;
+ int fts_charger_mode_flag;
+};
+
+struct fts_mode_flag g_fts_mode_flag;
+
+/*****************************************************************************
+* 4.Static variables
+*****************************************************************************/
+
+/*****************************************************************************
+* 5.Global variable or extern global variabls/functions
+*****************************************************************************/
+int fts_enter_glove_mode(struct i2c_client *client, int mode);
+int fts_enter_cover_mode(struct i2c_client *client, int mode);
+int fts_enter_charger_mode(struct i2c_client *client, int mode);
+
+/*****************************************************************************
+* 6.Static function prototypes
+*******************************************************************************/
+
+#if FTS_GLOVE_EN
+static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ u8 val;
+ struct input_dev *input_dev = fts_data->input_dev;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+
+ mutex_lock(&input_dev->mutex);
+ fts_i2c_read_reg(client, FTS_REG_GLOVE_MODE_EN, &val);
+ count = snprintf(buf, PAGE_SIZE, "Glove Mode: %s\n", g_fts_mode_flag.fts_glove_mode_flag ? "On" : "Off");
+ count += snprintf(buf + count, PAGE_SIZE, "Glove Reg(0xC0) = %d\n", val);
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client;
+
+ client = ts_data->client;
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ if (!g_fts_mode_flag.fts_glove_mode_flag) {
+ FTS_INFO("[Mode]enter glove mode");
+ ret = fts_enter_glove_mode(client, true);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_glove_mode_flag = true;
+ }
+ }
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ if (g_fts_mode_flag.fts_glove_mode_flag) {
+ FTS_INFO("[Mode]exit glove mode");
+ ret = fts_enter_glove_mode(client, false);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_glove_mode_flag = false;
+ }
+ }
+ }
+ FTS_INFO("[Mode]glove mode status: %d", g_fts_mode_flag.fts_glove_mode_flag);
+ return count;
+}
+
+/************************************************************************
+* Name: fts_enter_glove_mode
+* Brief: change glove mode
+* Input: glove mode
+* Output: no
+* Return: success >=0, otherwise failed
+***********************************************************************/
+int fts_enter_glove_mode(struct i2c_client *client, int mode)
+{
+ int ret = 0;
+ static u8 buf_addr[2] = { 0 };
+ static u8 buf_value[2] = { 0 };
+ buf_addr[0] = FTS_REG_GLOVE_MODE_EN; /* glove control */
+
+ if (mode)
+ buf_value[0] = 0x01;
+ else
+ buf_value[0] = 0x00;
+
+ ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]);
+ if (ret < 0) {
+ FTS_ERROR("[Mode]fts_enter_glove_mode write value fail");
+ }
+
+ return ret;
+
+}
+
+/* read and write glove mode
+* read example: cat fts_touch_glove_mode---read glove mode
+* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01
+*
+*/
+static DEVICE_ATTR(fts_glove_mode, S_IRUGO | S_IWUSR, fts_touch_glove_show, fts_touch_glove_store);
+
+#endif
+
+#if FTS_COVER_EN
+static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ u8 val;
+ struct input_dev *input_dev = fts_data->input_dev;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+
+ mutex_lock(&input_dev->mutex);
+ fts_i2c_read_reg(client, FTS_REG_COVER_MODE_EN, &val);
+ count = snprintf(buf, PAGE_SIZE, "Cover Mode: %s\n", g_fts_mode_flag.fts_cover_mode_flag ? "On" : "Off");
+ count += snprintf(buf + count, PAGE_SIZE, "Cover Reg(0xC1) = %d\n", val);
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client;
+
+ client = ts_data->client;
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ if (!g_fts_mode_flag.fts_cover_mode_flag) {
+ FTS_INFO("[Mode]enter cover mode");
+ ret = fts_enter_cover_mode(client, true);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_cover_mode_flag = true;
+ }
+ }
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ if (g_fts_mode_flag.fts_cover_mode_flag) {
+ FTS_INFO("[Mode]exit cover mode");
+ ret = fts_enter_cover_mode(client, false);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_cover_mode_flag = false;
+ }
+ }
+ }
+ FTS_INFO("[Mode]cover mode status: %d", g_fts_mode_flag.fts_cover_mode_flag);
+ return count;
+}
+
+/************************************************************************
+* Name: fts_enter_cover_mode
+* Brief: change cover mode
+* Input: cover mode
+* Output: no
+* Return: success >=0, otherwise failed
+***********************************************************************/
+int fts_enter_cover_mode(struct i2c_client *client, int mode)
+{
+ int ret = 0;
+ static u8 buf_addr[2] = { 0 };
+ static u8 buf_value[2] = { 0 };
+ buf_addr[0] = FTS_REG_COVER_MODE_EN; /* cover control */
+
+ if (mode)
+ buf_value[0] = 0x01;
+ else
+ buf_value[0] = 0x00;
+
+ ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]);
+ if (ret < 0) {
+ FTS_ERROR("[Mode] fts_enter_cover_mode write value fail \n");
+ }
+
+ return ret;
+
+}
+
+/* read and write cover mode
+* read example: cat fts_touch_cover_mode---read cover mode
+* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01
+*
+*/
+static DEVICE_ATTR(fts_cover_mode, S_IRUGO | S_IWUSR, fts_touch_cover_show, fts_touch_cover_store);
+
+#endif
+
+#if FTS_CHARGER_EN
+static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ u8 val;
+ struct input_dev *input_dev = fts_data->input_dev;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+
+ mutex_lock(&input_dev->mutex);
+ fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, &val);
+ count = snprintf(buf, PAGE_SIZE, "Charge Mode: %s\n", g_fts_mode_flag.fts_charger_mode_flag ? "On" : "Off");
+ count += snprintf(buf + count, PAGE_SIZE, "Charge Reg(0x8B) = %d\n", val);
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ struct fts_ts_data *ts_data = fts_data;
+ struct i2c_client *client;
+
+ client = ts_data->client;
+
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ if (!g_fts_mode_flag.fts_charger_mode_flag) {
+ FTS_INFO("[Mode]enter charger mode");
+ ret = fts_enter_charger_mode(client, true);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_charger_mode_flag = true;
+ }
+ }
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ if (g_fts_mode_flag.fts_charger_mode_flag) {
+ FTS_INFO("[Mode]exit charger mode");
+ ret = fts_enter_charger_mode(client, false);
+ if (ret >= 0) {
+ g_fts_mode_flag.fts_charger_mode_flag = false;
+ }
+ }
+ }
+ FTS_INFO("[Mode]charger mode status: %d", g_fts_mode_flag.fts_charger_mode_flag);
+ return count;
+}
+
+/************************************************************************
+* Name: fts_enter_charger_mode
+* Brief: change charger mode
+* Input: charger mode
+* Output: no
+* Return: success >=0, otherwise failed
+***********************************************************************/
+int fts_enter_charger_mode(struct i2c_client *client, int mode)
+{
+ int ret = 0;
+ static u8 buf_addr[2] = { 0 };
+ static u8 buf_value[2] = { 0 };
+ buf_addr[0] = FTS_REG_CHARGER_MODE_EN; /* charger control */
+
+ if (mode)
+ buf_value[0] = 0x01;
+ else
+ buf_value[0] = 0x00;
+
+ ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]);
+ if (ret < 0) {
+ FTS_DEBUG("[Mode]fts_enter_charger_mode write value fail");
+ }
+
+ return ret;
+
+}
+
+/* read and write charger mode
+* read example: cat fts_touch_charger_mode---read charger mode
+* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01
+*
+*/
+static DEVICE_ATTR(fts_charger_mode, S_IRUGO | S_IWUSR, fts_touch_charger_show, fts_touch_charger_store);
+
+#endif
+
+static struct attribute *fts_touch_mode_attrs[] = {
+#if FTS_GLOVE_EN
+ &dev_attr_fts_glove_mode.attr,
+#endif
+
+#if FTS_COVER_EN
+ &dev_attr_fts_cover_mode.attr,
+#endif
+
+#if FTS_CHARGER_EN
+ &dev_attr_fts_charger_mode.attr,
+#endif
+
+ NULL,
+};
+
+static struct attribute_group fts_touch_mode_group = {
+ .attrs = fts_touch_mode_attrs,
+};
+
+int fts_ex_mode_init(struct i2c_client *client)
+{
+ int err = 0;
+
+ g_fts_mode_flag.fts_glove_mode_flag = false;
+ g_fts_mode_flag.fts_cover_mode_flag = false;
+ g_fts_mode_flag.fts_charger_mode_flag = false;
+
+ err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group);
+ if (0 != err) {
+ FTS_ERROR("[Mode]create sysfs failed.");
+ sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group);
+ return -EIO;
+ } else {
+ FTS_DEBUG("[Mode]create sysfs succeeded");
+ }
+
+ return err;
+
+}
+
+int fts_ex_mode_exit(struct i2c_client *client)
+{
+ sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group);
+ return 0;
+}
+
+int fts_ex_mode_recovery(struct i2c_client *client)
+{
+ int ret = 0;
+#if FTS_GLOVE_EN
+ if (g_fts_mode_flag.fts_glove_mode_flag)
+ ret = fts_enter_glove_mode(client, true);
+#endif
+
+#if FTS_COVER_EN
+ if (g_fts_mode_flag.fts_cover_mode_flag)
+ ret = fts_enter_cover_mode(client, true);
+#endif
+
+#if FTS_CHARGER_EN
+ if (g_fts_mode_flag.fts_charger_mode_flag)
+ ret = fts_enter_charger_mode(client, true);
+#endif
+
+ return ret;
+}
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c
new file mode 100644
index 000000000000..0e7859d344a5
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.c
@@ -0,0 +1,1783 @@
+/*
+ *
+ * FocalTech fts TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_flash.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+#include "focaltech_flash.h"
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+/* Upgrade FW/PRAMBOOT/LCD CFG */
+
+#if FTS_AUTO_UPGRADE_EN
+u8 fw_file[] = {
+
+#include FTS_UPGRADE_FW_FILE
+};
+u8 fw_file2[] = {
+#include FTS_UPGRADE_FW2_FILE
+};
+
+u8 fw_file3[] = {
+#include FTS_UPGRADE_FW3_FILE
+};
+
+struct upgrade_fw fw_list[] = {
+ {FTS_VENDOR_ID, fw_file, sizeof(fw_file)}
+ ,
+ {FTS_VENDOR_ID2, fw_file2, sizeof(fw_file2)}
+ ,
+ {FTS_VENDOR_ID3, fw_file3, sizeof(fw_file3)}
+ ,
+};
+struct upgrade_func *upgrade_func_list[] = {
+ &upgrade_func_ft8719,
+};
+#endif
+struct fts_upgrade *fwupgrade;
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+static u16 fts_pram_ecc_calc_host(u8 *pbuf, u16 length)
+{
+ u16 ecc = 0;
+ u16 i = 0;
+ u16 j = 0;
+
+ for (i = 0; i < length; i += 2) {
+ ecc ^= ((pbuf[i] << 8) | (pbuf[i + 1]));
+ for (j = 0; j < 16; j++) {
+ if (ecc & 0x01)
+ ecc = (u16) ((ecc >> 1) ^ AL2_FCS_COEF);
+ else
+ ecc >>= 1;
+ }
+ }
+
+ return ecc;
+}
+
+/************************************************************************
+ * fts_pram_ecc_cal - Calculate and get pramboot ecc
+ *
+ * return pramboot ecc of tp if success, otherwise return error code
+ ***********************************************************************/
+static int fts_pram_ecc_cal_algo(struct i2c_client *client, u32 start_addr, u32 ecc_length)
+{
+ int ret = 0;
+ int i = 0;
+ int ecc = 0;
+ u8 val[2] = { 0 };
+ u8 cmd[FTS_ROMBOOT_CMD_ECC_NEW_LEN] = { 0 };
+
+ FTS_INFO("read out pramboot checksum");
+ cmd[0] = FTS_ROMBOOT_CMD_ECC;
+ cmd[1] = BYTE_OFF_16(start_addr);
+ cmd[2] = BYTE_OFF_8(start_addr);
+ cmd[3] = BYTE_OFF_0(start_addr);
+ cmd[4] = BYTE_OFF_16(ecc_length);
+ cmd[5] = BYTE_OFF_8(ecc_length);
+ cmd[6] = BYTE_OFF_0(ecc_length);
+ ret = fts_i2c_write(client, cmd, FTS_ROMBOOT_CMD_ECC_NEW_LEN);
+ if (ret < 0) {
+ FTS_ERROR("write pramboot ecc cal cmd fail");
+ return ret;
+ }
+
+ cmd[0] = FTS_ROMBOOT_CMD_ECC_FINISH;
+ for (i = 0; i < 100; i++) {
+ msleep(1);
+ ret = fts_i2c_read(client, cmd, 1, val, 1);
+ if (ret < 0) {
+ FTS_ERROR("ecc_finish read cmd fail");
+ return ret;
+ }
+ if (0 == val[0])
+ break;
+ }
+ if (i >= 100) {
+ FTS_ERROR("wait ecc finish fail");
+ return -EIO;
+ }
+
+ cmd[0] = FTS_CMD_READ_ECC;
+ ret = fts_i2c_read(client, cmd, 1, val, 2);
+ if (ret < 0) {
+ FTS_ERROR("read pramboot ecc fail");
+ return ret;
+ }
+
+ ecc = ((u16) (val[0] << 8) + val[1]) & 0x0000FFFF;
+ return ecc;
+}
+
+static int fts_pram_ecc_cal_xor(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 reg_val = 0;
+
+ FTS_INFO("read out pramboot checksum");
+
+ ret = fts_i2c_read_reg(client, FTS_ROMBOOT_CMD_ECC, &reg_val);
+ if (ret < 0) {
+ FTS_ERROR("read pramboot ecc fail");
+ return ret;
+ }
+
+ return (int)reg_val;
+}
+
+static int fts_pram_ecc_cal(struct i2c_client *client, u32 saddr, u32 len)
+{
+ if ((NULL == fwupgrade) && (NULL == fwupgrade->func)) {
+ FTS_ERROR("fwupgrade/func is null");
+ return -EINVAL;
+ }
+
+ if (fwupgrade->func->newmode) {
+ return fts_pram_ecc_cal_algo(client, saddr, len);
+ } else {
+ return fts_pram_ecc_cal_xor(client);
+ }
+}
+
+/************************************************************************
+ * fts_pram_write_buf - write pramboot data and calculate ecc
+ *
+ * return pramboot ecc of host if success, otherwise return error code
+ ***********************************************************************/
+static int fts_pram_write_buf(struct i2c_client *client, u8 *buf, u32 len)
+{
+ int ret = 0;
+ u32 i = 0;
+ u32 j = 0;
+ u32 offset = 0;
+ u32 remainder = 0;
+ u32 packet_number;
+ u32 packet_len = 0;
+ u8 packet_buf[FTS_FLASH_PACKET_LENGTH + FTS_CMD_WRITE_LEN] = { 0 };
+ u8 ecc_tmp = 0;
+ int ecc_in_host = 0;
+
+ FTS_INFO("write pramboot to pram");
+ if ((NULL == fwupgrade) && (NULL == fwupgrade->func)) {
+ FTS_ERROR("fwupgrade/func is null");
+ return -EINVAL;
+ }
+
+ if (NULL == buf) {
+ FTS_ERROR("pramboot buf is null");
+ return -EINVAL;
+ }
+
+ FTS_INFO("pramboot len=%d", len);
+ if ((len < PRAMBOOT_MIN_SIZE) || (len > PRAMBOOT_MAX_SIZE)) {
+ FTS_ERROR("pramboot length(%d) fail", len);
+ return -EINVAL;
+ }
+
+ packet_number = len / FTS_FLASH_PACKET_LENGTH;
+ remainder = len % FTS_FLASH_PACKET_LENGTH;
+ if (remainder > 0)
+ packet_number++;
+ packet_len = FTS_FLASH_PACKET_LENGTH;
+
+ packet_buf[0] = FTS_ROMBOOT_CMD_WRITE;
+ for (i = 0; i < packet_number; i++) {
+ offset = i * FTS_FLASH_PACKET_LENGTH;
+ packet_buf[1] = BYTE_OFF_16(offset);
+ packet_buf[2] = BYTE_OFF_8(offset);
+ packet_buf[3] = BYTE_OFF_0(offset);
+
+ /* last packet */
+ if ((i == (packet_number - 1)) && remainder)
+ packet_len = remainder;
+
+ packet_buf[4] = BYTE_OFF_8(packet_len);
+ packet_buf[5] = BYTE_OFF_0(packet_len);
+
+ for (j = 0; j < packet_len; j++) {
+ packet_buf[FTS_CMD_WRITE_LEN + j] = buf[offset + j];
+ if (!fwupgrade->func->newmode) {
+ ecc_tmp ^= packet_buf[FTS_CMD_WRITE_LEN + j];
+ }
+ }
+
+ ret = fts_i2c_write(client, packet_buf, packet_len + FTS_CMD_WRITE_LEN);
+ if (ret < 0) {
+ FTS_ERROR("pramboot write data(%d) fail", i);
+ return ret;
+ }
+ }
+
+ if (fwupgrade->func->newmode) {
+ ecc_in_host = (int)fts_pram_ecc_calc_host(buf, len);
+ } else {
+ ecc_in_host = (int)ecc_tmp;
+ }
+
+ return ecc_in_host;
+}
+
+/************************************************************************
+ * fts_pram_start - remap to start pramboot
+ *
+ * return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int fts_pram_start(struct i2c_client *client)
+{
+ u8 cmd = FTS_ROMBOOT_CMD_START_APP;
+ int ret = 0;
+
+ FTS_INFO("remap to start pramboot");
+
+ ret = fts_i2c_write(client, &cmd, 1);
+ if (ret < 0) {
+ FTS_ERROR("write start pram cmd fail");
+ return ret;
+ }
+ msleep(FTS_DELAY_PRAMBOOT_START);
+
+ return 0;
+}
+
+/************************************************************************
+ * fts_pram_write_remap - write pramboot to pram and start pramboot
+ *
+ * return 0 if success, otherwise return error code
+***********************************************************************/
+static int fts_pram_write_remap(struct i2c_client *client)
+{
+ int ret = 0;
+ int ecc_in_host = 0;
+ int ecc_in_tp = 0;
+ u8 *pb_buf = NULL;
+ u32 pb_len = 0;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("write pram and remap");
+
+ if (!upg || !upg->func || !upg->func->pramboot) {
+ FTS_ERROR("upgrade/pramboot is null");
+ return -EINVAL;
+ }
+
+ if (upg->func->pb_length < FTS_MIN_LEN) {
+ FTS_ERROR("pramboot length(%x) fail", upg->func->pb_length);
+ return -EINVAL;
+ }
+
+ pb_buf = upg->func->pramboot;
+ pb_len = upg->func->pb_length;
+
+ /* write pramboot to pram */
+ ecc_in_host = fts_pram_write_buf(client, pb_buf, pb_len);
+ if (ecc_in_host < 0) {
+ FTS_ERROR("write pramboot fail");
+ return ecc_in_host;
+ }
+
+ /* read out checksum */
+ ecc_in_tp = fts_pram_ecc_cal(client, 0, pb_len);
+ if (ecc_in_tp < 0) {
+ FTS_ERROR("read pramboot ecc fail");
+ return ecc_in_tp;
+ }
+
+ FTS_INFO("pram ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host);
+ /* pramboot checksum != fw checksum, upgrade fail */
+ if (ecc_in_host != ecc_in_tp) {
+ FTS_ERROR("pramboot ecc check fail");
+ return -EIO;
+ }
+
+ /*start pram */
+ ret = fts_pram_start(client);
+ if (ret < 0) {
+ FTS_ERROR("pram start fail");
+ return ret;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * fts_pram_init - initialize pramboot
+ *
+ * return 0 if success, otherwise return error code
+***********************************************************************/
+static int fts_pram_init(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 reg_val = 0;
+ u8 wbuf[3] = { 0 };
+
+ FTS_INFO("pramboot initialization");
+
+ /* read flash ID */
+ wbuf[0] = FTS_CMD_FLASH_TYPE;
+ ret = fts_i2c_read(client, wbuf, 1, &reg_val, 1);
+ if (ret < 0) {
+ FTS_ERROR("read flash type fail");
+ return ret;
+ }
+
+ /* set flash clk */
+ wbuf[0] = FTS_CMD_FLASH_TYPE;
+ wbuf[1] = reg_val;
+ wbuf[2] = 0x00;
+ ret = fts_i2c_write(client, wbuf, 3);
+ if (ret < 0) {
+ FTS_ERROR("write flash type fail");
+ return ret;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_pram_write_init
+* Brief: wirte pramboot to pram and initialize
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_pram_write_init(struct i2c_client *client)
+{
+ int ret = 0;
+ bool state = 0;
+ enum FW_STATUS status = FTS_RUN_IN_ERROR;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("**********pram write and init**********");
+ if ((NULL == upg) || (NULL == upg->func)) {
+ FTS_ERROR("upgrade/func is null");
+ return -EINVAL;
+ }
+
+ if (!upg->func->pramboot_supported) {
+ FTS_ERROR("ic not support pram");
+ return -EINVAL;
+ }
+
+ FTS_DEBUG("check whether tp is in romboot or not ");
+ /* need reset to romboot when non-romboot state */
+ ret = fts_fwupg_get_boot_state(client, &status);
+ if (status != FTS_RUN_IN_ROM) {
+ if (FTS_RUN_IN_PRAM == status) {
+ FTS_INFO("tp is in pramboot, need send reset cmd before upgrade");
+ ret = fts_pram_init(client);
+ if (ret < 0) {
+ FTS_ERROR("pramboot(before) init fail");
+ return ret;
+ }
+ }
+
+ FTS_INFO("tp isn't in romboot, need send reset to romboot");
+ ret = fts_fwupg_reset_to_romboot(client);
+ if (ret < 0) {
+ FTS_ERROR("reset to romboot fail");
+ return ret;
+ }
+ }
+
+ /* check the length of the pramboot */
+ ret = fts_pram_write_remap(client);
+ if (ret < 0) {
+ FTS_ERROR("pram write fail, ret=%d", ret);
+ return ret;
+ }
+
+ FTS_DEBUG("after write pramboot, confirm run in pramboot");
+ state = fts_fwupg_check_state(client, FTS_RUN_IN_PRAM);
+ if (!state) {
+ FTS_ERROR("not in pramboot");
+ return -EIO;
+ }
+
+ ret = fts_pram_init(client);
+ if (ret < 0) {
+ FTS_ERROR("pramboot init fail");
+ return ret;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_fwupg_check_fw_valid
+* Brief: check fw in tp is valid or not
+* Input:
+* Output:
+* Return: return true if fw is valid, otherwise return false
+***********************************************************************/
+bool fts_fwupg_check_fw_valid(struct i2c_client *client)
+{
+ int ret = 0;
+
+ ret = fts_wait_tp_to_valid(client);
+ if (ret < 0) {
+ FTS_INFO("tp fw invaild");
+ return false;
+ }
+
+ FTS_INFO("tp fw vaild");
+ return true;
+}
+
+/************************************************************************
+* Name: fts_fwupg_get_boot_state
+* Brief: read boot id(rom/pram/bootloader), confirm boot environment
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_fwupg_get_boot_state(struct i2c_client *client, enum FW_STATUS *fw_sts)
+{
+ int ret = 0;
+ u8 cmd[4] = { 0 };
+ u32 cmd_len = 0;
+ u8 val[2] = { 0 };
+ struct ft_chip_t ids = fts_data->ic_info.ids;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("**********read boot id**********");
+ if ((NULL == fw_sts) || (NULL == upg) || (NULL == upg->func)) {
+ FTS_ERROR("upgrade/func/fw_sts is null");
+ return -EINVAL;
+ }
+
+ if (upg->func->hid_supported)
+ fts_i2c_hid2std(client);
+
+ cmd[0] = FTS_CMD_START1;
+ cmd[1] = FTS_CMD_START2;
+ ret = fts_i2c_write(client, cmd, 2);
+ if (ret < 0) {
+ FTS_ERROR("write 55 aa cmd fail");
+ return ret;
+ }
+
+ msleep(FTS_CMD_START_DELAY);
+ cmd[0] = FTS_CMD_READ_ID;
+ cmd[1] = cmd[2] = cmd[3] = 0x00;
+ if (fts_data->ic_info.is_incell)
+ cmd_len = FTS_CMD_READ_ID_LEN_INCELL;
+ else
+ cmd_len = FTS_CMD_READ_ID_LEN;
+ ret = fts_i2c_read(client, cmd, cmd_len, val, 2);
+ if (ret < 0) {
+ FTS_ERROR("write 90 cmd fail");
+ return ret;
+ }
+
+ FTS_INFO("read boot id:0x%02x%02x", val[0], val[1]);
+ if ((val[0] == ids.rom_idh) && (val[1] == ids.rom_idl)) {
+ FTS_INFO("tp run in romboot");
+ *fw_sts = FTS_RUN_IN_ROM;
+ } else if ((val[0] == ids.pb_idh) && (val[1] == ids.pb_idl)) {
+ FTS_INFO("tp run in pramboot");
+ *fw_sts = FTS_RUN_IN_PRAM;
+ } else if ((val[0] == ids.bl_idh) && (val[1] == ids.bl_idl)) {
+ FTS_INFO("tp run in bootloader");
+ *fw_sts = FTS_RUN_IN_BOOTLOADER;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_fwupg_check_state
+* Brief: confirm tp run in romboot/pramboot/bootloader
+* Input:
+* Output:
+* Return: return true if state is match, otherwise return false
+***********************************************************************/
+bool fts_fwupg_check_state(struct i2c_client *client, enum FW_STATUS rstate)
+{
+ int ret = 0;
+ int i = 0;
+ enum FW_STATUS cstate = FTS_RUN_IN_ERROR;
+
+ for (i = 0; i < FTS_UPGRADE_LOOP; i++) {
+ ret = fts_fwupg_get_boot_state(client, &cstate);
+ /* FTS_DEBUG("fw state=%d, retries=%d", cstate, i); */
+ if (cstate == rstate)
+ return true;
+ msleep(FTS_DELAY_READ_ID);
+ }
+
+ return false;
+}
+
+/************************************************************************
+* Name: fts_fwupg_reset_in_boot
+* Brief: RST CMD(07), reset to romboot(bootloader) in boot environment
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_fwupg_reset_in_boot(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 cmd = FTS_CMD_RESET;
+
+ FTS_INFO("reset in boot environment");
+ ret = fts_i2c_write(client, &cmd, 1);
+ if (ret < 0) {
+ FTS_ERROR("pram/rom/bootloader reset cmd write fail");
+ return ret;
+ }
+
+ msleep(FTS_DELAY_UPGRADE_RESET);
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_fwupg_reset_to_boot
+* Brief: reset to boot environment
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_fwupg_reset_to_boot(struct i2c_client *client)
+{
+ int ret = 0;
+
+ FTS_INFO("send 0xAA and 0x55 to FW, reset to boot environment");
+
+ ret = fts_i2c_write_reg(client, FTS_REG_UPGRADE, FTS_UPGRADE_AA);
+ if (ret < 0) {
+ FTS_ERROR("write FC=0xAA fail");
+ return ret;
+ }
+ msleep(FTS_DELAY_FC_AA);
+
+ ret = fts_i2c_write_reg(client, FTS_REG_UPGRADE, FTS_UPGRADE_55);
+ if (ret < 0) {
+ FTS_ERROR("write FC=0x55 fail");
+ return ret;
+ }
+
+ msleep(FTS_DELAY_UPGRADE_RESET);
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_fwupg_reset_to_romboot
+* Brief: reset to romboot, to load pramboot
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_fwupg_reset_to_romboot(struct i2c_client *client)
+{
+ int ret = 0;
+ int i = 0;
+ u8 cmd = FTS_CMD_RESET;
+ enum FW_STATUS state = FTS_RUN_IN_ERROR;
+
+ ret = fts_i2c_write(client, &cmd, 1);
+ if (ret < 0) {
+ FTS_ERROR("pram/rom/bootloader reset cmd write fail");
+ return ret;
+ }
+ mdelay(10);
+
+ for (i = 0; i < FTS_UPGRADE_LOOP; i++) {
+ ret = fts_fwupg_get_boot_state(client, &state);
+ if (FTS_RUN_IN_ROM == state)
+ break;
+ mdelay(5);
+ }
+ if (i >= FTS_UPGRADE_LOOP) {
+ FTS_ERROR("reset to romboot fail");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_fwupg_enter_into_boot
+* Brief: enter into boot environment, ready for upgrade
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+int fts_fwupg_enter_into_boot(struct i2c_client *client)
+{
+ int ret = 0;
+ bool fwvalid = false;
+ bool state = false;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("***********enter into pramboot/bootloader***********");
+ if ((NULL == upg) || (NULL == upg->func)) {
+ FTS_ERROR("upgrade/func is null");
+ return -EINVAL;
+ }
+
+ fwvalid = fts_fwupg_check_fw_valid(client);
+ if (fwvalid) {
+ ret = fts_fwupg_reset_to_boot(client);
+ if (ret < 0) {
+ FTS_ERROR("enter into romboot/bootloader fail");
+ return ret;
+ }
+ }
+
+ if (upg->func->pramboot_supported) {
+ FTS_INFO("pram supported, write pramboot and init");
+ /* pramboot */
+ ret = fts_pram_write_init(client);
+ if (ret < 0) {
+ FTS_ERROR("pram write_init fail");
+ return ret;
+ }
+ } else {
+ FTS_DEBUG("pram not supported, confirm in bootloader");
+ /* bootloader */
+ state = fts_fwupg_check_state(client, FTS_RUN_IN_BOOTLOADER);
+ if (!state) {
+ FTS_ERROR("fw not in bootloader, fail");
+ return -EIO;
+ }
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * Name: fts_fwupg_check_flash_status
+ * Brief: read status from tp
+ * Input: flash_status: correct value from tp
+ * retries: read retry times
+ * retries_delay: retry delay
+ * Output:
+ * Return: return true if flash status check pass, otherwise return false
+***********************************************************************/
+static bool fts_fwupg_check_flash_status(struct i2c_client *client, u16 flash_status, int retries, int retries_delay)
+{
+ int ret = 0;
+ int i = 0;
+ u8 cmd = 0;
+ u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 };
+ u16 read_status = 0;
+
+ for (i = 0; i < retries; i++) {
+ cmd = FTS_CMD_FLASH_STATUS;
+ ret = fts_i2c_read(client, &cmd, 1, val, FTS_CMD_FLASH_STATUS_LEN);
+ read_status = (((u16) val[0]) << 8) + val[1];
+ if (flash_status == read_status) {
+ /* FTS_DEBUG("[UPGRADE]flash status ok"); */
+ return true;
+ }
+ /* FTS_DEBUG("flash status fail,ok:%04x read:%04x, retries:%d", flash_status, read_status, i); */
+ msleep(retries_delay);
+ }
+
+ return false;
+}
+
+/************************************************************************
+ * Name: fts_fwupg_erase
+ * Brief: erase flash area
+ * Input: delay - delay after erase
+ * Output:
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+int fts_fwupg_erase(struct i2c_client *client, u32 delay)
+{
+ int ret = 0;
+ u8 cmd = 0;
+ bool flag = false;
+
+ FTS_INFO("**********erase now**********");
+
+ /*send to erase flash */
+ cmd = FTS_CMD_ERASE_APP;
+ ret = fts_i2c_write(client, &cmd, 1);
+ if (ret < 0) {
+ FTS_ERROR("erase cmd fail");
+ return ret;
+ }
+ msleep(delay);
+
+ /* read status 0xF0AA: success */
+ flag =
+ fts_fwupg_check_flash_status(client, FTS_CMD_FLASH_STATUS_ERASE_OK, FTS_RETRIES_REASE,
+ FTS_RETRIES_DELAY_REASE);
+ if (!flag) {
+ FTS_ERROR("ecc flash status check fail");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * Name: fts_fwupg_ecc_cal
+ * Brief: calculate and get ecc from tp
+ * Input: saddr - start address need calculate ecc
+ * len - length need calculate ecc
+ * Output:
+ * Return: return data ecc of tp if success, otherwise return error code
+ ***********************************************************************/
+int fts_fwupg_ecc_cal(struct i2c_client *client, u32 saddr, u32 len)
+{
+ int ret = 0;
+ u32 i = 0;
+ u8 wbuf[FTS_CMD_ECC_CAL_LEN] = { 0 };
+ u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 };
+ u32 packet_num = 0;
+ u32 packet_len = 0;
+ u32 remainder = 0;
+ u32 addr = 0;
+ u32 offset = 0;
+
+ FTS_INFO("**********read out checksum**********");
+
+ /* check sum init */
+ wbuf[0] = FTS_CMD_ECC_INIT;
+ ret = fts_i2c_write(client, wbuf, 1);
+ if (ret < 0) {
+ FTS_ERROR("ecc init cmd write fail");
+ return ret;
+ }
+
+ packet_num = len / FTS_MAX_LEN_ECC_CALC;
+ remainder = len % FTS_MAX_LEN_ECC_CALC;
+ if (remainder)
+ packet_num++;
+ packet_len = FTS_MAX_LEN_ECC_CALC;
+ FTS_INFO("ecc calc num:%d, remainder:%d", packet_num, remainder);
+
+ /* send commond to start checksum */
+ wbuf[0] = FTS_CMD_ECC_CAL;
+ for (i = 0; i < packet_num; i++) {
+ offset = FTS_MAX_LEN_ECC_CALC * i;
+ addr = saddr + offset;
+ wbuf[1] = BYTE_OFF_16(addr);
+ wbuf[2] = BYTE_OFF_8(addr);
+ wbuf[3] = BYTE_OFF_0(addr);
+
+ if ((i == (packet_num - 1)) && remainder)
+ packet_len = remainder;
+ wbuf[4] = BYTE_OFF_8(packet_len);
+ wbuf[5] = BYTE_OFF_0(packet_len);
+
+ FTS_DEBUG("ecc calc startaddr:0x%04x, len:%d", addr, packet_len);
+ ret = fts_i2c_write(client, wbuf, FTS_CMD_ECC_CAL_LEN);
+ if (ret < 0) {
+ FTS_ERROR("ecc calc cmd write fail");
+ return ret;
+ }
+
+ msleep(packet_len / 256);
+
+ /* read status if check sum is finished */
+ ret =
+ fts_fwupg_check_flash_status(client, FTS_CMD_FLASH_STATUS_ECC_OK, FTS_RETRIES_ECC_CAL,
+ FTS_RETRIES_DELAY_ECC_CAL);
+ if (ret < 0) {
+ FTS_ERROR("ecc flash status read fail");
+ return ret;
+ }
+ }
+
+ /* read out check sum */
+ wbuf[0] = FTS_CMD_ECC_READ;
+ ret = fts_i2c_read(client, wbuf, 1, val, 1);
+ if (ret < 0) {
+ FTS_ERROR("ecc read cmd write fail");
+ return ret;
+ }
+
+ return val[0];
+}
+
+/************************************************************************
+ * Name: fts_flash_write_buf
+ * Brief: write buf data to flash address
+ * Input: saddr - start address data write to flash
+ * buf - data buffer
+ * len - data length
+ * delay - delay after write
+ * Output:
+ * Return: return data ecc of host if success, otherwise return error code
+ ***********************************************************************/
+int fts_flash_write_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len, u32 delay)
+{
+ int ret = 0;
+ u32 i = 0;
+ u32 j = 0;
+ u32 packet_number = 0;
+ u32 packet_len = 0;
+ u32 addr = 0;
+ u32 offset = 0;
+ u32 remainder = 0;
+ u8 packet_buf[FTS_FLASH_PACKET_LENGTH + FTS_CMD_WRITE_LEN] = { 0 };
+ u8 ecc_in_host = 0;
+ u8 cmd = 0;
+ u8 val[FTS_CMD_FLASH_STATUS_LEN] = { 0 };
+ u16 read_status = 0;
+ u16 wr_ok = 0;
+
+ FTS_INFO("**********write data to flash**********");
+
+ if ((NULL == buf) || (0 == len)) {
+ FTS_ERROR("buf is NULL or len is 0");
+ return -EINVAL;
+ }
+
+ FTS_INFO("data buf start addr=0x%x, len=0x%x", saddr, len);
+ packet_number = len / FTS_FLASH_PACKET_LENGTH;
+ remainder = len % FTS_FLASH_PACKET_LENGTH;
+ if (remainder > 0)
+ packet_number++;
+ packet_len = FTS_FLASH_PACKET_LENGTH;
+ FTS_INFO("write data, num:%d remainder:%d", packet_number, remainder);
+
+ packet_buf[0] = FTS_CMD_WRITE;
+ for (i = 0; i < packet_number; i++) {
+ offset = i * FTS_FLASH_PACKET_LENGTH;
+ addr = saddr + offset;
+ packet_buf[1] = BYTE_OFF_16(addr);
+ packet_buf[2] = BYTE_OFF_8(addr);
+ packet_buf[3] = BYTE_OFF_0(addr);
+
+ /* last packet */
+ if ((i == (packet_number - 1)) && remainder)
+ packet_len = remainder;
+
+ packet_buf[4] = BYTE_OFF_8(packet_len);
+ packet_buf[5] = BYTE_OFF_0(packet_len);
+
+ for (j = 0; j < packet_len; j++) {
+ packet_buf[FTS_CMD_WRITE_LEN + j] = buf[offset + j];
+ ecc_in_host ^= packet_buf[FTS_CMD_WRITE_LEN + j];
+ }
+
+ ret = fts_i2c_write(client, packet_buf, packet_len + FTS_CMD_WRITE_LEN);
+ if (ret < 0) {
+ FTS_ERROR("app write fail");
+ return ret;
+ }
+ mdelay(delay);
+
+ /* read status */
+ wr_ok = FTS_CMD_FLASH_STATUS_WRITE_OK + addr / packet_len;
+ for (j = 0; j < FTS_RETRIES_WRITE; j++) {
+ cmd = FTS_CMD_FLASH_STATUS;
+ ret = fts_i2c_read(client, &cmd, 1, val, FTS_CMD_FLASH_STATUS_LEN);
+ read_status = (((u16) val[0]) << 8) + val[1];
+ /* FTS_INFO("%x %x", wr_ok, read_status); */
+ if (wr_ok == read_status) {
+ break;
+ }
+ mdelay(FTS_RETRIES_DELAY_WRITE);
+ }
+ }
+
+ return (int)ecc_in_host;
+}
+
+/************************************************************************
+ * Name: fts_flash_read_buf
+ * Brief: read data from flash
+ * Input: saddr - start address data write to flash
+ * buf - buffer to store data read from flash
+ * len - read length
+ * Output:
+ * Return: return 0 if success, otherwise return error code
+ *
+ * Warning: can't call this function directly, need call in boot environment
+ ***********************************************************************/
+int fts_flash_read_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len)
+{
+ int ret = 0;
+ u32 i = 0;
+ u32 packet_number = 0;
+ u32 packet_len = 0;
+ u32 addr = 0;
+ u32 offset = 0;
+ u32 remainder = 0;
+ u8 wbuf[FTS_CMD_READ_LEN];
+
+ if ((NULL == buf) || (0 == len)) {
+ FTS_ERROR("buf is NULL or len is 0");
+ return -EINVAL;
+ }
+
+ packet_number = len / FTS_FLASH_PACKET_LENGTH;
+ remainder = len % FTS_FLASH_PACKET_LENGTH;
+ if (remainder > 0) {
+ packet_number++;
+ }
+ packet_len = FTS_FLASH_PACKET_LENGTH;
+ FTS_INFO("read packet_number:%d, remainder:%d", packet_number, remainder);
+
+ wbuf[0] = FTS_CMD_READ;
+ for (i = 0; i < packet_number; i++) {
+ offset = i * FTS_FLASH_PACKET_LENGTH;
+ addr = saddr + offset;
+ wbuf[1] = BYTE_OFF_16(addr);
+ wbuf[2] = BYTE_OFF_8(addr);
+ wbuf[3] = BYTE_OFF_0(addr);
+
+ /* last packet */
+ if ((i == (packet_number - 1)) && remainder)
+ packet_len = remainder;
+
+ ret = fts_i2c_write(client, wbuf, FTS_CMD_READ_LEN);
+ if (ret < 0) {
+ FTS_ERROR("pram/bootloader write 03 command fail");
+ return ret;
+ }
+
+ msleep(FTS_CMD_READ_DELAY); /* must wait, otherwise read wrong data */
+ ret = fts_i2c_read(client, NULL, 0, buf + offset, packet_len);
+ if (ret < 0) {
+ FTS_ERROR("pram/bootloader read 03 command fail");
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * Name: fts_flash_read
+ * Brief:
+ * Input: addr - address of flash
+ * len - length of read
+ * Output: buf - data read from flash
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+int fts_flash_read(struct i2c_client *client, u32 addr, u8 *buf, u32 len)
+{
+ int ret = 0;
+
+ FTS_INFO("***********read flash***********");
+
+ if ((NULL == buf) || (0 == len)) {
+ FTS_ERROR("buf is NULL or len is 0");
+ return -EINVAL;
+ }
+
+ ret = fts_fwupg_enter_into_boot(client);
+ if (ret < 0) {
+ FTS_ERROR("enter into pramboot/bootloader fail");
+ goto read_flash_err;
+ }
+
+ ret = fts_flash_read_buf(client, addr, buf, len);
+ if (ret < 0) {
+ FTS_ERROR("read flash fail");
+ goto read_flash_err;
+ }
+
+read_flash_err:
+ /* reset to normal boot */
+ ret = fts_fwupg_reset_in_boot(client);
+ if (ret < 0) {
+ FTS_ERROR("reset to normal boot fail");
+ }
+ return ret;
+}
+
+/************************************************************************
+ * Name: fts_read_file
+ * Brief: read file
+ * Input: file name
+ * Output:
+ * Return: return file len if succuss, otherwise return error code
+ ***********************************************************************/
+
+
+/************************************************************************
+* Name: fts_upgrade_bin
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+
+
+#if FTS_AUTO_LIC_UPGRADE_EN
+static int fts_lic_get_vid_in_tp(struct i2c_client *client, u16 *vid)
+{
+ int ret = 0;
+ u8 val[2] = { 0 };
+
+ if (NULL == vid) {
+ FTS_ERROR("vid is NULL");
+ return -EINVAL;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &val[0]);
+ if (fts_data->ic_info.is_incell)
+ ret = fts_i2c_read_reg(client, FTS_REG_MODULE_ID, &val[1]);
+ if (ret < 0) {
+ FTS_ERROR("read vid from tp fail");
+ return ret;
+ }
+
+ *vid = *(u16 *) val;
+ return 0;
+}
+
+static int fts_lic_get_vid_in_host(u16 *vid)
+{
+ u8 val[2] = { 0 };
+ u8 *licbuf = NULL;
+ u32 conf_saddr = 0;
+ struct fts_upgrade *upg = fwupgrade;
+
+ if (!upg || !upg->func || !upg->lic || !vid) {
+ FTS_ERROR("upgrade/func/get_hlic_ver/lic/vid is null");
+ return -EINVAL;
+ }
+
+ if (upg->lic_length < FTS_MAX_LEN_SECTOR) {
+ FTS_ERROR("lic length(%x) fail", upg->lic_length);
+ return -EINVAL;
+ }
+
+ licbuf = upg->lic;
+ conf_saddr = upg->func->fwcfgoff;
+ val[0] = licbuf[conf_saddr + FTS_CONIFG_VENDORID_OFF];
+ if (fts_data->ic_info.is_incell)
+ val[1] = licbuf[conf_saddr + FTS_CONIFG_MODULEID_OFF];
+
+ *vid = *(u16 *) val;
+ return 0;
+}
+
+static int fts_lic_get_ver_in_tp(struct i2c_client *client, u8 *ver)
+{
+ int ret = 0;
+
+ if (NULL == ver) {
+ FTS_ERROR("ver is NULL");
+ return -EINVAL;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_LIC_VER, ver);
+ if (ret < 0) {
+ FTS_ERROR("read lcd initcode ver from tp fail");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int fts_lic_get_ver_in_host(u8 *ver)
+{
+ int ret = 0;
+ struct fts_upgrade *upg = fwupgrade;
+
+ if (!upg || !upg->func || !upg->func->get_hlic_ver || !upg->lic) {
+ FTS_ERROR("upgrade/func/get_hlic_ver/lic is null");
+ return -EINVAL;
+ }
+
+ ret = upg->func->get_hlic_ver(upg->lic);
+ if (ret < 0) {
+ FTS_ERROR("get host lcd initial code version fail");
+ return ret;
+ }
+
+ *ver = (u8) ret;
+ return ret;
+}
+
+/* check if lcd init code need upgrade
+* true-need false-no need
+*/
+static bool fts_lic_need_upgrade(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 initcode_ver_in_tp = 0;
+ u8 initcode_ver_in_host = 0;
+ u16 vid_in_tp = 0;
+ u16 vid_in_host = 0;
+ bool fwvalid = false;
+
+ fwvalid = fts_fwupg_check_fw_valid(client);
+ if (!fwvalid) {
+ FTS_INFO("fw is invalid, no upgrade lcd init code");
+ return false;
+ }
+
+ ret = fts_lic_get_vid_in_host(&vid_in_host);
+ if (ret < 0) {
+ FTS_ERROR("vendor id in host invalid");
+ return false;
+ }
+
+ ret = fts_lic_get_vid_in_tp(client, &vid_in_tp);
+ if (ret < 0) {
+ FTS_ERROR("vendor id in tp invalid");
+ return false;
+ }
+
+ FTS_DEBUG("vid in tp:%x, host:%x", vid_in_tp, vid_in_host);
+ if (vid_in_tp != vid_in_host) {
+ FTS_INFO("vendor id in tp&host are different, no upgrade lic");
+ return false;
+ }
+
+ ret = fts_lic_get_ver_in_host(&initcode_ver_in_host);
+ if (ret < 0) {
+ FTS_ERROR("init code in host invalid");
+ return false;
+ }
+
+ ret = fts_lic_get_ver_in_tp(client, &initcode_ver_in_tp);
+ if (ret < 0) {
+ FTS_ERROR("read reg0xE4 fail");
+ return false;
+ }
+
+ FTS_DEBUG("lcd initial code version in tp:%x, host:%x", initcode_ver_in_tp, initcode_ver_in_host);
+ if (0xA5 == initcode_ver_in_tp) {
+ FTS_INFO("lcd init code ver is 0xA5, don't upgade init code");
+ return false;
+ } else if (0xFF == initcode_ver_in_tp) {
+ FTS_DEBUG("lcd init code in tp is invalid, need upgrade init code");
+ return true;
+ } else if (initcode_ver_in_tp < initcode_ver_in_host)
+ return true;
+ else
+ return false;
+}
+
+int fts_lic_upgrade(struct i2c_client *client, struct fts_upgrade *upg)
+{
+ int ret = 0;
+ bool hlic_upgrade = false;
+ int upgrade_count = 0;
+ u8 ver = 0;
+
+ FTS_INFO("lcd initial code auto upgrade function");
+ if ((!upg) || (!upg->func) || (!upg->func->lic_upgrade)) {
+ FTS_ERROR("lcd upgrade function is null");
+ return -EINVAL;
+ }
+
+ hlic_upgrade = fts_lic_need_upgrade(client);
+ FTS_INFO("lcd init code upgrade flag:%d", hlic_upgrade);
+ if (hlic_upgrade) {
+ FTS_INFO("lcd initial code need upgrade, upgrade begin...");
+ do {
+ FTS_INFO("lcd initial code upgrade times:%d", upgrade_count);
+ upgrade_count++;
+
+ ret = upg->func->lic_upgrade(client, upg->lic, upg->lic_length);
+ if (ret < 0) {
+ fts_fwupg_reset_in_boot(client);
+ } else {
+ fts_lic_get_ver_in_tp(client, &ver);
+ FTS_INFO("success upgrade to lcd initcode ver:%02x", ver);
+ break;
+ }
+ } while (upgrade_count < 2);
+ } else {
+ FTS_INFO("lcd initial code don't need upgrade");
+ }
+
+ return ret;
+}
+#endif /* FTS_AUTO_LIC_UPGRADE_EN */
+
+static int fts_param_get_ver_in_tp(struct i2c_client *client, u8 *ver)
+{
+ int ret = 0;
+
+ if (NULL == ver) {
+ FTS_ERROR("ver is NULL");
+ return -EINVAL;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_IDE_PARA_VER_ID, ver);
+ if (ret < 0) {
+ FTS_ERROR("read fw param ver from tp fail");
+ return ret;
+ }
+
+ if ((0x00 == *ver) || (0xFF == *ver)) {
+ FTS_INFO("param version in tp invalid");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static int fts_param_get_ver_in_host(u8 *ver)
+{
+ struct fts_upgrade *upg = fwupgrade;
+
+ if ((!upg) || (!upg->func) || (!upg->fw) || (!ver)) {
+ FTS_ERROR("fts_data/upgrade/func/fw/ver is NULL");
+ return -EINVAL;
+ }
+
+ if (upg->fw_length < upg->func->paramcfgveroff) {
+ FTS_ERROR("fw len(%x) < paramcfg ver offset(%x)", upg->fw_length, upg->func->paramcfgveroff);
+ return -EINVAL;
+ }
+
+ FTS_INFO("fw paramcfg version offset:%x", upg->func->paramcfgveroff);
+ *ver = upg->fw[upg->func->paramcfgveroff];
+
+ if ((0x00 == *ver) || (0xFF == *ver)) {
+ FTS_INFO("param version in host invalid");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * fts_param_need_upgrade - check fw paramcfg need upgrade or not
+ *
+ * Return: return true if paramcfg need upgrade
+ ***********************************************************************/
+static bool fts_param_need_upgrade(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 val = 0;
+ u8 ver_in_host = 0;
+ u8 ver_in_tp = 0;
+ bool fwvalid = false;
+
+ fwvalid = fts_fwupg_check_fw_valid(client);
+ if (!fwvalid) {
+ FTS_INFO("fw is invalid, no upgrade paramcfg");
+ return false;
+ }
+
+ ret = fts_param_get_ver_in_host(&ver_in_host);
+ if (ret < 0) {
+ FTS_ERROR("param version in host invalid");
+ return false;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_IDE_PARA_STATUS, &val);
+ if (ret < 0) {
+ FTS_ERROR("read IDE PARAM STATUS in tp fail");
+ return false;
+ }
+
+ if ((val & 0x80) != 0x80) {
+ FTS_INFO("no IDE VER in tp");
+ return false;
+ } else if ((val & 0x7F) != 0x00) {
+ FTS_INFO("IDE VER, param invalid, need upgrade param");
+ return true;
+ }
+
+ ret = fts_param_get_ver_in_tp(client, &ver_in_tp);
+ if (ret < 0) {
+ FTS_ERROR("get IDE param ver in tp fail");
+ return false;
+ }
+
+ FTS_INFO("fw paramcfg version in tp:%x, host:%x", ver_in_tp, ver_in_host);
+ if (ver_in_tp < ver_in_host) {
+ return true;
+ }
+
+ return false;
+}
+
+/************************************************************************
+ * fts_fwupg_get_ver_in_tp - read fw ver from tp register
+ *
+ * return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int fts_fwupg_get_ver_in_tp(struct i2c_client *client, u8 *ver)
+{
+ int ret = 0;
+
+ if (NULL == ver) {
+ FTS_ERROR("ver is NULL");
+ return -EINVAL;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_FW_VER, ver);
+ if (ret < 0) {
+ FTS_ERROR("read fw ver from tp fail");
+ return ret;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+ * fts_fwupg_get_ver_in_host - read fw ver in host fw image
+ *
+ * return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int fts_fwupg_get_ver_in_host(u8 *ver)
+{
+ struct fts_upgrade *upg = fwupgrade;
+
+ if ((!upg) || (!upg->func) || (!upg->fw) || (!ver)) {
+ FTS_ERROR("fts_data/upgrade/func/fw/ver is NULL");
+ return -EINVAL;
+ }
+
+ if (upg->fw_length < upg->func->fwveroff) {
+ FTS_ERROR("fw len(%x) < fw ver offset(%x)", upg->fw_length, upg->func->fwveroff);
+ return -EINVAL;
+ }
+
+ FTS_INFO("fw version offset:%x", upg->func->fwveroff);
+ *ver = upg->fw[upg->func->fwveroff];
+ return 0;
+}
+
+/************************************************************************
+ * fts_fwupg_need_upgrade - check fw need upgrade or not
+ *
+ * Return: return true if fw need upgrade
+ ***********************************************************************/
+static bool fts_fwupg_need_upgrade(struct i2c_client *client)
+{
+ int ret = 0;
+ bool fwvalid = false;
+ u8 fw_ver_in_host = 0;
+ u8 fw_ver_in_tp = 0;
+ struct fts_ts_data *ts_data = NULL;
+
+ ts_data = i2c_get_clientdata(client);
+ if (!ts_data) {
+ FTS_ERROR("can't get ts data");
+ return false;
+ }
+
+ fwvalid = fts_fwupg_check_fw_valid(client);
+ if (fwvalid) {
+ ret = fts_fwupg_get_ver_in_host(&fw_ver_in_host);
+ if (ret < 0) {
+ FTS_ERROR("get fw ver in host fail");
+ return false;
+ }
+
+ ret = fts_fwupg_get_ver_in_tp(client, &fw_ver_in_tp);
+ if (ret < 0) {
+ FTS_ERROR("get fw ver in tp fail");
+ return false;
+ }
+
+ ts_data->fw_ver_in_tp = fw_ver_in_tp;
+ ts_data->fw_ver_in_host = fw_ver_in_host;
+
+ FTS_INFO("fw version in tp:%x, host:%x", fw_ver_in_tp, fw_ver_in_host);
+ if (fw_ver_in_tp != fw_ver_in_host) {
+ return true;
+ }
+ } else {
+ FTS_INFO("fw invalid, need upgrade fw");
+ return true;
+ }
+
+ return false;
+}
+
+/************************************************************************
+ * Name: fts_fw_upgrade
+ * Brief: fw upgrade main entry
+ * Input:
+ * Output:
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+int fts_fwupg_upgrade(struct i2c_client *client, struct fts_upgrade *upg)
+{
+ int ret = 0;
+ bool upgrade_flag = false;
+ int upgrade_count = 0;
+ u8 ver = 0;
+
+ FTS_INFO("fw auto upgrade function");
+ if ((NULL == upg) || (NULL == upg->func)) {
+ FTS_ERROR("upg/upg->func is null");
+ return -EINVAL;
+ }
+
+ upgrade_flag = fts_fwupg_need_upgrade(client);
+ FTS_INFO("fw upgrade flag:%d", upgrade_flag);
+ do {
+ upgrade_count++;
+ if (upgrade_flag) {
+ FTS_INFO("upgrade fw app(times:%d)", upgrade_count);
+ if (upg->func->upgrade) {
+ ret = upg->func->upgrade(client, upg->fw, upg->fw_length);
+ if (ret < 0) {
+ fts_fwupg_reset_in_boot(client);
+ } else {
+ fts_fwupg_get_ver_in_tp(client, &ver);
+ FTS_INFO("success upgrade to fw version %02x", ver);
+ break;
+ }
+ } else {
+ FTS_ERROR("upgrade func/upgrade is null, return immediately");
+ ret = -ENODATA;
+ break;
+ }
+ } else {
+ FTS_INFO("fw don't need upgrade");
+ if (upg->func->param_upgrade) {
+ if (fts_param_need_upgrade(client)) {
+ FTS_INFO("upgrade param area(times:%d)", upgrade_count);
+ ret = upg->func->param_upgrade(client, upg->fw, upg->fw_length);
+ if (ret < 0) {
+ fts_fwupg_reset_in_boot(client);
+ } else {
+ fts_param_get_ver_in_tp(client, &ver);
+ FTS_INFO("success upgrade to fw param version %02x", ver);
+ break;
+ }
+ } else {
+ FTS_INFO("param don't need upgrade");
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ } while (upgrade_count < 2);
+
+ return ret;
+}
+
+#if FTS_AUTO_UPGRADE_EN
+/************************************************************************
+ * fts_fwupg_auto_upgrade - upgrade main entry
+ ***********************************************************************/
+void fts_fwupg_auto_upgrade(struct fts_ts_data *ts_data)
+{
+ int ret = 0;
+ struct i2c_client *client = ts_data->client;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("********************FTS enter upgrade********************");
+
+ ret = fts_fwupg_upgrade(client, upg);
+ if (ret < 0)
+ FTS_ERROR("**********tp fw(app/param) upgrade failed**********");
+ else
+ FTS_INFO("**********tp fw(app/param) no upgrade/upgrade success**********");
+
+#if FTS_AUTO_LIC_UPGRADE_EN
+ ret = fts_lic_upgrade(client, upg);
+ if (ret < 0)
+ FTS_ERROR("**********lcd init code upgrade failed**********");
+ else
+ FTS_INFO("**********lcd init code no upgrade/upgrade success**********");
+#endif
+
+ FTS_INFO("********************FTS exit upgrade********************");
+}
+
+/*
+ * fts_fwupg_work - fw upgrade work function, handle upgrade
+ * @vid - u16 consit of module id and panel id
+ *
+ * return 0 if success, otherwise return error code
+ */
+int fts_fwupg_get_vendorid(struct fts_ts_data *ts_data, u16 *vid)
+{
+ int ret = 0;
+ bool fwvalid = false;
+ u8 vendor_id = 0;
+ u8 module_id = 0;
+ u32 fwcfg_addr = 0;
+ u8 cfgbuf[FTS_HEADER_LEN] = { 0 };
+ struct i2c_client *client = ts_data->client;
+ struct fts_upgrade *upg = fwupgrade;
+
+ FTS_INFO("read vendor id from tp");
+ if ((!upg) || (!upg->func) || (!vid)) {
+ FTS_ERROR("upgrade/func/vid is null");
+ return -EINVAL;
+ }
+
+ fwvalid = fts_fwupg_check_fw_valid(client);
+ if (fwvalid) {
+ ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id);
+ if (ts_data->ic_info.is_incell)
+ ret = fts_i2c_read_reg(client, FTS_REG_MODULE_ID, &module_id);
+ } else {
+ fwcfg_addr = upg->func->fwcfgoff;
+ ret = fts_flash_read(client, fwcfg_addr, cfgbuf, FTS_HEADER_LEN);
+ vendor_id = cfgbuf[FTS_CONIFG_VENDORID_OFF];
+ if (ts_data->ic_info.is_incell) {
+ if ((cfgbuf[FTS_CONIFG_MODULEID_OFF] + cfgbuf[FTS_CONIFG_MODULEID_OFF + 1]) == 0xFF)
+ module_id = cfgbuf[FTS_CONIFG_MODULEID_OFF];
+ }
+ }
+
+ if (ret < 0) {
+ FTS_ERROR("fail to get vendor id from tp");
+ return ret;
+ }
+
+ *vid = ((u16) module_id << 8) + vendor_id;
+ return 0;
+}
+
+/*
+ * fts_fwupg_get_fw_file - get upgrade fw file in host driver
+ *
+ * return 0 if success, otherwise return error code
+ *
+ * call it to get upgrade file which include in host driver
+ * warning:
+ * 1. if more fw files, please modify FTS_GET_VENDOR_ID_NUM&
+ * FTS_VENDOR_ID
+ * 2. For incell ICs, vendor id = module id << 8 + panel id
+ * For others, vendor id = 0x0000 + panel id
+ * 3. get fw file from reques_firmware(), this function unactive
+ */
+#if FTS_AUTO_UPGRADE_EN
+static int fts_fwupg_get_fw_file(struct fts_ts_data *ts_data)
+{
+ struct upgrade_fw *fw = &fw_list[0];
+ struct fts_upgrade *upg = fwupgrade;
+
+#if (FTS_GET_VENDOR_ID_NUM > 1)
+ int ret = 0;
+ int i = 0;
+ u16 vendor_id = 0;
+
+ /* support multi vendor, must read correct vendor id */
+ ret = fts_fwupg_get_vendorid(ts_data, &vendor_id);
+ if (ret < 0) {
+ FTS_ERROR("get vendor id failed");
+ return ret;
+ }
+ FTS_INFO("success to read vendor id:%04x", vendor_id);
+ for (i = 0; i < FTS_GET_VENDOR_ID_NUM; i++) {
+ fw = &fw_list[i];
+ if (vendor_id == fw->vendor_id) {
+ FTS_INFO("vendor id match, get fw file successfully");
+ break;
+ }
+ }
+ if (i >= FTS_GET_VENDOR_ID_NUM) {
+ FTS_ERROR("no vendor id match, don't get file");
+ return -ENODATA;
+ }
+
+#endif
+ if (upg) {
+ upg->fw = fw->fw_file;
+ upg->fw_length = fw->fw_len;
+ upg->lic = fw->fw_file;
+ upg->lic_length = fw->fw_len;
+
+ FTS_INFO("upgrade fw file len:%x", upg->fw_length);
+ if ((upg->fw_length < FTS_MIN_LEN)
+ || (upg->fw_length > FTS_MAX_LEN_FILE)) {
+ FTS_ERROR("fw file len(%x) fail", upg->fw_length);
+ return -ENODATA;
+ }
+ }
+ return 0;
+}
+#endif
+/*
+ * fts_fwupg_init_ic_detail - for ic detail initialaztion
+ */
+static void fts_fwupg_init_ic_detail(void)
+{
+ struct fts_upgrade *upg = fwupgrade;
+
+ if (upg && upg->func && upg->func->init) {
+ upg->func->init();
+ }
+}
+
+/*
+ * fts_fwupg_work - fw upgrade work function
+ * 1. get fw image/file
+ * 2. call upgrade main function(fts_fwupg_auto_upgrade)
+ */
+#if FTS_AUTO_UPGRADE_EN
+static void fts_fwupg_work(struct work_struct *work)
+{
+ int ret = 0;
+ struct fts_ts_data *ts_data = container_of(work,
+ struct fts_ts_data, fwupg_work);
+
+ FTS_INFO("fw upgrade work function");
+ ts_data->fw_loading = 1;
+ fts_irq_disable();
+ #if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(DISABLE);
+ #endif
+
+ FTS_INFO("get upgrade fw file");
+ ret = fts_fwupg_get_fw_file(ts_data);
+ fts_fwupg_init_ic_detail();
+ if (ret < 0) {
+ FTS_ERROR("get file fail, can't upgrade");
+ } else {
+ /* run auto upgrade */
+ fts_fwupg_auto_upgrade(ts_data);
+ }
+
+ #if FTS_ESDCHECK_EN
+ fts_esdcheck_switch(ENABLE);
+ #endif
+ fts_irq_enable();
+ ts_data->fw_loading = 0;
+}
+#endif
+static int fts_get_lockdown_info(struct fts_ts_data *ts_data)
+{
+ int i, ret;
+
+ memset(ts_data->lockdown_info, 0x00, FTS_LOCKDOWN_INFO_SIZE);
+
+ ret = fts_flash_read(ts_data->client, LOCKDOWN_INFO_ADDR, ts_data->lockdown_info, FTS_LOCKDOWN_INFO_SIZE);
+ if (ret < 0) {
+ FTS_ERROR("fail to get lockdown info");
+ return ret;
+ }
+
+ for (i = 0; i < FTS_LOCKDOWN_INFO_SIZE; i++)
+ FTS_INFO("Lockdown info = %02x", ts_data->lockdown_info[i]);
+
+ FTS_TS_INFO("Lockdown:0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
+ (int)ts_data->lockdown_info[0], (int)ts_data->lockdown_info[1],
+ (int)ts_data->lockdown_info[2], (int)ts_data->lockdown_info[3],
+ (int)ts_data->lockdown_info[4], (int)ts_data->lockdown_info[5],
+ (int)ts_data->lockdown_info[6], (int)ts_data->lockdown_info[7]);
+ return ret;
+}
+
+/*****************************************************************************
+ * Name: fts_fwupg_init
+ * Brief: upgrade function initialization
+ * Input:
+ * Output:
+ * Return: return 0 if success, otherwise return error code
+ *****************************************************************************/
+int fts_fwupg_init(struct fts_ts_data *ts_data)
+{
+ int i = 0;
+ int j = 0;
+ int ret;
+#if FTS_AUTO_UPGRADE_EN
+ int ic_stype = ts_data->ic_info.ids.type;
+ struct upgrade_func *func = upgrade_func_list[0];
+ int func_count = sizeof(upgrade_func_list) / sizeof(upgrade_func_list[0]);
+ FTS_INFO("fw upgrade init function");
+
+ if (NULL == ts_data->ts_workqueue) {
+ FTS_ERROR("fts workqueue is NULL, can't run upgrade function");
+ return -EINVAL;
+ }
+
+ if (0 == func_count) {
+ FTS_ERROR("no upgrade function in tp driver");
+ return -ENODATA;
+ }
+ fwupgrade = (struct fts_upgrade *)kzalloc(sizeof(*fwupgrade), GFP_KERNEL);
+ if (NULL == fwupgrade) {
+ FTS_ERROR("malloc memory for upgrade fail");
+ return -ENOMEM;
+ }
+
+ if (1 == func_count) {
+ fwupgrade->func = func;
+ } else {
+ for (i = 0; i < func_count; i++) {
+ func = upgrade_func_list[i];
+ for (j = 0; j < FTX_MAX_COMPATIBLE_TYPE; j++) {
+ if (0 == func->ctype[j])
+ break;
+ else if (func->ctype[j] == ic_stype) {
+ FTS_INFO("match upgrade function,type:%x", (int)func->ctype[j]);
+ fwupgrade->func = func;
+ }
+ }
+ }
+ }
+
+ if (NULL == fwupgrade->func) {
+ FTS_ERROR("no upgrade functin match, can't upgrade");
+ return -ENODATA;
+ }
+#endif
+ ret = fts_get_lockdown_info(ts_data);
+ if (ret) {
+ FTS_ERROR("fail get lockdown info");
+ }
+#if FTS_AUTO_UPGRADE_EN
+ INIT_WORK(&ts_data->fwupg_work, fts_fwupg_work);
+ queue_work(ts_data->ts_workqueue, &ts_data->fwupg_work);
+#endif
+ return 0;
+}
+
+/*****************************************************************************
+ * Name: fts_fwupg_exit
+ * Brief:
+ * Input:
+ * Output:
+ * Return:
+ *****************************************************************************/
+int fts_fwupg_exit(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+ if (fwupgrade) {
+ kfree(fwupgrade);
+ }
+ FTS_FUNC_EXIT();
+
+ return 0;
+}
+
+#endif /* #if FTS_AUTO_UPGRADE_EN */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h
new file mode 100644
index 000000000000..bcb5de462394
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash.h
@@ -0,0 +1,171 @@
+/************************************************************************
+* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved.
+*
+* File Name: focaltech_flash.h
+*
+* Author: fupeipei
+*
+* Created: 2016-08-07
+*
+* Abstract:
+*
+************************************************************************/
+#ifndef __LINUX_FOCALTECH_FLASH_H__
+#define __LINUX_FOCALTECH_FLASH_H__
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define FTS_CMD_RESET 0x07
+#define FTS_ROMBOOT_CMD_WRITE 0xAE
+#define FTS_ROMBOOT_CMD_START_APP 0x08
+#define FTS_DELAY_PRAMBOOT_START 10
+#define FTS_ROMBOOT_CMD_ECC 0xCC
+
+#define FTS_CMD_READ 0x03
+#define FTS_CMD_READ_DELAY 1
+#define FTS_CMD_READ_LEN 4
+#define FTS_CMD_FLASH_TYPE 0x05
+#define FTS_CMD_FLASH_MODE 0x09
+#define FLASH_MODE_WRITE_FLASH_VALUE 0x0A
+#define FLASH_MODE_UPGRADE_VALUE 0x0B
+#define FLASH_MODE_LIC_VALUE 0x0C
+#define FLASH_MODE_PARAM_VALUE 0x0D
+#define FTS_CMD_ERASE_APP 0x61
+#define FTS_REASE_APP_DELAY 1350
+#define FTS_ERASE_SECTOR_DELAY 60
+#define FTS_RETRIES_REASE 50
+#define FTS_RETRIES_DELAY_REASE 200
+#define FTS_CMD_FLASH_STATUS 0x6A
+#define FTS_CMD_FLASH_STATUS_LEN 2
+#define FTS_CMD_FLASH_STATUS_NOP 0x0000
+#define FTS_CMD_FLASH_STATUS_ECC_OK 0xF055
+#define FTS_CMD_FLASH_STATUS_ERASE_OK 0xF0AA
+#define FTS_CMD_FLASH_STATUS_WRITE_OK 0x1000
+#define FTS_CMD_ECC_INIT 0x64
+#define FTS_CMD_ECC_CAL 0x65
+#define FTS_CMD_ECC_CAL_LEN 6
+#define FTS_RETRIES_ECC_CAL 10
+#define FTS_RETRIES_DELAY_ECC_CAL 50
+#define FTS_CMD_ECC_READ 0x66
+#define FTS_CMD_DATA_LEN 0xB0
+#define FTS_CMD_DATA_LEN_LEN 4
+#define FTS_CMD_WRITE 0xBF
+#define FTS_RETRIES_WRITE 100
+#define FTS_RETRIES_DELAY_WRITE 1
+#define FTS_CMD_WRITE_LEN 6
+#define FTS_DELAY_READ_ID 20
+#define FTS_DELAY_UPGRADE_RESET 80
+#define PRAMBOOT_MIN_SIZE 0x120
+#define PRAMBOOT_MAX_SIZE (64*1024)
+#define FTS_FLASH_PACKET_LENGTH 32 /* max=128 */
+#define FTS_MAX_LEN_ECC_CALC 0xFFFE /* must be even */
+#define FTS_MIN_LEN 0x120
+#define FTS_MAX_LEN_FILE (128 * 1024)
+#define FTS_MAX_LEN_APP (64 * 1024)
+#define FTS_MAX_LEN_SECTOR (4 * 1024)
+#define FTS_CONIFG_VENDORID_OFF 0x04
+#define FTS_CONIFG_MODULEID_OFF 0x1E
+#define FTS_CONIFG_PROJECTID_OFF 0x20
+#define FTS_APPINFO_OFF 0x100
+#define FTS_APPINFO_APPLEN_OFF 0x00
+#define FTS_APPINFO_APPLEN2_OFF 0x12
+#define FTS_REG_UPGRADE 0xFC
+#define FTS_UPGRADE_AA 0xAA
+#define FTS_UPGRADE_55 0x55
+#define FTS_DELAY_FC_AA 10
+#define FTS_UPGRADE_LOOP 30
+#define FTS_HEADER_LEN 32
+#define FTS_FW_BIN_FILEPATH "/sdcard/"
+
+#define FTS_ROMBOOT_CMD_ECC_NEW_LEN 7
+#define FTS_ROMBOOT_CMD_ECC_FINISH 0xCE
+#define FTS_CMD_READ_ECC 0xCD
+#define FTX_MAX_COMPATIBLE_TYPE 4
+#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3))
+
+#define FTS_I2C_NAME "FTS_ts"
+
+#define FTS_TS_INFO(fmt, args...) pr_err("[%s] %s %d: " fmt, FTS_I2C_NAME, __func__, __LINE__, ##args)
+
+enum FW_STATUS {
+ FTS_RUN_IN_ERROR,
+ FTS_RUN_IN_APP,
+ FTS_RUN_IN_ROM,
+ FTS_RUN_IN_PRAM,
+ FTS_RUN_IN_BOOTLOADER,
+};
+
+enum FW_FLASH_MODE {
+ FLASH_MODE_APP,
+ FLASH_MODE_LIC,
+ FLASH_MODE_PARAM,
+ FLASH_MODE_ALL,
+};
+
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+/* IC info */
+struct upgrade_func {
+ u64 ctype[FTX_MAX_COMPATIBLE_TYPE];
+ int newmode;
+ u32 fwveroff;
+ u32 fwcfgoff;
+ u32 appoff;
+ u32 licoff;
+ u32 paramcfgoff;
+ u32 paramcfgveroff;
+ u32 paramcfg2off;
+ bool hid_supported;
+ bool pramboot_supported;
+ u8 *pramboot;
+ u32 pb_length;
+ int (*init) (void);
+ int (*upgrade) (struct i2c_client *, u8 *, u32);
+ int (*get_hlic_ver) (u8 *);
+ int (*lic_upgrade) (struct i2c_client *, u8 *, u32);
+ int (*param_upgrade) (struct i2c_client *, u8 *, u32);
+ int (*force_upgrade) (struct i2c_client *, u8 *, u32);
+};
+
+struct fts_upgrade {
+ u8 *fw;
+ u32 fw_length;
+ u8 *lic;
+ u32 lic_length;
+ struct upgrade_func *func;
+};
+
+struct upgrade_fw {
+ u16 vendor_id;
+ u8 *fw_file;
+ u32 fw_len;
+};
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+extern struct fts_upgrade *fwupgrade;
+extern struct upgrade_func upgrade_func_ft8719;
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+bool fts_fwupg_check_fw_valid(struct i2c_client *client);
+int fts_fwupg_get_boot_state(struct i2c_client *client, enum FW_STATUS *fw_sts);
+bool fts_fwupg_check_state(struct i2c_client *client, enum FW_STATUS rstate);
+int fts_fwupg_reset_in_boot(struct i2c_client *client);
+int fts_fwupg_reset_to_boot(struct i2c_client *client);
+int fts_fwupg_reset_to_romboot(struct i2c_client *client);
+int fts_fwupg_enter_into_boot(struct i2c_client *client);
+int fts_fwupg_erase(struct i2c_client *client, u32 delay);
+int fts_fwupg_ecc_cal(struct i2c_client *client, u32 saddr, u32 len);
+int fts_flash_write_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len, u32 delay);
+int fts_fwupg_upgrade(struct i2c_client *client, struct fts_upgrade *upg);
+#endif
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile
new file mode 100644
index 000000000000..8a16f313bc7b
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/Makefile
@@ -0,0 +1,7 @@
+#
+# Makefile for the focaltech touchscreen drivers.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_ft8719.o
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c
new file mode 100644
index 000000000000..6c790fc6619f
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_flash/focaltech_upgrade_ft8719.c
@@ -0,0 +1,172 @@
+/*
+ *
+ * FocalTech fts TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_upgrade_ft8719.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2017-11-22
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "../focaltech_core.h"
+#include "../focaltech_flash.h"
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+u8 pb_file_ft8719[] = {
+#include "../include/pramboot/FT8719_Pramboot_V0.5_20171221.i"
+};
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+
+/************************************************************************
+ * fts_ft8719_upgrade_mode -
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int fts_ft8719_upgrade_mode(struct i2c_client *client, enum FW_FLASH_MODE mode, u8 *buf, u32 len)
+{
+ int ret = 0;
+ u32 start_addr = 0;
+ u8 cmd[4] = { 0 };
+ u32 delay = 0;
+ int ecc_in_host = 0;
+ int ecc_in_tp = 0;
+
+ if ((NULL == buf) || (len < FTS_MIN_LEN)) {
+ FTS_ERROR("buffer/len(%x) is invalid", len);
+ return -EINVAL;
+ }
+
+ /* enter into upgrade environment */
+ ret = fts_fwupg_enter_into_boot(client);
+ if (ret < 0) {
+ FTS_ERROR("enter into pramboot/bootloader fail,ret=%d", ret);
+ goto fw_reset;
+ }
+
+ cmd[0] = FTS_CMD_FLASH_MODE;
+ cmd[1] = FLASH_MODE_UPGRADE_VALUE;
+ start_addr = upgrade_func_ft8719.appoff;
+ FTS_INFO("flash mode:0x%02x, start addr=0x%04x", cmd[1], start_addr);
+ ret = fts_i2c_write(client, cmd, 2);
+ if (ret < 0) {
+ FTS_ERROR("upgrade mode(09) cmd write fail");
+ goto fw_reset;
+ }
+
+ delay = FTS_ERASE_SECTOR_DELAY * (len / FTS_MAX_LEN_SECTOR);
+ ret = fts_fwupg_erase(client, delay);
+ if (ret < 0) {
+ FTS_ERROR("erase cmd write fail");
+ goto fw_reset;
+ }
+
+ /* write app */
+ ecc_in_host = fts_flash_write_buf(client, start_addr, buf, len, 1);
+ if (ecc_in_host < 0) {
+ FTS_ERROR("lcd initial code write fail");
+ goto fw_reset;
+ }
+
+ /* ecc */
+ ecc_in_tp = fts_fwupg_ecc_cal(client, start_addr, len);
+ if (ecc_in_tp < 0) {
+ FTS_ERROR("ecc read fail");
+ goto fw_reset;
+ }
+
+ FTS_INFO("ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host);
+ if (ecc_in_tp != ecc_in_host) {
+ FTS_ERROR("ecc check fail");
+ goto fw_reset;
+ }
+
+ FTS_INFO("upgrade success, reset to normal boot");
+ ret = fts_fwupg_reset_in_boot(client);
+ if (ret < 0) {
+ FTS_ERROR("reset to normal boot fail");
+ }
+
+ msleep(400);
+ return 0;
+
+fw_reset:
+ return -EIO;
+}
+/************************************************************************
+* Name: fts_ft8719_upgrade
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+static int fts_ft8719_upgrade(struct i2c_client *client, u8 *buf, u32 len)
+{
+ int ret = 0;
+ u8 *tmpbuf = NULL;
+ u32 app_len = 0;
+
+ FTS_INFO("fw app upgrade...");
+ if (NULL == buf) {
+ FTS_ERROR("fw buf is null");
+ return -EINVAL;
+ }
+
+ if ((len < FTS_MIN_LEN) || (len > FTS_MAX_LEN_FILE)) {
+ FTS_ERROR("fw buffer len(%x) fail", len);
+ return -EINVAL;
+ }
+
+ app_len = len;
+ tmpbuf = buf;
+ ret = fts_ft8719_upgrade_mode(client, FLASH_MODE_APP, tmpbuf, app_len);
+ if (ret < 0) {
+ FTS_INFO("fw upgrade fail,reset to normal boot");
+ if (fts_fwupg_reset_in_boot(client) < 0) {
+ FTS_ERROR("reset to normal boot fail");
+ }
+ return ret;
+ }
+
+ return 0;
+}
+struct upgrade_func upgrade_func_ft8719 = {
+ .ctype = {0x0D},
+ .newmode = true,
+ .fwveroff = 0x010E,
+ .fwcfgoff = 0x1F80,
+ .appoff = 0x2000,
+ .pramboot_supported = true,
+ .pramboot = pb_file_ft8719,
+ .pb_length = sizeof(pb_file_ft8719),
+ .hid_supported = false,
+ .upgrade = fts_ft8719_upgrade
+};
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c
new file mode 100644
index 000000000000..f6429d4e5251
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_gesture.c
@@ -0,0 +1,606 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_gestrue.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2016-08-08
+*
+* Abstract:
+*
+* Reference:
+*
+*****************************************************************************/
+
+/*****************************************************************************
+* 1.Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+#if FTS_GESTURE_EN
+/******************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define KEY_GESTURE_U KEY_WAKEUP
+#define KEY_GESTURE_UP KEY_UP
+#define KEY_GESTURE_DOWN KEY_DOWN
+#define KEY_GESTURE_LEFT KEY_LEFT
+#define KEY_GESTURE_RIGHT KEY_RIGHT
+#define KEY_GESTURE_O KEY_O
+#define KEY_GESTURE_E KEY_E
+#define KEY_GESTURE_M KEY_M
+#define KEY_GESTURE_L KEY_L
+#define KEY_GESTURE_W KEY_W
+#define KEY_GESTURE_S KEY_S
+#define KEY_GESTURE_V KEY_V
+#define KEY_GESTURE_C KEY_C
+#define KEY_GESTURE_Z KEY_Z
+
+#define GESTURE_LEFT 0x20
+#define GESTURE_RIGHT 0x21
+#define GESTURE_UP 0x22
+#define GESTURE_DOWN 0x23
+#define GESTURE_DOUBLECLICK 0x24
+#define GESTURE_O 0x30
+#define GESTURE_W 0x31
+#define GESTURE_M 0x32
+#define GESTURE_E 0x33
+#define GESTURE_L 0x44
+#define GESTURE_S 0x46
+#define GESTURE_V 0x54
+#define GESTURE_Z 0x41
+#define GESTURE_C 0x34
+#define FTS_GESTRUE_POINTS 255
+#define FTS_GESTRUE_POINTS_HEADER 8
+
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+/*
+* header - byte0:gesture id
+* byte1:pointnum
+* byte2~7:reserved
+* coordinate_x - All gesture point x coordinate
+* coordinate_y - All gesture point y coordinate
+* mode - 1:enable gesture function(default)
+* - 0:disable
+* active - 1:enter into gesture(suspend)
+* 0:gesture disable or resume
+*/
+struct fts_gesture_st {
+ u8 header[FTS_GESTRUE_POINTS_HEADER];
+ u16 coordinate_x[FTS_GESTRUE_POINTS];
+ u16 coordinate_y[FTS_GESTRUE_POINTS];
+ u8 mode; /*host driver enable gesture flag */
+ u8 active; /*gesture actutally work */
+};
+
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+static struct fts_gesture_st fts_gesture_data;
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
+static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf);
+static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
+
+/* sysfs gesture node
+ * read example: cat fts_gesture_mode ---read gesture mode
+ * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01
+ *
+ */
+static DEVICE_ATTR(fts_gesture_mode, S_IRUGO | S_IWUSR, fts_gesture_show, fts_gesture_store);
+/*
+ * read example: cat fts_gesture_buf ---read gesture buf
+ */
+static DEVICE_ATTR(fts_gesture_buf, S_IRUGO | S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store);
+static struct attribute *fts_gesture_mode_attrs[] = {
+ &dev_attr_fts_gesture_mode.attr,
+ &dev_attr_fts_gesture_buf.attr,
+ NULL,
+};
+
+static struct attribute_group fts_gesture_group = {
+ .attrs = fts_gesture_mode_attrs,
+};
+
+/************************************************************************
+* Name: fts_gesture_show
+* Brief:
+* Input: device, device attribute, char buf
+* Output:
+* Return:
+***********************************************************************/
+static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ u8 val;
+ struct input_dev *input_dev = fts_data->input_dev;
+ struct i2c_client *client = container_of(dev, struct i2c_client, dev);
+
+ mutex_lock(&input_dev->mutex);
+ fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val);
+ count = snprintf(buf, PAGE_SIZE, "Gesture Mode: %s\n", fts_gesture_data.mode ? "On" : "Off");
+ count += snprintf(buf + count, PAGE_SIZE, "Reg(0xD0) = %d\n", val);
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/************************************************************************
+* Name: fts_gesture_store
+* Brief:
+* Input: device, device attribute, char buf, char count
+* Output:
+* Return:
+***********************************************************************/
+static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+ mutex_lock(&input_dev->mutex);
+ if (FTS_SYSFS_ECHO_ON(buf)) {
+ FTS_INFO("[GESTURE]enable gesture");
+ fts_gesture_data.mode = ENABLE;
+ } else if (FTS_SYSFS_ECHO_OFF(buf)) {
+ FTS_INFO("[GESTURE]disable gesture");
+ fts_gesture_data.mode = DISABLE;
+ }
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+void fts_gesture_enable(bool enable)
+{
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+
+ if (enable) {
+ FTS_INFO("[GESTURE]enable gesture");
+ fts_gesture_data.mode = ENABLE;
+ } else {
+ FTS_INFO("[GESTURE]disable gesture");
+ fts_gesture_data.mode = DISABLE;
+ }
+
+ mutex_unlock(&input_dev->mutex);
+}
+
+/************************************************************************
+* Name: fts_gesture_buf_show
+* Brief:
+* Input: device, device attribute, char buf
+* Output:
+* Return:
+***********************************************************************/
+static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ int count;
+ int i = 0;
+ struct input_dev *input_dev = fts_data->input_dev;
+
+ mutex_lock(&input_dev->mutex);
+ count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_gesture_data.header[0]);
+ count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_gesture_data.header[1]);
+ count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n");
+ for (i = 0; i < fts_gesture_data.header[1]; i++) {
+ count +=
+ snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_gesture_data.coordinate_x[i],
+ fts_gesture_data.coordinate_y[i]);
+ if ((i + 1) % 4 == 0)
+ count += snprintf(buf + count, PAGE_SIZE, "\n");
+ }
+ count += snprintf(buf + count, PAGE_SIZE, "\n");
+ mutex_unlock(&input_dev->mutex);
+
+ return count;
+}
+
+/************************************************************************
+* Name: fts_gesture_buf_store
+* Brief:
+* Input: device, device attribute, char buf, char count
+* Output:
+* Return:
+***********************************************************************/
+static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ /* place holder for future use */
+ return -EPERM;
+}
+
+/*****************************************************************************
+* Name: fts_create_gesture_sysfs
+* Brief:
+* Input:
+* Output:
+* Return: 0-success or others-error
+*****************************************************************************/
+int fts_create_gesture_sysfs(struct i2c_client *client)
+{
+ int ret = 0;
+
+ ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group);
+ if (ret != 0) {
+ FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!");
+ sysfs_remove_group(&client->dev.kobj, &fts_gesture_group);
+ return ret;
+ }
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_gesture_report
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
+{
+ int gesture;
+
+ FTS_FUNC_ENTER();
+ FTS_INFO("fts gesture_id==0x%x ", gesture_id);
+ switch (gesture_id) {
+ case GESTURE_LEFT:
+ gesture = KEY_GESTURE_LEFT;
+ break;
+ case GESTURE_RIGHT:
+ gesture = KEY_GESTURE_RIGHT;
+ break;
+ case GESTURE_UP:
+ gesture = KEY_GESTURE_UP;
+ break;
+ case GESTURE_DOWN:
+ gesture = KEY_GESTURE_DOWN;
+ break;
+ case GESTURE_DOUBLECLICK:
+ gesture = KEY_GESTURE_U;
+ break;
+ case GESTURE_O:
+ gesture = KEY_GESTURE_O;
+ break;
+ case GESTURE_W:
+ gesture = KEY_GESTURE_W;
+ break;
+ case GESTURE_M:
+ gesture = KEY_GESTURE_M;
+ break;
+ case GESTURE_E:
+ gesture = KEY_GESTURE_E;
+ break;
+ case GESTURE_L:
+ gesture = KEY_GESTURE_L;
+ break;
+ case GESTURE_S:
+ gesture = KEY_GESTURE_S;
+ break;
+ case GESTURE_V:
+ gesture = KEY_GESTURE_V;
+ break;
+ case GESTURE_Z:
+ gesture = KEY_GESTURE_Z;
+ break;
+ case GESTURE_C:
+ gesture = KEY_GESTURE_C;
+ break;
+ default:
+ gesture = -1;
+ break;
+ }
+ /* report event key */
+ if (gesture != -1) {
+ FTS_DEBUG("Gesture Code=%d", gesture);
+ input_report_key(input_dev, gesture, 1);
+ input_sync(input_dev);
+ input_report_key(input_dev, gesture, 0);
+ input_sync(input_dev);
+ }
+
+ FTS_FUNC_EXIT();
+}
+
+/************************************************************************
+* Name: fts_gesture_read_buffer
+* Brief: read data from TP register
+* Input:
+* Output:
+* Return: fail <0
+***********************************************************************/
+static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes)
+{
+ int remain_bytes;
+ int ret;
+ int i;
+
+ if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) {
+ ret = fts_i2c_read(client, buf, 1, buf, read_bytes);
+ } else {
+ ret = fts_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM);
+ remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM;
+ for (i = 1; remain_bytes > 0; i++) {
+ if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM)
+ ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes);
+ else
+ ret =
+ fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i,
+ I2C_BUFFER_LENGTH_MAXINUM);
+ remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM;
+ }
+ }
+
+ return ret;
+}
+
+/************************************************************************
+* Name: fts_gesture_readdata
+* Brief: read data from TP register
+* Input:
+* Output:
+* Return: return 0 if succuss, otherwise reture error code
+***********************************************************************/
+int fts_gesture_readdata(struct fts_ts_data *ts_data)
+{
+ u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 };
+ int ret = 0;
+ int i = 0;
+ int gestrue_id = 0;
+ int read_bytes = 0;
+ u8 pointnum;
+ u8 state;
+ struct i2c_client *client = ts_data->client;
+ struct input_dev *input_dev = ts_data->input_dev;
+
+ if (!ts_data->suspended) {
+ return -EINVAL;
+ }
+
+ ret = fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state);
+ if ((ret < 0) || (state != ENABLE)) {
+ FTS_DEBUG("gesture not enable, don't process gesture");
+ return -EIO;
+ }
+
+ /* init variable before read gesture point */
+ memset(fts_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER);
+ memset(fts_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16));
+ memset(fts_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16));
+
+ buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS;
+ ret = fts_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER);
+ if (ret < 0) {
+ FTS_ERROR("[GESTURE]Read gesture header data failed!!");
+ FTS_FUNC_EXIT();
+ return ret;
+ }
+
+ memcpy(fts_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER);
+ gestrue_id = buf[0];
+ pointnum = buf[1];
+ read_bytes = ((int)pointnum) * 4 + 2;
+ buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS;
+ FTS_DEBUG("[GESTURE]PointNum=%d", pointnum);
+ ret = fts_gesture_read_buffer(client, buf, read_bytes);
+ if (ret < 0) {
+ FTS_ERROR("[GESTURE]Read gesture touch data failed!!");
+ FTS_FUNC_EXIT();
+ return ret;
+ }
+
+ fts_gesture_report(input_dev, gestrue_id);
+ if (gestrue_id == GESTURE_DOUBLECLICK) {
+ ts_data->dbclick_count++;
+ }
+ for (i = 0; i < pointnum; i++) {
+ fts_gesture_data.coordinate_x[i] =
+ (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 | (((s16) buf[1 + (4 * i + 2)]) & 0xFF);
+ fts_gesture_data.coordinate_y[i] =
+ (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 | (((s16) buf[3 + (4 * i + 2)]) & 0xFF);
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_gesture_recovery
+* Brief: recovery gesture state when reset or power on
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_gesture_recovery(struct i2c_client *client)
+{
+ if ((ENABLE == fts_gesture_data.mode) && (ENABLE == fts_gesture_data.active)) {
+ FTS_INFO("enter fts_gesture_recovery");
+ fts_i2c_write_reg(client, 0xD1, 0xff);
+ fts_i2c_write_reg(client, 0xD2, 0xff);
+ fts_i2c_write_reg(client, 0xD5, 0xff);
+ fts_i2c_write_reg(client, 0xD6, 0xff);
+ fts_i2c_write_reg(client, 0xD7, 0xff);
+ fts_i2c_write_reg(client, 0xD8, 0xff);
+ fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE);
+ }
+}
+
+/*****************************************************************************
+* Name: fts_gesture_suspend
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if succuss, otherwise return error code
+*****************************************************************************/
+int fts_gesture_suspend(struct i2c_client *client)
+{
+ int i;
+ u8 state;
+
+ FTS_INFO("gesture suspend...");
+ /* gesture not enable, return immediately */
+ if (fts_gesture_data.mode == DISABLE) {
+ FTS_INFO("gesture is disabled");
+ return -EINVAL;
+ }
+
+ for (i = 0; i < 5; i++) {
+ fts_i2c_write_reg(client, 0xd1, 0xff);
+ fts_i2c_write_reg(client, 0xd2, 0xff);
+ fts_i2c_write_reg(client, 0xd5, 0xff);
+ fts_i2c_write_reg(client, 0xd6, 0xff);
+ fts_i2c_write_reg(client, 0xd7, 0xff);
+ fts_i2c_write_reg(client, 0xd8, 0xff);
+ fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE);
+ msleep(1);
+ fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state);
+ if (state == ENABLE)
+ break;
+ }
+
+ if (i >= 5) {
+ FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n");
+ fts_gesture_data.active = DISABLE;
+ return -EIO;
+ }
+
+ fts_gesture_data.active = ENABLE;
+ FTS_INFO("[GESTURE]Enter into gesture(suspend) successfully!");
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_gesture_resume
+* Brief:
+* Input:
+* Output:
+* Return: return 0 if succuss, otherwise return error code
+*****************************************************************************/
+int fts_gesture_resume(struct i2c_client *client)
+{
+ int i;
+ u8 state;
+
+ FTS_INFO("gesture resume...");
+ /* gesture not enable, return immediately */
+ if (fts_gesture_data.mode == DISABLE) {
+ FTS_DEBUG("gesture is disabled");
+ return -EINVAL;
+ }
+
+ if (fts_gesture_data.active == DISABLE) {
+ FTS_DEBUG("gesture in suspend is failed, no running fts_gesture_resume");
+ return -EINVAL;
+ }
+
+ fts_gesture_data.active = DISABLE;
+ for (i = 0; i < 5; i++) {
+ fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, DISABLE);
+ msleep(1);
+ fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state);
+ if (state == DISABLE)
+ break;
+ }
+
+ if (i >= 5) {
+ FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n");
+ return -EIO;
+ }
+
+ FTS_INFO("[GESTURE]resume from gesture successfully!");
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_gesture_init
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_gesture_init(struct fts_ts_data *ts_data)
+{
+ struct i2c_client *client = ts_data->client;
+ struct input_dev *input_dev = ts_data->input_dev;
+
+ FTS_FUNC_ENTER();
+ input_set_capability(input_dev, EV_KEY, KEY_POWER);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_U);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_UP);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_DOWN);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_LEFT);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_RIGHT);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_O);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_E);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_M);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_L);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_W);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_S);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_V);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_Z);
+ input_set_capability(input_dev, EV_KEY, KEY_GESTURE_C);
+
+ __set_bit(KEY_GESTURE_RIGHT, input_dev->keybit);
+ __set_bit(KEY_GESTURE_LEFT, input_dev->keybit);
+ __set_bit(KEY_GESTURE_UP, input_dev->keybit);
+ __set_bit(KEY_GESTURE_DOWN, input_dev->keybit);
+ __set_bit(KEY_GESTURE_U, input_dev->keybit);
+ __set_bit(KEY_GESTURE_O, input_dev->keybit);
+ __set_bit(KEY_GESTURE_E, input_dev->keybit);
+ __set_bit(KEY_GESTURE_M, input_dev->keybit);
+ __set_bit(KEY_GESTURE_W, input_dev->keybit);
+ __set_bit(KEY_GESTURE_L, input_dev->keybit);
+ __set_bit(KEY_GESTURE_S, input_dev->keybit);
+ __set_bit(KEY_GESTURE_V, input_dev->keybit);
+ __set_bit(KEY_GESTURE_C, input_dev->keybit);
+ __set_bit(KEY_GESTURE_Z, input_dev->keybit);
+
+ fts_create_gesture_sysfs(client);
+ fts_gesture_data.mode = DISABLE;
+ fts_gesture_data.active = DISABLE;
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_gesture_exit
+* Brief: call when driver removed
+* Input:
+* Output:
+* Return:
+***********************************************************************/
+int fts_gesture_exit(struct i2c_client *client)
+{
+ FTS_FUNC_ENTER();
+ sysfs_remove_group(&client->dev.kobj, &fts_gesture_group);
+ FTS_FUNC_EXIT();
+ return 0;
+}
+#endif
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c
new file mode 100644
index 000000000000..3a187750f8a0
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_i2c.c
@@ -0,0 +1,242 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/************************************************************************
+*
+* File Name: focaltech_i2c.c
+*
+* Author: fupeipei
+*
+* Created: 2016-08-04
+*
+* Abstract: i2c communication with TP
+*
+* Version: v1.0
+*
+* Revision History:
+* v1.0:
+* First release. By fupeipei 2016-08-04
+************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define I2C_RETRY_NUMBER 3
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+static DEFINE_MUTEX(i2c_rw_access);
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+
+/*****************************************************************************
+* functions body
+*****************************************************************************/
+
+/************************************************************************
+* Name: fts_i2c_read
+* Brief: i2c read
+* Input: i2c info, write buf, write len, read buf, read len
+* Output: get data in the 3rd buf
+* Return: fail <0
+***********************************************************************/
+int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen)
+{
+ int ret = 0;
+ int i = 0;
+
+ mutex_lock(&i2c_rw_access);
+
+ if (readlen > 0) {
+ if (writelen > 0) {
+ struct i2c_msg msgs[] = {
+ {
+ .addr = client->addr,
+ .flags = 0,
+ .len = writelen,
+ .buf = writebuf,
+ },
+ {
+ .addr = client->addr,
+ .flags = I2C_M_RD,
+ .len = readlen,
+ .buf = readbuf,
+ },
+ };
+ for (i = 0; i < I2C_RETRY_NUMBER; i++) {
+ ret = i2c_transfer(client->adapter, msgs, 2);
+ if (ret < 0) {
+ FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret);
+ } else
+ break;
+ }
+ } else {
+ struct i2c_msg msgs[] = {
+ {
+ .addr = client->addr,
+ .flags = I2C_M_RD,
+ .len = readlen,
+ .buf = readbuf,
+ },
+ };
+ for (i = 0; i < I2C_RETRY_NUMBER; i++) {
+ ret = i2c_transfer(client->adapter, msgs, 1);
+ if (ret < 0) {
+ FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret);
+ } else
+ break;
+ }
+ }
+ }
+
+ mutex_unlock(&i2c_rw_access);
+ return ret;
+}
+
+/************************************************************************
+* Name: fts_i2c_write
+* Brief: i2c write
+* Input: i2c info, write buf, write len
+* Output: no
+* Return: fail <0
+***********************************************************************/
+int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen)
+{
+ int ret = 0;
+ int i = 0;
+
+ mutex_lock(&i2c_rw_access);
+ if (writelen > 0) {
+ struct i2c_msg msgs[] = {
+ {
+ .addr = client->addr,
+ .flags = 0,
+ .len = writelen,
+ .buf = writebuf,
+ },
+ };
+ for (i = 0; i < I2C_RETRY_NUMBER; i++) {
+ ret = i2c_transfer(client->adapter, msgs, 1);
+ if (ret < 0) {
+ FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret);
+ } else
+ break;
+ }
+ }
+ mutex_unlock(&i2c_rw_access);
+
+ return ret;
+}
+
+/************************************************************************
+* Name: fts_i2c_write_reg
+* Brief: write register
+* Input: i2c info, reg address, reg value
+* Output: no
+* Return: fail <0
+***********************************************************************/
+int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue)
+{
+ u8 buf[2] = { 0 };
+
+ buf[0] = regaddr;
+ buf[1] = regvalue;
+ return fts_i2c_write(client, buf, sizeof(buf));
+}
+
+/************************************************************************
+* Name: fts_i2c_read_reg
+* Brief: read register
+* Input: i2c info, reg address, reg value
+* Output: get reg value
+* Return: fail <0
+***********************************************************************/
+int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue)
+{
+ return fts_i2c_read(client, &regaddr, 1, regvalue, 1);
+}
+
+/************************************************************************
+* HID to standard I2C
+***********************************************************************/
+void fts_i2c_hid2std(struct i2c_client *client)
+{
+ int ret = 0;
+ u8 buf[3] = { 0xeb, 0xaa, 0x09 };
+
+ ret = fts_i2c_write(client, buf, 3);
+ if (ret < 0)
+ FTS_ERROR("hid2std cmd write fail");
+ else {
+ msleep(10);
+ buf[0] = buf[1] = buf[2] = 0;
+ ret = fts_i2c_read(client, NULL, 0, buf, 3);
+ if (ret < 0)
+ FTS_ERROR("hid2std cmd read fail");
+ else if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) {
+ FTS_DEBUG("hidi2c change to stdi2c successful");
+ } else {
+ FTS_ERROR("hidi2c change to stdi2c fail");
+ }
+ }
+}
+
+/************************************************************************
+* Name: fts_i2c_init
+* Brief: fts i2c init
+* Input:
+* Output:
+* Return:
+***********************************************************************/
+int fts_i2c_init(void)
+{
+ FTS_FUNC_ENTER();
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_i2c_exit
+* Brief: fts i2c exit
+* Input:
+* Output:
+* Return:
+***********************************************************************/
+int fts_i2c_exit(void)
+{
+ FTS_FUNC_ENTER();
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c
new file mode 100644
index 000000000000..4eaa3ea93624
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_point_report_check.c
@@ -0,0 +1,135 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*****************************************************************************
+*
+* File Name: focaltech_point_report_check.c
+*
+* Author: WangTao
+*
+* Created: 2016-11-16
+*
+* Abstract: point report check function
+*
+* Version: v1.0
+*
+* Revision History:
+* v1.0:
+* First release. By WangTao 2016-11-16
+*****************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "focaltech_core.h"
+
+#if FTS_POINT_REPORT_CHECK_EN
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define POINT_REPORT_CHECK_WAIT_TIME 200 /* unit:ms */
+
+/*****************************************************************************
+* functions body
+*****************************************************************************/
+/*****************************************************************************
+* Name: fts_prc_func
+* Brief: fts point report check work func, report whole up of points
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+static void fts_prc_func(struct work_struct *work)
+{
+ struct fts_ts_data *ts_data = container_of(work,
+ struct fts_ts_data, prc_work.work);
+ struct input_dev *input_dev = ts_data->input_dev;
+
+#if FTS_MT_PROTOCOL_B_EN
+ u32 finger_count = 0;
+#endif
+
+ FTS_FUNC_ENTER();
+ mutex_lock(&ts_data->report_mutex);
+
+#if FTS_MT_PROTOCOL_B_EN
+ for (finger_count = 0; finger_count < ts_data->pdata->max_touch_number; finger_count++) {
+ input_mt_slot(input_dev, finger_count);
+ input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false);
+ }
+#else
+ input_mt_sync(input_dev);
+#endif
+ input_report_key(input_dev, BTN_TOUCH, 0);
+ input_sync(input_dev);
+
+ mutex_unlock(&ts_data->report_mutex);
+
+ FTS_FUNC_EXIT();
+}
+
+/*****************************************************************************
+* Name: fts_prc_queue_work
+* Brief: fts point report check queue work, call it when interrupt comes
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+void fts_prc_queue_work(struct fts_ts_data *ts_data)
+{
+ cancel_delayed_work(&ts_data->prc_work);
+ queue_delayed_work(ts_data->ts_workqueue, &ts_data->prc_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME));
+}
+
+/*****************************************************************************
+* Name: fts_point_report_check_init
+* Brief:
+* Input:
+* Output:
+* Return: < 0: Fail to create esd check queue
+*****************************************************************************/
+int fts_point_report_check_init(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+
+ if (ts_data->ts_workqueue) {
+ INIT_DELAYED_WORK(&ts_data->prc_work, fts_prc_func);
+ } else {
+ FTS_ERROR("fts workqueue is NULL, can't run point report check function");
+ return -EINVAL;
+ }
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+
+/*****************************************************************************
+* Name: fts_point_report_check_exit
+* Brief:
+* Input:
+* Output:
+* Return:
+*****************************************************************************/
+int fts_point_report_check_exit(struct fts_ts_data *ts_data)
+{
+ FTS_FUNC_ENTER();
+
+ FTS_FUNC_EXIT();
+ return 0;
+}
+#endif /* FTS_POINT_REPORT_CHECK_EN */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile
new file mode 100644
index 000000000000..53a8ea9ba7a8
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/Makefile
@@ -0,0 +1,12 @@
+#drivers/input/touchscreen/focaltech_touch/focaltech_test
+#
+#Makefile for test module
+#
+
+
+
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ini.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_detail_threshold.o
+obj-$(CONFIG_TOUCHSCREEN_FTS) += supported_ic/
+
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c
new file mode 100644
index 000000000000..1eb2ade05135
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.c
@@ -0,0 +1,1526 @@
+/*
+ *
+ * FocalTech TouchScreen driver.
+ *
+ * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/************************************************************************
+*
+* File Name: focaltech_test.c
+*
+* Author: Software Department, FocalTech
+*
+* Created: 2016-08-01
+*
+* Modify:
+*
+* Abstract: create char device and proc node for the comm between APK and TP
+*
+************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "focaltech_test.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+struct fts_test_data test_data;
+
+struct test_funcs *test_funcs_list[] = {
+ &test_func_ft8719,
+};
+
+static int fts_test_result = SELFTEST_INVALID;
+
+struct test_ic_type ic_types[] = {
+ {"FT5X22", 6, IC_FT5X46, 0},
+ {"FT5X46", 6, IC_FT5X46, 0},
+ {"FT5X46i", 7, IC_FT5X46I, 0},
+ {"FT5526", 6, IC_FT5526, 0},
+ {"FT3X17", 6, IC_FT3X17, 0},
+ {"FT5436", 6, IC_FT5436, 0},
+ {"FT3X27", 6, IC_FT3X27, 0},
+ {"FT5526i", 7, IC_FT5526I, 0},
+ {"FT5416", 6, IC_FT5416, 0},
+ {"FT5426", 6, IC_FT5426, 0},
+ {"FT5435", 6, IC_FT5435, 0},
+ {"FT7681", 6, IC_FT7681, 0},
+ {"FT7661", 6, IC_FT7661, 0},
+ {"FT7511", 6, IC_FT7511, 0},
+ {"FT7421", 6, IC_FT7421, 0},
+ {"FT7311", 6, IC_FT7311, 0},
+
+ {"FT6X36", 6, IC_FT6X36, 0},
+ {"FT3X07", 6, IC_FT3X07, 0},
+ {"FT6416", 6, IC_FT6416, 0},
+ {"FT6336G/U", 9, IC_FT6426, 0},
+ {"FT6236U", 7, IC_FT6236U, 0},
+ {"FT6436U", 7, IC_FT6436U, 0},
+ {"FT3267", 6, IC_FT3267, 0},
+ {"FT3367", 6, IC_FT3367, 0},
+ {"FT7401", 6, IC_FT7401, 0},
+ {"FT3407U", 7, IC_FT3407U, 0},
+
+ {"FT5822", 6, IC_FT5822, 0},
+ {"FT5626", 6, IC_FT5626, 0},
+ {"FT5726", 6, IC_FT5726, 0},
+ {"FT5826B", 7, IC_FT5826B, 0},
+ {"FT3617", 6, IC_FT3617, 0},
+ {"FT3717", 6, IC_FT3717, 0},
+ {"FT7811", 6, IC_FT7811, 0},
+ {"FT5826S", 7, IC_FT5826S, 0},
+ {"FT3517U", 7, IC_FT3517U, 0},
+
+ {"FT8606", 6, IC_FT8606, 0},
+
+ {"FT8716U", 7, IC_FT8716U, 0},
+ {"FT8716F", 7, IC_FT8716F, 0},
+ {"FT8716", 6, IC_FT8716, 0},
+ {"FT8613", 6, IC_FT8613, 0},
+
+ {"FT3C47U", 7, IC_FT3C47U, 0},
+
+ {"FT8607U", 7, IC_FT8607U, 0},
+ {"FT8607", 6, IC_FT8607, 0},
+
+ {"FT8736", 6, IC_FT8736, 0},
+
+ {"FT3D47", 6, IC_FT3D47, 0},
+
+ {"FTE716", 6, IC_FTE716, 0},
+
+ {"FT8201", 6, IC_FT8201, 0},
+
+ {"FT8006M", 7, IC_FT8006M, 0},
+
+ {"FT8006U", 7, IC_FT8006U, 0},
+
+ {"FT8719", 6, IC_FT8719, 0x8719},
+
+};
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+
+/*****************************************************************************
+* functions body
+*****************************************************************************/
+void sys_delay(int ms)
+{
+ msleep(ms);
+}
+
+int focal_abs(int value)
+{
+ if (value < 0)
+ value = 0 - value;
+
+ return value;
+}
+
+void *fts_malloc(size_t size)
+{
+ return kzalloc(size, GFP_ATOMIC);
+}
+
+void fts_free_proc(void *p)
+{
+ return kfree(p);
+}
+
+/********************************************************************
+ * test i2c read/write interface
+ *******************************************************************/
+int fts_test_i2c_read(u8 *writebuf, int writelen, u8 *readbuf, int readlen)
+{
+ int ret = 0;
+#if 1
+ if (NULL == fts_data) {
+ FTS_TEST_ERROR("fts_data is null, no test");
+ return -EINVAL;
+ }
+ ret = fts_i2c_read(fts_data->client, writebuf, writelen, readbuf, readlen);
+#else
+ ret = fts_i2c_read(writebuf, writelen, readbuf, readlen);
+#endif
+
+ if (ret < 0)
+ return ret;
+ else
+ return 0;
+}
+
+int fts_test_i2c_write(u8 *writebuf, int writelen)
+{
+ int ret = 0;
+#if 1
+ if (NULL == fts_data) {
+ FTS_TEST_ERROR("fts_data is null, no test");
+ return -EINVAL;
+ }
+ ret = fts_i2c_write(fts_data->client, writebuf, writelen);
+#else
+ ret = fts_i2c_write(writebuf, writelen);
+#endif
+
+ if (ret < 0)
+ return ret;
+ else
+ return 0;
+}
+
+int read_reg(u8 addr, u8 *val)
+{
+ return fts_test_i2c_read(&addr, 1, val, 1);
+}
+
+int write_reg(u8 addr, u8 val)
+{
+ int ret;
+ u8 cmd[2] = { 0 };
+
+ cmd[0] = addr;
+ cmd[1] = val;
+ ret = fts_test_i2c_write(cmd, 2);
+
+ return ret;
+}
+
+/********************************************************************
+ * test global function enter work/factory mode
+ *******************************************************************/
+int enter_work_mode(void)
+{
+ int ret = 0;
+ u8 mode = 0;
+ int i = 0;
+ int j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ ret = read_reg(DEVIDE_MODE_ADDR, &mode);
+ if ((0 == ret) && (((mode >> 4) & 0x07) == 0x00))
+ return 0;
+
+ for (i = 0; i < ENTER_WORK_FACTORY_RETRIES; i++) {
+ ret = write_reg(DEVIDE_MODE_ADDR, 0x00);
+ if (0 == ret) {
+ for (j = 0; j < 20; j++) {
+ ret = read_reg(DEVIDE_MODE_ADDR, &mode);
+ if ((0 == ret) && (((mode >> 4) & 0x07) == 0x00))
+ return 0;
+ else
+ sys_delay(FACTORY_TEST_DELAY);
+ }
+ }
+
+ sys_delay(50);
+ }
+
+ if (i >= ENTER_WORK_FACTORY_RETRIES) {
+ FTS_TEST_ERROR("Enter work mode fail");
+ return -EIO;
+ }
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+int enter_factory_mode(void)
+{
+ int ret = 0;
+ u8 mode = 0;
+ int i = 0;
+ int j = 0;
+
+ ret = read_reg(DEVIDE_MODE_ADDR, &mode);
+ if ((0 == ret) && (((mode >> 4) & 0x07) == 0x04))
+ return 0;
+
+ for (i = 0; i < ENTER_WORK_FACTORY_RETRIES; i++) {
+ ret = write_reg(DEVIDE_MODE_ADDR, 0x40);
+ if (0 == ret) {
+ for (j = 0; j < 20; j++) {
+ ret = read_reg(DEVIDE_MODE_ADDR, &mode);
+ if ((0 == ret) && (((mode >> 4) & 0x07) == 0x04)) {
+ sys_delay(200);
+ return 0;
+ } else
+ sys_delay(FACTORY_TEST_DELAY);
+ }
+ }
+
+ sys_delay(50);
+ }
+
+ if (i >= ENTER_WORK_FACTORY_RETRIES) {
+ FTS_TEST_ERROR("Enter factory mode fail");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_i2c_read_write
+* Brief: Write/Read Data by IIC
+* Input: writebuf, writelen, readlen
+* Output: readbuf
+* Return: Comm Code. Code = 0x00 is OK, else fail.
+***********************************************************************/
+unsigned char fts_i2c_read_write(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen)
+{
+ int ret;
+
+ if (readlen > 0) {
+ ret = fts_test_i2c_read(writebuf, writelen, readbuf, readlen);
+ } else {
+ ret = fts_test_i2c_write(writebuf, writelen);
+ }
+
+ if (ret >= 0)
+ return ERROR_CODE_OK;
+ else
+ return ERROR_CODE_COMM_ERROR;
+}
+
+/*
+ * read_mass_data - read rawdata/short test data
+ * addr - register addr which read data from
+ * byte_num - read data length, unit:byte
+ * buf - save data
+ *
+ * return 0 if read data succuss, otherwise return error code
+ */
+int read_mass_data(u8 addr, int byte_num, int *buf)
+{
+ int ret = 0;
+ int i = 0;
+ u8 reg_addr = 0;
+ u8 *data = NULL;
+ int read_num = 0;
+ int packet_num = 0;
+ int packet_remainder = 0;
+ int offset = 0;
+
+ data = (u8 *) fts_malloc(byte_num * sizeof(u8));
+ if (NULL == data) {
+ FTS_TEST_SAVE_INFO("rawdata buffer malloc fail\n");
+ return -ENOMEM;
+ }
+
+ /* read rawdata buffer */
+ FTS_TEST_INFO("mass data len:%d", byte_num);
+ packet_num = byte_num / BYTES_PER_TIME;
+ packet_remainder = byte_num % BYTES_PER_TIME;
+ if (packet_remainder)
+ packet_num++;
+
+ if (byte_num < BYTES_PER_TIME) {
+ read_num = byte_num;
+ } else {
+ read_num = BYTES_PER_TIME;
+ }
+ FTS_TEST_INFO("packet num:%d, remainder:%d", packet_num, packet_remainder);
+
+ reg_addr = addr;
+ ret = fts_test_i2c_read(&reg_addr, 1, data, read_num);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("read rawdata fail\n");
+ goto READ_MASSDATA_ERR;
+ }
+
+ for (i = 1; i < packet_num; i++) {
+ offset = read_num * i;
+ if ((i == (packet_num - 1)) && packet_remainder) {
+ read_num = packet_remainder;
+ }
+
+ ret = fts_test_i2c_read(NULL, 0, data + offset, read_num);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("read much rawdata fail\n");
+ goto READ_MASSDATA_ERR;
+ }
+ }
+
+ for (i = 0; i < byte_num; i = i + 2) {
+ buf[i >> 1] = (int)(((int)(data[i]) << 8) + data[i + 1]);
+ }
+
+READ_MASSDATA_ERR:
+ if (data) {
+ fts_free(data);
+ }
+
+ return ret;
+}
+
+/*
+ * chip_clb_incell - auto clb
+ */
+int chip_clb_incell(void)
+{
+ int ret = 0;
+ u8 val = 0;
+ int times = 0;
+
+ /* start clb */
+ ret = write_reg(FACTORY_REG_CLB, 0x04);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write start clb fail\n");
+ return ret;
+ }
+
+ sys_delay(120);
+ while (times++ < FACTORY_TEST_RETRY) {
+ ret = read_reg(FACTORY_REG_CLB, &val);
+ if ((0 == ret) && (0x02 == val)) {
+ /* clb ok */
+ break;
+ } else
+ FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_CLB, val, times);
+
+ sys_delay(FACTORY_TEST_DELAY);
+ }
+
+ if (times >= FACTORY_TEST_RETRY) {
+ FTS_TEST_SAVE_INFO("chip clb timeout\n");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * start_scan_incell - start to scan a frame for incell ic
+ */
+int start_scan_incell(void)
+{
+ int ret = 0;
+ u8 val = 0x00;
+ int times = 0;
+
+ ret = read_reg(DEVIDE_MODE_ADDR, &val);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("read device mode fail\n");
+ return ret;
+ }
+
+ /* Top bit position 1, start scan */
+ val |= 0x80;
+ ret = write_reg(DEVIDE_MODE_ADDR, val);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write device mode fail\n");
+ return ret;
+ }
+
+ while (times++ < FACTORY_TEST_RETRY) {
+ /* Wait for the scan to complete */
+ sys_delay(FACTORY_TEST_DELAY);
+
+ ret = read_reg(DEVIDE_MODE_ADDR, &val);
+ if ((0 == ret) && (0 == (val >> 7))) {
+ break;
+ } else
+ FTS_TEST_DBG("reg%x=%x,retry:%d", DEVIDE_MODE_ADDR, val, times);
+ }
+
+ if (times >= FACTORY_TEST_RETRY) {
+ FTS_TEST_SAVE_INFO("start scan timeout\n");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * wait_state_update - wait fw status update
+ */
+int wait_state_update(void)
+{
+ int ret = 0;
+ int times = 0;
+ u8 state = 0xFF;
+
+ while (times++ < FACTORY_TEST_RETRY) {
+ sys_delay(100);
+ /* Wait register status update */
+ state = 0xFF;
+ ret = read_reg(FACTORY_REG_PARAM_UPDATE_STATE, &state);
+ if ((0 == ret) && (0x00 == state))
+ break;
+ else
+ FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_PARAM_UPDATE_STATE, state, times);
+ }
+
+ if (times >= FACTORY_TEST_RETRY) {
+ FTS_TEST_SAVE_INFO("Wait State Update fail\n");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * get_rawdata_incell - read rawdata/diff for incell ic
+ */
+int get_rawdata_incell(int *data)
+{
+ int ret = 0;
+ u8 tx_num = 0;
+ u8 rx_num = 0;
+ u8 key_num = 0;
+ int va_num = 0;
+
+ FTS_TEST_FUNC_ENTER();
+ /* enter into factory mode */
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Enter Factory Mode\n");
+ return ret;
+ }
+
+ /* get tx/rx num */
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ va_num = tx_num * rx_num;
+ key_num = test_data.screen_param.key_num_total;
+
+ /* start to scan a frame */
+ ret = start_scan_incell();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Scan ...\n");
+ return ret;
+ }
+
+ /* Read RawData for va Area */
+ ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("wirte AD to reg01 fail\n");
+ return ret;
+ }
+ ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, va_num * 2, data);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n");
+ return ret;
+ }
+
+ /* Read RawData for key Area */
+ ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAE);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("wirte AE to reg01 fail\n");
+ return ret;
+ }
+ ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, key_num * 2, data + va_num);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Get RawData of keys.\n");
+ return ret;
+ }
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+/*
+ * get_cb_incell - get cb data for incell IC
+ */
+int get_cb_incell(u16 saddr, int byte_num, int *cb_buf)
+{
+ int ret = 0;
+ int i = 0;
+ u8 cb_addr = 0;
+ u8 addr_h = 0;
+ u8 addr_l = 0;
+ int read_num = 0;
+ int packet_num = 0;
+ int packet_remainder = 0;
+ int offset = 0;
+ int addr = 0;
+ u8 *data = NULL;
+
+ data = (u8 *) fts_malloc(byte_num * sizeof(u8));
+ if (NULL == data) {
+ FTS_TEST_SAVE_INFO("cb buffer malloc fail\n");
+ return -ENOMEM;
+ }
+
+ packet_num = byte_num / BYTES_PER_TIME;
+ packet_remainder = byte_num % BYTES_PER_TIME;
+ if (packet_remainder)
+ packet_num++;
+ read_num = BYTES_PER_TIME;
+
+ FTS_TEST_INFO("cb packet:%d,remainder:%d", packet_num, packet_remainder);
+ cb_addr = FACTORY_REG_CB_ADDR;
+ for (i = 0; i < packet_num; i++) {
+ offset = read_num * i;
+ addr = saddr + offset;
+ addr_h = (addr >> 8) & 0xFF;
+ addr_l = addr & 0xFF;
+ if ((i == (packet_num - 1)) && packet_remainder) {
+ read_num = packet_remainder;
+ }
+
+ ret = write_reg(FACTORY_REG_CB_ADDR_H, addr_h);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write cb addr high fail\n");
+ goto TEST_CB_ERR;
+ }
+ ret = write_reg(FACTORY_REG_CB_ADDR_L, addr_l);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write cb addr low fail\n");
+ goto TEST_CB_ERR;
+ }
+
+ ret = fts_test_i2c_read(&cb_addr, 1, data + offset, read_num);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("read cb fail\n");
+ goto TEST_CB_ERR;
+ }
+ }
+
+ for (i = 0; i < byte_num; i++) {
+ cb_buf[i] = data[i];
+ }
+
+TEST_CB_ERR:
+ fts_free(data);
+ return ret;
+}
+
+/*
+ * weakshort_get_adc_data_incell - get short(adc) data for incell IC
+ */
+int weakshort_get_adc_data_incell(u8 retval, u8 ch_num, int byte_num, int *adc_buf)
+{
+ int ret = 0;
+ int times = 0;
+ u8 short_state = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ /* Start ADC sample */
+ ret = write_reg(FACTORY_REG_SHORT_TEST_EN, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("start short test fail\n");
+ goto ADC_ERROR;
+ }
+ sys_delay(ch_num * FACTORY_TEST_DELAY);
+
+ for (times = 0; times < FACTORY_TEST_RETRY; times++) {
+ ret = read_reg(FACTORY_REG_SHORT_TEST_STATE, &short_state);
+ if ((0 == ret) && (retval == short_state))
+ break;
+ else
+ FTS_TEST_DBG("reg%x=%x,retry:%d", FACTORY_REG_SHORT_TEST_STATE, short_state, times);
+
+ sys_delay(FACTORY_TEST_RETRY_DELAY);
+ }
+ if (times >= FACTORY_TEST_RETRY) {
+ FTS_TEST_SAVE_INFO("short test timeout, ADC data not OK\n");
+ ret = -EIO;
+ goto ADC_ERROR;
+ }
+
+ ret = read_mass_data(FACTORY_REG_SHORT_ADDR, byte_num, adc_buf);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("get short(adc) data fail\n");
+ }
+
+ADC_ERROR:
+ FTS_TEST_FUNC_EXIT();
+ return ret;
+}
+
+/*
+ * show_data_incell - show and save test data to testresult.txt
+ */
+void show_data_incell(int *data, bool include_key)
+{
+ int row = 0;
+ int col = 0;
+ int tx_num = test_data.screen_param.tx_num;
+ int rx_num = test_data.screen_param.rx_num;
+ int key_num = test_data.screen_param.key_num_total;
+
+ FTS_TEST_SAVE_INFO("\nVA Channels: ");
+ for (row = 0; row < tx_num; row++) {
+ FTS_TEST_SAVE_INFO("\nCh_%02d: ", row + 1);
+ for (col = 0; col < rx_num; col++) {
+ FTS_TEST_SAVE_INFO("%5d, ", data[row * rx_num + col]);
+ }
+ }
+
+ if (include_key) {
+ FTS_TEST_SAVE_INFO("\nKeys: ");
+ for (col = 0; col < key_num; col++) {
+ FTS_TEST_SAVE_INFO("%5d, ", data[rx_num * tx_num + col]);
+ }
+ FTS_TEST_SAVE_INFO("\n");
+ }
+}
+
+/*
+ * compare_data_incell - check data in range or not
+ *
+ * return true if check pass, or return false
+ */
+bool compare_data_incell(int *data, int min, int max, int vk_min, int vk_max, bool include_key)
+{
+ int row = 0;
+ int col = 0;
+ int value = 0;
+ bool tmp_result = true;
+ int tx_num = test_data.screen_param.tx_num;
+ int rx_num = test_data.screen_param.rx_num;
+ int key_num = test_data.screen_param.key_num_total;
+
+ /* VA area */
+ for (row = 0; row < tx_num; row++) {
+ for (col = 0; col < rx_num; col++) {
+ if (0 == test_data.incell_detail_thr.invalid_node[row * rx_num + col])
+ continue; /* Invalid Node */
+ value = data[row * rx_num + col];
+ if (value < min || value > max) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("test failure.Node=(%d, %d),Get_value=%d,Set_Range=(%d, %d)\n",
+ row + 1, col + 1, value, min, max);
+ }
+ }
+ }
+ /* Key area */
+ if (include_key) {
+ if (test_data.screen_param.key_flag) {
+ key_num = test_data.screen_param.key_num;
+ }
+ row = test_data.screen_param.tx_num;
+ for (col = 0; col < key_num; col++) {
+ if (0 == test_data.incell_detail_thr.invalid_node[tx_num * rx_num + col])
+ continue; /* Invalid Node */
+ value = data[rx_num * tx_num + col];
+ if (value < vk_min || value > vk_max) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("test failure.Node=(%d, %d),Get_value=%d,Set_Range=(%d, %d)\n",
+ row + 1, col + 1, value, vk_min, vk_max);
+ }
+ }
+ }
+
+ return tmp_result;
+}
+
+/************************************************************************
+* Name: compare_detailthreshold_data_incell
+* Brief: compare_detailthreshold_data_incell
+* Input: none
+* Output: none
+* Return: none.
+***********************************************************************/
+bool compare_detailthreshold_data_incell(int *data, int *data_min, int *data_max, bool include_key)
+{
+ int row, col;
+ int value;
+ bool tmp_result = true;
+ int tmp_min, tmp_max;
+ int rx_num = test_data.screen_param.rx_num;
+ int tx_num = test_data.screen_param.tx_num;
+ int key_num = test_data.screen_param.key_num_total;
+ /* VA */
+ for (row = 0; row < tx_num; row++) {
+ for (col = 0; col < rx_num; col++) {
+ if (test_data.incell_detail_thr.invalid_node[row * rx_num + col] == 0)
+ continue; /* Invalid Node */
+ tmp_min = data_min[row * rx_num + col];
+ tmp_max = data_max[row * rx_num + col];
+ value = data[row * rx_num + col];
+ if (value < tmp_min || value > tmp_max) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO
+ (" \n test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d)", row + 1,
+ col + 1, value, tmp_min, tmp_max);
+ }
+ }
+ }
+ /* Key */
+ if (include_key) {
+ if (test_data.screen_param.key_flag) {
+ key_num = test_data.screen_param.key_num;
+ }
+ row = test_data.screen_param.tx_num;
+ for (col = 0; col < key_num; col++) {
+ if (test_data.incell_detail_thr.invalid_node[rx_num * tx_num + col] == 0)
+ continue; /* Invalid Node */
+ tmp_min = data_min[rx_num * tx_num + col];
+ tmp_max = data_max[rx_num * tx_num + col];
+ value = data[rx_num * tx_num + col];
+ if (value < tmp_min || value > tmp_max) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO
+ (" \n test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d)", row + 1,
+ col + 1, value, tmp_min, tmp_max);
+ }
+ }
+ }
+
+ return tmp_result;
+}
+
+/*
+ * save_testdata_incell - save data to testdata.csv
+ */
+void save_testdata_incell(int *data, char *test_num, int index, u8 row, u8 col, u8 item_count)
+{
+ int len = 0;
+ int i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ /* Save Msg */
+ len =
+ snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%s, %d, %d, %d, %d, %d, ", test_num,
+ test_data.test_item_code, row, col, test_data.start_line, item_count);
+
+ memcpy(test_data.msg_area_line2 + test_data.len_msg_area_line2, test_data.tmp_buffer, len);
+ test_data.len_msg_area_line2 += len;
+
+ test_data.start_line += row;
+ test_data.test_data_count++;
+
+ /* Save Data */
+ for (i = 0 + index; (i < row + index) && (i < TX_NUM_MAX); i++) {
+ for (j = 0; (j < col) && (j < RX_NUM_MAX); j++) {
+ if (j == (col - 1)) {
+ /* The Last Data of the row, add "\n" */
+ len =
+ snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%d, \n",
+ data[col * (i + index) + j]);
+ } else {
+ len =
+ snprintf(test_data.tmp_buffer, BUFF_LEN_TMP_BUFFER, "%d, ",
+ data[col * (i + index) + j]);
+ }
+
+ memcpy(test_data.store_data_area + test_data.len_store_data_area, test_data.tmp_buffer, len);
+ test_data.len_store_data_area += len;
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+/*
+ * fts_ic_table_get_ic_code_from_ic_name - get ic code from ic name
+ */
+u32 fts_ic_table_get_ic_code_from_ic_name(char *ic_name)
+{
+ int i = 0;
+ int type_size = 0;
+
+ type_size = sizeof(ic_types) / sizeof(ic_types[0]);
+ for (i = 0; i < type_size; i++) {
+ if (0 == strncmp(ic_name, ic_types[i].ic_name, ic_types[i].len))
+ return ic_types[i].ic_type;
+ }
+
+ FTS_TEST_ERROR("no IC type match");
+ return 0;
+}
+
+/*
+ * init_test_funcs - get test function based on ic_type
+ */
+int init_test_funcs(u32 ic_type)
+{
+ int i = 0;
+ struct test_funcs *funcs = test_funcs_list[0];
+ int funcs_len = sizeof(test_funcs_list) / sizeof(test_funcs_list[0]);
+ u32 ic_series = 0;
+
+ ic_series = TEST_ICSERIES(ic_type);
+ FTS_TEST_INFO("ic_type:%x, test functions len:%x", ic_type, funcs_len);
+ for (i = 0; i < funcs_len; i++) {
+ funcs = test_funcs_list[i];
+ if (ic_series == funcs->ic_series) {
+ test_data.func = funcs;
+ break;
+ }
+ }
+
+ if (i >= funcs_len) {
+ FTS_TEST_ERROR("no ic serial function match");
+ return -ENODATA;
+ }
+
+ return 0;
+}
+
+/************************************************************************
+* Name: fts_set_testitem
+* Brief: set test item code and name
+* Input: null
+* Output: null
+* Return:
+**********************************************************************/
+void fts_set_testitem(u8 itemcode)
+{
+ test_data.test_item[test_data.test_num].itemcode = itemcode;
+ test_data.test_item[test_data.test_num].testnum = test_data.test_num;
+ test_data.test_item[test_data.test_num].testresult = RESULT_NULL;
+ test_data.test_num++;
+}
+
+
+void init_storeparam_testdata(void)
+{
+ test_data.testresult_len = 0;
+
+ test_data.len_store_msg_area = 0;
+ test_data.len_msg_area_line2 = 0;
+ test_data.len_store_data_area = 0;
+ /* The Start Line of Data Area is 11 */
+ test_data.start_line = 11;
+ test_data.test_data_count = 0;
+}
+
+int allocate_init_testdata_memory(void)
+{
+ test_data.testresult = fts_malloc(BUFF_LEN_TESTRESULT_BUFFER);
+ if (NULL == test_data.testresult)
+ goto ERR;
+
+ test_data.store_all_data = fts_malloc(FTS_TEST_STORE_DATA_SIZE);
+ if (NULL == test_data.store_all_data)
+ goto ERR;
+
+ test_data.store_msg_area = fts_malloc(BUFF_LEN_STORE_MSG_AREA);
+ if (NULL == test_data.store_msg_area)
+ goto ERR;
+
+ test_data.msg_area_line2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2);
+ if (NULL == test_data.msg_area_line2)
+ goto ERR;
+
+ test_data.store_data_area = fts_malloc(BUFF_LEN_STORE_DATA_AREA);
+ if (NULL == test_data.store_data_area)
+ goto ERR;
+
+ test_data.tmp_buffer = fts_malloc(BUFF_LEN_TMP_BUFFER);
+ if (NULL == test_data.tmp_buffer)
+ goto ERR;
+
+ init_storeparam_testdata();
+ return 0;
+ERR:
+ FTS_TEST_ERROR("fts_malloc memory failed in function.");
+ return -ENOMEM;
+}
+
+/************************************************************************
+* Name: free_testdata_memory
+* Brief: Release pointer memory
+* Input: none
+* Output: none
+* Return: none
+***********************************************************************/
+void free_testdata_memory(void)
+{
+ /* free buff */
+ if (NULL != test_data.testresult)
+ fts_free(test_data.testresult);
+
+ if (NULL != test_data.store_all_data)
+ fts_free(test_data.store_all_data);
+
+ if (NULL != test_data.store_msg_area)
+ fts_free(test_data.store_msg_area);
+
+ if (NULL != test_data.msg_area_line2)
+ fts_free(test_data.msg_area_line2);
+
+ if (NULL != test_data.store_data_area)
+ fts_free(test_data.store_data_area);
+
+ if (NULL != test_data.tmp_buffer)
+ fts_free(test_data.tmp_buffer);
+
+}
+
+int get_tx_rx_num(u8 tx_rx_reg, u8 *ch_num, u8 ch_num_max)
+{
+ int ret = 0;
+ int i = 0;
+
+ for (i = 0; i < 3; i++) {
+ ret = read_reg(tx_rx_reg, ch_num);
+ if ((ret < 0) || (*ch_num > ch_num_max)) {
+ sys_delay(50);
+ } else
+ break;
+ }
+
+ if (i >= 3) {
+ FTS_TEST_ERROR("get channel num fail");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static int get_channel_num(void)
+{
+ int ret = 0;
+ u8 tx_num = 0;
+ u8 rx_num = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ ret = enter_factory_mode();
+ if (ret < 0) {
+ FTS_TEST_ERROR("enter factory mode fail, can't get tx/rx num");
+ return ret;
+ }
+
+ test_data.screen_param.used_max_tx_num = TX_NUM_MAX;
+ test_data.screen_param.used_max_rx_num = RX_NUM_MAX;
+ test_data.screen_param.key_num_total = KEY_NUM_MAX;
+ ret = get_tx_rx_num(FACTORY_REG_CHX_NUM, &tx_num, TX_NUM_MAX);
+ if (ret < 0) {
+ FTS_TEST_ERROR("get tx_num fail");
+ return ret;
+ }
+
+ ret = get_tx_rx_num(FACTORY_REG_CHY_NUM, &rx_num, RX_NUM_MAX);
+ if (ret < 0) {
+ FTS_TEST_ERROR("get rx_num fail");
+ return ret;
+ }
+
+ test_data.screen_param.tx_num = (int)tx_num;
+ test_data.screen_param.rx_num = (int)rx_num;
+ test_data.screen_param.used_max_tx_num = tx_num + KEY_NUM_MAX;
+ test_data.screen_param.used_max_rx_num = rx_num + KEY_NUM_MAX;
+
+ FTS_TEST_INFO("TxNum=%d, RxNum=%d, MaxTxNum=%d, MaxRxNum=%d",
+ test_data.screen_param.tx_num, test_data.screen_param.rx_num,
+ test_data.screen_param.used_max_tx_num, test_data.screen_param.used_max_rx_num);
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+static int fts_test_init_basicinfo(void)
+{
+ int ret = 0;
+ u8 val = 0;
+
+ FTS_TEST_SAVE_INFO("FTS TESTCODE VERSION:%s\n", IC_TEST_VERSION);
+
+ ret = read_reg(REG_FW_VERSION, &val);
+ FTS_TEST_SAVE_INFO("FW version:0x%02x\n", val);
+
+ ret = read_reg(REG_VA_TOUCH_THR, &val);
+ test_data.va_touch_thr = val;
+ ret = read_reg(REG_VKEY_TOUCH_THR, &val);
+ test_data.key_touch_thr = val;
+
+ /* enter into factory mode and read tx/rx num */
+ ret = get_channel_num();
+ FTS_TEST_SAVE_INFO("tx_num:%d, rx_num:%d\n", test_data.screen_param.tx_num, test_data.screen_param.rx_num);
+
+ return ret;
+}
+
+static int fts_test_main_init(void)
+{
+ int ret = 0;
+ int len = 0;
+
+ FTS_TEST_FUNC_ENTER();
+ /* allocate memory for test data:csv&txt */
+ ret = allocate_init_testdata_memory();
+ if (ret < 0) {
+ FTS_TEST_ERROR("allocate memory for test data fail");
+ return ret;
+ }
+
+ /* get basic information: tx/rx num */
+ ret = fts_test_init_basicinfo();
+ if (ret < 0) {
+ FTS_TEST_ERROR("test init basicinfo fail");
+ return ret;
+ }
+
+ /* Allocate memory for detail threshold structure */
+ ret = malloc_struct_DetailThreshold();
+ if (ret < 0) {
+ FTS_TEST_ERROR("Failed to malloc memory for detaithreshold");
+ return ret;
+ }
+
+ /*Allocate test data buffer */
+ len = (test_data.screen_param.tx_num + 1) * test_data.screen_param.rx_num;
+ test_data.buffer = (int *)fts_malloc(len * sizeof(int));
+ if (NULL == test_data.buffer) {
+ FTS_TEST_ERROR("test_data.buffer malloc fail");
+ return -ENOMEM;
+ }
+ memset(test_data.buffer, 0, len * sizeof(int));
+
+ FTS_TEST_FUNC_EXIT();
+ return ret;
+}
+
+/*
+ * fts_test_get_testparams - get test parameter from ini
+ */
+
+static int fts_test_main_exit(void)
+{
+ FTS_TEST_FUNC_ENTER();
+ /* free memory */
+ free_struct_DetailThreshold();
+ free_testdata_memory();
+
+ /*free test data buffer */
+ if (test_data.buffer)
+ fts_free(test_data.buffer);
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+
+/************************************************************************
+* Name: fts_test_show
+* Brief: no
+* Input: device, device attribute, char buf
+* Output: no
+* Return: EPERM
+***********************************************************************/
+static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ return -EPERM;
+}
+
+/************************************************************************
+* Name: fts_test_store
+* Brief: upgrade from app.bin
+* Input: device, device attribute, char buf, char count
+* Output: no
+* Return: char count
+***********************************************************************/
+static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ char fwname[128] = { 0 };
+ struct fts_ts_data *ts_data = fts_data;
+ struct input_dev *input_dev;
+
+ FTS_TEST_FUNC_ENTER();
+
+ input_dev = ts_data->input_dev;
+ memset(fwname, 0, sizeof(fwname));
+ snprintf(fwname, 128, "%s", buf);
+ fwname[count - 1] = '\0';
+ FTS_TEST_DBG("fwname:%s.", fwname);
+
+ mutex_lock(&input_dev->mutex);
+ disable_irq(ts_data->irq);
+
+#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN)
+ fts_esdcheck_switch(DISABLE);
+#endif
+
+
+#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN)
+ fts_esdcheck_switch(ENABLE);
+#endif
+
+ enable_irq(ts_data->irq);
+ mutex_unlock(&input_dev->mutex);
+
+ FTS_TEST_FUNC_EXIT();
+ return count;
+}
+
+/* test from test.ini
+* example:echo "***.ini" > fts_test
+*/
+static DEVICE_ATTR(fts_test, S_IRUGO | S_IWUSR, fts_test_show, fts_test_store);
+
+/* add your attr in here*/
+static struct attribute *fts_test_attributes[] = {
+ &dev_attr_fts_test.attr,
+ NULL
+};
+
+static struct attribute_group fts_test_attribute_group = {
+ .attrs = fts_test_attributes
+};
+
+static int fts_i2c_test(void)
+{
+ int ret = 0;
+ u8 chip_id[2] = { 0 };
+ int cnt = 0;
+
+ do {
+ ret = fts_i2c_read_reg(fts_data->client, FTS_REG_CHIP_ID, &chip_id[0]);
+ ret = fts_i2c_read_reg(fts_data->client, FTS_REG_CHIP_ID2, &chip_id[1]);
+ if ((ret < 0) || (0x0 == chip_id[0]) || (0x0 == chip_id[1])) {
+ cnt++;
+ ret = SELFTEST_FAIL;
+ msleep(100);
+ } else {
+ ret = SELFTEST_PASS;
+ break;
+ }
+ } while (cnt < 10);
+
+ return SELFTEST_PASS;
+}
+
+static int fts_tp_selftest_open(struct inode *inode, struct file *file)
+{
+ return 0;
+}
+
+static ssize_t fts_tp_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ char tmp[5];
+ int cnt;
+
+ if (*pos != 0)
+ return 0;
+
+ cnt = snprintf(tmp, sizeof(fts_test_result), "%d\n", fts_test_result);
+ if (copy_to_user(buf, tmp, strlen(tmp)))
+ return -EFAULT;
+ *pos += cnt;
+ return cnt;
+}
+
+static int get_ic_types_by_chipid(short chipid)
+{
+ int i = 0;
+ int type_size = 0;
+
+ type_size = sizeof(ic_types) / sizeof(ic_types[0]);
+ for (i = 0; i < type_size; i++) {
+ if (chipid == ic_types[i].chipid)
+ return ic_types[i].ic_type;
+ }
+
+ return 0;
+}
+
+ssize_t fts_tp_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
+{
+ char tmp[6];
+ int retval;
+ int id;
+
+ fts_test_result = SELFTEST_INVALID;
+
+ if (!fts_data->client || count > sizeof(tmp)) {
+ retval = -SELFTEST_INVALID;
+ fts_test_result = SELFTEST_INVALID;
+ goto out;
+ }
+
+ if (copy_from_user(tmp, buf, count)) {
+ retval = -EFAULT;
+ fts_test_result = SELFTEST_INVALID;
+ goto out;
+ }
+
+ /* test initialize */
+ retval = fts_test_main_init();
+ if (retval < 0) {
+ FTS_TEST_ERROR("fts_test_main_init() error.");
+ goto test_err;
+ }
+
+ id = get_ic_types_by_chipid(fts_data->chipid);
+ if (id == 0) {
+ retval = -EFAULT;
+ fts_test_result = SELFTEST_INVALID;
+ goto out;
+ }
+
+ retval = init_test_funcs(id);
+ if (retval < 0) {
+ retval = -EFAULT;
+ fts_test_result = SELFTEST_INVALID;
+ goto out;
+ }
+
+ if (!test_data.func) {
+ FTS_TEST_ERROR("[focal] %s - ERROR: can't find test data func", __func__);
+ retval = -SELFTEST_INVALID;
+ fts_test_result = SELFTEST_INVALID;
+ goto out;
+ }
+
+ disable_irq(fts_data->irq);
+ if (!strncmp(tmp, "short", 5)) {
+ if (test_data.func->open_test)
+ fts_test_result = test_data.func->short_test();
+ } else if (!strncmp(tmp, "open", 4)) {
+ if (test_data.func->short_test)
+ fts_test_result = test_data.func->open_test();
+ } else if (!strncmp(tmp, "i2c", 3))
+ fts_test_result = fts_i2c_test();
+ retval = fts_test_result;
+
+ enter_work_mode();
+ enable_irq(fts_data->irq);
+out:
+ if (retval >= 0)
+ retval = count;
+ fts_test_main_exit();
+test_err:
+ return retval;
+}
+
+int fts_tp_selftest_release(struct inode *inode, struct file *file)
+{
+ return 0;
+}
+
+static const struct file_operations tp_selftest_ops = {
+ .open = fts_tp_selftest_open,
+ .read = fts_tp_selftest_read,
+ .write = fts_tp_selftest_write,
+ .release = fts_tp_selftest_release,
+};
+
+static int32_t c_show(struct seq_file *m, void *v)
+{
+ int ret = 0;
+ int i = 0, j = 0, len = 0;
+ int *rawdata = NULL;
+ u8 old_mode = 0;
+ u8 tx_num = 0;
+ u8 rx_num = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ rawdata = (int *)vmalloc(PAGE_SIZE * 4);
+ if (!rawdata) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ /* 0xEE = 1, disable cb */
+ ret = write_reg(FACTORY_REG_AUTO_CAL_FLAG, 0x01);
+ if (ret) {
+ FTS_TEST_ERROR("write data auto cal fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ ret = enter_factory_mode();
+ if (ret < 0) {
+ FTS_TEST_ERROR("enter factory mode fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ ret = read_reg(FACTORY_REG_CHX_NUM, &tx_num);
+ ret = read_reg(FACTORY_REG_CHY_NUM, &rx_num);
+
+ /* switch to differ mode */
+ ret = read_reg(FACTORY_REG_DATA_SELECT, &old_mode);
+
+/*********************GET RAWDATA*********************/
+ ret = write_reg(FACTORY_REG_DATA_SELECT, 0x00);
+ if (ret) {
+ FTS_TEST_ERROR("write data select fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ /* start to scan a frame */
+ ret = start_scan_incell();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Scan ...\n");
+ return ret;
+ }
+
+ ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD);
+ if (ret) {
+ FTS_TEST_ERROR("write REG LINE fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, tx_num * rx_num * 2, rawdata);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ seq_printf(m, "\nRAW DATA\n");
+ len = 0;
+ for (i = 0; (i < tx_num) && (i < TX_NUM_MAX); i++) {
+ for (j = 0; (j < rx_num) && (j < RX_NUM_MAX); j++) {
+ if (j == (rx_num - 1)) {
+ seq_printf(m, "%5d, \n", rawdata[rx_num * i + j]);
+ } else {
+ seq_printf(m, "%5d, ", rawdata[rx_num * i + j]);
+ }
+ }
+ }
+ seq_printf(m, "\nDIFF DATA\n");
+
+/*********************GET DIFFDATA*********************/
+ ret = write_reg(FACTORY_REG_DATA_SELECT, 0x01);
+ if (ret) {
+ FTS_TEST_ERROR("write data select fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ /* start to scan a frame */
+ ret = start_scan_incell();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Scan ...\n");
+ return ret;
+ }
+
+ ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD);
+ if (ret) {
+ FTS_TEST_ERROR("write REG LINE fail");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, tx_num * rx_num * 2, rawdata);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Get RawData of channel.\n");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ for (i = 0; (i < tx_num) && (i < TX_NUM_MAX); i++) {
+ for (j = 0; (j < rx_num) && (j < RX_NUM_MAX); j++) {
+ if (j == (rx_num - 1)) {
+ seq_printf(m, "%5d, \n", (short)rawdata[rx_num * i + j]);
+ } else {
+ seq_printf(m, "%5d, ", (short)rawdata[rx_num * i + j]);
+ }
+ }
+ }
+ seq_printf(m, "\n\n");
+
+out:
+ if (old_mode)
+ write_reg(FACTORY_REG_DATA_SELECT, old_mode);
+ ret = enter_work_mode();
+ enable_irq(fts_data->irq);
+
+ if (rawdata) {
+ vfree(rawdata);
+ rawdata = NULL;
+ }
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+ return *pos < 1 ? (void *)1 : NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+ ++*pos;
+ return NULL;
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
+ return;
+}
+
+const struct seq_operations fts_datadump_seq_ops = {
+ .start = c_start,
+ .next = c_next,
+ .stop = c_stop,
+ .show = c_show
+};
+
+static int32_t fts_tp_data_open(struct inode *inode, struct file *file)
+{
+ return seq_open(file, &fts_datadump_seq_ops);
+}
+
+static const struct file_operations fts_datadump_fops = {
+ .owner = THIS_MODULE,
+ .open = fts_tp_data_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+int fts_test_init(struct i2c_client *client)
+{
+ int ret = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ ret = sysfs_create_group(&client->dev.kobj, &fts_test_attribute_group);
+ if (0 != ret) {
+ FTS_TEST_ERROR("[focal] %s() - ERROR: sysfs_create_group() failed.", __func__);
+ sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group);
+ } else {
+ FTS_TEST_DBG("[focal] %s() - sysfs_create_group() succeeded.", __func__);
+ }
+ fts_data->tp_selftest_proc = proc_create("tp_selftest", 0644, NULL, &tp_selftest_ops);
+ if (!fts_data->tp_selftest_proc)
+ FTS_TEST_ERROR("[focal] %s() - ERROR: tp_selftest proc create failed.", __func__);
+
+ fts_data->tp_data_dump_proc = proc_create("tp_data_dump", 0444, NULL, &fts_datadump_fops);
+ FTS_TEST_ERROR("create file node of tp_data_dump");
+ if (!fts_data->tp_data_dump_proc)
+ FTS_TEST_ERROR("[focal] %s() - ERROR: tp_data_dump proc create failed.", __func__);
+
+ FTS_TEST_FUNC_EXIT();
+
+ return ret;
+}
+
+int fts_test_exit(struct i2c_client *client)
+{
+ FTS_TEST_FUNC_ENTER();
+
+ sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group);
+ if (fts_data->tp_selftest_proc)
+ remove_proc_entry("tp_selftest", NULL);
+ if (fts_data->tp_data_dump_proc)
+ remove_proc_entry("tp_data_dump", NULL);
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h
new file mode 100644
index 000000000000..4374dee27574
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test.h
@@ -0,0 +1,425 @@
+/************************************************************************
+* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved.
+* Copyright (C) 2020 XiaoMi, Inc.
+*
+* File Name: focaltech_test.h
+*
+* Author: Software Development Team, AE
+*
+* Created: 2016-08-01
+*
+* Abstract: test entry for all IC
+*
+************************************************************************/
+#ifndef _TEST_LIB_H
+#define _TEST_LIB_H
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/debugfs.h>
+#include <asm/uaccess.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/string.h>
+#include <asm/unistd.h>
+#include <linux/vmalloc.h>
+
+#include "../focaltech_core.h"
+#include "focaltech_test_detail_threshold.h"
+#include "focaltech_test_ini.h"
+
+/*****************************************************************************
+* Macro definitions using #define
+*****************************************************************************/
+#define IC_TEST_VERSION "V2.0.0 20170811"
+#define FTS_INI_FILE_PATH "/mnt/sdcard/"
+#define FTS_TESTDATA_FILE_NAME "testdata.csv"
+#define FTS_TESTRESULT_FILE_NAME "testresult.txt"
+#define false 0
+#define true 1
+#define MAX_IC_NAME_LEN 20
+#define TEST_ICSERIES_LEN 8
+#define TEST_ICSERIES(x) ((x) >> TEST_ICSERIES_LEN)
+
+/*
+#define FTS_CHIP_TEST_TYPE IC_FT8006M
+#define FLAG_TEST_IDC_BIT 15
+#define FLAG_BIT(x) (0x01 << (x))
+#define FTS_CHIP_IDC ((FTS_CHIP_TEST_TYPE & FLAG_BIT(FLAG_TEST_IDC_BIT)) == FLAG_BIT(FLAG_TEST_IDC_BIT))
+*/
+
+#define TEST_OPEN_MAX_VALUE 255
+#define MAX_TEST_ITEM 20
+#define BYTES_PER_TIME 128
+#define FTS_TEST_STORE_DATA_SIZE (80*1024)
+/*buff length*/
+#define BUFF_LEN_STORE_MSG_AREA (1024*10)
+#define BUFF_LEN_MSG_AREA_LINE2 (1024*4)
+#define BUFF_LEN_STORE_DATA_AREA (1024*80)
+#define BUFF_LEN_TMP_BUFFER (1024*16)
+#define BUFF_LEN_TESTRESULT_BUFFER (1024*80*5)
+
+/*-----------------------------------------------------------
+Error Code for Comm
+-----------------------------------------------------------*/
+#define ERROR_CODE_OK 0x00
+#define ERROR_CODE_INVALID_COMMAND 0x02
+#define ERROR_CODE_INVALID_PARAM 0x03
+#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07
+#define ERROR_CODE_COMM_ERROR 0x0c
+#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d
+
+/*-----------------------------------------------------------
+Test Status
+-----------------------------------------------------------*/
+#define RESULT_NULL 0
+#define RESULT_PASS 1
+#define RESULT_NG 2
+
+#define SELFTEST_INVALID 0
+#define SELFTEST_PASS 2
+#define SELFTEST_FAIL 1
+
+/*
+ * factory test registers
+ */
+#define ENTER_WORK_FACTORY_RETRIES 5
+#define KEY_NUM_MAX 6
+
+#define START_SCAN_RETRIES_INCELL 20
+#define START_SCAN_RETRIES_DELAY_INCELL 16
+#define FACTORY_TEST_RETRY 50
+#define FACTORY_TEST_DELAY 18
+#define FACTORY_TEST_RETRY_DELAY 100
+
+#define DEVIDE_MODE_ADDR 0x00
+#define REG_FW_VERSION 0xA6
+#define REG_VA_TOUCH_THR 0x80
+#define REG_VKEY_TOUCH_THR 0x82
+
+#define FACTORY_REG_LINE_ADDR 0x01
+#define FACTORY_REG_CHX_NUM 0x02
+#define FACTORY_REG_CHY_NUM 0x03
+#define FACTORY_REG_CLB 0x04
+
+#define FACTORY_REG_DATA_SELECT 0x06
+#define FACTORY_REG_RAWBUF_SELECT 0x09
+#define FACTORY_REG_KEY_CBWIDTH 0x0B
+#define FACTORY_REG_PARAM_UPDATE_STATE 0x0E
+#define FACTORY_REG_SHORT_TEST_EN 0x0F
+#define FACTORY_REG_SHORT_TEST_STATE 0x10
+#define FACTORY_REG_LCD_NOISE_START 0x11
+#define FACTORY_REG_LCD_NOISE_FRAME 0x12
+#define FACTORY_REG_LCD_NOISE_NUMBER 0x13
+#define FACTORY_REG_CB_ADDR_H 0x18
+#define FACTORY_REG_CB_ADDR_L 0x19
+
+#define FACTORY_REG_LEFT_KEY 0x1E
+#define FACTORY_REG_RIGHT_KEY 0x1F
+#define FACTORY_REG_GIP_DRIVER_MODE 0x20
+#define FACTORY_REG_SOURCE_DRIVER_MODE 0x21
+#define FACTORY_REG_K1 0x31
+#define FACTORY_REG_K2 0x32
+#define FACTORY_REG_RAWDATA_ADDR 0x6A
+#define FACTORY_REG_CB_ADDR 0x6E
+#define FACTORY_REG_SHORT_ADDR 0x89
+#define FACTORY_REG_RAWDATA_TEST_EN 0x9E
+#define FACTORY_REG_CB_TEST_EN 0x9F
+#define FACTORY_REG_OPEN_TEST_EN 0xA0
+#define FACTORY_REG_AUTO_CAL_FLAG 0xEE
+
+#define TEST_RETVAL_00 0x00
+#define TEST_RETVAL_AA 0xAA
+
+/*****************************************************************************
+* enumerations, structures and unions
+*****************************************************************************/
+struct test_funcs {
+ u32 ic_series;
+ void (*init_testitem) (char *);
+ void (*init_basicthreshold) (char *);
+ void (*init_detailthreshold) (char *);
+ void (*set_testitem_sequence) (void);
+ bool(*start_test) (void);
+ int (*open_test) (void);
+ int (*short_test) (void);
+};
+
+struct test_ic_type {
+ char ic_name[MAX_IC_NAME_LEN];
+ u8 len;
+ u32 ic_type;
+ short chipid;
+};
+
+/*
+ * selected_ic - ic type need test
+ * normalize - auto normalize or overall normalize
+ * tx_num - tx number
+ * rx_num - rx number
+ * channels_num - for ft6x36
+ * key_num - actually key number used
+ * key_num_total - equal max key number
+ * used_max_tx_num - tx_num <= used_max_tx_num
+ * used_max_rx_num - rx_num <= used_max_rx_num
+ * left_key1/2/3 - left key flag
+ * right_key1/2/3 - right key flag
+ */
+struct screen_setting {
+ int selected_ic;
+ int normalize;
+ int tx_num;
+ int rx_num;
+ u8 channels_num;
+ u8 key_num;
+ u8 key_num_total;
+ u8 key_flag;
+ int used_max_tx_num;
+ int used_max_rx_num;
+
+ bool left_key1;
+ bool left_key2;
+ bool left_key3;
+ bool left_key4;
+ bool right_key1;
+ bool right_key2;
+ bool right_key3;
+};
+
+/*
+ * itemtype -
+ * testnum - Test number
+ * testresult - Test result, NG\PASS\TESTING
+ * itemcode - Test item code
+ */
+struct test_item {
+ u8 itemtype;
+ u8 testnum;
+ u8 testresult;
+ u8 itemcode;
+};
+
+/*
+ * test_num - test item numbers
+ * testresult - test result write to testresult.txt
+ * testresult_len - length of testresult
+ * va_touch_thr - touch threshold in va
+ * key_touch_thr - touch threshold in key
+ * buffer - save detail data temporary
+ * ini_ic_name - ic name of ini file
+ * ini_keyword_num - keyword line number of ini file
+ * ini_data - save ini data as struct _ini_data
+ * func - test main function
+ * test_item - save whole test item
+ * screen_param - test basic parameter: tx/rx/key num...
+ */
+struct fts_test_data {
+ int test_num;
+ char *store_all_data;
+ char *tmp_buffer;
+ char *store_msg_area;
+ int len_store_msg_area;
+ char *msg_area_line2;
+ int len_msg_area_line2;
+ char *store_data_area;
+ int len_store_data_area;
+ u8 test_item_code;
+ int start_line;
+ int test_data_count;
+ char *testresult;
+ int testresult_len;
+ u8 va_touch_thr;
+ u8 key_touch_thr;
+ int *buffer;
+ char ini_ic_name[20];
+ int ini_keyword_num;
+ struct _ini_data *ini_data;
+ struct test_funcs *func;
+ struct test_item test_item[MAX_TEST_ITEM];
+ struct screen_setting screen_param;
+ struct detailthreshold_mcap mcap_detail_thr;
+ struct detailthreshold_scap scap_detail_thr;
+ struct detailthreshold_incell incell_detail_thr;
+};
+
+/*-----------------------------------------------------------
+ * IC corresponding code, each of the IC code is 16 bit, high 8
+ * bit on behalf of the same series, low 8 bit on behalf of the specific IC
+ *-----------------------------------------------------------*/
+enum ic_type {
+ IC_FT5X36 = 0x0000,
+ IC_FT5X36i = 0x0001,
+ IC_FT3X16 = 0x0002,
+ IC_FT3X26 = 0x0003,
+
+ IC_FT5X46 = 0x0100,
+ IC_FT5X46I = 0x0101,
+ IC_FT5526 = 0x0102,
+ IC_FT3X17 = 0x0103,
+ IC_FT5436 = 0x0104,
+ IC_FT3X27 = 0x0105,
+ IC_FT5526I = 0x0106,
+ IC_FT5416 = 0x0107,
+ IC_FT5426 = 0x0108,
+ IC_FT5435 = 0x0109,
+ IC_FT7681 = 0x010A,
+ IC_FT7661 = 0x010B,
+ IC_FT7511 = 0x010C,
+ IC_FT7421 = 0x010D,
+ IC_FT7311 = 0x010E,
+
+ IC_FT6X06 = 0x0200,
+ IC_FT3X06 = 0x0201,
+
+ IC_FT6X36 = 0x0300,
+ IC_FT3X07 = 0x0301,
+ IC_FT6416 = 0x0302,
+ IC_FT6426 = 0x0303,
+ IC_FT7401 = 0x0304,
+ IC_FT3407U = 0x0305,
+ IC_FT6236U = 0x0306,
+ IC_FT6436U = 0x0307,
+ IC_FT3267 = 0x0308,
+ IC_FT3367 = 0x0309,
+
+ IC_FT5X16 = 0x0400,
+ IC_FT5X12 = 0x0401,
+
+ IC_FT5506 = 0x0500,
+ IC_FT5606 = 0x0501,
+ IC_FT5816 = 0x0502,
+
+ IC_FT5822 = 0x0600,
+ IC_FT5626 = 0x0601,
+ IC_FT5726 = 0x0602,
+ IC_FT5826B = 0x0603,
+ IC_FT3617 = 0x0604,
+ IC_FT3717 = 0x0605,
+ IC_FT7811 = 0x0606,
+ IC_FT5826S = 0x0607,
+ IC_FT3517U = 0x0608,
+
+ IC_FT5306 = 0x0700,
+ IC_FT5406 = 0x0701,
+
+ IC_FT3C47U = 0x0800,
+
+ IC_FT3D47 = 0x0900,
+
+ IC_FT5442 = 0x0A00,
+
+ IC_FT3428U = 0x0B00,
+
+ IC_FT8606 = 0x8000,
+
+ IC_FT8716 = 0x8100,
+ IC_FT8716U = 0x8101,
+ IC_FT8613 = 0x8102,
+ IC_FT8716F = 0x8103,
+
+ IC_FT8607 = 0x8200,
+ IC_FT8607U = 0x8201,
+
+ IC_FT8707 = 0x8300,
+
+ IC_FT8736 = 0x8400,
+
+ IC_FTE716 = 0x8500,
+
+ IC_FT8006M = 0x8600,
+
+ IC_FTE736 = 0x8700,
+
+ IC_FT8006U = 0x8800,
+
+ IC_FT8201 = 0x8900,
+
+ IC_FT8719 = 0x8A00,
+};
+
+enum normalize_type {
+ OVERALL_NORMALIZE = 0,
+ AUTO_NORMALIZE = 1,
+};
+
+enum NodeType {
+ NODE_INVALID_TYPE = 0,
+ NODE_VALID_TYPE = 1,
+ NODE_KEY_TYPE = 2,
+ NODE_AST_TYPE = 3,
+};
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+extern struct test_funcs test_func_ft8719;
+extern struct test_funcs *test_funcs_list[];
+extern struct test_ic_type ic_types[];
+extern struct fts_test_data test_data;
+
+int init_test_funcs(u32 ic_type);
+u32 fts_ic_table_get_ic_code_from_ic_name(char *strIcName);
+void sys_delay(int ms);
+int focal_abs(int value);
+unsigned char fts_i2c_read_write(unsigned char *writebuf, int writelen,
+ unsigned char *readbuf, int readlen);
+int fts_test_i2c_read(u8 *writebuf, int writelen, u8 *readbuf, int readlen);
+int fts_test_i2c_write(u8 *writebuf, int writelen);
+int read_reg(u8 addr, u8 *val);
+int write_reg(u8 addr, u8 val);
+int enter_work_mode(void);
+int enter_factory_mode(void);
+int read_mass_data(u8 addr, int byte_num, int *buf);
+int chip_clb_incell(void);
+int start_scan_incell(void);
+int wait_state_update(void);
+int get_rawdata_incell(int *data);
+int get_cb_incell(u16 saddr, int byte_num, int *cb_buf);
+int weakshort_get_adc_data_incell(u8 retval, u8 ch_num, int byte_num,
+ int *adc_buf);
+void show_data_incell(int *data, bool include_key);
+bool compare_data_incell(int *data, int min, int max, int vk_min, int vk_max,
+ bool include_key);
+bool compare_detailthreshold_data_incell(int *data, int *data_min,
+ int *data_max, bool include_key);
+void save_testdata_incell(int *data, char *test_num, int index, u8 row, u8 col,
+ u8 item_count);
+void fts_set_testitem(unsigned char ucitemcode);
+void *fts_malloc(size_t size);
+void fts_free_proc(void *p);
+
+#define fts_free(p) do {\
+ if (p) {\
+ fts_free_proc(p);\
+ p = NULL;\
+ } } while (0)
+
+#define FOCAL_TEST_DEBUG_EN 1
+#if (FOCAL_TEST_DEBUG_EN)
+#define FTS_TEST_DBG(fmt, args...) do {printk("[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0)
+#define FTS_TEST_FUNC_ENTER() printk("[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__)
+#define FTS_TEST_FUNC_EXIT() printk("[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__)
+#else
+#define FTS_TEST_DBG(fmt, args...) do {} while (0)
+#define FTS_TEST_FUNC_ENTER()
+#define FTS_TEST_FUNC_EXIT()
+#endif
+
+#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0)
+#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0)
+
+#define FTS_TEST_SAVE_INFO(fmt, args...) do { \
+ if (test_data.testresult) { \
+ test_data.testresult_len += snprintf( \
+ test_data.testresult + test_data.testresult_len, \
+ BUFF_LEN_TESTRESULT_BUFFER, \
+ fmt, ##args);\
+ }; \
+} while (0)
+
+#endif
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c
new file mode 100644
index 000000000000..d6bcc94243c1
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.c
@@ -0,0 +1,1903 @@
+/************************************************************************
+* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved.
+*
+* File Name: focaltech_test_detail_threshold.c
+*
+* Author: Software Development Team, AE
+*
+* Created: 2016-08-01
+*
+* Abstract: Set Detail Threshold for all IC
+*
+************************************************************************/
+
+#include "focaltech_test.h"
+
+int malloc_struct_DetailThreshold(void)
+{
+ FTS_TEST_FUNC_ENTER();
+
+ /*malloc mcap detailthreshold */
+ test_data.mcap_detail_thr.invalid_node =
+ (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX *
+ sizeof(unsigned char));
+ if (NULL == test_data.mcap_detail_thr.invalid_node)
+ goto ERR;
+ test_data.mcap_detail_thr.invalid_node_sc =
+ (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX *
+ sizeof(unsigned char));
+ if (NULL == test_data.mcap_detail_thr.invalid_node_sc)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_min)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_max)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_low_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_low_min)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_low_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_low_max)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_high_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_high_min)
+ goto ERR;
+ test_data.mcap_detail_thr.rawdata_test_high_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rawdata_test_high_max)
+ goto ERR;
+ test_data.mcap_detail_thr.rx_linearity_test_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.rx_linearity_test_max)
+ goto ERR;
+ test_data.mcap_detail_thr.tx_linearity_test_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.tx_linearity_test_max)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_rawdata_on_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.scap_rawdata_on_max)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_rawdata_on_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.scap_rawdata_on_min)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_rawdata_off_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.scap_rawdata_off_max)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_rawdata_off_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.scap_rawdata_off_min)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_cb_test_on_max =
+ (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short));
+ if (NULL == test_data.mcap_detail_thr.scap_cb_test_on_max)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_cb_test_on_min =
+ (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short));
+ if (NULL == test_data.mcap_detail_thr.scap_cb_test_on_min)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_cb_test_off_max =
+ (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short));
+ if (NULL == test_data.mcap_detail_thr.scap_cb_test_off_max)
+ goto ERR;
+ test_data.mcap_detail_thr.scap_cb_test_off_min =
+ (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(short));
+ if (NULL == test_data.mcap_detail_thr.scap_cb_test_off_min)
+ goto ERR;
+ test_data.mcap_detail_thr.noise_test_coefficient =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.noise_test_coefficient)
+ goto ERR;
+ test_data.mcap_detail_thr.panel_differ_test_max =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.panel_differ_test_max)
+ goto ERR;
+ test_data.mcap_detail_thr.panel_differ_test_min =
+ (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.mcap_detail_thr.panel_differ_test_min)
+ goto ERR;
+
+ /*malloc incell detailthreshold */
+ test_data.incell_detail_thr.invalid_node =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.invalid_node)
+ goto ERR;
+ test_data.incell_detail_thr.rawdata_test_min =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.rawdata_test_min)
+ goto ERR;
+ test_data.incell_detail_thr.rawdata_test_max =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.rawdata_test_max)
+ goto ERR;
+ test_data.incell_detail_thr.rawdata_test_b_frame_min =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.rawdata_test_min)
+ goto ERR;
+ test_data.incell_detail_thr.rawdata_test_b_frame_max =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.rawdata_test_max)
+ goto ERR;
+ test_data.incell_detail_thr.cb_test_min =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.cb_test_min)
+ goto ERR;
+ test_data.incell_detail_thr.cb_test_max =
+ fts_malloc(NUM_MAX * sizeof(int));
+ if (NULL == test_data.incell_detail_thr.cb_test_max)
+ goto ERR;
+
+ FTS_TEST_FUNC_EXIT();
+
+ return 0;
+
+ERR:
+ FTS_TEST_ERROR("fts_malloc memory failed in function.");
+ return -ENOMEM;
+}
+
+void free_struct_DetailThreshold(void)
+{
+
+ /*free mcap detailthreshold */
+ if (NULL != test_data.mcap_detail_thr.invalid_node) {
+ fts_free(test_data.mcap_detail_thr.invalid_node);
+ test_data.mcap_detail_thr.invalid_node = NULL;
+ }
+ if (NULL != test_data.mcap_detail_thr.invalid_node_sc) {
+ fts_free(test_data.mcap_detail_thr.invalid_node_sc);
+ test_data.mcap_detail_thr.invalid_node_sc = NULL;
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_min) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_max) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_low_min) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_low_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_low_max) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_low_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_high_min) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_high_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.rawdata_test_high_max) {
+ fts_free(test_data.mcap_detail_thr.rawdata_test_high_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.rx_linearity_test_max) {
+ fts_free(test_data.mcap_detail_thr.rx_linearity_test_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.tx_linearity_test_max) {
+ fts_free(test_data.mcap_detail_thr.tx_linearity_test_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_rawdata_on_max) {
+ fts_free(test_data.mcap_detail_thr.scap_rawdata_on_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_rawdata_on_min) {
+ fts_free(test_data.mcap_detail_thr.scap_rawdata_on_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_rawdata_off_max) {
+ fts_free(test_data.mcap_detail_thr.scap_rawdata_off_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_rawdata_off_min) {
+ fts_free(test_data.mcap_detail_thr.scap_rawdata_off_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_cb_test_on_max) {
+ fts_free(test_data.mcap_detail_thr.scap_cb_test_on_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_cb_test_on_min) {
+ fts_free(test_data.mcap_detail_thr.scap_cb_test_on_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_cb_test_off_max) {
+ fts_free(test_data.mcap_detail_thr.scap_cb_test_off_max);
+ }
+ if (NULL != test_data.mcap_detail_thr.scap_cb_test_off_min) {
+ fts_free(test_data.mcap_detail_thr.scap_cb_test_off_min);
+ }
+ if (NULL != test_data.mcap_detail_thr.noise_test_coefficient) {
+ fts_free(test_data.mcap_detail_thr.noise_test_coefficient);
+ test_data.mcap_detail_thr.noise_test_coefficient = NULL;
+ }
+ if (NULL != test_data.mcap_detail_thr.panel_differ_test_max) {
+ fts_free(test_data.mcap_detail_thr.panel_differ_test_max);
+ test_data.mcap_detail_thr.panel_differ_test_max = NULL;
+ }
+ if (NULL != test_data.mcap_detail_thr.panel_differ_test_min) {
+ fts_free(test_data.mcap_detail_thr.panel_differ_test_min);
+ test_data.mcap_detail_thr.panel_differ_test_min = NULL;
+ }
+
+ /*free incell detailthreshold */
+ if (NULL != test_data.incell_detail_thr.invalid_node) {
+ fts_free(test_data.incell_detail_thr.invalid_node);
+ test_data.incell_detail_thr.invalid_node = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.rawdata_test_min) {
+ fts_free(test_data.incell_detail_thr.rawdata_test_min);
+ test_data.incell_detail_thr.rawdata_test_min = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.rawdata_test_max) {
+ fts_free(test_data.incell_detail_thr.rawdata_test_max);
+ test_data.incell_detail_thr.rawdata_test_max = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.rawdata_test_b_frame_min) {
+ fts_free(test_data.incell_detail_thr.rawdata_test_b_frame_min);
+ test_data.incell_detail_thr.rawdata_test_b_frame_min = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.rawdata_test_b_frame_max) {
+ fts_free(test_data.incell_detail_thr.rawdata_test_b_frame_max);
+ test_data.incell_detail_thr.rawdata_test_b_frame_max = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.cb_test_min) {
+ fts_free(test_data.incell_detail_thr.cb_test_min);
+ test_data.incell_detail_thr.cb_test_min = NULL;
+ }
+ if (NULL != test_data.incell_detail_thr.cb_test_max) {
+ fts_free(test_data.incell_detail_thr.cb_test_max);
+ test_data.incell_detail_thr.cb_test_max = NULL;
+ }
+}
+
+void OnInit_InvalidNode(char *strIniFile)
+{
+
+ char str[MAX_PATH] = { 0 }, strTemp[MAX_PATH] = {
+ 0};
+ int i = 0, j = 0;
+ FTS_TEST_FUNC_ENTER();
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ snprintf(strTemp, MAX_PATH, "InvalidNode[%d][%d]", (i + 1),
+ (j + 1));
+
+ GetPrivateProfileString("INVALID_NODE", strTemp, "1",
+ str, strIniFile);
+ if (fts_atoi(str) == 0) {
+ test_data.mcap_detail_thr.invalid_node[i][j] =
+ 0;
+ test_data.incell_detail_thr.invalid_node[i *
+ test_data.
+ screen_param.
+ rx_num
+ + j] =
+ 0;
+ FTS_TEST_DBG("node (%d, %d)", (i + 1), (j + 1));
+
+ } else if (fts_atoi(str) == 2) {
+ test_data.mcap_detail_thr.invalid_node[i][j] =
+ 2;
+ test_data.incell_detail_thr.invalid_node[i *
+ test_data.
+ screen_param.
+ rx_num
+ + j] =
+ 2;
+ } else {
+ test_data.mcap_detail_thr.invalid_node[i][j] =
+ 1;
+ test_data.incell_detail_thr.invalid_node[i *
+ test_data.
+ screen_param.
+ rx_num
+ + j] =
+ 1;
+ }
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ snprintf(strTemp, MAX_PATH, "InvalidNodeS[%d][%d]", (i + 1),
+ (j + 1));
+ GetPrivateProfileString("INVALID_NODES", strTemp, "1",
+ str, strIniFile);
+ if (fts_atoi(str) == 0) {
+ test_data.mcap_detail_thr.
+ invalid_node_sc[i][j] = 0;
+ } else if (fts_atoi(str) == 2) {
+ test_data.mcap_detail_thr.
+ invalid_node_sc[i][j] = 2;
+ } else
+ test_data.mcap_detail_thr.
+ invalid_node_sc[i][j] = 1;
+ }
+
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_RawDataTest(char *strIniFile)
+{
+ char str[128];
+ char strTemp[MAX_PATH];
+ char strValue[MAX_PATH];
+ int MaxValue, MinValue, B_MaxValue, B_MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ if ((TEST_ICSERIES(test_data.screen_param.selected_ic) ==
+ TEST_ICSERIES(IC_FT8716))
+ || (TEST_ICSERIES(test_data.screen_param.selected_ic) ==
+ TEST_ICSERIES(IC_FT8736))
+ || (TEST_ICSERIES(test_data.screen_param.selected_ic) ==
+ TEST_ICSERIES(IC_FTE716))) {
+ return;
+ }
+
+ /*RawData Test */
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_BFrame_Max",
+ "5000", str, strIniFile);
+ B_MaxValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_max[i][j] =
+ MaxValue;
+ test_data.incell_detail_thr.rawdata_test_max[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MaxValue;
+ test_data.incell_detail_thr.rawdata_test_b_frame_max[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ j]
+ = B_MaxValue;
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "111", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ test_data.incell_detail_thr.rawdata_test_max[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ k]
+ = (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_BFrame_Min",
+ "11000", str, strIniFile);
+ B_MinValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_min[i][j] =
+ MinValue;
+ test_data.incell_detail_thr.rawdata_test_min[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MinValue;
+ test_data.incell_detail_thr.rawdata_test_b_frame_min[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ j]
+ = B_MinValue;
+ }
+ }
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Min_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ test_data.incell_detail_thr.rawdata_test_min[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ k]
+ = (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ /*RawData Test Low */
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max",
+ "15000", str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_low_max[i][j] =
+ MaxValue;
+ }
+ }
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Max_Low_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_low_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min",
+ "3000", str, strIniFile);
+ MinValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_low_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Min_Low_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_low_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ /*RawData Test High */
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max",
+ "15000", str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_high_max[i][j] =
+ MaxValue;
+ }
+ }
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min",
+ "3000", str, strIniFile);
+ MinValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.mcap_detail_thr.rawdata_test_high_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Max_High_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_high_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Min_High_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rawdata_test_high_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_SCapRawDataTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ /*SCapRawDataTest_OFF */
+ GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min",
+ "150", str, strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max",
+ "1000", str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ /*Max */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_rawdata_off_max[i][j] =
+ MaxValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapRawData_OFF_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_rawdata_off_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ /*Min */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_rawdata_off_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapRawData_OFF_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_rawdata_off_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ /*ON*/ GetPrivateProfileString("Basic_Threshold",
+ "SCapRawDataTest_ON_Min", "150", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max",
+ "1000", str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ /*Max */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_rawdata_on_max[i][j] =
+ MaxValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapRawData_ON_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_rawdata_on_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ /*Min */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_rawdata_on_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapRawData_ON_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_rawdata_on_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_SCapCbTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ /*SCapCbTest_ON */
+ GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ /*Max */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_cb_test_on_max[i][j] =
+ MaxValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapCB_ON_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_cb_test_on_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ /*Min */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_cb_test_on_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapCB_ON_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_cb_test_on_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ /*SCapCbTest_OFF */
+ GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+ /*Max */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_cb_test_off_max[i][j] =
+ MaxValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapCB_OFF_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_cb_test_off_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ /*Min */
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.scap_cb_test_off_min[i][j] =
+ MinValue;
+ }
+ }
+ for (i = 0; i < 2; i++) {
+ snprintf(str, 128, "ScapCB_OFF_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ scap_cb_test_off_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_PanelDifferTest(char *strIniFile)
+{
+
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+ char str_tmp[128];
+
+ FTS_TEST_FUNC_ENTER();
+ GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max",
+ "1000", str, strIniFile);
+ MaxValue = fts_atoi(str);
+ for (i = 0; i < TX_NUM_MAX; i++) {
+ for (j = 0; j < RX_NUM_MAX; j++) {
+ test_data.mcap_detail_thr.panel_differ_test_max[i][j] =
+ MaxValue;
+ }
+ }
+
+ for (i = 0; i < TX_NUM_MAX; i++) {
+ snprintf(str, 128, "Panel_Differ_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ panel_differ_test_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+ for (i = 0; i < TX_NUM_MAX; i++) {
+ for (j = 0; j < RX_NUM_MAX; j++) {
+ test_data.mcap_detail_thr.panel_differ_test_min[i][j] =
+ MinValue;
+ }
+ }
+
+ for (i = 0; i < TX_NUM_MAX; i++) {
+ snprintf(str, 128, "Panel_Differ_Min_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ panel_differ_test_min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+
+}
+
+void OnInit_DThreshold_RxLinearityTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue = 0;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.rx_linearity_test_max[i][j] =
+ MaxValue;
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) {
+ snprintf(str, 128, "Rx_Linearity_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "111", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ rx_linearity_test_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_TxLinearityTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue = 0;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+
+ for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.tx_linearity_test_max[i][j] =
+ MaxValue;
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.used_max_tx_num; i++) {
+ snprintf(str, 128, "Tx_Linearity_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "111", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ tx_linearity_test_max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapRawDataTest_OFF_Min", "150",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapRawDataTest_OFF_Max", "1000",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_OFF_Max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_OFF_Min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapRawDataTest_ON_Min", "150", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapRawDataTest_ON_Max", "1000",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_ON_Max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapRawDataTest_ON_Min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapCbTest_ON_Min", "0", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapCbTest_ON_Max", "240", str,
+ strIniFile);
+ MaxValue = fts_atoi(str);
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapCB_ON_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_ON_Max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapCB_ON_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ FTS_TEST_DBG("%s\r", strTemp);
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_ON_Min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapCbTest_OFF_Min", "0", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold",
+ "ForceTouch_SCapCbTest_OFF_Max", "240", str,
+ strIniFile);
+ MaxValue = fts_atoi(str);
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_OFF_Max[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ for (j = 0; j < test_data.screen_param.used_max_rx_num; j++) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue;
+ }
+ }
+ for (i = 0; i < 1; i++) {
+ snprintf(str, 128, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.mcap_detail_thr.
+ ForceTouch_SCapCbTest_OFF_Min[i][k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_CBTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey;
+ int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+ if ((TEST_ICSERIES(test_data.screen_param.selected_ic) ==
+ TEST_ICSERIES(IC_FT8606))) {
+ return;
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str,
+ strIniFile);
+ MaxValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100",
+ str, strIniFile);
+ MaxValue_Vkey = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX",
+ "15", str, strIniFile);
+ ChannelNumTest_ChannelXNum = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY",
+ "24", str, strIniFile);
+ ChannelNumTest_ChannelYNum = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_max[i *
+ test_data.
+ screen_param.
+ rx_num + j] =
+ MaxValue;
+ }
+
+ if (i == ChannelNumTest_ChannelXNum) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_max[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MaxValue_Vkey;
+ }
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "CB_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.cb_test_max[i *
+ test_data.
+ screen_param.
+ rx_num +
+ k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str,
+ strIniFile);
+ MinValue_Vkey = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_min[i *
+ test_data.
+ screen_param.
+ rx_num + j] =
+ MinValue;
+ }
+
+ if (i == ChannelNumTest_ChannelXNum) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_min[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MinValue_Vkey;
+ }
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "CB_Min_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.cb_test_min[i *
+ test_data.
+ screen_param.
+ rx_num +
+ k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnInit_DThreshold_AllButtonCBTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ if ((TEST_ICSERIES(test_data.screen_param.selected_ic) ==
+ TEST_ICSERIES(IC_FT8606))) {
+ return;
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str,
+ strIniFile);
+ MaxValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_max[i *
+ test_data.
+ screen_param.
+ rx_num + j] =
+ MaxValue;
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "CB_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.cb_test_max[i *
+ test_data.
+ screen_param.
+ rx_num +
+ k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str,
+ strIniFile);
+ MinValue = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.cb_test_min[i *
+ test_data.
+ screen_param.
+ rx_num + j] =
+ MinValue;
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "CB_Min_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.cb_test_min[i *
+ test_data.
+ screen_param.
+ rx_num +
+ k] =
+ (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile)
+{
+ char str[128], strTemp[MAX_PATH], strValue[MAX_PATH];
+ int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey;
+ int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum;
+ int dividerPos = 0;
+ char str_tmp[128];
+ int index = 0;
+ int k = 0, i = 0, j = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ if ((TEST_ICSERIES(test_data.screen_param.selected_ic) !=
+ TEST_ICSERIES(IC_FT8716))
+ && (TEST_ICSERIES(test_data.screen_param.selected_ic) !=
+ TEST_ICSERIES(IC_FT8736))
+ && (TEST_ICSERIES(test_data.screen_param.selected_ic) !=
+ TEST_ICSERIES(IC_FTE716))) {
+ return;
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000",
+ str, strIniFile);
+ MaxValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey",
+ "11000", str, strIniFile);
+ MaxValue_Vkey = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX",
+ "15", str, strIniFile);
+ ChannelNumTest_ChannelXNum = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY",
+ "24", str, strIniFile);
+ ChannelNumTest_ChannelYNum = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.rawdata_test_max[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MaxValue;
+ }
+
+ if (i == ChannelNumTest_ChannelXNum) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.rawdata_test_max[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ j]
+ = MaxValue_Vkey;
+ }
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Max_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.rawdata_test_max[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ k]
+ = (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000",
+ str, strIniFile);
+ MinValue = fts_atoi(str);
+
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey",
+ "5000", str, strIniFile);
+ MinValue_Vkey = fts_atoi(str);
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.rawdata_test_min[i *
+ test_data.
+ screen_param.
+ rx_num +
+ j] =
+ MinValue;
+ }
+
+ if (i == ChannelNumTest_ChannelXNum) {
+ for (j = 0; j < test_data.screen_param.rx_num; j++) {
+ test_data.incell_detail_thr.rawdata_test_min[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ j]
+ = MinValue_Vkey;
+ }
+ }
+ }
+
+ for (i = 0; i < test_data.screen_param.tx_num + 1; i++) {
+ snprintf(str, 128, "RawData_Min_Tx%d", (i + 1));
+ dividerPos =
+ GetPrivateProfileString("SpecialSet", str, "NULL", strTemp,
+ strIniFile);
+ snprintf(strValue, MAX_PATH, "%s", strTemp);
+ if (0 == dividerPos)
+ continue;
+ index = 0;
+ k = 0;
+ memset(str_tmp, 0, sizeof(str_tmp));
+ for (j = 0; j < dividerPos; j++) {
+ if (',' == strValue[j]) {
+ test_data.incell_detail_thr.rawdata_test_min[i *
+ test_data.
+ screen_param.
+ rx_num
+ +
+ k]
+ = (short)(fts_atoi(str_tmp));
+ index = 0;
+ memset(str_tmp, 0x00, sizeof(str_tmp));
+ k++;
+ } else {
+ if (' ' == strValue[j])
+ continue;
+ str_tmp[index] = strValue[j];
+ index++;
+ }
+ }
+ }
+ FTS_TEST_FUNC_EXIT();
+}
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h
new file mode 100644
index 000000000000..55dd16d24c69
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_detail_threshold.h
@@ -0,0 +1,108 @@
+/************************************************************************
+* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved.
+*
+* File Name: focaltech_test_detail_threshold.h
+*
+* Author: Software Development Team, AE
+*
+* Created: 2016-08-01
+*
+* Abstract: Set Detail Threshold for all IC
+*
+************************************************************************/
+
+#ifndef _DETAIL_THRESHOLD_H
+#define _DETAIL_THRESHOLD_H
+
+#define TX_NUM_MAX 60
+#define RX_NUM_MAX 60
+#define NUM_MAX ((TX_NUM_MAX)*(RX_NUM_MAX))
+#define MAX_PATH 256
+#define BUFFER_LENGTH 512
+#define MAX_TEST_ITEM 20
+#define MAX_GRAPH_ITEM 20
+#define MAX_CHANNEL_NUM 144
+
+#define FORCETOUCH_ROW 1
+
+struct detailthreshold_incell {
+ int *invalid_node;
+ int *rawdata_test_min;
+ int *rawdata_test_max;
+ int *rawdata_test_b_frame_min;
+ int *rawdata_test_b_frame_max;
+ int *cb_test_min;
+ int *cb_test_max;
+};
+struct detailthreshold_mcap {
+ unsigned char (*invalid_node)[RX_NUM_MAX];
+ unsigned char (*invalid_node_sc)[RX_NUM_MAX];
+ int (*rawdata_test_min)[RX_NUM_MAX];
+ int (*rawdata_test_max)[RX_NUM_MAX];
+ int (*rawdata_test_low_min)[RX_NUM_MAX];
+ int (*rawdata_test_low_max)[RX_NUM_MAX];
+ int (*rawdata_test_high_min)[RX_NUM_MAX];
+ int (*rawdata_test_high_max)[RX_NUM_MAX];
+ int (*rx_linearity_test_max)[RX_NUM_MAX];
+ int (*tx_linearity_test_max)[RX_NUM_MAX];
+ int (*panel_differ_test_max)[RX_NUM_MAX];
+ int (*panel_differ_test_min)[RX_NUM_MAX];
+ int (*scap_rawdata_on_max)[RX_NUM_MAX];
+ int (*scap_rawdata_on_min)[RX_NUM_MAX];
+ int (*scap_rawdata_off_max)[RX_NUM_MAX];
+ int (*scap_rawdata_off_min)[RX_NUM_MAX];
+ short (*scap_cb_test_on_max)[RX_NUM_MAX];
+ short (*scap_cb_test_on_min)[RX_NUM_MAX];
+ short (*scap_cb_test_off_max)[RX_NUM_MAX];
+ short (*scap_cb_test_off_min)[RX_NUM_MAX];
+ int (*noise_test_coefficient)[RX_NUM_MAX];
+
+ int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX];
+ int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX];
+};
+
+struct detailthreshold_scap {
+ int TempData[MAX_CHANNEL_NUM];
+ int rawdata_test_max[MAX_CHANNEL_NUM];
+ int rawdata_test_min[MAX_CHANNEL_NUM];
+ int CiTest_Max[MAX_CHANNEL_NUM];
+ int CiTest_Min[MAX_CHANNEL_NUM];
+ int DeltaCiTest_Base[MAX_CHANNEL_NUM];
+ int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM];
+ int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM];
+ int CiDeviationTest_Base[MAX_CHANNEL_NUM];
+
+ int NoiseTest_Max[MAX_CHANNEL_NUM];
+ int DeltaCxTest_Sort[MAX_CHANNEL_NUM];
+ int DeltaCxTest_Area[MAX_CHANNEL_NUM];
+
+ int cb_test_max[MAX_CHANNEL_NUM];
+ int cb_test_min[MAX_CHANNEL_NUM];
+ int DeltaCbTest_Base[MAX_CHANNEL_NUM];
+ int DifferTest_Base[MAX_CHANNEL_NUM];
+ int CBDeviationTest_Base[MAX_CHANNEL_NUM];
+ int K1DifferTest_Base[MAX_CHANNEL_NUM];
+};
+
+void OnInit_InvalidNode(char *strIniFile);
+void OnInit_DThreshold_RawDataTest(char *strIniFile);
+void OnInit_DThreshold_SCapRawDataTest(char *strIniFile);
+void OnInit_DThreshold_SCapCbTest(char *strIniFile);
+void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile);
+void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile);
+void OnInit_DThreshold_RxLinearityTest(char *strIniFile);
+void OnInit_DThreshold_TxLinearityTest(char *strIniFile);
+void OnInit_DThreshold_PanelDifferTest(char *strIniFile);
+void OnInit_DThreshold_CBTest(char *strIniFile);
+void OnInit_DThreshold_AllButtonCBTest(char *strIniFile);
+void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile);
+void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue);
+int malloc_struct_DetailThreshold(void);
+void free_struct_DetailThreshold(void);
+#endif
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c
new file mode 100644
index 000000000000..dd46a5093566
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.c
@@ -0,0 +1,431 @@
+/************************************************************************
+* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved.
+*
+* File Name: focaltech_test_ini.c
+*
+* Author: Software Development Team, AE
+*
+* Created: 2016-08-01
+*
+* Abstract: parsing function of INI file
+*
+************************************************************************/
+#include "focaltech_test.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+/* '[' ']':Section Symbol-Can be defined according to the special need to change */
+const char CFG_SSL = '[';
+const char CFG_SSR = ']';
+const char CFG_NIS = ':'; /* Separator between name and index */
+const char CFG_NTS = '#'; /* annotator */
+const char CFG_EQS = '='; /* The equal sign */
+#define ERROR_RETURN_VALUE -1
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+/* Works only for digits and letters, but small and fast */
+#define TOLOWER(x) ((x) | 0x20)
+int fts_strncmp(const char *cs, const char *ct, size_t count)
+{
+ u8 c1 = 0, c2 = 0;
+
+ while (count) {
+ c1 = TOLOWER(*cs++);
+ c2 = TOLOWER(*ct++);
+ if (c1 != c2)
+ return c1 < c2 ? -1 : 1;
+ if (!c1)
+ break;
+ count--;
+ }
+
+ return 0;
+}
+
+/*************************************************************
+Function: Get the value of key
+Input: char * filedata; char * section; char * key
+Output: char * value¡¡key
+Return: 0 SUCCESS
+-1 can not find section
+-2 can not find key
+-10 File open failed
+-12 File read failed
+-14 File format error
+-22 Out of buffer size
+Note:
+*************************************************************/
+int ini_get_key(char *filedata, char *section, char *key, char *value)
+{
+ int i = 0;
+ int ret = -2;
+ for (i = 0; i < test_data.ini_keyword_num; i++) {
+ if (fts_strncmp(section, test_data.ini_data[i].section_name, test_data.ini_data[i].section_name_len) !=
+ 0)
+ continue;
+ if (strlen(key) == test_data.ini_data[i].key_name_len) {
+ if (fts_strncmp(key, test_data.ini_data[i].key_name, test_data.ini_data[i].key_name_len) == 0) {
+ memcpy(value, test_data.ini_data[i].key_value, test_data.ini_data[i].key_value_len);
+ ret = 0;
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+/*************************************************************
+Function: Remove empty character on the right side of the string
+Input: char * buf --String pointer
+Output:
+Return: String pointer
+Note:
+*************************************************************/
+char *ini_str_trim_r(char *buf)
+{
+ int len, i;
+ char tmp[512];
+
+ memset(tmp, 0, sizeof(tmp));
+ len = strlen(buf);
+
+ memset(tmp, 0x00, len);
+ for (i = 0; i < len; i++) {
+ if (buf[i] != ' ')
+ break;
+ }
+ if (i < len) {
+ strlcpy(tmp, (buf + i), sizeof(tmp));
+ }
+ strlcpy(buf, tmp, sizeof(buf));
+ return buf;
+}
+
+/*************************************************************
+Function: Remove empty character on the left side of the string
+Input: char * buf --String pointer
+Output:
+Return: String pointer
+Note:
+*************************************************************/
+char *ini_str_trim_l(char *buf)
+{
+ int len, i;
+ char tmp[512];
+
+ memset(tmp, 0, sizeof(tmp));
+ len = strlen(buf);
+
+ memset(tmp, 0x00, len);
+
+ for (i = 0; i < len; i++) {
+ if (buf[len - i - 1] != ' ')
+ break;
+ }
+ if (i < len) {
+ strlcpy(tmp, buf, sizeof(tmp));
+ }
+ strlcpy(buf, tmp, sizeof(buf));
+ return buf;
+}
+
+/*************************************************************
+Function: Read a line from file
+Input: FILE *fp; int maxlen-- Maximum length of buffer
+Output: char *buffer -- A string
+Return: >0 Actual read length
+-1 End of file
+-2 Error reading file
+Note:
+*************************************************************/
+static int ini_file_get_line(char *filedata, char *buffer, int maxlen)
+{
+ int i = 0;
+ int j = 0;
+ int iRetNum = -1;
+ char ch1 = '\0';
+
+ for (i = 0, j = 0; i < maxlen; j++) {
+ ch1 = filedata[j];
+ iRetNum = j + 1;
+ if (ch1 == '\n' || ch1 == '\r') {
+ ch1 = filedata[j + 1];
+ if (ch1 == '\n' || ch1 == '\r') {
+ iRetNum++;
+ }
+
+ break;
+ } else if (ch1 == 0x00) {
+ iRetNum = -1;
+ break;
+ } else {
+ buffer[i++] = ch1;
+ }
+ }
+ buffer[i] = '\0';
+
+ return iRetNum;
+}
+
+int isspace(int x)
+{
+ if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r')
+ return 1;
+ else
+ return 0;
+}
+
+int isdigit(int x)
+{
+ if (x <= '9' && x >= '0')
+ return 1;
+ else
+ return 0;
+}
+
+static long fts_atol(char *nptr)
+{
+ int c; /* current char */
+ long total; /* current total */
+ int sign; /* if ''-'', then negative, otherwise positive */
+ /* skip whitespace */
+ while (isspace((int)(unsigned char)*nptr))
+ ++nptr;
+ c = (int)(unsigned char)*nptr++;
+ sign = c; /* save sign indication */
+ if (c == '-' || c == '+')
+ c = (int)(unsigned char)*nptr++; /* skip sign */
+ total = 0;
+ while (isdigit(c)) {
+ total = 10 * total + (c - '0'); /* accumulate digit */
+ c = (int)(unsigned char)*nptr++; /* get next char */
+ }
+ if (sign == '-')
+ return -total;
+ else
+ return total; /* return result, negated if necessary */
+}
+
+int fts_atoi(char *nptr)
+{
+ return (int)fts_atol(nptr);
+}
+
+int init_key_data(void)
+{
+ int i = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ test_data.ini_keyword_num = 0;
+
+ for (i = 0; i < MAX_KEYWORD_NUM; i++) {
+ memset(test_data.ini_data[i].section_name, 0, MAX_KEYWORD_NAME_LEN);
+ memset(test_data.ini_data[i].key_name, 0, MAX_KEYWORD_NAME_LEN);
+ memset(test_data.ini_data[i].key_value, 0, MAX_KEYWORD_VALUE_LEN);
+ test_data.ini_data[i].section_name_len = 0;
+ test_data.ini_data[i].key_name_len = 0;
+ test_data.ini_data[i].key_value_len = 0;
+ }
+
+ FTS_TEST_FUNC_EXIT();
+ return 1;
+}
+
+int print_key_data(void)
+{
+ int i = 0;
+
+ FTS_TEST_DBG("test_data.ini_keyword_num = %d", test_data.ini_keyword_num);
+ for (i = 0; i < MAX_KEYWORD_NUM; i++) {
+
+ FTS_TEST_DBG("section_name_%d:%s, key_name_%d:%s\n,key_value_%d:%s", i,
+ test_data.ini_data[i].section_name, i, test_data.ini_data[i].key_name, i,
+ test_data.ini_data[i].key_value);
+ }
+
+ return 0;
+}
+
+/*************************************************************
+Function: Read all the parameters and values to the structure.
+Return: Returns the number of key. If you go wrong, return a negative number.
+-10 File open failed
+-12 File read failed
+ -14 File format error
+Note:
+*************************************************************/
+int ini_get_key_data(char *filedata)
+{
+ char buf1[MAX_CFG_BUF + 1] = { 0 };
+ int n = 0;
+ int ret = 0;
+ int dataoff = 0;
+ int iEqualSign = 0;
+ int i = 0;
+ char tmsection_name[MAX_CFG_BUF + 1] = { 0 };
+
+ FTS_TEST_FUNC_ENTER();
+ ret = init_key_data();
+ if (ret < 0) {
+ FTS_TEST_ERROR("init key data failed");
+ return ERROR_RETURN_VALUE;
+ }
+ test_data.ini_keyword_num = 0;
+ while (1) { /*find section */
+ ret = CFG_ERR_READ_FILE;
+ n = ini_file_get_line(filedata + dataoff, buf1, MAX_CFG_BUF);
+ if (n < -1)
+ goto cfg_scts_end;
+ if (n < 0)
+ break; /* file end */
+ if (n >= MAX_CFG_BUF) {
+ FTS_TEST_ERROR("Error Length:%d\n", n);
+ goto cfg_scts_end;
+ }
+ dataoff += n;
+ n = strlen(ini_str_trim_l(ini_str_trim_r(buf1)));
+ if (n == 0 || buf1[0] == CFG_NTS)
+ continue; /* A blank line or a comment line */
+ ret = CFG_ERR_FILE_FORMAT;
+ if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n - 1] != CFG_SSR))) {
+ FTS_TEST_ERROR("Bad Section:%s\n", buf1);
+ goto cfg_scts_end;
+ }
+
+ if (buf1[0] == CFG_SSL) {
+ test_data.ini_data[test_data.ini_keyword_num].section_name_len = n - 2;
+ if (MAX_KEYWORD_NAME_LEN < test_data.ini_data[test_data.ini_keyword_num].section_name_len) {
+ ret = CFG_ERR_OUT_OF_LEN;
+ FTS_TEST_ERROR("MAX_KEYWORD_NAME_LEN: CFG_ERR_OUT_OF_LEN\n");
+ goto cfg_scts_end;
+ }
+ buf1[n - 1] = 0x00;
+ strlcpy((char *)tmsection_name, buf1 + 1, sizeof(tmsection_name));
+
+ continue;
+ }
+ strlcpy(test_data.ini_data[test_data.ini_keyword_num].section_name, tmsection_name,
+ sizeof(test_data.ini_data[test_data.ini_keyword_num].section_name));
+ test_data.ini_data[test_data.ini_keyword_num].section_name_len = strlen(tmsection_name);
+
+ iEqualSign = 0;
+ for (i = 0; i < n; i++) {
+ if (buf1[i] == CFG_EQS) {
+ iEqualSign = i;
+ break;
+ }
+ }
+ if (0 == iEqualSign)
+ continue;
+ /* before equal sign is assigned to the key name */
+ test_data.ini_data[test_data.ini_keyword_num].key_name_len = iEqualSign;
+ if (MAX_KEYWORD_NAME_LEN < test_data.ini_data[test_data.ini_keyword_num].key_name_len) {
+ ret = CFG_ERR_OUT_OF_LEN;
+ FTS_TEST_ERROR("MAX_KEYWORD_NAME_LEN: CFG_ERR_OUT_OF_LEN\n");
+ goto cfg_scts_end;
+ }
+ memcpy(test_data.ini_data[test_data.ini_keyword_num].key_name, buf1,
+ test_data.ini_data[test_data.ini_keyword_num].key_name_len);
+
+ /* After equal sign is assigned to the key value */
+ test_data.ini_data[test_data.ini_keyword_num].key_value_len = n - iEqualSign - 1;
+ if (MAX_KEYWORD_VALUE_LEN < test_data.ini_data[test_data.ini_keyword_num].key_value_len) {
+ ret = CFG_ERR_OUT_OF_LEN;
+ FTS_TEST_ERROR("MAX_KEYWORD_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n");
+ goto cfg_scts_end;
+ }
+ memcpy(test_data.ini_data[test_data.ini_keyword_num].key_value, buf1 + iEqualSign + 1,
+ test_data.ini_data[test_data.ini_keyword_num].key_value_len);
+
+ ret = test_data.ini_keyword_num;
+ test_data.ini_keyword_num++; /*Parameter number accumulation */
+ if (MAX_KEYWORD_NUM < test_data.ini_keyword_num) {
+ ret = CFG_ERR_TOO_MANY_KEY_NUM;
+ FTS_TEST_ERROR("MAX_KEYWORD_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n");
+ goto cfg_scts_end;
+ }
+ }
+
+ FTS_TEST_FUNC_EXIT();
+
+ return 0;
+
+cfg_scts_end:
+
+ FTS_TEST_FUNC_EXIT();
+ return ret;
+}
+
+int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile)
+{
+ char value[512] = { 0 };
+ int len = 0;
+
+ if (NULL == returnValue) {
+ FTS_TEST_DBG("return Value==NULL");
+ return 0;
+ }
+ if (ini_get_key(IniFile, section, ItemName, value) < 0) {
+ if (NULL != defaultvalue)
+ memcpy(value, defaultvalue, strlen(defaultvalue));
+ snprintf(returnValue, strlen(returnValue), "%s", value);
+ return 0;
+ } else {
+ len = snprintf(returnValue, strlen(returnValue), "%s", value);
+ }
+
+ return len;
+}
+
+
+int init_interface(char *ini)
+{
+ char str[MAX_KEYWORD_VALUE_LEN] = { 0 };
+ u32 ic_type = 0xFF;
+
+ FTS_TEST_FUNC_ENTER();
+
+ /* IC type */
+ GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, ini);
+ ic_type = fts_ic_table_get_ic_code_from_ic_name(str);
+ if (0 == ic_type) {
+ FTS_TEST_ERROR("get ic code fail");
+ return -EINVAL;
+ }
+ test_data.screen_param.selected_ic = ic_type;
+ /*Get IC Name */
+ snprintf(test_data.ini_ic_name, sizeof(test_data.ini_ic_name), "%s", str);
+ FTS_TEST_INFO("IC Name:%s IC Code:0x%02x. ", test_data.ini_ic_name, test_data.screen_param.selected_ic);
+
+ /* Normalize Type */
+ GetPrivateProfileString("Interface", "Normalize_Type", 0, str, ini);
+ test_data.screen_param.normalize = fts_atoi(str);
+
+ FTS_TEST_FUNC_EXIT();
+ return 0;
+}
+
+/************************************************************************
+* Name: set_param_data
+* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items
+* Input: TestParamData, from ini file.
+* Output: none
+* Return: 0. No sense, just according to the old format.
+***********************************************************************/
+
+/*
+ * fts_test_get_testparam_from_ini - get test parameters from ini
+ *
+ * read, parse the configuration file, initialize the test variable
+ *
+ * return 0 if succuss, else errro code
+ */
+
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h
new file mode 100644
index 000000000000..18c774d42af2
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/focaltech_test_ini.h
@@ -0,0 +1,56 @@
+/************************************************************************
+* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved.
+*
+* File Name: focaltech_test_ini.h
+*
+* Author: Host Driver Team
+*
+* Created: 2016-08-01
+*
+* Abstract: parsing function of INI file
+*
+************************************************************************/
+#ifndef _INI_H
+#define _INI_H
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define MAX_KEYWORD_NUM 500
+#define MAX_KEYWORD_NAME_LEN 50
+#define MAX_KEYWORD_VALUE_LEN 512
+#define MAX_CFG_BUF 480
+
+#define SUCCESS 0
+
+#define CFG_ERR_OPEN_FILE -10
+#define CFG_ERR_CREATE_FILE -11
+#define CFG_ERR_READ_FILE -12
+#define CFG_ERR_WRITE_FILE -13
+#define CFG_ERR_FILE_FORMAT -14
+#define CFG_ERR_TOO_MANY_KEY_NUM -15
+#define CFG_ERR_OUT_OF_LEN -16
+
+/*****************************************************************************
+* enumerations, structures and unions
+*****************************************************************************/
+struct _ini_data {
+ char section_name[MAX_KEYWORD_NAME_LEN];
+ char key_name[MAX_KEYWORD_NAME_LEN];
+ char key_value[MAX_KEYWORD_VALUE_LEN];
+ int section_name_len;
+ int key_name_len;
+ int key_value_len;
+};
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+int fts_atoi(char *nptr);
+char *ini_str_trim_r(char *buf);
+char *ini_str_trim_l(char *buf);
+int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile);
+int fts_test_get_testparam_from_ini(char *config_name);
+int fts_test_get_ini_size(char *config_name);
+int fts_test_read_ini_data(char *config_name, char *config_buf);
+
+#endif /* _INI_H */
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile
new file mode 100644
index 000000000000..e164798e7b65
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/Makefile
@@ -0,0 +1,6 @@
+#drivers/input/touchscreen/focaltech_ts/focaltech_test
+#
+# Makefile for test module
+#
+# Linux driver folder
+obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ft8719.o \ No newline at end of file
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c
new file mode 100644
index 000000000000..7bde6ca65f5e
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/focaltech_test/supported_ic/focaltech_test_ft8719.c
@@ -0,0 +1,968 @@
+/************************************************************************
+* Copyright (C) 2012-2018, Focaltech Systems (R), All Rights Reserved.
+* Copyright (C) 2020 XiaoMi, Inc.
+*
+* File Name: Focaltech_test_ft8719.c
+*
+* Author: Focaltech Driver Team
+*
+* Created: 2017-12-01
+*
+* Abstract: test item for FT8719
+*
+************************************************************************/
+
+/*****************************************************************************
+* Included header files
+*****************************************************************************/
+#include "../focaltech_test.h"
+
+/*****************************************************************************
+* Private constant and macro definitions using #define
+*****************************************************************************/
+#define FACTORY_REG_VGH02 0x20
+#define FACTORY_REG_VGL02 0x21
+
+/*****************************************************************************
+* Private enumerations, structures and unions using typedef
+*****************************************************************************/
+struct ft8719_test_item {
+ bool rawdata_test;
+ bool cb_test;
+ bool short_test;
+ bool lcd_noise_test;
+ bool open_test;
+};
+
+struct ft8719_basic_threshold {
+ int rawdata_test_min;
+ int rawdata_test_max;
+ bool cb_test_va_check;
+ int cb_test_min;
+ int cb_test_max;
+ bool cb_test_vk_check;
+ int cb_test_min_vk;
+ int cb_test_max_vk;
+ int short_res_min;
+ int lcd_noise_test_frame;
+ int lcd_noise_test_max;
+ int lcd_noise_coefficient;
+ int lcd_noise_coefficient_key;
+ int open_test_cb_min;
+ bool open_test_k1_check;
+ int open_test_k1;
+ bool open_test_k2_check;
+ int open_test_k2;
+};
+
+enum test_item_ft8719 {
+ CODE_FT8719_ENTER_FACTORY_MODE = 0,
+ CODE_FT8719_RAWDATA_TEST = 7,
+ CODE_FT8719_CB_TEST = 12,
+ CODE_FT8719_SHORT_CIRCUIT_TEST = 14,
+ CODE_FT8719_LCD_NOISE_TEST = 15,
+ CODE_FT8719_OPEN_TEST = 24,
+};
+
+/*****************************************************************************
+* Static variables
+*****************************************************************************/
+
+/*****************************************************************************
+* Global variable or extern global variabls/functions
+*****************************************************************************/
+struct ft8719_basic_threshold ft8719_basic_thr;
+struct ft8719_test_item ft8719_item;
+
+/*****************************************************************************
+* Static function prototypes
+*****************************************************************************/
+static int ft8719_get_key_num(void)
+{
+ int ret = 0;
+ int i = 0;
+ u8 keyval = 0;
+
+ test_data.screen_param.key_num = 0;
+ for (i = 0; i < 3; i++) {
+ ret = read_reg(FACTORY_REG_LEFT_KEY, &keyval);
+ if (0 == ret) {
+ if (((keyval >> 0) & 0x01)) {
+ test_data.screen_param.left_key1 = true;
+ ++test_data.screen_param.key_num;
+ }
+ if (((keyval >> 1) & 0x01)) {
+ test_data.screen_param.left_key2 = true;
+ ++test_data.screen_param.key_num;
+ }
+ if (((keyval >> 2) & 0x01)) {
+ test_data.screen_param.left_key3 = true;
+ ++test_data.screen_param.key_num;
+ }
+ if (((keyval >> 3) & 0x01)) {
+ test_data.screen_param.left_key4 = true;
+ ++test_data.screen_param.key_num;
+ }
+ break;
+ } else {
+ sys_delay(150);
+ continue;
+ }
+ }
+
+ if (i >= 3) {
+ FTS_TEST_SAVE_INFO("can't get left key num");
+ return ret;
+ }
+ return 0;
+}
+
+/************************************************************************
+ * Name: ft8719_enter_factory_mode
+ * Brief: Check whether TP can enter Factory Mode, and do some thing
+ * Input: none
+ * Output: none
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int ft8719_enter_factory_mode(void)
+{
+ int ret = 0;
+
+ ret = enter_factory_mode();
+ if (ret < 0) {
+ FTS_TEST_SAVE_INFO("enter factory mode fail, can't get tx/rx num");
+ return ret;
+ }
+ ret = ft8719_get_key_num();
+ if (ret < 0) {
+ FTS_TEST_SAVE_INFO("get key num fail");
+ return ret;
+ }
+
+ return ret;
+}
+
+/************************************************************************
+ * Name: ft8719_short_test
+ * Brief: Get short circuit test mode data, judge whether
+ * there is a short circuit
+ * Input: test_result
+ * Output: test_result, PASS or FAIL
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int ft8719_short_test(bool *test_result)
+{
+ int ret = 0;
+ bool temp_result = false;
+ int res_min = 0;
+ int byte_num = 0;
+ int tx_num = 0;
+ int rx_num = 0;
+ int key_num = 0;
+ int ch_num = 0;
+ int row = 0;
+ int col = 0;
+ int tmp_adc = 0;
+ int min = 0;
+ int max = 0;
+ int *adcdata = NULL;
+
+ FTS_TEST_SAVE_INFO("==============================Test Item: -------- Short Circuit Test");
+
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ key_num = test_data.screen_param.key_num_total;
+ memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int));
+ adcdata = test_data.buffer;
+
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Enter factory mode,ret=%d\n", ret);
+ goto TEST_END;
+ }
+
+ byte_num = (tx_num * rx_num + key_num) * 2;
+ ch_num = rx_num;
+ ret = weakshort_get_adc_data_incell(TEST_RETVAL_AA, ch_num, byte_num, adcdata);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to get AdcData,ret=%d\n", ret);
+ goto TEST_END;
+ }
+
+ /* calculate resistor */
+ for (row = 0; row < tx_num + 1; ++row) {
+ for (col = 0; col < rx_num; ++col) {
+ tmp_adc = adcdata[row * rx_num + col];
+ if (tmp_adc < 50) {
+ adcdata[row * rx_num + col] = -1;
+ continue;
+ } else if (tmp_adc < 200) {
+ tmp_adc = 200;
+ }
+ adcdata[row * rx_num + col] = 252000 / (tmp_adc - 120) - 60;
+ }
+ }
+
+ show_data_incell(adcdata, true);
+
+ /* analyze data */
+ res_min = ft8719_basic_thr.short_res_min;
+ min = res_min;
+ max = 100000000;
+ FTS_TEST_SAVE_INFO("Short Circuit test, Set_Range=(%d, %d)\n", min, max);
+ temp_result = compare_data_incell(adcdata, min, max, min, max, true);
+
+ save_testdata_incell(adcdata, "Short Circuit Test", 0, tx_num + 1, rx_num, 1);
+
+TEST_END:
+ if (temp_result) {
+ FTS_TEST_SAVE_INFO("\n==========Short Circuit Test is OK!\r\n");
+ *test_result = true;
+ } else {
+ FTS_TEST_SAVE_INFO("\n==========Short Circuit Test is NG!\r\n");
+ *test_result = false;
+ }
+
+ return ret;
+}
+
+/************************************************************************
+ * Name: ft8719_open_test
+ * Brief: Check if channel is open
+ * Input: test_result
+ * Output: test_result, PASS or FAIL
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int ft8719_open_test(bool *test_result)
+{
+ int ret = 0;
+ bool tmp_result = false;
+ int min = 0;
+ int max = 0;
+ u8 reg_vgh = 0;
+ u8 reg_vgl = 0;
+ u8 k1 = 0;
+ u8 k2 = 0;
+ int tx_num = 0;
+ int rx_num = 0;
+ int cb_byte_num = 0;
+ int *opendata = NULL;
+
+ FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- Open Test");
+
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int));
+ opendata = test_data.buffer;
+
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nEnter Factory fail");
+ goto TEST_ERR_FACTORY;
+ }
+
+ /* open test enable */
+ ret = write_reg(FACTORY_REG_OPEN_TEST_EN, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nopen test enable fail");
+ goto TEST_ERR_FACTORY;
+ }
+
+ /* backup defaul value */
+ ret = read_reg(FACTORY_REG_VGH02, &reg_vgh);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nread reg 0x20 fail");
+ goto TEST_ERR_FACTORY;
+ }
+ ret = read_reg(FACTORY_REG_VGL02, &reg_vgl);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nread reg 0x21 fail");
+ goto TEST_ERR_FACTORY;
+ }
+ if (ft8719_basic_thr.open_test_k1_check) {
+ ret = read_reg(FACTORY_REG_K1, &k1);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nread k1 fail");
+ goto TEST_ERR_FACTORY;
+ }
+ }
+ if (ft8719_basic_thr.open_test_k2_check) {
+ ret = read_reg(FACTORY_REG_K2, &k2);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nread k2 fail");
+ goto TEST_ERR_FACTORY;
+ }
+ }
+
+ /* set open test environment */
+ ret = write_reg(FACTORY_REG_VGH02, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nwrite reg 0x20 fail");
+ goto TEST_ERR;
+ }
+
+ ret = write_reg(FACTORY_REG_VGL02, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nwrite reg 0x21 fail");
+ goto TEST_ERR;
+ }
+
+ if (ft8719_basic_thr.open_test_k1_check) {
+ ret = write_reg(FACTORY_REG_K1, ft8719_basic_thr.open_test_k1);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nwrite reg k1 fail");
+ goto TEST_ERR;
+ }
+ }
+
+ if (ft8719_basic_thr.open_test_k2_check) {
+ ret = write_reg(FACTORY_REG_K2, ft8719_basic_thr.open_test_k2);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nwrite reg k2 fail");
+ goto TEST_ERR;
+ }
+ }
+
+ /* wait fw state update before clb */
+ wait_state_update();
+ /* auto clb */
+ ret = chip_clb_incell();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nauto clb fail");
+ goto TEST_ERR;
+ }
+
+ /* get cb data */
+ cb_byte_num = tx_num * rx_num;
+ ret = get_cb_incell(0, cb_byte_num, opendata);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nget CB fail");
+ goto TEST_ERR;
+ }
+
+ /* show open data to testresult.txt */
+ show_data_incell(opendata, false);
+
+ /* compare data */
+ min = ft8719_basic_thr.open_test_cb_min;
+ max = TEST_OPEN_MAX_VALUE;
+ FTS_TEST_SAVE_INFO("\nOpen test, Set_Range=(%d, %d)\n", min, max);
+ tmp_result = compare_data_incell(opendata, min, max, 0, 0, false);
+
+ /* save data to testdata.csv */
+ save_testdata_incell(opendata, "Open Test", 0, tx_num, rx_num, 1);
+
+TEST_ERR:
+ /* restore reg */
+ ret = write_reg(FACTORY_REG_VGH02, reg_vgh);
+ if (ret) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("\r\nrestore 0x20 reg fail");
+ }
+ ret = write_reg(FACTORY_REG_VGL02, reg_vgl);
+ if (ret) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("\r\nrestore 0x21 reg fail");
+ }
+ if (ft8719_basic_thr.open_test_k1_check) {
+ ret = write_reg(FACTORY_REG_K1, k1);
+ if (ret) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("\r\nrestore reg k1 fail");
+ }
+ }
+ if (ft8719_basic_thr.open_test_k2_check) {
+ ret = write_reg(FACTORY_REG_K2, k2);
+ if (ret) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("\r\nrestore reg k2 fail");
+ }
+ }
+ /* wait fw state update before clb */
+ wait_state_update();
+ /* auto clb */
+ ret = chip_clb_incell();
+ if (ret) {
+ tmp_result = false;
+ FTS_TEST_SAVE_INFO("\r\nauto clb fail");
+ }
+
+TEST_ERR_FACTORY:
+ /* open test disable */
+ ret = write_reg(FACTORY_REG_OPEN_TEST_EN, 0x0);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nopen test disable fail");
+ }
+ if (tmp_result) {
+ *test_result = true;
+ FTS_TEST_SAVE_INFO("\n==========Open Test is OK!\r\n");
+ } else {
+ *test_result = false;
+ FTS_TEST_SAVE_INFO("\n==========Open Test is NG!\r\n");
+ }
+
+ return ret;
+}
+
+/************************************************************************
+ * Name: ft8719_cb_test
+ * Brief: TestItem: Cb Test. Check if Cb is within the range.
+ * Input: none
+ * Output: test_result, PASS or FAIL
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int ft8719_cb_test(bool *test_result)
+{
+ int ret = 0;
+ bool tmp_result = false;
+ int tx_num = 0;
+ int rx_num = 0;
+ int key_num = 0;
+ int cb_byte_num = 0;
+ bool include_key = false;
+ int *cbdata = NULL;
+
+ FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- CB Test");
+
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ key_num = test_data.screen_param.key_num_total;
+ memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int));
+ cbdata = test_data.buffer;
+
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO(" Failed to Enter factory mode. Error Code: %d", ret);
+ goto TEST_ERR;
+ }
+
+ /* cb test enable */
+ ret = write_reg(FACTORY_REG_CB_TEST_EN, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\ncb test enable fail");
+ goto TEST_ERR;
+ }
+
+ /* auto clb */
+ ret = chip_clb_incell();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\n//========= auto clb Failed !");
+ goto TEST_ERR;
+ }
+
+ cb_byte_num = tx_num * rx_num + key_num;
+ ret = get_cb_incell(0, cb_byte_num, cbdata);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to get CB value...\n");
+ goto TEST_ERR;
+ }
+
+ /* Show CbData to testresult.txt */
+ include_key = ft8719_basic_thr.cb_test_vk_check;
+ show_data_incell(cbdata, include_key);
+
+ /* To Determine Cb if in Range or not */
+ tmp_result = compare_detailthreshold_data_incell(cbdata,
+ test_data.incell_detail_thr.cb_test_min,
+ test_data.incell_detail_thr.cb_test_max, include_key);
+
+ /* Save Test Data to testdata.csv */
+ save_testdata_incell(cbdata, "CB Test", 0, tx_num + 1, rx_num, 1);
+
+TEST_ERR:
+ /* cb test disable */
+ ret = write_reg(FACTORY_REG_CB_TEST_EN, 0x0);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\ncb test disable fail");
+ }
+ if (tmp_result) {
+ *test_result = true;
+ FTS_TEST_SAVE_INFO("\n==========CB Test is OK!\r\n");
+ } else {
+ *test_result = false;
+ FTS_TEST_SAVE_INFO("\n==========CB Test is NG!\r\n");
+ }
+
+ return ret;
+}
+
+/************************************************************************
+* Name: ft8719_rawdata_test
+* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range.
+* Input: test_result
+* Output: test_result, PASS or FAIL
+* Return: return 0 if success, otherwise return error code
+***********************************************************************/
+static int ft8719_rawdata_test(bool *test_result)
+{
+ int ret = 0;
+ bool tmp_result = false;
+ int tx_num = 0;
+ int rx_num = 0;
+ int key_num = 0;
+ int i = 0;
+ int *rawdata = NULL;
+
+ FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- Raw Data Test");
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ key_num = test_data.screen_param.key_num_total;
+ memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int));
+ rawdata = test_data.buffer;
+
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Enter factory mode,ret=%d", ret);
+ goto TEST_FAC_ERR;
+ }
+
+ /* rawdata test enable */
+ ret = write_reg(FACTORY_REG_RAWDATA_TEST_EN, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nrawdata test enable fail");
+ goto TEST_FAC_ERR;
+ }
+
+ /*********************GET RAWDATA*********************/
+ for (i = 0; i < 3; i++) {
+ /* Lost 3 Frames, In order to obtain stable data */
+ ret = get_rawdata_incell(rawdata);
+ }
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to get Raw Data!! Error Code: %d", ret);
+ return ret;
+ }
+ /* Show RawData to testresult.txt */
+ show_data_incell(rawdata, true);
+
+ /* To Determine RawData if in Range or not */
+ tmp_result = compare_detailthreshold_data_incell(rawdata,
+ test_data.incell_detail_thr.rawdata_test_min,
+ test_data.incell_detail_thr.rawdata_test_max, true);
+
+ /* Save Test Data to testdata.csv */
+ save_testdata_incell(rawdata, "RawData Test", 0, tx_num + 1, rx_num, 1);
+
+TEST_FAC_ERR:
+ /* rawdata test enable */
+ ret = write_reg(FACTORY_REG_RAWDATA_TEST_EN, 0x0);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("\r\nrawdata test disable fail");
+ }
+ if (tmp_result) {
+ *test_result = true;
+ FTS_TEST_SAVE_INFO("\n==========RawData Test is OK!\n");
+ } else {
+ *test_result = false;
+ FTS_TEST_SAVE_INFO("\n==========RawData Test is NG!\n");
+ }
+ return ret;
+}
+
+/************************************************************************
+ * Name: ft8719_lcdnoise_test
+ * Brief: TestItem: LCD NoiseTest. Check if Noise is within the range.
+ * Input: test_result
+ * Output: test_result, PASS or FAIL
+ * Return: return 0 if success, otherwise return error code
+ ***********************************************************************/
+static int ft8719_lcdnoise_test(bool *test_result)
+{
+ int ret = 0;
+ bool result_flag = false;
+ u8 old_mode = 0;
+ int row = 0;
+ int col = 0;
+ int value_min = 0;
+ int value_max = 0;
+ int vk_value_max = 0;
+ int retry = 0;
+ u8 status = 0xFF;
+ u8 noise_value_va = 0xFF;
+ u8 noise_value_vk = 0xFF;
+ int tx_num = 0;
+ int rx_num = 0;
+ int key_num = 0;
+ int frame_num = 0;
+ int lcdnoise_bytenum = 0;
+ int *lcdnoise = NULL;
+
+ FTS_TEST_SAVE_INFO("\n\n==============================Test Item: -------- LCD Noise Test");
+
+ tx_num = test_data.screen_param.tx_num;
+ rx_num = test_data.screen_param.rx_num;
+ key_num = test_data.screen_param.key_num_total;
+ memset(test_data.buffer, 0, ((tx_num + 1) * rx_num) * sizeof(int));
+ lcdnoise = test_data.buffer;
+
+ ret = enter_factory_mode();
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Enter factory mode, ret:%d", ret);
+ goto TEST_END;
+ }
+
+ /* switch to differ mode */
+ ret = read_reg(FACTORY_REG_DATA_SELECT, &old_mode);
+ ret = write_reg(FACTORY_REG_DATA_SELECT, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write data select fail");
+ goto TEST_END;
+ }
+ sys_delay(FACTORY_TEST_DELAY);
+
+ /* RawData Address Register Offset cleared */
+ ret = write_reg(FACTORY_REG_LINE_ADDR, 0xAD);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write line addr register fail");
+ goto TEST_END;
+ }
+
+ /* set scan number */
+ frame_num = ft8719_basic_thr.lcd_noise_test_frame;
+ FTS_TEST_DBG(" lcd_noise_test_frame:%d\n", frame_num);
+ ret = write_reg(FACTORY_REG_LCD_NOISE_FRAME, frame_num / 4);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write lcd noise frame fail");
+ goto TEST_END;
+ }
+
+ /* start test */
+ ret = write_reg(FACTORY_REG_LCD_NOISE_START, 0x01);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("write lcd noise start fail");
+ goto TEST_END;
+ }
+
+ /* check status */
+ sys_delay(frame_num * FACTORY_TEST_DELAY / 2);
+ for (retry = 0; retry < FACTORY_TEST_RETRY; retry++) {
+ status = 0xFF;
+ ret = read_reg(FACTORY_REG_LCD_NOISE_START, &status);
+ if ((0 == ret) && (TEST_RETVAL_AA == status)) {
+ break;
+ } else {
+ FTS_TEST_DBG("reg%x=%x,retry:%d\n", FACTORY_REG_LCD_NOISE_START, status, retry);
+ }
+ sys_delay(FACTORY_TEST_RETRY_DELAY);
+ }
+ if (retry >= FACTORY_TEST_RETRY) {
+ FTS_TEST_SAVE_INFO("Scan Noise Time Out!");
+ goto TEST_END;
+ }
+
+ lcdnoise_bytenum = tx_num * rx_num * 2 + key_num * 2;
+ ret = read_mass_data(FACTORY_REG_RAWDATA_ADDR, lcdnoise_bytenum, lcdnoise);
+ if (ret) {
+ FTS_TEST_SAVE_INFO("Failed to Read Data.\n");
+ goto TEST_END;
+ }
+
+ for (row = 0; row < tx_num + 1; ++row) {
+ for (col = 0; col < rx_num; ++col) {
+ lcdnoise[row * rx_num + col] = focal_abs(lcdnoise[row * rx_num + col]);
+ }
+ }
+
+ /* show and save data of lcd_noise to testresult.txt */
+ show_data_incell(lcdnoise, true);
+
+ /* analyze lcd noise data */
+ noise_value_va = test_data.va_touch_thr;
+ noise_value_vk = test_data.key_touch_thr;
+ value_min = 0;
+ value_max = ft8719_basic_thr.lcd_noise_coefficient * noise_value_va * 32 / 100;
+ vk_value_max = ft8719_basic_thr.lcd_noise_coefficient_key * noise_value_vk * 32 / 100;
+ FTS_TEST_SAVE_INFO("VA_Set_Range=(%d, %d). VK_Set_Range=(%d, %d)\n",
+ value_min, value_max, value_min, vk_value_max);
+ result_flag = compare_data_incell(lcdnoise, value_min, value_max, value_min, vk_value_max, true);
+
+ /* Save Test Data to csv */
+ save_testdata_incell(lcdnoise, "LCD Noise Test", 0, tx_num + 1, rx_num, 1);
+
+TEST_END:
+ write_reg(FACTORY_REG_DATA_SELECT, old_mode);
+ write_reg(FACTORY_REG_LCD_NOISE_START, 0x00);
+ sys_delay(FACTORY_TEST_DELAY);
+ if (result_flag) {
+ FTS_TEST_SAVE_INFO("\n==========LCD Noise Test is OK!\r\n");
+ *test_result = true;
+ } else {
+ FTS_TEST_SAVE_INFO("\n==========LCD Noise Test is NG!\r\n");
+ *test_result = false;
+ }
+
+ return ret;
+}
+
+static bool start_test_ft8719(void)
+{
+ int ret = 0;
+ bool test_result = true;
+ bool temp_result = true;
+ int item_count = 0;
+ u8 item_code = 0;
+
+ FTS_TEST_FUNC_ENTER();
+
+ if (0 == test_data.test_num) {
+ FTS_TEST_SAVE_INFO("test item == 0\n");
+ return false;
+ }
+
+ for (item_count = 0; item_count < test_data.test_num; item_count++) {
+ item_code = test_data.test_item[item_count].itemcode;
+ test_data.test_item_code = item_code;
+
+ /* FT8719_ENTER_FACTORY_MODE */
+ if (CODE_FT8719_ENTER_FACTORY_MODE == item_code) {
+ ret = ft8719_enter_factory_mode();
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ break; /* if this item FAIL, no longer test. */
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+
+ /* FT8719_SHORT_TEST */
+ if (CODE_FT8719_SHORT_CIRCUIT_TEST == item_code) {
+ ret = ft8719_short_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+
+ /* FT8719_Open_TEST */
+ if (CODE_FT8719_OPEN_TEST == item_code) {
+ ret = ft8719_open_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+
+ /* FT8719_CB_TEST */
+ if (CODE_FT8719_CB_TEST == item_code) {
+ ret = ft8719_cb_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+
+ /* FT8719_RAWDATA_TEST */
+ if (CODE_FT8719_RAWDATA_TEST == item_code) {
+ ret = ft8719_rawdata_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+
+ /* FT8719_LCD_NOISE_TEST */
+ if (CODE_FT8719_LCD_NOISE_TEST == item_code) {
+ ret = ft8719_lcdnoise_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ test_result = false;
+ test_data.test_item[item_count].testresult = RESULT_NG;
+ } else
+ test_data.test_item[item_count].testresult = RESULT_PASS;
+ }
+ }
+
+ return test_result;
+}
+
+static int ft8719_open_selftest(void)
+{
+ int ret = SELFTEST_INVALID;
+ bool temp_result = true;
+
+ FTS_TEST_FUNC_ENTER();
+
+ ret = ft8719_enter_factory_mode();
+ if (ret != 0) {
+ ret = SELFTEST_INVALID;
+ goto end;
+ }
+ ret = ft8719_open_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ ret = SELFTEST_FAIL;
+ } else
+ ret = SELFTEST_PASS;
+
+ FTS_TEST_FUNC_EXIT();
+end:
+ return ret;
+}
+
+static int ft8719_short_selftest(void)
+{
+ int ret = SELFTEST_INVALID;
+ bool temp_result = true;
+
+ FTS_TEST_FUNC_ENTER();
+
+ ret = ft8719_enter_factory_mode();
+ if ((ret != 0)) {
+ ret = SELFTEST_INVALID;
+ goto end;
+ }
+ ret = ft8719_short_test(&temp_result);
+ if ((ret != 0) || (!temp_result)) {
+ ret = SELFTEST_FAIL;
+ } else
+ ret = SELFTEST_PASS;
+
+ FTS_TEST_FUNC_EXIT();
+
+end:
+ return ret;
+}
+
+static void init_basicthreshold_ft8719(char *ini)
+{
+ char str[MAX_KEYWORD_VALUE_LEN] = { 0 };
+
+ FTS_TEST_FUNC_ENTER();
+
+ /* RawData Test */
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, ini);
+ ft8719_basic_thr.rawdata_test_min = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, ini);
+ ft8719_basic_thr.rawdata_test_max = fts_atoi(str);
+
+ /* CB Test */
+ GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, ini);
+ ft8719_basic_thr.cb_test_va_check = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, ini);
+ ft8719_basic_thr.cb_test_min = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "60", str, ini);
+ ft8719_basic_thr.cb_test_max = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, ini);
+ ft8719_basic_thr.cb_test_vk_check = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, ini);
+ ft8719_basic_thr.cb_test_min_vk = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, ini);
+ ft8719_basic_thr.cb_test_max_vk = fts_atoi(str);
+
+ /* Short Circuit Test */
+ GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "200", str, ini);
+ ft8719_basic_thr.short_res_min = fts_atoi(str);
+
+ /* LCD Noise Test */
+ GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Frame", "50", str, ini);
+ ft8719_basic_thr.lcd_noise_test_frame = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max", "30", str, ini);
+ ft8719_basic_thr.lcd_noise_test_max = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient", "50", str, ini);
+ ft8719_basic_thr.lcd_noise_coefficient = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient_Key", "50", str, ini);
+ ft8719_basic_thr.lcd_noise_coefficient_key = fts_atoi(str);
+
+ /* Open Test */
+ GetPrivateProfileString("Basic_Threshold", "OpenTest_CBMin", "64", str, ini);
+ ft8719_basic_thr.open_test_cb_min = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K1", "0", str, ini);
+ ft8719_basic_thr.open_test_k1_check = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "OpenTest_K1Threshold", "0", str, ini);
+ ft8719_basic_thr.open_test_k1 = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K2", "0", str, ini);
+ ft8719_basic_thr.open_test_k2_check = fts_atoi(str);
+ GetPrivateProfileString("Basic_Threshold", "OpenTest_K2Threshold", "0", str, ini);
+ ft8719_basic_thr.open_test_k2 = fts_atoi(str);
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+static void init_testitem_ft8719(char *ini)
+{
+ char str[MAX_KEYWORD_VALUE_LEN] = { 0 };
+
+ FTS_TEST_FUNC_ENTER();
+
+ /* RawData Test */
+ GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, ini);
+ ft8719_item.rawdata_test = fts_atoi(str);
+
+ /* CB_TEST */
+ GetPrivateProfileString("TestItem", "CB_TEST", "1", str, ini);
+ ft8719_item.cb_test = fts_atoi(str);
+
+ /* SHORT_CIRCUIT_TEST */
+ GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "0", str, ini);
+ ft8719_item.short_test = fts_atoi(str);
+
+ /* LCD_NOISE_TEST */
+ GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, ini);
+ ft8719_item.lcd_noise_test = fts_atoi(str);
+
+ /* OPEN_TEST */
+ GetPrivateProfileString("TestItem", "OPEN_TEST", "0", str, ini);
+ ft8719_item.open_test = fts_atoi(str);
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+static void init_detailthreshold_ft8719(char *ini)
+{
+ FTS_TEST_FUNC_ENTER();
+
+ OnInit_InvalidNode(ini);
+ OnInit_DThreshold_RawDataTest(ini);
+ OnInit_DThreshold_CBTest(ini);
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+static void set_testitem_sequence_ft8719(void)
+{
+ FTS_TEST_FUNC_ENTER();
+
+ test_data.test_num = 0;
+ /* Enter Factory Mode */
+ fts_set_testitem(CODE_FT8719_ENTER_FACTORY_MODE);
+
+ /* Short Test */
+ if (ft8719_item.short_test == 1) {
+ fts_set_testitem(CODE_FT8719_SHORT_CIRCUIT_TEST);
+ }
+
+ /* Open Test */
+ if (ft8719_item.open_test == 1) {
+ fts_set_testitem(CODE_FT8719_OPEN_TEST);
+ }
+
+ /* CB_TEST */
+ if (ft8719_item.cb_test == 1) {
+ fts_set_testitem(CODE_FT8719_CB_TEST);
+ }
+
+ /* RawData Test */
+ if (ft8719_item.rawdata_test == 1) {
+ fts_set_testitem(CODE_FT8719_RAWDATA_TEST);
+ }
+
+ /* LCD_NOISE_TEST */
+ if (ft8719_item.lcd_noise_test == 1) {
+ fts_set_testitem(CODE_FT8719_LCD_NOISE_TEST);
+ }
+
+ FTS_TEST_FUNC_EXIT();
+}
+
+struct test_funcs test_func_ft8719 = {
+ .ic_series = TEST_ICSERIES(IC_FT8719),
+ .init_testitem = init_testitem_ft8719,
+ .init_basicthreshold = init_basicthreshold_ft8719,
+ .init_detailthreshold = init_detailthreshold_ft8719,
+ .set_testitem_sequence = set_testitem_sequence_ft8719,
+ .start_test = start_test_ft8719,
+ .open_test = ft8719_open_selftest,
+ .short_test = ft8719_short_selftest,
+};
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore b/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore
new file mode 100644
index 000000000000..232d23dd9b84
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/.gitignore
@@ -0,0 +1 @@
+!*.i
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i
new file mode 100644
index 000000000000..842b6d6c91cb
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2t.i
@@ -0,0 +1,6304 @@
+0x2, 0x2, 0x89, 0x2, 0xc3, 0xf7, 0xeb, 0xaa, 0x8, 0x0, 0x0, 0x2, 0xc3, 0xc4,
+ 0xd3, 0x22, 0xb2, 0x86, 0x22, 0x2, 0xc4, 0x64, 0x7d, 0x23, 0x2, 0x1a, 0x89,
+ 0x2, 0xc3, 0xc9, 0x2, 0x42, 0xcd, 0x22, 0x22, 0x2, 0x1d, 0x81, 0x2, 0x42,
+ 0xcd, 0x22, 0x22, 0x2, 0x67, 0xb3, 0x7d, 0x43, 0x7f, 0x10, 0x80, 0x7, 0x1b,
+ 0x44, 0x7a, 0xb, 0xb0, 0xb, 0x14, 0x4d, 0x44, 0x78, 0xf5, 0x22, 0xc2, 0x1a,
+ 0x22, 0x2, 0x67, 0xfb, 0xa2, 0x93, 0xe4, 0x33, 0x22, 0x2, 0x1e, 0x8, 0x0,
+ 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x2, 0x60, 0x17, 0xff, 0xff, 0x2, 0xc6,
+ 0xd2, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x7c, 0xb7, 0x22, 0xff,
+ 0xff, 0x2, 0xc9, 0x8f, 0xca, 0xf8, 0x7f, 0x20, 0x80, 0xa, 0x7e, 0x1b, 0xf0,
+ 0x7a, 0x2b, 0xf0, 0xb, 0x34, 0xb, 0x54, 0x69, 0xff, 0xff, 0xfc, 0x7d, 0xef,
+ 0x1b, 0xe4, 0x79, 0xef, 0xff, 0xfc, 0x4d, 0xff, 0x78, 0xe6, 0x7f, 0x10,
+ 0xda, 0xf8, 0x22, 0xff, 0x0, 0x1, 0x2, 0x0, 0xff, 0x1, 0x2, 0x0, 0x1, 0xff,
+ 0x2, 0x0, 0x1, 0x2, 0xff, 0x7d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x48, 0x3, 0x7d,
+ 0x32, 0x22, 0x6d, 0x33, 0x9d, 0x32, 0x22, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8,
+ 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8,
+ 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8, 0xb, 0xb8,
+ 0xb, 0xb8, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4,
+ 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4,
+ 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4, 0x48, 0xf4,
+ 0x48, 0x7e, 0x37, 0x81, 0xed, 0x22, 0xdb, 0xf8, 0x24, 0x7, 0xd2, 0xd5, 0x2d,
+ 0x2a, 0x2b, 0xdb, 0xd4, 0x24, 0xe0, 0x1f, 0x13, 0xec, 0xff, 0xff, 0xff,
+ 0xff, 0xb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xf0, 0x6,
+ 0xc2, 0xd5, 0x7c, 0xb4, 0x30, 0xe7, 0x8, 0xb2, 0xd5, 0x6e, 0x24, 0xff, 0xff,
+ 0xb, 0x24, 0x7c, 0xb6, 0x30, 0xe7, 0x12, 0xb2, 0xd5, 0x6e, 0x34, 0xff, 0xff,
+ 0xb, 0x34, 0x8d, 0x32, 0x6e, 0x24, 0xff, 0xff, 0xb, 0x24, 0x80, 0x2, 0x8d,
+ 0x32, 0x30, 0xd5, 0x6, 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x22, 0x7d, 0x51,
+ 0xad, 0x3, 0x7d, 0x2, 0x7d, 0x21, 0xad, 0x5, 0x2d, 0x12, 0xad, 0x35, 0x2d,
+ 0x21, 0x22, 0x7d, 0x2, 0xad, 0x31, 0xad, 0x10, 0x2d, 0x21, 0x22, 0x6d, 0x0,
+ 0x74, 0x10, 0x4d, 0x0, 0x78, 0xb, 0x4d, 0x22, 0x78, 0x27, 0x8d, 0x31, 0x7d,
+ 0x12, 0x6d, 0x22, 0x22, 0x7d, 0x43, 0x7d, 0x32, 0x6d, 0x22, 0x2f, 0x11,
+ 0x2d, 0x44, 0x50, 0x2, 0xa5, 0xf, 0xbf, 0x10, 0x40, 0x4, 0x9f, 0x10, 0xb,
+ 0x90, 0x14, 0x78, 0xed, 0x7f, 0x1, 0x6d, 0x22, 0x7d, 0x34, 0x22, 0x7d, 0x41,
+ 0x7d, 0x13, 0x8d, 0x24, 0x7d, 0x2, 0x2f, 0x0, 0x40, 0x4, 0xbd, 0x4, 0x40,
+ 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14, 0x78, 0xf1, 0x7d, 0x23, 0x7d, 0x31, 0x7d,
+ 0x10, 0x6d, 0x0, 0x22, 0xc2, 0xd5, 0x7c, 0xb0, 0x30, 0xe7, 0x8, 0xb2, 0xd5,
+ 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x7c, 0xb4, 0x30, 0xe7, 0x13, 0xb2, 0xd5,
+ 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x12, 0x1, 0x6e, 0x9f, 0x22, 0x9f, 0x20,
+ 0x7f, 0x2, 0x80, 0x3, 0x12, 0x1, 0x6e, 0x30, 0xd5, 0x6, 0x9f, 0x22, 0x9f,
+ 0x21, 0x7f, 0x12, 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1a, 0x1e, 0x54,
+ 0x68, 0xe, 0xb, 0x38, 0x20, 0x1b, 0x18, 0x20, 0xb, 0x35, 0xb, 0x15, 0x1b,
+ 0x54, 0x78, 0xf2, 0x50, 0x6, 0x7e, 0x39, 0x40, 0x7a, 0x19, 0x40, 0x22, 0x6c,
+ 0xaa, 0xbe, 0x8, 0x0, 0x0, 0x68, 0x20, 0x1e, 0x54, 0xb, 0x54, 0x50, 0x16,
+ 0x7e, 0x1b, 0x80, 0x7a, 0xb, 0x80, 0xb, 0x1c, 0xb, 0xc, 0x80, 0xa, 0xb,
+ 0x1a, 0x40, 0x1b, 0xa, 0x40, 0xb, 0x1d, 0xb, 0xd, 0x1b, 0x54, 0x78, 0xf2,
+ 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc, 0x7e, 0x1b,
+ 0x0, 0x7a, 0x19, 0x0, 0x68, 0x12, 0xb, 0x1c, 0xb, 0x14, 0xb, 0x1a, 0x0,
+ 0x1b, 0x18, 0x0, 0xb, 0x1d, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2, 0x22, 0x6c,
+ 0xaa, 0xbe, 0x8, 0x0, 0x0, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc, 0x7e, 0x39,
+ 0x40, 0x7a, 0xb, 0x40, 0x68, 0x12, 0xb, 0x34, 0xb, 0xc, 0xb, 0x38, 0x20,
+ 0x1b, 0xa, 0x20, 0xb, 0x35, 0xb, 0xd, 0x1b, 0x54, 0x78, 0xf2, 0x22, 0x75,
+ 0x84, 0x1, 0x7e, 0x44, 0x9f, 0xff, 0xe4, 0x7a, 0x49, 0xb0, 0x1b, 0x44, 0x78,
+ 0xf9, 0x7e, 0xf8, 0x9b, 0xb1, 0x75, 0x14, 0x0, 0x75, 0x15, 0x0, 0xc2, 0x1c,
+ 0xc2, 0x1d, 0xc2, 0x1e, 0x75, 0xd, 0x0, 0x75, 0xe, 0x0, 0xc2, 0x2f, 0xc2,
+ 0x1f, 0xc2, 0x20, 0xc2, 0x21, 0xc2, 0x22, 0xc2, 0x23, 0xc2, 0x24, 0x75,
+ 0x18, 0x0, 0xc2, 0x25, 0xc2, 0x26, 0xc2, 0x30, 0xc2, 0x31, 0xd2, 0x32, 0xc2,
+ 0x27, 0xc2, 0x28, 0xc2, 0x14, 0xc2, 0x15, 0xc2, 0x16, 0xd2, 0x17, 0xc2,
+ 0x29, 0xc2, 0x2a, 0x75, 0x19, 0x6, 0xc2, 0xb, 0xc2, 0xc, 0xc2, 0xd, 0xc2,
+ 0xe, 0xc2, 0xf, 0xc2, 0x10, 0xd2, 0x11, 0xc2, 0x12, 0xc2, 0x13, 0xc2, 0x34,
+ 0xc2, 0x2b, 0xc2, 0x2c, 0xc2, 0x35, 0xc2, 0x36, 0xd2, 0x2d, 0xc2, 0x2e,
+ 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x14, 0x5, 0xd4, 0xb, 0xa, 0x40, 0x5d, 0x44,
+ 0x68, 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44, 0x80, 0xa, 0x7e, 0xb,
+ 0xb0, 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b, 0x44, 0x78, 0xf2, 0x80,
+ 0xdf, 0x2, 0x7, 0xfe, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0,
+ 0x3, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x6, 0x0, 0x7, 0x0, 0x6, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c,
+ 0x0, 0xa, 0x0, 0xc, 0x0, 0xc, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0xf, 0x0, 0x12, 0x0, 0x13,
+ 0x0, 0x12, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x92, 0x0, 0x15, 0x0, 0x19, 0x0, 0x1b, 0x0, 0x1b, 0x0, 0x19, 0x0, 0x15,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe7, 0x0, 0x1c, 0x0,
+ 0x21, 0x0, 0x24, 0x0, 0x25, 0x0, 0x24, 0x0, 0x21, 0x0, 0x1c, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x1, 0x58, 0x0, 0x24, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x30,
+ 0x0, 0x30, 0x0, 0x2e, 0x0, 0x2a, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
+ 0xe9, 0x0, 0x2d, 0x0, 0x34, 0x0, 0x39, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3c, 0x0,
+ 0x39, 0x0, 0x34, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x0, 0x37, 0x0,
+ 0x3f, 0x0, 0x45, 0x0, 0x49, 0x0, 0x4b, 0x0, 0x4b, 0x0, 0x49, 0x0, 0x45, 0x0,
+ 0x3f, 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0x0, 0x42, 0x0, 0x4b, 0x0, 0x52, 0x0, 0x57,
+ 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5a, 0x0, 0x57, 0x0, 0x52, 0x0, 0x4b, 0x0, 0x42,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4,
+ 0x84, 0x0, 0x4e, 0x0, 0x58, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6a, 0x0, 0x6c, 0x0,
+ 0x6c, 0x0, 0x6a, 0x0, 0x66, 0x0, 0x60, 0x0, 0x58, 0x0, 0x4e, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, 0x0, 0x5b, 0x0,
+ 0x66, 0x0, 0x6f, 0x0, 0x76, 0x0, 0x7b, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x7e, 0x0,
+ 0x7b, 0x0, 0x76, 0x0, 0x6f, 0x0, 0x66, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x2a, 0x0, 0x69, 0x0, 0x75, 0x0, 0x7f, 0x0,
+ 0x87, 0x0, 0x8d, 0x0, 0x91, 0x0, 0x93, 0x0, 0x93, 0x0, 0x91, 0x0, 0x8d, 0x0,
+ 0x87, 0x0, 0x7f, 0x0, 0x75, 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x8, 0xcf, 0x0, 0x78, 0x0, 0x85, 0x0, 0x90, 0x0, 0x99, 0x0, 0xa0, 0x0,
+ 0xa5, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xa8, 0x0, 0xa5, 0x0, 0xa0, 0x0, 0x99, 0x0,
+ 0x90, 0x0, 0x85, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0,
+ 0x88, 0x0, 0x96, 0x0, 0xa2, 0x0, 0xac, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xbe, 0x0,
+ 0xc0, 0x0, 0xc0, 0x0, 0xbe, 0x0, 0xba, 0x0, 0xb4, 0x0, 0xac, 0x0, 0xa2, 0x0,
+ 0x96, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0xc, 0xd1, 0x0, 0x99, 0x0, 0xa8, 0x0,
+ 0xb5, 0x0, 0xc0, 0x0, 0xc9, 0x0, 0xd0, 0x0, 0xd5, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+ 0xd8, 0x0, 0xd5, 0x0, 0xd0, 0x0, 0xc9, 0x0, 0xc0, 0x0, 0xb5, 0x0, 0xa8, 0x0,
+ 0x99, 0x0, 0x0, 0xf, 0x36, 0x0, 0xab, 0x0, 0xbb, 0x0, 0xc9, 0x0, 0xd5, 0x0,
+ 0xdf, 0x0, 0xe7, 0x0, 0xed, 0x0, 0xf1, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf1, 0x0,
+ 0xed, 0x0, 0xe7, 0x0, 0xdf, 0x0, 0xd5, 0x0, 0xc9, 0x0, 0xbb, 0x0, 0xab, 0x0,
+ 0x1, 0x37, 0xd2, 0x3, 0x0, 0x1, 0x37, 0xd4, 0x0, 0x0, 0x1, 0x37, 0xde, 0xc,
+ 0x0, 0x1, 0x37, 0xe2, 0x3, 0x0, 0x1, 0x37, 0xe6, 0x0, 0x0, 0x2, 0x38, 0x72,
+ 0x44, 0x40, 0x0, 0x1, 0x38, 0x7b, 0x0, 0x0, 0x1, 0x38, 0x82, 0x0, 0x0, 0x1,
+ 0x38, 0x83, 0x0, 0x0, 0x2, 0x38, 0x9a, 0x0, 0x0, 0x0, 0x1, 0x38, 0x9c, 0x1,
+ 0x0, 0x1, 0x38, 0x9d, 0x0, 0x0, 0x1, 0x39, 0xfb, 0x1, 0x0, 0x1, 0x9b, 0x1f,
+ 0x0, 0x0, 0x2, 0x9b, 0x20, 0x0, 0x0, 0x0, 0x1, 0x59, 0x39, 0xff, 0x0, 0x2,
+ 0x59, 0xab, 0x0, 0x0, 0x0, 0x14, 0x9b, 0x43, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0,
+ 0x14, 0x9b, 0x63, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3,
+ 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x1, 0x1, 0x1, 0x0, 0x1, 0x39, 0xfd, 0x0, 0x0,
+ 0x3c, 0x59, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xe9, 0x0, 0x0, 0x1, 0x59, 0xed, 0x11,
+ 0x0, 0x1, 0x2, 0x4a, 0x0, 0x0, 0x1, 0x2f, 0xb9, 0xff, 0x0, 0x1, 0x31, 0x5,
+ 0x0, 0x0, 0x2, 0x31, 0x6, 0x0, 0x0, 0x0, 0x4, 0x31, 0x8, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x1, 0x36, 0xa2, 0x0, 0x0, 0x2, 0x36, 0xf3, 0x0, 0x0, 0x0, 0x1, 0x39,
+ 0xe2, 0x1, 0x0, 0x1, 0x39, 0xdc, 0x0, 0x0, 0x6, 0x3, 0xeb, 0x10, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xf1, 0x64, 0x0, 0x1, 0x39, 0x3a, 0xff, 0x0,
+ 0x1, 0x39, 0x3b, 0xff, 0x0, 0x1, 0x39, 0x3f, 0x64, 0x0, 0x1, 0x39, 0x40,
+ 0x0, 0x0, 0x1, 0x39, 0xe3, 0x0, 0x0, 0x4, 0x39, 0xe4, 0x0, 0x0, 0xc6, 0x0,
+ 0x0, 0x1, 0x9b, 0x7d, 0x0, 0x0, 0x2, 0x9b, 0x80, 0x0, 0x21, 0x0, 0x1, 0x9b,
+ 0x84, 0x1, 0x0, 0x1, 0x9b, 0x87, 0x4, 0x0, 0x1, 0x9b, 0xa8, 0x1, 0x0, 0x1,
+ 0x9b, 0xab, 0x0, 0x0, 0x2, 0x9b, 0xac, 0x0, 0x20, 0x0, 0x1, 0x9b, 0xae, 0x0,
+ 0x0, 0x1, 0x9b, 0xaf, 0x0, 0x0, 0x1, 0x9b, 0xb1, 0x0, 0x0, 0x1, 0x3, 0xd4,
+ 0xff, 0x0, 0x2, 0x3, 0xd8, 0x0, 0x0, 0x0, 0x1, 0x3, 0xdb, 0x0, 0x0, 0x1,
+ 0x39, 0xff, 0x0, 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,
+ 0xf8, 0x1, 0x0, 0x1, 0x3, 0xc9, 0x0, 0x0, 0x2, 0x96, 0x5a, 0x96, 0x60, 0x0,
+ 0x1, 0x9a, 0x20, 0x2, 0x0, 0x2, 0x9a, 0x21, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x4b,
+ 0x0, 0x0, 0x2, 0x39, 0xf9, 0xc3, 0x0, 0x0, 0x4, 0x39, 0xe8, 0x0, 0x0, 0xc5,
+ 0x0, 0x0, 0x4, 0x8f, 0x18, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x4, 0x8f, 0x1c, 0x0,
+ 0x0, 0xa0, 0x0, 0x0, 0x4, 0x91, 0xfa, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x4, 0x39,
+ 0xed, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x4, 0x39, 0xf1, 0x0, 0x0, 0xc2, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x12, 0xcc,
+ 0x74, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x7a, 0xb3, 0x9b, 0x1f, 0x2, 0x32, 0x20,
+ 0x12, 0x46, 0xf6, 0x12, 0x5f, 0xb3, 0x12, 0x4e, 0x37, 0x12, 0x3b, 0x89,
+ 0x12, 0x72, 0x42, 0x12, 0x7, 0xef, 0x12, 0x8, 0x2c, 0x12, 0x5b, 0x60, 0x7e,
+ 0xb3, 0x59, 0x62, 0x24, 0xfd, 0x68, 0x9, 0xb, 0xb1, 0x78, 0xf4, 0x12, 0xa,
+ 0x1c, 0x80, 0xef, 0x12, 0xb, 0x9, 0x80, 0xea, 0xca, 0x79, 0x7e, 0xb3, 0x38,
+ 0x7b, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x21, 0x8c, 0x7e, 0x1f, 0x39, 0xed, 0x69,
+ 0xa1, 0x0, 0x6, 0x5e, 0xa4, 0x8, 0x0, 0x68, 0x2, 0x21, 0x51, 0x6c, 0xee,
+ 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf4, 0xb1, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24,
+ 0x0, 0x6, 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x6, 0x78, 0x4, 0xb,
+ 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0,
+ 0x6, 0x78, 0x10, 0x6c, 0xff, 0x12, 0xa, 0x3, 0x19, 0x7a, 0x38, 0x84, 0xb,
+ 0xf0, 0xbe, 0xf0, 0x6, 0x78, 0xf2, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0x12,
+ 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, 0x0, 0x9, 0x12, 0x9, 0x8f, 0x7d, 0xb3,
+ 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe,
+ 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x10, 0x6c, 0xff, 0x12,
+ 0xa, 0x3, 0x19, 0x7a, 0x37, 0xe7, 0xb, 0xf0, 0xbe, 0xf0, 0x9, 0x78, 0xf2,
+ 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xd2, 0x2, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24,
+ 0x0, 0x2, 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x2, 0x78, 0x4, 0xb,
+ 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0,
+ 0x2, 0x78, 0x10, 0x6c, 0xff, 0x12, 0xa, 0x3, 0x19, 0x7a, 0x38, 0x8c, 0xb,
+ 0xf0, 0xbe, 0xf0, 0x2, 0x78, 0xf2, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0x90,
+ 0x12, 0xa, 0xa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3,
+ 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e, 0x73, 0x91, 0xfe, 0x7a,
+ 0x73, 0x37, 0xe6, 0x12, 0x9, 0xf4, 0x7e, 0x34, 0xf3, 0xb3, 0x12, 0xa, 0xa,
+ 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec,
+ 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x37,
+ 0xd4, 0xbe, 0xe0, 0x5, 0x78, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x7b, 0x7e,
+ 0xb3, 0x38, 0x7b, 0xb4, 0x1, 0x34, 0x7e, 0x73, 0x38, 0x8c, 0x7a, 0x73, 0x59,
+ 0x5e, 0x7e, 0x73, 0x38, 0x8d, 0x7a, 0x73, 0x59, 0x5a, 0x7e, 0xb3, 0x59,
+ 0x5e, 0xb4, 0x86, 0x9, 0x7e, 0xb3, 0x59, 0x5a, 0xbe, 0xb0, 0x15, 0x68, 0xc,
+ 0x74, 0x87, 0x7a, 0xb3, 0x59, 0x5e, 0x74, 0x19, 0x7a, 0xb3, 0x59, 0x5a,
+ 0x7e, 0x73, 0x37, 0xe6, 0x7a, 0x73, 0x59, 0x6c, 0xda, 0x79, 0x22, 0x12,
+ 0xd8, 0xd, 0x80, 0x49, 0x6d, 0x33, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0,
+ 0xa, 0x12, 0xd7, 0xb9, 0x12, 0xdb, 0xa0, 0x7a, 0xb3, 0x39, 0xec, 0x80, 0xa,
+ 0x12, 0xd8, 0xaa, 0x68, 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xd8, 0x4e,
+ 0x68, 0xf1, 0x12, 0xd9, 0xc0, 0x7e, 0x6f, 0x39, 0xe8, 0x69, 0x36, 0x0, 0x4,
+ 0x5e, 0x34, 0x0, 0x2, 0x78, 0xf2, 0x7e, 0xb3, 0x39, 0xec, 0x70, 0x11, 0x69,
+ 0x36, 0x0, 0xa, 0x6c, 0x66, 0x7a, 0x7b, 0x70, 0xb, 0xf4, 0x1b, 0x14, 0x4d,
+ 0x11, 0x78, 0xb3, 0x2, 0x9, 0xe4, 0x6d, 0x33, 0x7e, 0x2f, 0x39, 0xe8, 0x1b,
+ 0x2a, 0x30, 0xc2, 0xcc, 0x7d, 0x32, 0x9d, 0x31, 0x22, 0x7e, 0x8, 0x91, 0xfe,
+ 0x7e, 0x34, 0x0, 0x9, 0xe4, 0x12, 0x0, 0x2e, 0x6c, 0xff, 0x22, 0xa, 0xaf,
+ 0x9, 0x7a, 0x91, 0xfe, 0x22, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x24, 0x0, 0x1,
+ 0x12, 0x9, 0x8f, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x1, 0x22, 0x30, 0x25, 0xc,
+ 0x7e, 0xb3, 0x59, 0xa9, 0xb4, 0x1, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12,
+ 0x32, 0x63, 0xc2, 0x25, 0xd2, 0x86, 0x12, 0x8, 0x2c, 0x7e, 0xb3, 0x3, 0xfd,
+ 0xb4, 0x1, 0x78, 0x12, 0x60, 0x5, 0x12, 0x59, 0xdc, 0xe4, 0x12, 0x68, 0x8e,
+ 0x12, 0xcb, 0x3a, 0x12, 0x70, 0x41, 0x12, 0x30, 0x5f, 0x12, 0xdb, 0xb0,
+ 0x12, 0x56, 0x1b, 0x12, 0x7f, 0x85, 0x12, 0xa, 0xed, 0x40, 0xd8, 0x12, 0xb0,
+ 0xe, 0x7e, 0xb3, 0x59, 0x5f, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x7e, 0xb3, 0x82,
+ 0x4, 0x70, 0x6, 0x12, 0x4e, 0x97, 0x12, 0xce, 0xf6, 0x12, 0x78, 0x84, 0x12,
+ 0xab, 0xd4, 0x12, 0xa, 0xed, 0x40, 0xb5, 0x74, 0x1, 0x12, 0xa, 0xc8, 0x12,
+ 0x65, 0x56, 0x12, 0x7f, 0x33, 0x12, 0x7f, 0xd6, 0x74, 0x2, 0x12, 0xa, 0xc8,
+ 0x12, 0x3c, 0x79, 0x74, 0x3, 0x12, 0xa, 0xc8, 0x12, 0x99, 0xd1, 0x74, 0x4,
+ 0x12, 0xa, 0xc8, 0x12, 0xd0, 0x7c, 0x12, 0x6c, 0xb3, 0x12, 0x59, 0xb4, 0x12,
+ 0x53, 0xfb, 0x12, 0x5f, 0xe0, 0x80, 0x81, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x12,
+ 0x57, 0x6e, 0x2, 0xa, 0xbf, 0x7e, 0x73, 0x59, 0x62, 0x7a, 0x73, 0x3, 0xfd,
+ 0x22, 0x24, 0xfd, 0x68, 0xa, 0xb, 0xb1, 0x78, 0x1c, 0xe4, 0x7a, 0xb3, 0x69,
+ 0x73, 0x22, 0x12, 0x9e, 0x81, 0x12, 0xa8, 0x1a, 0x12, 0xa8, 0xa0, 0x7a,
+ 0xb3, 0x69, 0x75, 0x12, 0x90, 0x6f, 0x12, 0x8d, 0xbd, 0x2, 0x9c, 0x6, 0x22,
+ 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x14, 0x7e, 0xb3, 0x59, 0x60, 0xbe, 0xb0, 0x3,
+ 0x68, 0xb, 0x12, 0xaa, 0x76, 0x12, 0xa, 0xbf, 0x12, 0x4f, 0x86, 0xd3, 0x22,
+ 0xc3, 0x22, 0x12, 0x40, 0x8, 0x7e, 0xb3, 0x3, 0xfd, 0xb4, 0x3, 0x2, 0x80,
+ 0x2, 0x61, 0xb3, 0x74, 0x4, 0x12, 0x68, 0x8e, 0x12, 0x32, 0xe0, 0x12, 0x30,
+ 0x5f, 0x12, 0x32, 0x99, 0x7e, 0xb3, 0x9a, 0xbc, 0x20, 0xe7, 0x7, 0x7e, 0xb3,
+ 0x9a, 0xcd, 0xb4, 0x1, 0x78, 0x12, 0x25, 0xee, 0x68, 0x5, 0xc2, 0x4, 0x12,
+ 0xb, 0xc5, 0x12, 0x30, 0xa3, 0x30, 0xe, 0xa, 0xc2, 0xe, 0xd2, 0x0, 0x12,
+ 0x32, 0xa8, 0x12, 0x32, 0xc0, 0x12, 0x25, 0xee, 0x68, 0x5, 0x12, 0x56, 0xf8,
+ 0x80, 0x9, 0x12, 0x56, 0x1b, 0x12, 0xda, 0xfe, 0x12, 0x57, 0x18, 0x7e, 0xb3,
+ 0x8d, 0x91, 0xb4, 0x1, 0x2f, 0x12, 0xb0, 0xe, 0x12, 0xce, 0xf6, 0x12, 0xab,
+ 0xd4, 0x12, 0x65, 0x56, 0x7e, 0xb3, 0x9a, 0xc2, 0x70, 0x1d, 0x7e, 0xb3,
+ 0x9b, 0x18, 0x70, 0x17, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a, 0x1d, 0x27, 0x7e,
+ 0x1f, 0x2d, 0x2e, 0x7f, 0x1, 0xe4, 0x12, 0xac, 0x8c, 0x12, 0xda, 0xfe, 0x12,
+ 0x77, 0x13, 0x12, 0x57, 0xb6, 0x12, 0x25, 0xee, 0x68, 0xd, 0x12, 0x27, 0xfb,
+ 0x7e, 0xb3, 0x9a, 0xbc, 0x54, 0x7f, 0x7a, 0xb3, 0x9a, 0xbc, 0x12, 0x28,
+ 0x53, 0x12, 0x40, 0x4d, 0x61, 0xc, 0xd2, 0x25, 0xd2, 0x4, 0x12, 0xb, 0xc5,
+ 0x12, 0x0, 0x21, 0x2, 0xa, 0xbf, 0x12, 0x32, 0xc0, 0xd2, 0x4, 0x12, 0x53,
+ 0xac, 0x80, 0x11, 0x12, 0xdb, 0xb7, 0x40, 0x3, 0x12, 0x53, 0xf1, 0x30, 0xb,
+ 0x3, 0x12, 0x53, 0xf1, 0x12, 0x30, 0xee, 0x12, 0xdb, 0xa8, 0x68, 0xea, 0x30,
+ 0x4, 0x3, 0x2, 0x4f, 0x63, 0x22, 0xca, 0x3b, 0x12, 0xda, 0x5d, 0x12, 0xdb,
+ 0x7, 0x12, 0x70, 0xf5, 0x12, 0x37, 0x5c, 0x7e, 0x34, 0xf3, 0xb3, 0x12, 0xc6,
+ 0xe, 0xf5, 0x14, 0xbe, 0xb0, 0x1, 0x50, 0xf, 0x7e, 0x34, 0xc5, 0xac, 0x12,
+ 0xc6, 0xe, 0xf5, 0x15, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0xd, 0x7e, 0x34, 0xf4,
+ 0xa2, 0x12, 0xc6, 0xe, 0xf5, 0x15, 0x7e, 0x34, 0xf4, 0xa2, 0x7e, 0xb3, 0x9b,
+ 0x7, 0x12, 0x31, 0x2b, 0xe5, 0x15, 0x7a, 0xb3, 0x9b, 0x6, 0x12, 0x61, 0x99,
+ 0x9, 0x75, 0x9b, 0x27, 0x7e, 0xf0, 0xee, 0xac, 0xf7, 0x2e, 0x74, 0x1, 0x0,
+ 0x12, 0xd8, 0x8e, 0x12, 0xd, 0x20, 0x7d, 0x63, 0x7a, 0x65, 0x27, 0x7e, 0x8,
+ 0x0, 0x27, 0x74, 0x3, 0x6c, 0x77, 0x12, 0x48, 0xfe, 0x12, 0xd8, 0x93, 0x7e,
+ 0x25, 0x27, 0x12, 0xd, 0x10, 0x12, 0xd8, 0x93, 0x12, 0xd, 0x20, 0x7a, 0x35,
+ 0x27, 0x12, 0xda, 0x17, 0x12, 0x32, 0x20, 0x12, 0x30, 0x5f, 0xd2, 0x4, 0x12,
+ 0xb, 0xc5, 0x12, 0x37, 0x5b, 0xe5, 0x14, 0xbe, 0xb0, 0x1, 0x50, 0x6, 0x7e,
+ 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0x7e, 0xb3, 0x9b, 0x8,
+ 0x12, 0x31, 0x2b, 0x12, 0xda, 0x17, 0x12, 0xb, 0xc0, 0x12, 0xd9, 0xcd, 0x7a,
+ 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d, 0x26, 0x7e, 0xa3, 0x9b, 0xaf, 0x74, 0x3,
+ 0xa4, 0x9, 0xb5, 0x9b, 0x59, 0x12, 0x27, 0x7f, 0x12, 0xcd, 0x61, 0x6d, 0x33,
+ 0x80, 0x22, 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x2f, 0x2d, 0x2e, 0x2d, 0x51, 0xb,
+ 0x2a, 0x0, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x5, 0xb, 0x2a, 0x20, 0x80, 0x4, 0x6d,
+ 0x22, 0x9d, 0x20, 0x59, 0x21, 0x3a, 0x0, 0xb, 0x34, 0x7e, 0x27, 0x8d, 0x94,
+ 0xbd, 0x23, 0x38, 0xd6, 0x12, 0xd8, 0x8e, 0x7d, 0x26, 0x12, 0xd, 0x10, 0x12,
+ 0xd8, 0x93, 0x12, 0xd, 0x20, 0x7a, 0x35, 0x27, 0xe5, 0x14, 0xbe, 0xb0, 0x1,
+ 0x50, 0x6, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0xe5,
+ 0x15, 0x12, 0x31, 0x2b, 0x12, 0x37, 0xfc, 0x74, 0xaa, 0x7a, 0xb3, 0x9b, 0x5,
+ 0xda, 0x3b, 0x22, 0x7d, 0x2, 0x7d, 0x53, 0x7d, 0x20, 0x12, 0x12, 0x86, 0x7d,
+ 0x35, 0x7d, 0x20, 0x2, 0x12, 0x79, 0x12, 0xda, 0x93, 0xb, 0x1a, 0x30, 0x22,
+ 0xca, 0x3b, 0x30, 0x0, 0x3, 0x2, 0x11, 0x24, 0x74, 0x3, 0x12, 0x14, 0xcb,
+ 0x7e, 0x34, 0x91, 0xfe, 0x7e, 0x24, 0x15, 0x15, 0x7e, 0x74, 0x0, 0xb9, 0x1b,
+ 0x38, 0x20, 0xb, 0x35, 0x1b, 0x74, 0x78, 0xf7, 0x12, 0xdb, 0x97, 0x7e, 0x24,
+ 0x0, 0xb9, 0x12, 0x17, 0x8f, 0x12, 0xdb, 0x97, 0x12, 0x17, 0x2a, 0x7e, 0xb3,
+ 0x9b, 0xaf, 0xb4, 0x1, 0x3f, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x30, 0x0, 0x1c,
+ 0x7a, 0x37, 0x37, 0xd8, 0x69, 0x30, 0x0, 0x1a, 0x7a, 0x37, 0x37, 0xdc, 0x69,
+ 0x30, 0x0, 0x12, 0x7a, 0x37, 0x38, 0x76, 0x69, 0x30, 0x0, 0x14, 0x7a, 0x37,
+ 0x38, 0x80, 0x7e, 0x34, 0x0, 0x3f, 0x79, 0x30, 0x0, 0x1a, 0x6d, 0x33, 0x12,
+ 0xc9, 0x34, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xc9, 0x51, 0x7e, 0x34, 0x0, 0x1,
+ 0x12, 0xc9, 0x46, 0xe4, 0x7a, 0xb3, 0x37, 0xe1, 0x74, 0x3, 0x7a, 0xb3, 0x37,
+ 0xe2, 0x7a, 0xb3, 0x37, 0xd2, 0x7e, 0x93, 0x9b, 0xaf, 0x4c, 0x99, 0x78,
+ 0x1d, 0xe5, 0xc2, 0x7a, 0xb3, 0x37, 0xe0, 0x12, 0xd9, 0x3, 0x43, 0xc3, 0x20,
+ 0x12, 0x26, 0x94, 0x43, 0xc3, 0xc0, 0x12, 0x26, 0x94, 0x43, 0xc2, 0x40,
+ 0x12, 0x26, 0x94, 0x80, 0x8, 0xbe, 0x90, 0x1, 0x78, 0x3, 0x12, 0xd9, 0x3,
+ 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x6, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4, 0x9e,
+ 0x7e, 0xb3, 0x69, 0xec, 0x60, 0xb, 0x6d, 0x33, 0x12, 0xc9, 0x2b, 0x12, 0xc9,
+ 0x67, 0x12, 0xc9, 0x3d, 0x12, 0x50, 0x24, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e,
+ 0x34, 0x0, 0x1f, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x76, 0x12, 0xdb, 0x8e,
+ 0x4e, 0x50, 0x1, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x25, 0x12, 0xd, 0x20,
+ 0x7a, 0x37, 0x3f, 0x2e, 0x12, 0xdb, 0x85, 0x5e, 0x24, 0x0, 0x9f, 0x4e, 0x40,
+ 0x76, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x27, 0x12, 0xd, 0x20, 0x7a, 0x37,
+ 0x3f, 0x32, 0x12, 0xdb, 0x7c, 0x5e, 0x24, 0xf6, 0x4f, 0x4e, 0x24, 0x60, 0xf,
+ 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x1, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f,
+ 0x36, 0x12, 0xdb, 0x73, 0x5e, 0x24, 0xc0, 0x0, 0x4e, 0x50, 0xc2, 0x12, 0xd,
+ 0x10, 0x7e, 0x34, 0x0, 0x2a, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x38, 0x12,
+ 0xdb, 0x6a, 0x5e, 0x50, 0xf, 0x4e, 0x50, 0x20, 0x12, 0xd, 0x10, 0x7e, 0xf,
+ 0x39, 0xed, 0x69, 0x30, 0x0, 0x4c, 0x7a, 0x37, 0x38, 0x7e, 0x7e, 0x53, 0x37,
+ 0xd2, 0xa, 0x55, 0x7d, 0x25, 0x12, 0x16, 0xf8, 0x2d, 0x25, 0x6c, 0x77, 0x4d,
+ 0x32, 0x79, 0x30, 0x0, 0x4c, 0x7e, 0xb3, 0x69, 0xec, 0x7e, 0x34, 0x0, 0x20,
+ 0x60, 0x2f, 0x12, 0xd, 0x20, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x2, 0x7e, 0x34,
+ 0x0, 0x20, 0x12, 0x14, 0xc4, 0x7d, 0x13, 0x5e, 0x14, 0x0, 0x2, 0x7e, 0x34,
+ 0x0, 0x20, 0x12, 0xd8, 0x9a, 0x12, 0xdb, 0xee, 0x4d, 0x21, 0x12, 0x15, 0xe,
+ 0x12, 0xd9, 0x14, 0x12, 0xdb, 0xee, 0x4d, 0x20, 0x80, 0x15, 0x12, 0xd8,
+ 0x9a, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x15, 0xe, 0x12, 0xd9, 0x14,
+ 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x28,
+ 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x34, 0x12, 0xdb, 0x61, 0x5e, 0x24, 0xf7,
+ 0xef, 0x4e, 0x40, 0x8, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x1b, 0x12, 0xd,
+ 0x20, 0x7a, 0x37, 0x3f, 0x44, 0x12, 0xdb, 0x58, 0x5e, 0x40, 0xdf, 0x12,
+ 0xdb, 0xe6, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x48, 0x7e, 0x34, 0x0, 0x17,
+ 0x7e, 0xb3, 0x37, 0xd3, 0x54, 0x3f, 0xa, 0x2b, 0x12, 0xd, 0x10, 0x7e, 0x34,
+ 0x0, 0x26, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x30, 0x12, 0xdb, 0x4f, 0x5e,
+ 0x24, 0xf1, 0xdf, 0x12, 0xd, 0x10, 0x6d, 0x33, 0x12, 0xd, 0x20, 0x7a, 0x37,
+ 0x3f, 0x4a, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x5e, 0x24, 0x7f, 0xfd,
+ 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x21, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f,
+ 0x4c, 0x12, 0xdb, 0x46, 0x5e, 0x40, 0xef, 0x12, 0x12, 0x86, 0x7e, 0x34, 0x0,
+ 0x21, 0x12, 0x14, 0xc4, 0x7a, 0x37, 0x3f, 0x4e, 0x12, 0xdb, 0x3d, 0x5e,
+ 0x40, 0xef, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x14, 0x12, 0xd, 0x20, 0x7a,
+ 0x37, 0x3f, 0x46, 0x12, 0xdb, 0x34, 0x5e, 0x24, 0xfc, 0x0, 0x12, 0xdb, 0xde,
+ 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x53,
+ 0x37, 0xd5, 0xa, 0x55, 0x12, 0x49, 0x61, 0x7e, 0x27, 0x3f, 0x5c, 0x5e, 0x24,
+ 0x8, 0x0, 0x4d, 0x25, 0x4e, 0x50, 0x2e, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0,
+ 0x16, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x52, 0x12, 0xdb, 0x2b, 0x5e, 0x24,
+ 0xf8, 0x0, 0x4e, 0x50, 0xc4, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x18, 0x12,
+ 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x58, 0x12, 0xdb, 0x22, 0x5e, 0x24, 0xfc, 0x0,
+ 0x4e, 0x50, 0xda, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x19, 0x12, 0xd, 0x20,
+ 0x7a, 0x37, 0x3f, 0x5a, 0x12, 0xdb, 0x19, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x24,
+ 0x1, 0x90, 0x12, 0xdb, 0xd6, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x56, 0x7e,
+ 0x34, 0x0, 0x1a, 0x6d, 0x22, 0x12, 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e,
+ 0x64, 0x0, 0x6, 0x12, 0xd9, 0x24, 0x59, 0x32, 0x3f, 0x3a, 0x7d, 0x27, 0x3e,
+ 0x24, 0x49, 0x32, 0x3f, 0x3a, 0x59, 0x32, 0x3f, 0x20, 0xb, 0x74, 0xbe, 0x74,
+ 0x0, 0x5, 0x78, 0xdf, 0x7e, 0xb3, 0x9b, 0xaf, 0x7e, 0x8, 0x3f, 0x26, 0x70,
+ 0x7, 0x12, 0xda, 0x6e, 0x74, 0x1, 0x80, 0x5, 0x12, 0xda, 0x6e, 0x74, 0x2,
+ 0x7e, 0x70, 0x1, 0x12, 0x48, 0xfe, 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12,
+ 0x48, 0xc7, 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12, 0x48, 0xef, 0x7e, 0x73,
+ 0x38, 0x78, 0xa, 0x37, 0x7a, 0x37, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x6, 0x7e,
+ 0x27, 0x3f, 0x20, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x9, 0x7e, 0x27, 0x3f,
+ 0x26, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0xa, 0x7e, 0x27, 0x3f, 0x28, 0x12,
+ 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0xb, 0x12, 0xd9, 0x24,
+ 0x59, 0x32, 0x3f, 0x5e, 0x12, 0xda, 0x64, 0x59, 0x32, 0x3f, 0x64, 0x12,
+ 0x12, 0x92, 0x78, 0xe7, 0x7e, 0x34, 0x0, 0xb, 0x7e, 0x24, 0x11, 0x11, 0x12,
+ 0xd, 0x10, 0x7e, 0x34, 0x0, 0xc, 0x7e, 0x24, 0x0, 0x1, 0x12, 0xd, 0x10,
+ 0x7e, 0x34, 0x1, 0xfb, 0x12, 0xd, 0x20, 0x7d, 0x73, 0x7e, 0x34, 0x0, 0xd,
+ 0x7d, 0x27, 0x12, 0xd, 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39,
+ 0x12, 0xd9, 0x24, 0x59, 0x32, 0x3f, 0x6a, 0x12, 0xda, 0x64, 0x59, 0x32,
+ 0x3f, 0x70, 0x12, 0x12, 0x92, 0x78, 0xe7, 0x7e, 0x34, 0x0, 0x39, 0x12, 0x17,
+ 0xe6, 0x7e, 0x34, 0x0, 0x3a, 0x12, 0x17, 0xe6, 0x7e, 0x34, 0x0, 0x3b, 0x7e,
+ 0x24, 0x50, 0x5, 0x12, 0x12, 0x86, 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x24, 0x12,
+ 0x34, 0x12, 0x12, 0x79, 0x7e, 0x34, 0x0, 0x3a, 0x7e, 0x24, 0x23, 0x45, 0x12,
+ 0x12, 0x79, 0x7e, 0x34, 0x0, 0x3b, 0x7e, 0x24, 0x10, 0x5, 0x12, 0x12, 0x79,
+ 0x41, 0x72, 0x7e, 0xa3, 0x9b, 0xaf, 0x4c, 0xaa, 0x78, 0x24, 0x7e, 0xb3,
+ 0x37, 0xe0, 0xf5, 0xc2, 0x7e, 0x73, 0x37, 0xe3, 0x7c, 0xb7, 0x54, 0xc0,
+ 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54, 0x20, 0x4c, 0xb7, 0xf5, 0xc3,
+ 0x7c, 0xb7, 0x54, 0x7, 0x4c, 0xb7, 0xf5, 0xc3, 0x80, 0xb, 0xbe, 0xa0, 0x1,
+ 0x78, 0x6, 0x7e, 0xb3, 0x37, 0xe3, 0xf5, 0xc3, 0x12, 0xc9, 0x5a, 0x12, 0xdb,
+ 0x8e, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x85, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x7c,
+ 0x12, 0xd, 0x10, 0x12, 0xdb, 0x73, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x6a, 0x12,
+ 0xd, 0x10, 0x12, 0xc9, 0x5a, 0x12, 0xd8, 0xa1, 0x12, 0x15, 0xe, 0x7e, 0x27,
+ 0x3f, 0x2c, 0x12, 0x12, 0x79, 0x12, 0xdb, 0x61, 0x12, 0xd, 0x10, 0x12, 0xdb,
+ 0x58, 0x12, 0xdb, 0xe6, 0x7e, 0x27, 0x3f, 0x48, 0x12, 0xd, 0x10, 0x12, 0xdb,
+ 0x4f, 0x12, 0xd, 0x10, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x12, 0xd, 0x10,
+ 0x12, 0xdb, 0x46, 0x12, 0x12, 0x86, 0x12, 0xdb, 0x3d, 0x12, 0x12, 0x79,
+ 0x12, 0xdb, 0x34, 0x12, 0xdb, 0xde, 0x7e, 0x27, 0x3f, 0x5c, 0x12, 0xd, 0x10,
+ 0x7e, 0x34, 0x0, 0x10, 0x7e, 0x27, 0x3f, 0x50, 0x12, 0xd, 0x10, 0x12, 0xdb,
+ 0x2b, 0x12, 0xdb, 0xd6, 0x7e, 0x27, 0x3f, 0x56, 0x12, 0xd, 0x10, 0x12, 0xdb,
+ 0x22, 0x12, 0xd, 0x10, 0x12, 0xdb, 0x19, 0x12, 0xd, 0x10, 0x7e, 0xb3, 0x69,
+ 0xec, 0x60, 0x8, 0x12, 0xc9, 0x23, 0x6d, 0x33, 0x12, 0xc9, 0x3d, 0x7e, 0xb3,
+ 0x9b, 0xaf, 0xb4, 0x1, 0x1c, 0x7e, 0x37, 0x37, 0xd8, 0x12, 0xc9, 0x34, 0x7e,
+ 0x37, 0x37, 0xdc, 0x12, 0xc9, 0x79, 0x7e, 0x37, 0x38, 0x76, 0x12, 0xc9,
+ 0x51, 0x7e, 0x37, 0x38, 0x80, 0x12, 0xc9, 0x46, 0x6d, 0x77, 0x7d, 0x67,
+ 0x2e, 0x64, 0x0, 0x6, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x3a, 0x12, 0xd,
+ 0x10, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xe8, 0x6d, 0x77, 0x12, 0x12,
+ 0x99, 0x49, 0x22, 0x3f, 0x5e, 0x12, 0x12, 0x86, 0x12, 0x12, 0x99, 0x49,
+ 0x22, 0x3f, 0x64, 0x12, 0x12, 0x8f, 0x78, 0xea, 0x6d, 0x77, 0x7d, 0x67,
+ 0x2e, 0x64, 0x0, 0x39, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x6a, 0x12, 0x12,
+ 0x86, 0x12, 0x12, 0x9f, 0x49, 0x22, 0x3f, 0x70, 0x12, 0x12, 0x8f, 0x78,
+ 0xe4, 0x12, 0x72, 0x64, 0x12, 0x17, 0x40, 0xda, 0x3b, 0x22, 0x7e, 0x27,
+ 0x8d, 0xf6, 0x7d, 0x12, 0x12, 0xda, 0x8a, 0x1b, 0x1a, 0x10, 0x22, 0x49,
+ 0x25, 0x8e, 0x2c, 0x7d, 0x12, 0x12, 0xda, 0x93, 0x1b, 0x1a, 0x10, 0x22,
+ 0x12, 0x12, 0x79, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x3, 0x22, 0x7d, 0x67, 0x2e,
+ 0x64, 0x0, 0xb, 0x7d, 0x36, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0xca, 0xf8, 0x6c,
+ 0xff, 0x74, 0xee, 0xac, 0xbf, 0x12, 0x75, 0xca, 0x12, 0xda, 0xf5, 0xa, 0xe7,
+ 0x3e, 0xe4, 0x3e, 0xe4, 0x3e, 0xe4, 0xb, 0xe6, 0x9, 0x75, 0x9b, 0x24, 0xa,
+ 0xd7, 0x3e, 0xd4, 0x3e, 0xd4, 0x3e, 0xd4, 0xb, 0xd6, 0x7e, 0xc4, 0x0, 0x2c,
+ 0x7a, 0xc5, 0x2f, 0x12, 0xd9, 0xe7, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0xd6,
+ 0xca, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0x1a, 0xea, 0x7d, 0x3e, 0x7d, 0x2d,
+ 0x74, 0x2a, 0x12, 0xd6, 0x6d, 0x12, 0xd9, 0x79, 0x12, 0x12, 0x86, 0x12,
+ 0xd9, 0x6a, 0x12, 0x75, 0x33, 0xac, 0xbf, 0x12, 0x75, 0xd1, 0x12, 0xd9,
+ 0x79, 0x12, 0x12, 0x79, 0x12, 0xd9, 0x6a, 0x12, 0x12, 0x79, 0x12, 0x75,
+ 0x36, 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x5a, 0x12, 0x12, 0x79, 0xb, 0xf0, 0xbe,
+ 0xf0, 0x4, 0x40, 0x8d, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7e, 0xf3, 0x9b, 0xa8,
+ 0x7e, 0x30, 0x8, 0xac, 0x3f, 0x9, 0xc1, 0x9b, 0x23, 0x9, 0xd1, 0x9b, 0x24,
+ 0x7e, 0x4, 0x0, 0x8, 0xca, 0x9, 0x2e, 0x14, 0x9b, 0x23, 0x6d, 0x0, 0x7e,
+ 0x18, 0x9a, 0xed, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x74, 0x8, 0xac, 0xbf, 0x9,
+ 0xe5, 0x9b, 0x27, 0x74, 0xee, 0xac, 0xbe, 0x7d, 0xa5, 0x2e, 0xa4, 0x1, 0x0,
+ 0x74, 0x3, 0x12, 0x14, 0xcb, 0x12, 0x14, 0xbd, 0x5e, 0x34, 0x1, 0x0, 0x68,
+ 0xd, 0x5e, 0xb4, 0xfe, 0xff, 0x7a, 0xb7, 0x38, 0x79, 0x7c, 0xbf, 0x12, 0x18,
+ 0x7, 0x12, 0x14, 0xbd, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x35, 0x5e, 0xb4, 0xff,
+ 0xfe, 0x7a, 0xb7, 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xed, 0x12, 0x0, 0xe, 0x50,
+ 0x18, 0x7e, 0xb3, 0x9a, 0xed, 0x12, 0xb8, 0xff, 0x50, 0xf, 0x7e, 0xb3, 0x9a,
+ 0xed, 0x12, 0x1b, 0x53, 0x12, 0x3a, 0x3d, 0x12, 0x12, 0xa6, 0x80, 0xc, 0x74,
+ 0x8, 0xac, 0xbf, 0x19, 0xc5, 0x9b, 0x23, 0x7a, 0xc3, 0x9a, 0xed, 0x12, 0x14,
+ 0xbd, 0x5e, 0x34, 0x0, 0x2, 0x68, 0x2c, 0x5e, 0xb4, 0xff, 0xfd, 0x7a, 0xb7,
+ 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xee, 0x12, 0x20, 0x6, 0x50, 0xf, 0x7e, 0xb3,
+ 0x9a, 0xee, 0x12, 0x1b, 0x95, 0x12, 0x3a, 0x3d, 0x12, 0x12, 0xa6, 0x80, 0xc,
+ 0x74, 0x8, 0xac, 0xbf, 0x19, 0xd5, 0x9b, 0x24, 0x7a, 0xd3, 0x9a, 0xee, 0x12,
+ 0x14, 0xbd, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x4e, 0x5e, 0xb4, 0xff, 0xfb, 0x7a,
+ 0xb7, 0x38, 0x79, 0x4e, 0xb4, 0x2, 0x0, 0x7a, 0xb7, 0x38, 0x79, 0x7c, 0xbf,
+ 0x12, 0x38, 0x7, 0x7e, 0x30, 0x3c, 0xac, 0x3e, 0x12, 0x1a, 0xbb, 0x12, 0xd6,
+ 0xfc, 0x7e, 0x30, 0x3c, 0xac, 0x3e, 0x12, 0xda, 0x45, 0x74, 0x8, 0xac, 0xbf,
+ 0x12, 0xd6, 0x48, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x34, 0x60, 0x7d, 0x3a, 0x2e,
+ 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0xdb, 0xcf, 0x7d, 0x3a, 0xb,
+ 0x35, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0x12, 0x82, 0x12, 0x14, 0xb6, 0x5e,
+ 0x24, 0x0, 0x10, 0x68, 0x12, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x38, 0x79, 0x7e,
+ 0xb3, 0x9a, 0xef, 0x7e, 0x73, 0x9a, 0xf0, 0x12, 0x74, 0xd5, 0x12, 0x14,
+ 0xb6, 0x5e, 0x24, 0x0, 0x40, 0x68, 0x11, 0x5e, 0x70, 0xbf, 0x7a, 0x37, 0x38,
+ 0x79, 0x7c, 0xbf, 0xa, 0xf, 0x12, 0x36, 0xca, 0x12, 0x5d, 0x6c, 0x12, 0x14,
+ 0xb6, 0x5e, 0x24, 0x0, 0x80, 0x68, 0xa, 0x5e, 0x70, 0x7f, 0x7a, 0x37, 0x38,
+ 0x79, 0x12, 0x17, 0x40, 0x12, 0x14, 0xb6, 0x5e, 0x24, 0x4, 0x0, 0x68, 0xe,
+ 0x5e, 0x60, 0xfb, 0x7a, 0x37, 0x38, 0x79, 0x7e, 0xb3, 0x9a, 0xc6, 0x12,
+ 0xb6, 0xda, 0x12, 0x14, 0xb6, 0x5e, 0x24, 0x20, 0x0, 0x68, 0xc, 0x5e, 0x60,
+ 0xdf, 0x7a, 0x37, 0x38, 0x79, 0x7c, 0xbf, 0x12, 0x47, 0xd5, 0xda, 0x3b,
+ 0x22, 0x7e, 0x37, 0x38, 0x79, 0x7d, 0x23, 0x22, 0x7e, 0xb7, 0x38, 0x79,
+ 0x7d, 0x3b, 0x22, 0x12, 0xda, 0x8a, 0xb, 0x1a, 0x30, 0x22, 0x7c, 0xab, 0x7e,
+ 0x8, 0x8d, 0xb6, 0x7c, 0xba, 0x12, 0xd6, 0x85, 0x7e, 0x8, 0x8d, 0xf6, 0x12,
+ 0xd6, 0x85, 0x12, 0x15, 0x6, 0x7e, 0x27, 0x8d, 0xf6, 0x2, 0x12, 0x79, 0xa2,
+ 0x6, 0x92, 0x9, 0x12, 0xc4, 0xf6, 0x12, 0xda, 0xb7, 0x12, 0x75, 0xb9, 0x12,
+ 0xda, 0xae, 0x12, 0x75, 0xb9, 0x12, 0x15, 0x6, 0x12, 0x12, 0x75, 0x12, 0x17,
+ 0xfe, 0x2, 0x12, 0x86, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x8d, 0xb6, 0x12,
+ 0x12, 0x86, 0x7e, 0x34, 0x0, 0x20, 0x22, 0xa2, 0x8, 0x92, 0x9, 0x12, 0xc4,
+ 0xf6, 0xa2, 0x8, 0x92, 0x9, 0x12, 0xda, 0xb7, 0x12, 0x75, 0x86, 0xa2, 0x8,
+ 0x92, 0x9, 0x12, 0xda, 0xae, 0x12, 0x75, 0x86, 0x12, 0x15, 0x6, 0x12, 0x12,
+ 0x75, 0x12, 0x17, 0xfe, 0x2, 0x12, 0x86, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xca,
+ 0xe4, 0x1b, 0xa0, 0x68, 0x46, 0x1b, 0xa0, 0x68, 0x62, 0x1b, 0xa0, 0x78, 0x2,
+ 0xc1, 0x5, 0x1b, 0xa0, 0x68, 0x76, 0xb, 0xa2, 0x68, 0x2, 0xc1, 0x24, 0xd2,
+ 0x8, 0x12, 0x15, 0x16, 0x7e, 0x34, 0x9a, 0x4c, 0x12, 0x16, 0x94, 0xd2, 0x2e,
+ 0xd2, 0x2d, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x10, 0xb, 0xa, 0x30,
+ 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0x49, 0xc6, 0x12, 0x1c, 0xb5, 0x4e,
+ 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0xc5, 0x45, 0x80, 0x72, 0xd2, 0x6, 0x12,
+ 0x14, 0xe7, 0x12, 0xd9, 0x88, 0x12, 0x16, 0x29, 0x12, 0xd9, 0x88, 0x12,
+ 0x16, 0xb8, 0x12, 0x16, 0xa0, 0x12, 0xda, 0x78, 0xb4, 0x1, 0x4, 0x74, 0x1,
+ 0x80, 0x6d, 0x80, 0x52, 0x12, 0x1f, 0xd9, 0x78, 0x7, 0xd2, 0x8, 0x12, 0x15,
+ 0x16, 0x80, 0x5, 0xd2, 0x6, 0x12, 0x14, 0xe7, 0x7e, 0x34, 0x9a, 0x62, 0x12,
+ 0x16, 0x94, 0xd2, 0x2e, 0xd2, 0x2d, 0x80, 0x34, 0x7e, 0x34, 0x0, 0xb, 0xca,
+ 0x39, 0x7e, 0x63, 0x9b, 0xaf, 0xac, 0x67, 0x2e, 0x34, 0x9a, 0x4c, 0x6d,
+ 0x22, 0x7e, 0x8, 0x94, 0xd6, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0,
+ 0x1, 0x7a, 0x37, 0x94, 0xd6, 0x7e, 0x34, 0x94, 0xd6, 0x12, 0x16, 0x94, 0x12,
+ 0xda, 0x78, 0xb4, 0x1, 0x4, 0x74, 0x4, 0x80, 0x19, 0x12, 0x1f, 0xf6, 0x80,
+ 0x21, 0x7e, 0x34, 0x9a, 0x6d, 0x12, 0x16, 0x94, 0x7e, 0xb3, 0x9b, 0x7f,
+ 0xb4, 0x1, 0xc, 0xd2, 0x2e, 0xd2, 0x2d, 0x74, 0x3, 0x7a, 0xb3, 0x9b, 0x82,
+ 0x80, 0x7, 0x12, 0xc4, 0x48, 0x80, 0x2, 0xc2, 0x5, 0xa2, 0x5, 0x22, 0x12,
+ 0xc9, 0x4f, 0x12, 0xc6, 0xc2, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x7f, 0x1b, 0xa,
+ 0x30, 0xe5, 0x47, 0x54, 0x1f, 0xa, 0x2b, 0x12, 0x16, 0xa7, 0xe5, 0x48, 0x12,
+ 0x16, 0xf2, 0x12, 0x16, 0xa7, 0xe5, 0x49, 0x54, 0x3, 0x12, 0x16, 0xf4, 0x3e,
+ 0x24, 0x12, 0x16, 0xa7, 0x7e, 0x35, 0x45, 0xbe, 0x34, 0x0, 0x2, 0x78, 0x35,
+ 0x12, 0xc6, 0xc2, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0xe5,
+ 0x4a, 0x54, 0x1f, 0x7c, 0x4b, 0x6c, 0x55, 0x12, 0x16, 0xa7, 0xe5, 0x4b,
+ 0x54, 0x1, 0xa, 0x5b, 0xc4, 0x23, 0x54, 0xe0, 0x7c, 0xab, 0xe4, 0x12, 0xda,
+ 0x81, 0x12, 0x48, 0xbe, 0xe5, 0x4c, 0x12, 0x4f, 0xdf, 0x12, 0xda, 0x81,
+ 0x12, 0x48, 0xbe, 0x22, 0x7e, 0x14, 0x0, 0x45, 0x74, 0xb, 0x12, 0x1, 0xf3,
+ 0x12, 0x16, 0x29, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x7b, 0x22, 0x7e, 0xf, 0x39,
+ 0xed, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30, 0x4d, 0x32, 0x1b, 0xa, 0x30,
+ 0x22, 0x12, 0xd7, 0x3b, 0x5e, 0x70, 0xf8, 0x12, 0xd7, 0x38, 0x4e, 0x70, 0x3,
+ 0x1b, 0xa, 0x30, 0x6d, 0x33, 0x12, 0xc9, 0x70, 0xe5, 0x4d, 0x54, 0x1f, 0xa,
+ 0x2b, 0x12, 0x17, 0xf5, 0x12, 0x16, 0xaf, 0xe5, 0x4e, 0x12, 0x16, 0xf2,
+ 0x12, 0x17, 0xf5, 0x12, 0x16, 0xaf, 0xe5, 0x4f, 0x54, 0x3, 0x12, 0x16, 0xf4,
+ 0x3e, 0x24, 0x12, 0x17, 0xf5, 0x2, 0x16, 0xaf, 0x54, 0x1, 0xa, 0x2b, 0x3e,
+ 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x22, 0x12, 0xc7,
+ 0x23, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4,
+ 0x7e, 0x34, 0x9d, 0x0, 0x12, 0xd7, 0x8b, 0xb4, 0x1, 0xa, 0x12, 0x1f, 0xd9,
+ 0x68, 0x5, 0xd2, 0x6, 0x12, 0x14, 0xe7, 0x12, 0xd7, 0x59, 0x2, 0x17, 0x2a,
+ 0x7d, 0x53, 0x3e, 0x54, 0x2e, 0x54, 0xb0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80,
+ 0x3, 0x12, 0xd7, 0xda, 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x12, 0x50, 0x6f, 0xe4,
+ 0x12, 0x5f, 0xbe, 0x12, 0x50, 0x66, 0x60, 0x29, 0x6d, 0x22, 0x12, 0x17,
+ 0xed, 0x7e, 0x8, 0x82, 0x51, 0x7d, 0x2b, 0x12, 0x17, 0xed, 0x7d, 0x1b, 0x3e,
+ 0x14, 0x2e, 0x14, 0x82, 0x51, 0x6d, 0x0, 0x7d, 0x2a, 0x12, 0x17, 0x8f, 0x7d,
+ 0x3a, 0x12, 0x50, 0x5d, 0x7e, 0x24, 0x0, 0x4, 0x2, 0x17, 0x8f, 0x12, 0x50,
+ 0x78, 0x7e, 0x8, 0x82, 0x51, 0x12, 0x50, 0x84, 0x2e, 0x14, 0x82, 0x51, 0x12,
+ 0x50, 0x54, 0x6d, 0x22, 0x2, 0x17, 0x2a, 0x7e, 0x24, 0x0, 0x17, 0x7d, 0x53,
+ 0x3e, 0x54, 0x2e, 0x54, 0xa0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12,
+ 0xd7, 0xda, 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x12, 0xc7, 0x23, 0x7e, 0x34,
+ 0x28, 0x1, 0x7a, 0x37, 0x8d, 0xc2, 0x7e, 0x34, 0x9, 0x70, 0x7a, 0x37, 0x8d,
+ 0xc4, 0x7e, 0x34, 0x8, 0x0, 0x7a, 0x37, 0x8d, 0xc6, 0x7e, 0xb3, 0x69, 0xec,
+ 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x0, 0x12,
+ 0xd7, 0x8b, 0xb4, 0x1, 0xa, 0x12, 0x1f, 0xd9, 0x68, 0x5, 0xd2, 0x6, 0x12,
+ 0x14, 0xe7, 0x12, 0xd7, 0x59, 0x2, 0x17, 0x2a, 0x7e, 0x24, 0x43, 0x21, 0x2,
+ 0x12, 0x86, 0x12, 0x17, 0x2a, 0x7e, 0x34, 0x1, 0x0, 0x22, 0x7e, 0xf, 0x39,
+ 0xed, 0x2e, 0x14, 0x0, 0x24, 0x22, 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27, 0x8d,
+ 0xc4, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x12, 0xda, 0xc0, 0x7e, 0x73, 0x9a,
+ 0xf3, 0x19, 0x75, 0x9b, 0x29, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x30,
+ 0x5, 0xac, 0x3e, 0x2e, 0x14, 0x9b, 0x43, 0x6d, 0x0, 0x7e, 0x18, 0x9a, 0xfc,
+ 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x12, 0x1c, 0xb, 0x74, 0x8, 0xac, 0xbe, 0x9,
+ 0xb5, 0x9b, 0x29, 0x12, 0x1a, 0xa5, 0x12, 0xd9, 0xa3, 0x7d, 0x3b, 0x2e,
+ 0x34, 0x0, 0xb, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x3e, 0x6d,
+ 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0xd8, 0x5b, 0x12, 0x17, 0x2a, 0xda, 0x79,
+ 0x22, 0x12, 0x49, 0x1e, 0x79, 0x50, 0x0, 0x4, 0x22, 0xca, 0x3b, 0x7c, 0xeb,
+ 0xbe, 0xe0, 0x4, 0x40, 0x2, 0x41, 0x86, 0x12, 0xda, 0xc0, 0xbe, 0xf0, 0x4,
+ 0x40, 0x2, 0x41, 0x86, 0x9, 0x75, 0x9b, 0x23, 0xa, 0x47, 0x3e, 0x44, 0x3e,
+ 0x44, 0x3e, 0x44, 0xb, 0x46, 0x7a, 0x45, 0x27, 0x9, 0x75, 0x9b, 0x24, 0xa,
+ 0x67, 0x3e, 0x64, 0x3e, 0x64, 0x3e, 0x64, 0xb, 0x66, 0x7e, 0x50, 0x3c, 0xac,
+ 0x5f, 0x2e, 0x24, 0x8e, 0x28, 0xb, 0x28, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0x28,
+ 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0x75, 0x9b, 0x2a, 0x2e, 0x70, 0xff, 0x92,
+ 0x1, 0x12, 0x1a, 0xce, 0x12, 0xd6, 0xeb, 0x7e, 0x90, 0x8, 0xac, 0x9e, 0x9,
+ 0xb4, 0x9b, 0x26, 0xf5, 0x29, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d, 0x13,
+ 0x12, 0x1a, 0xc7, 0x2e, 0x34, 0x8e, 0x5a, 0x6d, 0x22, 0x9, 0xb4, 0x9b, 0x25,
+ 0x12, 0x75, 0x3f, 0x12, 0x1a, 0xc2, 0x7e, 0x35, 0x27, 0x12, 0x1a, 0x99,
+ 0x12, 0x1a, 0xb6, 0x7d, 0x36, 0x12, 0x1a, 0x9f, 0x7e, 0x30, 0x3c, 0xac,
+ 0x3f, 0x12, 0xda, 0x45, 0x74, 0x8, 0xac, 0xbe, 0x12, 0xd6, 0x48, 0x12, 0x1a,
+ 0xb6, 0x74, 0x3, 0xac, 0xbe, 0x12, 0xd7, 0x0, 0x12, 0x1b, 0x47, 0x6d, 0x33,
+ 0x12, 0x0, 0x16, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12, 0x48, 0xa8, 0x7e, 0x70,
+ 0x5, 0xac, 0x7e, 0x9, 0xb3, 0x9b, 0x63, 0x9, 0x73, 0x9b, 0x64, 0x12, 0x48,
+ 0xfe, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12, 0x48, 0xa8, 0x74, 0x5, 0xac, 0xbe,
+ 0x9, 0xb5, 0x9b, 0x65, 0x12, 0x48, 0xaf, 0x12, 0x1a, 0xda, 0x9, 0xb5, 0x9b,
+ 0x66, 0x12, 0x48, 0xc7, 0x12, 0x1a, 0xda, 0x9, 0xb5, 0x9b, 0x67, 0x12, 0x48,
+ 0xef, 0x12, 0x1b, 0x26, 0x12, 0x0, 0x16, 0xc2, 0x1, 0x12, 0x1a, 0xf0, 0x12,
+ 0xd6, 0x9d, 0x12, 0x1c, 0xb, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x9b, 0x29,
+ 0x12, 0x1a, 0xa5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x8e, 0x3c, 0xb,
+ 0x28, 0x30, 0x7e, 0x34, 0x0, 0x2, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e,
+ 0x44, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x46, 0x6d, 0x33, 0x74,
+ 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x48, 0x7e, 0x34, 0x22, 0x5, 0x74, 0x3c,
+ 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x4a, 0x7e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac,
+ 0xbf, 0x59, 0x35, 0x8e, 0x4c, 0x7e, 0x34, 0x0, 0x12, 0x74, 0x3c, 0xac, 0xbf,
+ 0x59, 0x35, 0x8e, 0x4e, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x50,
+ 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x52, 0x7e, 0x34, 0x8, 0x8, 0x74,
+ 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x54, 0x6d, 0x33, 0x74, 0x3c, 0xac,
+ 0xbf, 0x59, 0x35, 0x8e, 0x5c, 0x7e, 0x34, 0x0, 0x1, 0x74, 0x3c, 0xac, 0xbf,
+ 0x59, 0x35, 0x8e, 0x56, 0x7e, 0x34, 0xc, 0x1c, 0x74, 0x3c, 0xac, 0xbf, 0x59,
+ 0x35, 0x8e, 0x58, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x8e, 0x5a, 0xb,
+ 0x28, 0x30, 0x4e, 0x34, 0x41, 0x96, 0x1b, 0x28, 0x30, 0x7e, 0x34, 0x1f, 0x0,
+ 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x5e, 0xbe, 0xe0, 0x3, 0x78, 0x19,
+ 0x7e, 0x34, 0x3, 0x51, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x38, 0x7e,
+ 0x34, 0x4, 0x4, 0x12, 0x1a, 0xad, 0x7e, 0x34, 0x4, 0x29, 0x80, 0x7, 0x7e,
+ 0x34, 0xa, 0x19, 0x12, 0x1a, 0xad, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e,
+ 0x62, 0x7e, 0x34, 0x0, 0x2c, 0x7a, 0x35, 0x2f, 0x12, 0xd9, 0xe7, 0x7e, 0x35,
+ 0x27, 0x7d, 0x26, 0x12, 0xd6, 0xca, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x12,
+ 0x1a, 0xea, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x74, 0x2a, 0x12, 0xd6, 0x6d,
+ 0x74, 0x3, 0x12, 0x14, 0xcb, 0x12, 0xd9, 0xa3, 0x7d, 0x3b, 0x12, 0x1a, 0xce,
+ 0x7e, 0x24, 0x0, 0x1e, 0x12, 0xd8, 0x5b, 0x7e, 0x24, 0x0, 0x3, 0x12, 0x17,
+ 0x2a, 0xda, 0x3b, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x34, 0xfc, 0x0, 0x1b, 0xa,
+ 0x30, 0x4d, 0x32, 0x1b, 0xa, 0x30, 0x22, 0x12, 0xd6, 0xc0, 0x2, 0x1a, 0x90,
+ 0x12, 0xd6, 0xc0, 0x2, 0x1a, 0x90, 0x12, 0x49, 0x1e, 0x79, 0x50, 0x0, 0x4,
+ 0x22, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x8e, 0x60, 0x22, 0x7e, 0x30,
+ 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x2c, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c,
+ 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x2a, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac,
+ 0x3f, 0x2e, 0x14, 0x8e, 0x28, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f,
+ 0x2e, 0x14, 0x8e, 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xbe, 0x22, 0x12, 0x1a,
+ 0xfc, 0x75, 0x2f, 0x2c, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e,
+ 0x5a, 0x6d, 0x0, 0x22, 0x7d, 0x52, 0x7d, 0x43, 0x7e, 0x1d, 0x2f, 0xb, 0x1a,
+ 0x30, 0x5e, 0x60, 0x7, 0x7e, 0x25, 0x33, 0x2d, 0x23, 0x7d, 0x35, 0x2d, 0x34,
+ 0xbe, 0x34, 0x0, 0xe0, 0x28, 0x8, 0x9e, 0x34, 0x0, 0xe0, 0x3e, 0x34, 0x2d,
+ 0x23, 0x2, 0x1a, 0x89, 0x12, 0x12, 0x86, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d,
+ 0x13, 0x2e, 0x14, 0x8e, 0x36, 0x6d, 0x0, 0x7a, 0xd, 0x2f, 0x7d, 0x13, 0x2e,
+ 0x14, 0x8e, 0x2a, 0x6d, 0x0, 0x2e, 0x34, 0x8e, 0x2c, 0x6d, 0x22, 0x12, 0x1b,
+ 0xd7, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x36, 0x6d, 0x0, 0x22,
+ 0xca, 0xf8, 0x7c, 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3,
+ 0x9b, 0x23, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8,
+ 0xac, 0xbf, 0x9, 0xa5, 0x9b, 0x23, 0x12, 0xd8, 0xbc, 0x12, 0x1a, 0xc2, 0x7d,
+ 0x3f, 0x12, 0x1a, 0x99, 0x7d, 0x3e, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbf, 0x49,
+ 0x25, 0x8e, 0x2a, 0x12, 0x1b, 0x23, 0x12, 0xd7, 0xf3, 0x40, 0xd9, 0xda,
+ 0xf8, 0x22, 0xca, 0xf8, 0x7c, 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f,
+ 0x19, 0xa3, 0x9b, 0x24, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff,
+ 0x74, 0x8, 0xac, 0xbf, 0x9, 0xa5, 0x9b, 0x24, 0x12, 0xd8, 0xbc, 0x12, 0x1a,
+ 0xb6, 0x7d, 0x3f, 0x12, 0x1a, 0x9f, 0x7d, 0x3e, 0xb, 0x35, 0x74, 0x3c, 0xac,
+ 0xbf, 0x49, 0x25, 0x8e, 0x2c, 0x12, 0x1b, 0x23, 0x12, 0xd7, 0xf3, 0x40,
+ 0xd9, 0xda, 0xf8, 0x22, 0x7f, 0x21, 0xb, 0xa, 0x20, 0x5e, 0x40, 0x7, 0xb,
+ 0x2a, 0x10, 0x5e, 0x20, 0x7, 0x7e, 0x2d, 0x2f, 0xb, 0x2a, 0x30, 0x5e, 0x60,
+ 0x3, 0x2d, 0x12, 0x2d, 0x13, 0x7e, 0x4, 0x0, 0xc9, 0x7e, 0x24, 0x0, 0xa7,
+ 0xbe, 0x14, 0x0, 0xb8, 0x68, 0x8, 0xbd, 0x1, 0x68, 0x4, 0xbd, 0x21, 0x78,
+ 0x2, 0xb, 0x34, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x3e,
+ 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x2e, 0x34, 0x9b, 0x43, 0x6d, 0x22,
+ 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x9b, 0x29, 0x12, 0x18, 0x5f, 0x7e, 0x30,
+ 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x8d, 0x9a, 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac,
+ 0x7e, 0x2e, 0x34, 0x9b, 0x43, 0x22, 0x12, 0x1f, 0xd9, 0x78, 0x7, 0xe4, 0x7a,
+ 0xb3, 0x9b, 0xa8, 0x80, 0x12, 0x7e, 0xb3, 0x9b, 0xa8, 0xb4, 0x2, 0x8, 0x74,
+ 0x2, 0x7a, 0xb3, 0x9b, 0xa8, 0x80, 0x3, 0x12, 0x1c, 0xa1, 0x7a, 0xb3, 0x9b,
+ 0xaf, 0x74, 0x2, 0x12, 0x18, 0x67, 0x7e, 0xb3, 0x9b, 0xa8, 0x24, 0x0, 0x68,
+ 0xe, 0x24, 0xfd, 0x68, 0x7, 0xb, 0xb1, 0x78, 0xc, 0x2, 0x3f, 0xdc, 0x2,
+ 0x1c, 0xa1, 0xe4, 0x12, 0x18, 0x67, 0x80, 0x0, 0x2, 0x1c, 0x87, 0x12, 0xcc,
+ 0x7f, 0x78, 0x6, 0xe4, 0x7a, 0xb3, 0x9b, 0xaf, 0x22, 0x12, 0x1c, 0xb9, 0x12,
+ 0xc7, 0xd, 0x12, 0xd7, 0x15, 0x12, 0x3f, 0xf9, 0x2, 0xc5, 0x49, 0x74, 0x1,
+ 0x7a, 0xb3, 0x9b, 0xa8, 0x22, 0x2e, 0x14, 0x0, 0xe, 0xb, 0xa, 0x30, 0x5e,
+ 0x60, 0xfd, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0xe,
+ 0xb, 0xa, 0x30, 0x22, 0x12, 0x1f, 0xd9, 0x68, 0x27, 0xd2, 0x30, 0x7e, 0xb3,
+ 0x9b, 0x7f, 0xb4, 0x1, 0x5, 0x12, 0x3f, 0xdc, 0x80, 0x3, 0x12, 0x1c, 0x87,
+ 0x12, 0x1c, 0xb5, 0x4e, 0x60, 0x2, 0x12, 0x1c, 0xb2, 0x12, 0x1f, 0xff, 0x12,
+ 0x1f, 0xca, 0xe4, 0x7a, 0xb3, 0x3, 0xda, 0x80, 0x36, 0x30, 0x30, 0x5, 0x12,
+ 0x17, 0xa5, 0xc2, 0x30, 0x12, 0x0, 0x40, 0x12, 0xcc, 0x8c, 0xe4, 0x12, 0x1f,
+ 0xcc, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0xa, 0x12, 0xd8, 0x44, 0x7a,
+ 0xb3, 0x9b, 0x7e, 0x7a, 0xb3, 0x59, 0x60, 0x7a, 0xb3, 0x3, 0xda, 0x7e, 0xf,
+ 0x39, 0xed, 0x12, 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x12, 0x3f, 0xb2, 0x12,
+ 0x3a, 0xdf, 0x12, 0x37, 0xa0, 0x2, 0x1d, 0x2c, 0x74, 0x1, 0x12, 0x32, 0x2b,
+ 0x6c, 0xaa, 0x7e, 0x63, 0x9b, 0xa8, 0x7e, 0x70, 0x8, 0xac, 0x67, 0x9, 0xb3,
+ 0x9b, 0x23, 0xa, 0x4b, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x49, 0x32, 0x76, 0x60,
+ 0xbd, 0x43, 0x78, 0x4, 0x7a, 0xa3, 0x39, 0x45, 0x7e, 0x50, 0x1e, 0xac, 0x5a,
+ 0x19, 0x72, 0x39, 0x49, 0xb, 0xa0, 0xbe, 0xa0, 0x3, 0x78, 0xd0, 0x7e, 0x73,
+ 0x39, 0x45, 0xbe, 0x70, 0x3, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0x45, 0x7e,
+ 0xb3, 0x39, 0x45, 0x12, 0xb7, 0x3d, 0x7e, 0x73, 0x39, 0x45, 0x7a, 0x73,
+ 0x39, 0xdb, 0x22, 0xca, 0xb8, 0xca, 0x1b, 0xca, 0xb, 0x12, 0x1d, 0xff, 0x5e,
+ 0x34, 0x80, 0x0, 0x68, 0x1c, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x80, 0x0, 0x68,
+ 0x13, 0x12, 0x1c, 0xb9, 0x6e, 0x70, 0x40, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x80,
+ 0x0, 0x12, 0x1f, 0xc1, 0x12, 0x1f, 0xe6, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0,
+ 0x2, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x2, 0x68, 0x10, 0x12,
+ 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x1f, 0xc1, 0x12,
+ 0x1f, 0xe6, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x1f, 0xb, 0xa,
+ 0x30, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x16, 0x12, 0x1c, 0xb9, 0x4e, 0x60, 0x2,
+ 0x12, 0x1c, 0xb2, 0x12, 0x1f, 0xff, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x1f, 0xc1,
+ 0x12, 0xc4, 0x3a, 0xc2, 0xc1, 0xda, 0xb, 0xda, 0x1b, 0xda, 0xb8, 0x32, 0x7e,
+ 0xf, 0x39, 0xed, 0x69, 0x30, 0x0, 0x4, 0x22, 0xca, 0x7b, 0xca, 0x6b, 0xca,
+ 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0x12, 0x1d, 0xff, 0x5e,
+ 0x34, 0x0, 0x40, 0x68, 0x52, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x40, 0x68,
+ 0x49, 0x7e, 0x34, 0x0, 0x40, 0x79, 0x30, 0x0, 0x2, 0x30, 0x1d, 0x5, 0x12,
+ 0x1f, 0xf6, 0xc2, 0x1d, 0x7e, 0xb3, 0x9b, 0x82, 0xbe, 0xb0, 0x1, 0x68, 0x3,
+ 0xb4, 0x4, 0x13, 0x12, 0x1f, 0xf6, 0x30, 0xd, 0x8, 0x7e, 0x73, 0x9b, 0x7b,
+ 0x7a, 0x73, 0x9b, 0x79, 0xe4, 0x7a, 0xb3, 0x9b, 0x82, 0x7e, 0x1f, 0x39,
+ 0xed, 0x69, 0x31, 0x0, 0xa, 0x5e, 0x34, 0xf, 0xc0, 0x12, 0x4e, 0x2c, 0x1e,
+ 0x34, 0x7a, 0x73, 0x9b, 0x7e, 0xe4, 0x7a, 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff,
+ 0x5e, 0x34, 0x0, 0x8, 0x68, 0x11, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x8,
+ 0x68, 0x8, 0x7e, 0x34, 0x0, 0x8, 0x79, 0x30, 0x0, 0x2, 0x12, 0x1d, 0xff,
+ 0x5e, 0x34, 0x0, 0x10, 0x68, 0x17, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x10,
+ 0x68, 0xe, 0x7e, 0x34, 0x0, 0x10, 0x79, 0x30, 0x0, 0x2, 0x74, 0x2, 0x7a,
+ 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x0, 0x20, 0x68, 0x17, 0xb,
+ 0xa, 0x30, 0x5e, 0x34, 0x0, 0x20, 0x68, 0xe, 0x7e, 0x34, 0x0, 0x20, 0x79,
+ 0x30, 0x0, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x3, 0xd4, 0x12, 0x1d, 0xff, 0x5e,
+ 0x34, 0x40, 0x0, 0x68, 0x2e, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x40, 0x0, 0x68,
+ 0x25, 0x7e, 0x34, 0x40, 0x0, 0x79, 0x30, 0x0, 0x2, 0xd2, 0xc, 0x7e, 0xb3,
+ 0x9b, 0x7a, 0xbe, 0xb0, 0xc8, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9b, 0x7a, 0x7e,
+ 0xb3, 0x9b, 0x7a, 0xb4, 0x1, 0x3, 0x12, 0x32, 0x20, 0x12, 0x53, 0xf1, 0x12,
+ 0x1d, 0xff, 0x5e, 0x34, 0x20, 0x0, 0x68, 0x16, 0xb, 0xa, 0x30, 0x5e, 0x34,
+ 0x20, 0x0, 0x68, 0xd, 0x7e, 0x34, 0x20, 0x0, 0x79, 0x30, 0x0, 0x2, 0xd2,
+ 0xc, 0x12, 0x53, 0xf1, 0x12, 0x1d, 0xff, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x66,
+ 0xb, 0xa, 0x30, 0x7d, 0x23, 0x5e, 0x24, 0x10, 0x0, 0x68, 0x5b, 0x5e, 0x34,
+ 0x8, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x92, 0xf, 0x69, 0x30, 0x0, 0x6, 0x7d,
+ 0x23, 0x5e, 0x24, 0x0, 0x1, 0x68, 0xc, 0x5e, 0x34, 0x4, 0x0, 0x2e, 0x34,
+ 0xff, 0xff, 0x72, 0xf, 0x92, 0xf, 0x7e, 0x34, 0x8, 0x0, 0x79, 0x30, 0x0,
+ 0x2, 0x7e, 0xb3, 0x38, 0x83, 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x38,
+ 0x83, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x1f, 0xc1, 0x80, 0x3d, 0xc2, 0x2e, 0x12,
+ 0xca, 0x81, 0x12, 0x49, 0xe4, 0x7e, 0xb3, 0x3, 0xfd, 0xbe, 0xb0, 0x3, 0x68,
+ 0xa, 0x12, 0x1f, 0xd9, 0x78, 0x5, 0xc2, 0x8, 0x12, 0x15, 0x16, 0x12, 0x1d,
+ 0xff, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0,
+ 0x4, 0x68, 0x10, 0x7e, 0x34, 0x0, 0x4, 0x79, 0x30, 0x0, 0x2, 0x7e, 0xb3,
+ 0x59, 0x60, 0x70, 0x2, 0xd2, 0x12, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda,
+ 0x4b, 0xda, 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32, 0x7e, 0xf, 0x39, 0xed, 0x79,
+ 0x30, 0x0, 0x2, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0xaf, 0x7a, 0xb3, 0x9b,
+ 0xa8, 0x22, 0xd2, 0xb, 0xd2, 0xe, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0,
+ 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x12, 0x1f, 0xd5, 0x78, 0x3, 0x2, 0xc4,
+ 0x1e, 0x22, 0x4e, 0x70, 0x2, 0x1b, 0xa, 0x30, 0x22, 0x12, 0xc6, 0xc2, 0xb,
+ 0xa, 0x30, 0x2, 0x1f, 0xef, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x22, 0x7c,
+ 0x7b, 0x74, 0x8, 0xac, 0x7b, 0xb, 0x36, 0xbe, 0x34, 0x0, 0x6, 0x50, 0x2,
+ 0xc3, 0x22, 0xd3, 0x22, 0x7c, 0x2b, 0xa5, 0xba, 0x0, 0x3, 0x2, 0x61, 0x79,
+ 0xa5, 0xba, 0x5f, 0x5, 0x7e, 0xb3, 0x9b, 0x1b, 0x22, 0xbe, 0x20, 0x5c, 0x38,
+ 0x7, 0xa, 0x32, 0x9, 0xb3, 0x9a, 0xbc, 0x22, 0xbe, 0x20, 0x6a, 0x68, 0x4,
+ 0xa5, 0xba, 0x6b, 0x1d, 0x7e, 0x37, 0x37, 0xda, 0x7d, 0x23, 0xb, 0x24, 0x7a,
+ 0x27, 0x37, 0xda, 0x2e, 0x37, 0x38, 0x92, 0x7e, 0x39, 0x30, 0xa5, 0xba,
+ 0x6b, 0x3, 0x75, 0xf, 0x6a, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6e, 0x68, 0x4,
+ 0xa5, 0xba, 0x6f, 0x2d, 0x7e, 0x7, 0x8d, 0x94, 0xbe, 0x7, 0x37, 0xd6, 0x7e,
+ 0x37, 0x37, 0xd6, 0x28, 0x8, 0x12, 0x21, 0xa8, 0x5e, 0x30, 0x3f, 0x80, 0x3,
+ 0x12, 0x21, 0xa8, 0x7e, 0x7, 0x37, 0xd6, 0xb, 0x4, 0x7a, 0x7, 0x37, 0xd6,
+ 0xa5, 0xba, 0x6f, 0x3, 0x75, 0xf, 0x6e, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6c,
+ 0x68, 0x4, 0xa5, 0xba, 0x6d, 0x1d, 0x7e, 0x37, 0x38, 0x8e, 0x7d, 0x23, 0xb,
+ 0x24, 0x7a, 0x27, 0x38, 0x8e, 0x2e, 0x37, 0x38, 0x74, 0x7e, 0x39, 0x30,
+ 0xa5, 0xba, 0x6d, 0x3, 0x75, 0xf, 0x6c, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x89,
+ 0x68, 0x4, 0xa5, 0xba, 0x8a, 0x1d, 0x7e, 0x37, 0x38, 0x98, 0x7d, 0x23, 0xb,
+ 0x24, 0x7a, 0x27, 0x38, 0x98, 0x2e, 0x37, 0x38, 0x94, 0x7e, 0x39, 0x30,
+ 0xa5, 0xba, 0x8a, 0x3, 0x75, 0xf, 0x89, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x10,
+ 0x7, 0x7e, 0x33, 0x9a, 0xcc, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x70, 0x40, 0xa,
+ 0xbe, 0x20, 0x7f, 0x38, 0x5, 0x7c, 0xb2, 0x2, 0x50, 0x92, 0xbe, 0x20, 0x81,
+ 0x68, 0x4, 0xa5, 0xba, 0x82, 0x19, 0x7e, 0xb3, 0x9a, 0xd3, 0xa, 0x3b, 0x9,
+ 0x33, 0x37, 0xf2, 0x4, 0x7a, 0xb3, 0x9a, 0xd3, 0xa5, 0xba, 0x82, 0x3, 0x75,
+ 0xf, 0x81, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x83, 0x5, 0x7e, 0xb3, 0x37, 0xde,
+ 0x22, 0xa5, 0xba, 0x86, 0x5, 0x7e, 0xb3, 0x37, 0xe2, 0x22, 0xa5, 0xba, 0x87,
+ 0x5, 0x7e, 0xb3, 0x37, 0xd2, 0x22, 0xa5, 0xba, 0x88, 0x3, 0xe5, 0xc4, 0x22,
+ 0xbe, 0x20, 0x92, 0x68, 0x4, 0xa5, 0xba, 0x93, 0x13, 0x7e, 0xb3, 0x37, 0xdf,
+ 0xa, 0x3b, 0x9, 0x33, 0x38, 0x84, 0xa5, 0xba, 0x93, 0x3, 0x75, 0xf, 0x92,
+ 0x80, 0x1a, 0xbe, 0x20, 0x94, 0x68, 0x4, 0xa5, 0xba, 0x95, 0x19, 0x7e, 0xb3,
+ 0x37, 0xdf, 0xa, 0x3b, 0x9, 0x33, 0x37, 0xe7, 0xa5, 0xba, 0x95, 0x3, 0x75,
+ 0xf, 0x94, 0x4, 0x7a, 0xb3, 0x37, 0xdf, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0xed,
+ 0x5, 0x7e, 0xb3, 0x38, 0x82, 0x22, 0xa5, 0xba, 0xee, 0x5, 0x7e, 0xb3, 0x38,
+ 0x7c, 0x22, 0xa5, 0xba, 0xef, 0x5, 0x7e, 0xb3, 0x38, 0x7d, 0x22, 0xa5, 0xba,
+ 0xfe, 0xd, 0x7e, 0x23, 0x9b, 0xa8, 0x74, 0x8, 0xac, 0xb2, 0x9, 0xb5, 0x9b,
+ 0x23, 0x22, 0xe4, 0x22, 0x2e, 0x37, 0x38, 0x8a, 0x7e, 0x39, 0x30, 0x22,
+ 0x7c, 0x7b, 0x6c, 0xaa, 0x12, 0x25, 0xf6, 0x78, 0x9, 0x7c, 0xb7, 0x12, 0x60,
+ 0x7c, 0x7c, 0xab, 0x80, 0xa, 0xb4, 0x4, 0x7, 0x7c, 0xb7, 0x12, 0x20, 0x18,
+ 0x7c, 0xab, 0x7c, 0xba, 0x22, 0x30, 0x90, 0x19, 0xc2, 0x90, 0xe5, 0x8, 0x70,
+ 0x9, 0x75, 0x8, 0x1, 0xe5, 0x91, 0xf5, 0xf, 0x80, 0x11, 0x7e, 0x71, 0x91,
+ 0xe5, 0xf, 0x12, 0x21, 0xfa, 0x5, 0xf, 0x30, 0x91, 0xb, 0xc2, 0x91, 0x5,
+ 0xf, 0xe5, 0xf, 0x12, 0x21, 0xb0, 0xf5, 0x91, 0x22, 0x7c, 0x6b, 0x12, 0x25,
+ 0xf6, 0x78, 0x5, 0x7c, 0xb6, 0x2, 0x25, 0xfe, 0xb4, 0x4, 0x5, 0x7c, 0xb6,
+ 0x2, 0x22, 0xf, 0x22, 0x7c, 0x6b, 0xa5, 0xbe, 0x0, 0x7, 0x7c, 0xb7, 0x12,
+ 0x68, 0x27, 0xa1, 0xc5, 0xa5, 0xbe, 0xf, 0xd, 0x7a, 0x73, 0x9a, 0xcb, 0x74,
+ 0x1, 0x7a, 0xb3, 0x9a, 0xcc, 0xd2, 0x1e, 0x22, 0xa5, 0xbe, 0x49, 0x19, 0xa5,
+ 0xbf, 0x1, 0x7, 0x7a, 0x73, 0x9b, 0x5, 0xd2, 0x1e, 0x22, 0xa5, 0xbf, 0x0,
+ 0x2, 0x80, 0x2, 0xa1, 0xc5, 0x7a, 0x73, 0x9b, 0x5, 0xa1, 0xc5, 0xa5, 0xbe,
+ 0x4a, 0x6, 0x7a, 0x73, 0x9b, 0x6, 0xa1, 0xc5, 0xa5, 0xbe, 0x4b, 0x6, 0x7a,
+ 0x73, 0x9b, 0x7, 0xa1, 0xc5, 0xa5, 0xbe, 0x4c, 0x6, 0x7a, 0x73, 0x9b, 0x8,
+ 0xa1, 0xc5, 0xa5, 0xbe, 0x11, 0x29, 0xa5, 0xbf, 0x1, 0x15, 0x12, 0x25, 0xee,
+ 0x78, 0x2, 0xa1, 0xe4, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xcd, 0xe4, 0x7a, 0xb3,
+ 0x9a, 0xcf, 0x2, 0xda, 0x29, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0xa1, 0xe4,
+ 0xe4, 0x7a, 0xb3, 0x9a, 0xcd, 0x2, 0xdb, 0x10, 0xa5, 0xbe, 0x12, 0xf, 0xa,
+ 0x27, 0x3e, 0x24, 0x3e, 0x24, 0x7a, 0x27, 0x38, 0x96, 0x7a, 0x73, 0x9a,
+ 0xce, 0x22, 0xa5, 0xbe, 0x13, 0xd, 0x7c, 0x67, 0x6c, 0x77, 0x2e, 0x37, 0x38,
+ 0x96, 0x7a, 0x37, 0x38, 0x96, 0x22, 0xa5, 0xbe, 0x1, 0x1b, 0x7e, 0xf, 0x2d,
+ 0x2e, 0x7d, 0x21, 0x7a, 0x27, 0x38, 0x92, 0x6d, 0x22, 0x7a, 0x27, 0x37,
+ 0xda, 0x7a, 0x73, 0x9a, 0xbd, 0x7c, 0xb7, 0x12, 0x53, 0x4, 0xa1, 0xc5, 0xbe,
+ 0x60, 0x5c, 0x28, 0x2, 0x81, 0xb9, 0xa5, 0xbe, 0x30, 0x11, 0x7e, 0x53, 0x9a,
+ 0xec, 0xbc, 0x57, 0x78, 0x2, 0xa1, 0xe4, 0xbe, 0x70, 0x4, 0x40, 0x2, 0xa1,
+ 0xe4, 0xbe, 0x60, 0x20, 0x40, 0xc, 0xbe, 0x60, 0x24, 0x38, 0x7, 0xbe, 0x70,
+ 0x3, 0x28, 0x2, 0xa1, 0xe4, 0x7c, 0xb6, 0x24, 0xf9, 0x78, 0x2, 0xa1, 0xe4,
+ 0x24, 0xfb, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78,
+ 0x2, 0xa1, 0xe4, 0x24, 0xe3, 0x78, 0x2, 0xa1, 0xe4, 0x14, 0x78, 0x2, 0xa1,
+ 0xe4, 0x80, 0x0, 0xa, 0x26, 0x19, 0x72, 0x9a, 0xbc, 0x7c, 0xb6, 0x1b, 0xb2,
+ 0xbe, 0xb0, 0x45, 0x40, 0x2, 0x81, 0x8f, 0x7e, 0xa0, 0x3, 0xa4, 0x90, 0x23,
+ 0x43, 0x73, 0x2, 0x24, 0x12, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x12, 0x2, 0x24,
+ 0x8f, 0x2, 0x24, 0x16, 0x2, 0x24, 0x12, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f,
+ 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2,
+ 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24,
+ 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f,
+ 0x2, 0x24, 0x55, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x62, 0x2, 0x24, 0x8f, 0x2,
+ 0x24, 0x75, 0x2, 0x24, 0x12, 0x2, 0x24, 0x12, 0x2, 0x24, 0x1b, 0x2, 0x24,
+ 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x1b, 0x2, 0x24, 0x8f,
+ 0x2, 0x24, 0x84, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2,
+ 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24,
+ 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x12, 0x2, 0x24, 0x2d, 0x2, 0x24, 0x36,
+ 0x2, 0x24, 0x48, 0x2, 0x24, 0x48, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x3f, 0x2,
+ 0x24, 0x24, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24,
+ 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f, 0x2, 0x24, 0x8f,
+ 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2,
+ 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24, 0x24, 0x2, 0x24,
+ 0x24, 0xd2, 0x1e, 0x80, 0x79, 0x12, 0x0, 0x10, 0x80, 0x74, 0x7e, 0x27, 0x38,
+ 0x79, 0x4e, 0x40, 0x20, 0x80, 0x2b, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x40, 0x1,
+ 0x80, 0x22, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x1, 0x80, 0x19, 0x7e, 0x27,
+ 0x38, 0x79, 0x4e, 0x50, 0x2, 0x80, 0x10, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50,
+ 0x4, 0x80, 0x7, 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x10, 0x7a, 0x27, 0x38,
+ 0x79, 0x80, 0x3a, 0x7e, 0x53, 0x9a, 0xd4, 0x12, 0x25, 0xe5, 0x7a, 0x27,
+ 0x37, 0xd6, 0x80, 0x2d, 0x7e, 0x53, 0x9a, 0xd6, 0x12, 0x25, 0xe5, 0x3e,
+ 0x24, 0x7a, 0x27, 0x38, 0x8e, 0x7a, 0x27, 0x37, 0xf0, 0x80, 0x1a, 0x7e,
+ 0x53, 0x9a, 0xd8, 0x12, 0x25, 0xe5, 0x3e, 0x24, 0x7a, 0x27, 0x37, 0xda,
+ 0x80, 0xb, 0x7e, 0x53, 0x9a, 0xe1, 0x12, 0x25, 0xe5, 0x7a, 0x53, 0x9b, 0x7c,
+ 0xbe, 0x60, 0x3b, 0x40, 0x10, 0xbe, 0x60, 0x3e, 0x38, 0xb, 0x7e, 0x27, 0x38,
+ 0x79, 0x4e, 0x40, 0x2, 0x7a, 0x27, 0x38, 0x79, 0xa5, 0xbe, 0xa, 0x2, 0x80,
+ 0x2, 0xa1, 0xc5, 0x7e, 0x37, 0x38, 0x79, 0x4e, 0x60, 0x4, 0x7a, 0x37, 0x38,
+ 0x79, 0xa1, 0xc5, 0xbe, 0x60, 0x6c, 0x68, 0x4, 0xa5, 0xbe, 0x6d, 0x2b, 0x7e,
+ 0x27, 0x38, 0x79, 0x4e, 0x50, 0x80, 0x7a, 0x27, 0x38, 0x79, 0x7e, 0x27,
+ 0x37, 0xf0, 0x7d, 0x12, 0xb, 0x14, 0x7a, 0x17, 0x37, 0xf0, 0x2e, 0x27, 0x38,
+ 0x74, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6d, 0x2, 0x80, 0x2, 0xa1, 0xc5, 0x75,
+ 0xf, 0x6c, 0xa1, 0xc5, 0xbe, 0x60, 0x6e, 0x68, 0x4, 0xa5, 0xbe, 0x6f, 0x56,
+ 0x7e, 0x27, 0x38, 0x79, 0x4e, 0x50, 0x40, 0x7a, 0x27, 0x38, 0x79, 0x7e,
+ 0x43, 0x9a, 0xd4, 0x6c, 0x55, 0x7e, 0xb3, 0x9a, 0xd5, 0xa, 0x1b, 0x2d, 0x12,
+ 0x4, 0x7a, 0xb3, 0x9a, 0xd5, 0x70, 0x9, 0x7e, 0xb3, 0x9a, 0xd4, 0x4, 0x7a,
+ 0xb3, 0x9a, 0xd4, 0x7e, 0x27, 0x8d, 0x94, 0xbd, 0x21, 0x28, 0xf, 0x7c, 0xb7,
+ 0x54, 0x3f, 0x7e, 0x27, 0x38, 0x8a, 0x2d, 0x21, 0x7a, 0x29, 0xb0, 0x80, 0x9,
+ 0x7e, 0x27, 0x38, 0x8a, 0x2d, 0x21, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6f, 0x2,
+ 0x80, 0x2, 0xa1, 0xc5, 0x75, 0xf, 0x6e, 0x80, 0x79, 0xbe, 0x60, 0x70, 0x40,
+ 0xc, 0xbe, 0x60, 0x7f, 0x38, 0x7, 0x7c, 0xb6, 0x12, 0x51, 0x24, 0x80, 0x68,
+ 0xa5, 0xbe, 0x83, 0x6, 0x7a, 0x73, 0x37, 0xde, 0x80, 0x5e, 0xa5, 0xbe, 0x86,
+ 0xf, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3, 0x37, 0xe2, 0x53, 0xc3, 0xf8, 0x42,
+ 0xc3, 0x80, 0x4b, 0xa5, 0xbe, 0x87, 0x1a, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3,
+ 0x37, 0xd2, 0xa, 0x2b, 0x7d, 0x32, 0x12, 0x70, 0x95, 0x2e, 0x34, 0x7f, 0x0,
+ 0x2d, 0x32, 0x12, 0xc9, 0x5e, 0x80, 0x2d, 0xa5, 0xbe, 0x88, 0x5, 0x7a, 0x71,
+ 0xc4, 0x80, 0x24, 0xa5, 0xbe, 0xed, 0x20, 0x7a, 0x73, 0x38, 0x82, 0xa5,
+ 0xbf, 0x4, 0x5, 0x12, 0xda, 0x5d, 0x80, 0x13, 0xa5, 0xbf, 0x2, 0x8, 0x6d,
+ 0x33, 0x7a, 0x37, 0x37, 0xd6, 0x80, 0x7, 0xa5, 0xbf, 0x3, 0x3, 0x12, 0xda,
+ 0x56, 0x30, 0x1e, 0xa, 0x7e, 0xb3, 0x9a, 0xca, 0x44, 0x1, 0x7a, 0xb3, 0x9a,
+ 0xca, 0x7e, 0x37, 0x38, 0x79, 0x4d, 0x33, 0x68, 0xa, 0x7e, 0xb3, 0x9a, 0xca,
+ 0x44, 0x2, 0x7a, 0xb3, 0x9a, 0xca, 0x22, 0x7c, 0x25, 0x6c, 0x33, 0xa, 0x27,
+ 0x2d, 0x21, 0x22, 0x7e, 0xb3, 0x9a, 0xcd, 0xbe, 0xb0, 0x1, 0x22, 0x7e, 0xb3,
+ 0x9a, 0xbc, 0xc4, 0x54, 0x7, 0x22, 0x7c, 0xa7, 0x7c, 0x3b, 0xa5, 0xbb, 0x0,
+ 0x7, 0x7c, 0xba, 0x12, 0x68, 0x27, 0x80, 0x25, 0xbe, 0x30, 0xeb, 0x68, 0x4,
+ 0xa5, 0xbb, 0xec, 0x9, 0x7c, 0xb3, 0x7c, 0x7a, 0x12, 0x68, 0x52, 0x80, 0x13,
+ 0xbe, 0x30, 0x80, 0x40, 0xe, 0xbe, 0x30, 0xef, 0x38, 0x9, 0x7c, 0xb3, 0x24,
+ 0x80, 0x7c, 0x7a, 0x12, 0x6f, 0xf8, 0xa5, 0xbb, 0xfc, 0x5, 0x7c, 0xba, 0x2,
+ 0x26, 0x4e, 0xa5, 0xbb, 0xfd, 0x8, 0xbe, 0xa0, 0x5a, 0x78, 0x9, 0xd2, 0x2f,
+ 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xfb, 0x22, 0x24, 0xab, 0x68, 0x10, 0x24,
+ 0xef, 0x68, 0x1c, 0x24, 0xde, 0x68, 0x26, 0x24, 0xde, 0x78, 0x2f, 0x74, 0x5,
+ 0x80, 0x2d, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0x2a, 0x12, 0x26, 0x94, 0x12,
+ 0x42, 0xf7, 0x2, 0x0, 0x1e, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0x1a, 0x12,
+ 0x26, 0x94, 0x75, 0xe9, 0xff, 0x22, 0x7e, 0xb3, 0x39, 0xfb, 0xb4, 0x5, 0xc,
+ 0x12, 0x26, 0x94, 0x2, 0x0, 0x26, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xfb, 0x22,
+ 0x7e, 0x34, 0x0, 0x1, 0x7d, 0x3, 0x80, 0x14, 0x7e, 0xa0, 0x4, 0x80, 0x7,
+ 0x7e, 0x34, 0x0, 0xfa, 0x12, 0xc5, 0x49, 0x7c, 0x7a, 0x1b, 0xa0, 0xa5, 0xbf,
+ 0x0, 0xf1, 0x7d, 0x10, 0x1b, 0x4, 0x4d, 0x11, 0x78, 0xe4, 0x22, 0xca, 0x3b,
+ 0xf5, 0x37, 0x7f, 0x31, 0x7a, 0xd, 0x2f, 0x12, 0x32, 0xc0, 0x7e, 0xb3, 0x9b,
+ 0x5, 0xb4, 0x1, 0x1e, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x12, 0x26, 0x94, 0x12,
+ 0xd9, 0x3d, 0x12, 0x27, 0x36, 0x12, 0x27, 0x29, 0x12, 0xd9, 0x2e, 0x12,
+ 0x27, 0x6f, 0x7f, 0x3, 0x12, 0x27, 0x75, 0x80, 0x32, 0x75, 0x38, 0x0, 0x80,
+ 0x1f, 0x30, 0xb, 0x3, 0x12, 0x53, 0xf1, 0x12, 0x55, 0xc5, 0xe5, 0x38, 0x70,
+ 0xa, 0x12, 0xd9, 0x3d, 0x12, 0x27, 0x6f, 0x5, 0x38, 0x80, 0x8, 0x12, 0x27,
+ 0x29, 0x7f, 0x3, 0x12, 0x27, 0x75, 0x12, 0xdb, 0xa8, 0x68, 0xdc, 0x12, 0x4f,
+ 0x63, 0x12, 0xd9, 0x2e, 0x12, 0x27, 0x36, 0x7e, 0xd, 0x33, 0x7e, 0xb3, 0x9b,
+ 0x38, 0x12, 0x27, 0x7f, 0xda, 0x3b, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a,
+ 0x1d, 0x3d, 0x7f, 0x3, 0x7e, 0x18, 0x13, 0x60, 0x7f, 0x61, 0x7f, 0x70, 0x12,
+ 0x77, 0xa5, 0x12, 0xaf, 0xac, 0x7d, 0x3f, 0x7a, 0x37, 0x92, 0x6, 0x7e, 0x34,
+ 0x0, 0x20, 0x12, 0xaf, 0x99, 0x2, 0x27, 0x50, 0xa9, 0xd6, 0xcb, 0xc2, 0x37,
+ 0x12, 0x2b, 0x51, 0x12, 0x2c, 0x18, 0x12, 0xaf, 0x8a, 0x12, 0x29, 0x5f, 0x2,
+ 0x27, 0x64, 0x69, 0x30, 0x0, 0xa, 0x12, 0x28, 0x76, 0xa9, 0xc6, 0xcb, 0x22,
+ 0x12, 0x27, 0x36, 0x7e, 0xd, 0x2f, 0x7e, 0xa1, 0x37, 0x74, 0x8, 0xa4, 0x9,
+ 0xb5, 0x9b, 0x28, 0x7c, 0x9b, 0x7f, 0x60, 0xa, 0xf9, 0x7c, 0xb9, 0x12, 0x38,
+ 0x5b, 0x7c, 0xab, 0x7e, 0xb3, 0x39, 0xff, 0x60, 0x9, 0x7c, 0xb9, 0x12, 0xcc,
+ 0x9c, 0x7c, 0xab, 0x80, 0x7, 0x7c, 0xb9, 0x12, 0x3a, 0x26, 0x7d, 0xf3, 0xa,
+ 0x5a, 0x2e, 0x54, 0x0, 0xb, 0x7e, 0x18, 0x0, 0x1, 0x60, 0x5, 0x2f, 0x11,
+ 0x14, 0x78, 0xfb, 0x2f, 0x11, 0x2f, 0x11, 0x7d, 0x1f, 0x12, 0x1, 0x6c, 0xbe,
+ 0xf4, 0x0, 0x4, 0x68, 0x38, 0x7e, 0x33, 0x82, 0xc, 0x7a, 0x33, 0x91, 0xfe,
+ 0x7e, 0x33, 0x82, 0xd, 0x7a, 0x33, 0x91, 0xff, 0x74, 0xb, 0x7a, 0xb3, 0x92,
+ 0x0, 0x7d, 0xed, 0x7a, 0xe7, 0x92, 0x2, 0x7a, 0xe7, 0x92, 0x6, 0xbe, 0xf4,
+ 0x0, 0x2, 0x38, 0xb, 0xe4, 0x7a, 0xb3, 0x92, 0x0, 0x7e, 0x34, 0x0, 0x4,
+ 0x8d, 0x3f, 0x7e, 0x8, 0x91, 0xfe, 0x2, 0x2c, 0x27, 0x22, 0x7e, 0xb3, 0x38,
+ 0x82, 0xb4, 0x1, 0xa, 0x12, 0x28, 0x67, 0x7e, 0x37, 0x38, 0x92, 0x12, 0x28,
+ 0xd, 0x22, 0xe4, 0x12, 0x28, 0x1c, 0xa, 0x26, 0x7a, 0x53, 0x38, 0x7c, 0x7a,
+ 0x73, 0x38, 0x7d, 0x22, 0xa9, 0xd6, 0xcb, 0x7e, 0x17, 0x39, 0xf9, 0x59,
+ 0x31, 0x0, 0x4, 0x7e, 0x37, 0x39, 0xf9, 0x59, 0x23, 0x0, 0xc, 0x12, 0x29,
+ 0x5f, 0x7e, 0x34, 0x0, 0x90, 0x12, 0x28, 0x6e, 0x49, 0x33, 0x0, 0x2c, 0xa9,
+ 0xc6, 0xcb, 0x22, 0x7e, 0xb3, 0x38, 0x82, 0xb4, 0x4, 0xa, 0x12, 0x28, 0x67,
+ 0x7e, 0x34, 0x3a, 0x0, 0x12, 0x28, 0xd, 0x22, 0x7e, 0xb3, 0x38, 0x82, 0xb4,
+ 0x2, 0xc, 0x12, 0x28, 0x67, 0x7e, 0x37, 0x38, 0x8a, 0x1e, 0x24, 0x12, 0x28,
+ 0xd, 0x22, 0x7e, 0x27, 0x8d, 0x94, 0xb, 0x26, 0x22, 0x12, 0x28, 0x76, 0x7e,
+ 0x37, 0x39, 0xf9, 0x22, 0x7d, 0x3, 0x7e, 0xa1, 0xcd, 0x75, 0xcd, 0x0, 0xc2,
+ 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b, 0x1e, 0x20, 0xe2, 0xf7, 0x7d,
+ 0x20, 0x4e, 0x50, 0x1, 0x12, 0x29, 0x3, 0x4d, 0x12, 0x1b, 0x38, 0x10, 0x6c,
+ 0x99, 0x0, 0xb, 0x90, 0xbe, 0x90, 0x8, 0x78, 0xf8, 0xd2, 0xaf, 0x80, 0x42,
+ 0x7e, 0x17, 0x39, 0xf9, 0xb, 0x18, 0x10, 0x5e, 0x14, 0x0, 0x8, 0xbe, 0x14,
+ 0x0, 0x8, 0x78, 0x31, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b,
+ 0x1e, 0x20, 0xe2, 0xf7, 0xbe, 0x4, 0x0, 0xd0, 0x78, 0x7, 0x7e, 0x34, 0x0,
+ 0x2, 0x12, 0xc5, 0x49, 0x12, 0x29, 0x3, 0x4e, 0x30, 0x4, 0x1b, 0x38, 0x10,
+ 0xd2, 0x37, 0x6c, 0x99, 0x0, 0xb, 0x90, 0xbe, 0x90, 0x8, 0x78, 0xf8, 0xd2,
+ 0xaf, 0x12, 0x2c, 0x82, 0x5e, 0x34, 0x80, 0x0, 0x68, 0xb5, 0xb, 0x28, 0x30,
+ 0x4e, 0x60, 0x40, 0x1b, 0x28, 0x30, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7a,
+ 0xa1, 0xcd, 0x22, 0x7e, 0x37, 0x39, 0xf9, 0xb, 0x38, 0x10, 0x22, 0x7f, 0x20,
+ 0xa9, 0xd6, 0xcb, 0x69, 0x12, 0x0, 0x4, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10,
+ 0x0, 0x4, 0x69, 0x12, 0x0, 0x8, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0x8,
+ 0x7e, 0x2b, 0x30, 0x7c, 0x3, 0x6c, 0x11, 0x29, 0x32, 0x0, 0x1, 0xa, 0x13,
+ 0x2d, 0x10, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0xc, 0x12, 0x2d, 0x24,
+ 0x12, 0x2b, 0xfa, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x80, 0x40,
+ 0x12, 0x28, 0x6e, 0x49, 0x33, 0x0, 0x3a, 0xa9, 0xc6, 0xcb, 0x22, 0x29, 0xb0,
+ 0x0, 0x3, 0x54, 0x7, 0x7c, 0x4b, 0x6c, 0x55, 0x7e, 0x37, 0x39, 0xf9, 0x1b,
+ 0x38, 0x20, 0x22, 0x7f, 0x71, 0x12, 0xaf, 0x91, 0x12, 0x2b, 0x2e, 0x69,
+ 0x30, 0x0, 0x8, 0x12, 0x2d, 0x2d, 0x12, 0x30, 0x1e, 0x29, 0x70, 0x0, 0x1,
+ 0x7c, 0x47, 0x6c, 0x55, 0x7e, 0xb, 0x70, 0x12, 0x2b, 0x80, 0x29, 0x70, 0x0,
+ 0x2, 0xa, 0x37, 0x1b, 0x34, 0x12, 0x2c, 0x72, 0x69, 0x30, 0x0, 0xa, 0x12,
+ 0x2c, 0x1e, 0x69, 0x30, 0x0, 0xc, 0x12, 0x2b, 0xfa, 0x69, 0x30, 0x0, 0xe,
+ 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x12, 0x69, 0x30, 0x0, 0x10, 0x7e,
+ 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x30, 0x29, 0x70, 0x0, 0x3, 0x7c, 0x47,
+ 0x12, 0x29, 0x61, 0x7e, 0x34, 0x0, 0xa0, 0x12, 0x28, 0x6e, 0x49, 0x23, 0x0,
+ 0x1a, 0x7a, 0x7b, 0x50, 0x49, 0x23, 0x0, 0x1c, 0x39, 0x57, 0x0, 0x1, 0x49,
+ 0x23, 0x0, 0x16, 0x79, 0x27, 0x0, 0x2, 0x49, 0x23, 0x0, 0x18, 0x79, 0x27,
+ 0x0, 0x4, 0x49, 0x23, 0x0, 0x22, 0x79, 0x27, 0x0, 0x6, 0x49, 0x23, 0x0,
+ 0x24, 0x79, 0x27, 0x0, 0x8, 0x49, 0x23, 0x0, 0x1e, 0x79, 0x27, 0x0, 0xa,
+ 0x49, 0x33, 0x0, 0x20, 0x79, 0x37, 0x0, 0xc, 0xa9, 0xc6, 0xcb, 0x22, 0xca,
+ 0xf8, 0x7f, 0x70, 0x7e, 0x7b, 0xf0, 0x29, 0x77, 0x0, 0x1, 0xbc, 0x7f, 0x28,
+ 0x2, 0x7c, 0xf7, 0x69, 0x17, 0x0, 0x6, 0x6d, 0x0, 0x7e, 0x34, 0x0, 0xf2,
+ 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7f, 0x7, 0x12, 0x2b, 0xe, 0xa9, 0xd6, 0xcb,
+ 0x6c, 0xaa, 0x80, 0x2d, 0x6c, 0x77, 0x80, 0x1f, 0x7e, 0x10, 0xb, 0xac, 0x1a,
+ 0xa, 0x17, 0x2d, 0x1, 0x3e, 0x4, 0x69, 0x17, 0x0, 0x6, 0x2d, 0x10, 0x6d,
+ 0x0, 0xb, 0xa, 0x20, 0x6e, 0x24, 0xff, 0xff, 0x1b, 0xa, 0x20, 0xb, 0x70,
+ 0x29, 0x67, 0x0, 0x1, 0xbc, 0x67, 0x38, 0xd9, 0xb, 0xa0, 0x7e, 0x7b, 0x60,
+ 0xbc, 0x6a, 0x38, 0xcc, 0x69, 0x37, 0x0, 0x6, 0x12, 0x2b, 0x2e, 0x7c, 0x4f,
+ 0x6c, 0x55, 0xa, 0x3f, 0x12, 0x2b, 0x82, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x12,
+ 0xda, 0x34, 0x12, 0xda, 0xa5, 0x1b, 0xa, 0x30, 0xd2, 0xac, 0x7e, 0x34, 0x0,
+ 0xd0, 0x12, 0x28, 0x76, 0x12, 0xd8, 0x3e, 0x6c, 0xaa, 0xbe, 0xa0, 0x4, 0x50,
+ 0x15, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0x12, 0x2b, 0x7, 0x49, 0x44, 0x0, 0x26,
+ 0x60, 0x34, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x2d, 0xbe, 0xa0, 0x8, 0x50,
+ 0x14, 0xa, 0x3a, 0x1b, 0x36, 0x12, 0x2b, 0x3, 0x49, 0x44, 0x0, 0x28, 0x60,
+ 0x1b, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x14, 0xa, 0x3a, 0x9e, 0x34, 0x0,
+ 0x8, 0x12, 0x2b, 0x3, 0x49, 0x44, 0x0, 0x2a, 0x60, 0x5, 0x1e, 0x44, 0x14,
+ 0x78, 0xfb, 0x5e, 0x44, 0x0, 0xf, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x69, 0x37,
+ 0x0, 0x6, 0x2d, 0x32, 0x6d, 0x22, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0xbe, 0xa0,
+ 0xb, 0x40, 0x9e, 0xa9, 0xc6, 0xcb, 0xda, 0xf8, 0x22, 0x3e, 0x34, 0x3e, 0x34,
+ 0x7c, 0xb7, 0x7e, 0x47, 0x39, 0xf9, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0,
+ 0x2, 0x12, 0x2b, 0x2e, 0x69, 0x30, 0x0, 0x4, 0x12, 0x2d, 0x2d, 0x12, 0x2b,
+ 0x6d, 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x0, 0x60, 0x2, 0x27, 0x68,
+ 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x22, 0x12, 0x2b, 0x4e, 0x69,
+ 0x30, 0x0, 0xc, 0x12, 0x2c, 0x1e, 0x69, 0x30, 0x0, 0xe, 0x12, 0x2b, 0xfa,
+ 0x12, 0x29, 0x59, 0x2, 0x27, 0x64, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, 0x4,
+ 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6, 0x7e,
+ 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27,
+ 0x39, 0xf9, 0x59, 0x32, 0x0, 0x8, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c, 0x55,
+ 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x39, 0xf9, 0x59,
+ 0x32, 0x0, 0xc, 0x22, 0x12, 0x2b, 0x4e, 0x12, 0x2c, 0xc, 0x12, 0x2c, 0x7b,
+ 0xa2, 0x4, 0xe4, 0x33, 0x12, 0x2c, 0x3, 0x4d, 0x35, 0x1b, 0x28, 0x30, 0x12,
+ 0x29, 0x59, 0x2, 0x27, 0x64, 0x7f, 0x71, 0x12, 0x2f, 0xff, 0x12, 0xd9, 0x95,
+ 0x12, 0x2b, 0x82, 0x7c, 0x4b, 0x6c, 0x55, 0xe5, 0x27, 0xa, 0x3b, 0x4d, 0x32,
+ 0x12, 0x2b, 0xfa, 0x29, 0x77, 0x0, 0x2, 0x12, 0x70, 0x93, 0x7e, 0x7b, 0x40,
+ 0x6c, 0x55, 0x4d, 0x23, 0x29, 0x77, 0x0, 0x4, 0x7c, 0x64, 0x4c, 0x75, 0x12,
+ 0x2c, 0x1e, 0x29, 0x77, 0x0, 0x1, 0x7c, 0x47, 0x29, 0x77, 0x0, 0x3, 0x7c,
+ 0x64, 0x12, 0x2c, 0x72, 0x12, 0x2c, 0xc, 0x12, 0x2c, 0x7b, 0x6d, 0x22, 0x12,
+ 0x29, 0x63, 0x7e, 0x34, 0x0, 0x30, 0x2, 0x27, 0x68, 0x7e, 0x27, 0x39, 0xf9,
+ 0x59, 0x32, 0x0, 0x10, 0x22, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab,
+ 0xe4, 0x7e, 0x27, 0x39, 0xf9, 0x2e, 0x24, 0x0, 0x38, 0xb, 0x28, 0x30, 0x22,
+ 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0,
+ 0xe, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x20, 0x0, 0x4, 0x7e, 0x57, 0x39, 0xf9,
+ 0x59, 0x25, 0x0, 0x4, 0x69, 0x20, 0x0, 0x8, 0x7e, 0x57, 0x39, 0xf9, 0x59,
+ 0x25, 0x0, 0x8, 0x7e, 0xb, 0x50, 0xa, 0x55, 0x7c, 0xab, 0xe4, 0x29, 0x50,
+ 0x0, 0x1, 0xa, 0x25, 0x2d, 0x25, 0x7e, 0x57, 0x39, 0xf9, 0x59, 0x25, 0x0,
+ 0xc, 0x29, 0x50, 0x0, 0x2, 0xa, 0x25, 0x12, 0x2d, 0x24, 0x12, 0x2c, 0x72,
+ 0x6d, 0x22, 0x12, 0x29, 0x63, 0x7e, 0x34, 0x0, 0x40, 0x2, 0x27, 0x68, 0x7e,
+ 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0xa, 0x22, 0x5e, 0x60, 0xbf, 0x1b, 0x28,
+ 0x30, 0x22, 0x7e, 0x27, 0x39, 0xf9, 0x49, 0x32, 0x0, 0x38, 0x22, 0x7e, 0xa1,
+ 0xcd, 0x12, 0x2d, 0x1c, 0x7d, 0x43, 0x5e, 0x44, 0x80, 0x0, 0x75, 0xcd, 0x0,
+ 0x5e, 0x60, 0x7f, 0x1b, 0x28, 0x30, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e,
+ 0xb3, 0x9b, 0x1e, 0x20, 0xe2, 0xf7, 0x12, 0x2c, 0xc, 0x4e, 0x70, 0x1, 0x1b,
+ 0x28, 0x30, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, 0xaf,
+ 0x80, 0x33, 0x12, 0x2c, 0x82, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x20, 0xbe, 0x4,
+ 0x0, 0x20, 0x78, 0x24, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x9b,
+ 0x1e, 0x20, 0xe2, 0xf7, 0x2e, 0x24, 0x0, 0x38, 0x4e, 0x70, 0x2, 0x1b, 0x28,
+ 0x30, 0xd2, 0x37, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2,
+ 0xaf, 0x12, 0x2c, 0x82, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x80, 0x68, 0xc2, 0x2e,
+ 0x24, 0x0, 0x38, 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0x4d, 0x44, 0x68, 0x9,
+ 0x12, 0x2d, 0x1c, 0x4e, 0x60, 0x80, 0x1b, 0x28, 0x30, 0x7a, 0xa1, 0xcd,
+ 0x22, 0x7e, 0x27, 0x39, 0xf9, 0xb, 0x28, 0x30, 0x22, 0x7e, 0x17, 0x39, 0xf9,
+ 0x59, 0x21, 0x0, 0xe, 0x22, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6,
+ 0x69, 0x30, 0x0, 0x6, 0x22, 0x7e, 0x17, 0x76, 0x4c, 0x7d, 0xf1, 0x7d, 0xe2,
+ 0x7d, 0xd3, 0x12, 0x77, 0xa5, 0x12, 0xaf, 0xb0, 0x7e, 0x8, 0x91, 0xfe, 0x7d,
+ 0x3e, 0x7d, 0x2f, 0x2, 0x29, 0xb, 0xca, 0x79, 0xc2, 0x3, 0x7e, 0xb7, 0x67,
+ 0x68, 0x7e, 0xe3, 0x67, 0x62, 0x7e, 0xa3, 0x76, 0x4f, 0xbc, 0xae, 0x7e,
+ 0xb3, 0x76, 0x4e, 0x28, 0x5, 0xa4, 0x7d, 0xc5, 0x80, 0x4, 0xac, 0xbe, 0x7d,
+ 0xc5, 0x7e, 0x1f, 0x2d, 0x2e, 0x7e, 0x27, 0x76, 0x4a, 0x12, 0x2d, 0x3a,
+ 0x7a, 0x37, 0x3, 0xf2, 0x7e, 0x1f, 0x2d, 0x2e, 0x7e, 0x24, 0x0, 0x64, 0x12,
+ 0x2d, 0x3a, 0x7a, 0x37, 0x3, 0xf7, 0x6c, 0xff, 0x6c, 0x11, 0x80, 0x1b, 0x7c,
+ 0xb1, 0x12, 0x2e, 0x26, 0x7d, 0x43, 0x7d, 0x54, 0x3e, 0x54, 0xbd, 0x5b,
+ 0x48, 0x8, 0x7e, 0x57, 0x76, 0x53, 0xbd, 0x54, 0x8, 0x2, 0xb, 0xf0, 0xb,
+ 0x10, 0x7e, 0x3, 0x67, 0x62, 0xbc, 0x1, 0x38, 0xdd, 0x7e, 0xd7, 0x3, 0xf2,
+ 0xbd, 0xdc, 0x28, 0x2f, 0x7e, 0xd7, 0x76, 0x55, 0xbd, 0xdb, 0x58, 0x5, 0xbe,
+ 0xe0, 0x1, 0x38, 0xc, 0x74, 0x2, 0xac, 0xbf, 0xa, 0x4e, 0x1b, 0x44, 0xbd,
+ 0x54, 0x48, 0x4, 0x74, 0x1, 0x80, 0x1, 0xe4, 0x12, 0x2e, 0x19, 0x38, 0x6,
+ 0x7e, 0xb3, 0x3, 0xf6, 0x60, 0x12, 0x7e, 0xd7, 0x76, 0x51, 0x80, 0x8, 0xe4,
+ 0x12, 0x2e, 0x19, 0x28, 0x6, 0x1b, 0xd4, 0x7a, 0xd7, 0x3, 0xf4, 0x12, 0x2e,
+ 0x1d, 0x28, 0x2, 0xd2, 0x3, 0x7e, 0xd7, 0x76, 0x57, 0xbd, 0xdb, 0x58, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x62, 0xa2, 0x3, 0xda, 0x79, 0x22, 0x7a, 0xb3, 0x3,
+ 0xf6, 0x7e, 0xd7, 0x3, 0xf4, 0xbe, 0xd4, 0x0, 0x0, 0x22, 0x7c, 0xab, 0x7e,
+ 0x70, 0x2, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0x60, 0x9, 0x73, 0x65, 0x61, 0x2,
+ 0x2e, 0x40, 0x7e, 0xb3, 0x92, 0x2, 0x7e, 0x73, 0x92, 0x3, 0x12, 0x59, 0x91,
+ 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x31, 0xb, 0x1a, 0x30,
+ 0x22, 0xca, 0x3b, 0x7c, 0xc6, 0x7c, 0x97, 0x6d, 0xbb, 0x7d, 0xab, 0x4c,
+ 0x55, 0x68, 0x7, 0x6c, 0xff, 0x7e, 0xe0, 0x1, 0x80, 0x10, 0x7e, 0x83, 0x82,
+ 0xe, 0xa, 0xf8, 0x7d, 0x7f, 0x1b, 0x74, 0x1b, 0xf5, 0x7d, 0x3f, 0x7c, 0xe7,
+ 0x7e, 0xe4, 0x0, 0x64, 0x7c, 0xd9, 0x7c, 0x9, 0x7c, 0x8d, 0x80, 0xc, 0x12,
+ 0xda, 0x4c, 0x8, 0xc, 0x7c, 0x8, 0x12, 0x2f, 0xda, 0x1b, 0x80, 0xbe, 0x80,
+ 0x0, 0x58, 0xef, 0x7c, 0xd9, 0x7c, 0x19, 0x1a, 0x1d, 0xb, 0x14, 0x7c, 0x83,
+ 0x80, 0xc, 0x12, 0xda, 0x4c, 0x8, 0xf, 0x7c, 0x18, 0x12, 0x2f, 0xda, 0xb,
+ 0x80, 0x7e, 0x73, 0x82, 0xf, 0xbc, 0x78, 0x18, 0xec, 0x7c, 0xb9, 0x7c, 0x70,
+ 0x7c, 0x61, 0x6c, 0x55, 0x7e, 0x43, 0x82, 0xf, 0xa, 0xf4, 0x1b, 0xf4, 0x7d,
+ 0x1f, 0x7c, 0x43, 0x12, 0xbd, 0xba, 0x7c, 0xdb, 0xbd, 0xba, 0x50, 0x12,
+ 0x7d, 0x3a, 0x6d, 0x22, 0x74, 0x4, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7d, 0x1b,
+ 0x12, 0x2f, 0xf7, 0x80, 0x2, 0x9f, 0x66, 0x4d, 0xaa, 0x78, 0x4, 0x9f, 0x66,
+ 0x80, 0x10, 0x4d, 0xbb, 0x78, 0x2, 0x80, 0x6, 0xbe, 0x68, 0x0, 0xff, 0x28,
+ 0x4, 0x7e, 0x68, 0x0, 0xff, 0x7d, 0x3d, 0x74, 0x15, 0xac, 0xbc, 0x19, 0x75,
+ 0x37, 0x2, 0x19, 0xd5, 0x37, 0x3, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7c, 0xc6,
+ 0x7c, 0x1b, 0x6d, 0xee, 0x7d, 0xbe, 0x4c, 0x55, 0x68, 0x18, 0x6c, 0xff,
+ 0x7e, 0xe0, 0x1, 0x7e, 0xb3, 0x59, 0x47, 0xb4, 0x1, 0x6, 0x7e, 0xf4, 0x3,
+ 0xe8, 0x80, 0x1a, 0x7e, 0xf4, 0x3, 0x20, 0x80, 0x14, 0x7e, 0x3, 0x82, 0xf,
+ 0xa, 0xa0, 0x7d, 0x7a, 0x1b, 0x74, 0x1b, 0xa5, 0x7d, 0x3a, 0x7c, 0xe7, 0x7e,
+ 0xf4, 0x0, 0x64, 0x7c, 0x81, 0x7c, 0x1, 0x7c, 0x98, 0x80, 0xc, 0x12, 0x2f,
+ 0xed, 0x8, 0xc, 0x7c, 0x9, 0x12, 0x2f, 0xc9, 0x1b, 0x90, 0xbe, 0x90, 0x0,
+ 0x58, 0xef, 0x7c, 0x81, 0x1a, 0x48, 0xb, 0x44, 0x80, 0xc, 0x12, 0x2f, 0xed,
+ 0x8, 0xf, 0x7c, 0x19, 0x12, 0x2f, 0xc9, 0xb, 0x90, 0x7e, 0x83, 0x82, 0xe,
+ 0xbc, 0x89, 0x18, 0xec, 0xa, 0x30, 0xa, 0xa1, 0x9d, 0xa3, 0xb, 0xa4, 0x7d,
+ 0x3a, 0x7c, 0xd7, 0xbd, 0xeb, 0x50, 0x12, 0x7d, 0x3b, 0x6d, 0x22, 0x74, 0x4,
+ 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7d, 0x1e, 0x12, 0x2f, 0xf7, 0x80, 0x2, 0x9f,
+ 0x66, 0x4d, 0xbb, 0x78, 0x4, 0x9f, 0x66, 0x80, 0x10, 0x4d, 0xee, 0x78, 0x2,
+ 0x80, 0x6, 0xbe, 0x68, 0x0, 0xff, 0x28, 0x4, 0x7e, 0x68, 0x0, 0xff, 0x7d,
+ 0x3d, 0x74, 0x15, 0xac, 0xbc, 0x19, 0x75, 0x37, 0x4, 0x19, 0xd5, 0x37, 0x5,
+ 0xda, 0x3b, 0x22, 0x7c, 0xb9, 0x7c, 0x7f, 0x12, 0x2e, 0x40, 0x2d, 0xb3,
+ 0x7c, 0x7e, 0x12, 0x2e, 0x40, 0x2d, 0xe3, 0x22, 0x7c, 0xbf, 0x7c, 0x78,
+ 0x12, 0x2e, 0x40, 0x2d, 0xa3, 0x7c, 0xbe, 0x7c, 0x78, 0x12, 0x2e, 0x40,
+ 0x2d, 0xb3, 0x22, 0x7c, 0xb9, 0x7c, 0x7f, 0x12, 0x2e, 0x40, 0xbd, 0x3f,
+ 0x22, 0xb, 0x14, 0x12, 0x1, 0x6c, 0x7f, 0x61, 0x22, 0xa9, 0xd6, 0xcb, 0x69,
+ 0x30, 0x0, 0x4, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30,
+ 0x0, 0x6, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0,
+ 0x8, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x8, 0x22, 0x7e, 0xa3, 0x9a,
+ 0xc0, 0xbe, 0xa0, 0x5, 0x78, 0xd, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xc0, 0x74,
+ 0x2, 0x7a, 0xb3, 0x9a, 0xc0, 0x22, 0xbe, 0xa0, 0x4, 0x78, 0x1c, 0x74, 0x1,
+ 0x7a, 0xb3, 0x9a, 0xc0, 0x12, 0x37, 0xe2, 0x12, 0x32, 0x1d, 0x12, 0x30,
+ 0x5f, 0x74, 0x2, 0x7a, 0xb3, 0x9a, 0xc0, 0x7e, 0x34, 0x0, 0xc8, 0x2, 0x26,
+ 0x98, 0x22, 0x12, 0x30, 0xa3, 0x7e, 0xb3, 0x8d, 0x92, 0x60, 0xd, 0x80, 0x6,
+ 0x12, 0x32, 0x99, 0x12, 0x30, 0xa3, 0x12, 0x5c, 0xcb, 0x50, 0xf5, 0x7e,
+ 0xb3, 0x8d, 0x93, 0x60, 0xd, 0x80, 0x6, 0x12, 0x32, 0x99, 0x12, 0x30, 0xa3,
+ 0x12, 0x33, 0x43, 0x50, 0xf5, 0x2, 0x30, 0x8b, 0x30, 0x14, 0x14, 0x7e, 0x34,
+ 0x0, 0x8, 0xca, 0x39, 0x7e, 0x63, 0x9b, 0xa8, 0x12, 0xd9, 0xda, 0x12, 0x0,
+ 0x6e, 0x1b, 0xfd, 0xc2, 0x14, 0x22, 0x12, 0x30, 0xee, 0xc2, 0x4, 0x12, 0x30,
+ 0xca, 0xc2, 0xc, 0x30, 0xb, 0x15, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0xc2, 0xb,
+ 0x12, 0x1c, 0xc1, 0x12, 0x31, 0x6f, 0x12, 0x36, 0xb7, 0x74, 0x1, 0x12, 0x32,
+ 0x1d, 0xd2, 0x4, 0x2, 0x30, 0xca, 0xa2, 0xac, 0x92, 0x5, 0x12, 0xda, 0x34,
+ 0x30, 0x4, 0xa, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x3, 0x80, 0x8, 0xb,
+ 0x16, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfc, 0x1b, 0xa, 0x30, 0xa2, 0x5, 0x92,
+ 0xac, 0x22, 0x30, 0x2f, 0x39, 0x12, 0x47, 0xa8, 0x78, 0x34, 0xc2, 0x2f,
+ 0x7e, 0x34, 0x28, 0x0, 0x12, 0x31, 0x64, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x31,
+ 0x64, 0x7e, 0x34, 0xf7, 0x0, 0x74, 0x5a, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0xf7,
+ 0x1, 0x74, 0xa5, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0xf7, 0x2, 0x74, 0x95, 0x12,
+ 0x31, 0x2b, 0x7e, 0x34, 0xf7, 0x3, 0x74, 0x27, 0x2, 0x31, 0x2b, 0x22, 0x12,
+ 0xc6, 0x76, 0xa, 0x3b, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x8, 0x12,
+ 0xc6, 0x8c, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x80, 0xa, 0x12, 0xc6, 0x64, 0x68,
+ 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xc6, 0x57, 0x68, 0xf1, 0x12, 0xc6,
+ 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x2, 0x31, 0x5c, 0x6d, 0x33, 0x1b, 0xa,
+ 0x30, 0xc2, 0xcc, 0x22, 0xe4, 0x12, 0x31, 0x2b, 0x7e, 0x34, 0x0, 0x46, 0x2,
+ 0x26, 0x98, 0x12, 0xdb, 0x10, 0x7e, 0x63, 0x9b, 0xa8, 0xa, 0x6, 0x12, 0x37,
+ 0xe9, 0x2e, 0x24, 0x5a, 0x0, 0x7a, 0x27, 0x38, 0x8a, 0x6d, 0x22, 0x7a, 0x27,
+ 0x37, 0xd6, 0x7e, 0x24, 0x82, 0x51, 0x7a, 0x27, 0x38, 0x74, 0x7e, 0x24, 0x0,
+ 0x8, 0xca, 0x29, 0x7e, 0x70, 0x8, 0x12, 0xd9, 0xda, 0x12, 0x0, 0x6e, 0x1b,
+ 0xfd, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x63, 0x9b, 0xa8, 0xac, 0x67,
+ 0x2e, 0x34, 0x9b, 0x43, 0x6d, 0x22, 0x7e, 0x8, 0x9a, 0xfc, 0x12, 0x0, 0x6e,
+ 0x1b, 0xfd, 0x7e, 0xb3, 0x9b, 0xa8, 0x12, 0x48, 0xda, 0x12, 0x32, 0x15, 0x9,
+ 0x75, 0x9b, 0x63, 0x7a, 0x73, 0x9a, 0xdc, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b,
+ 0x64, 0x7a, 0x73, 0x9a, 0xdd, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x65, 0x7a,
+ 0x73, 0x9a, 0xde, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x66, 0x7a, 0x73, 0x9a,
+ 0xdf, 0x12, 0x32, 0x15, 0x9, 0x75, 0x9b, 0x67, 0x7a, 0x73, 0x9a, 0xe0, 0x7e,
+ 0x73, 0x9b, 0xa8, 0x7a, 0x73, 0x9a, 0xec, 0x12, 0x40, 0x7b, 0xe4, 0x2, 0x32,
+ 0xa, 0x7a, 0xb3, 0x9b, 0x7, 0x74, 0x3f, 0x7a, 0xb3, 0x9b, 0x8, 0x22, 0x7e,
+ 0xa3, 0x9b, 0xa8, 0x74, 0x5, 0xa4, 0x22, 0x12, 0x32, 0x2b, 0x74, 0xf, 0x7a,
+ 0xb3, 0x8d, 0x92, 0x7a, 0xb3, 0x8d, 0x93, 0x22, 0x7c, 0xab, 0xe4, 0x7a,
+ 0xb3, 0x39, 0x46, 0x7a, 0xb3, 0x39, 0x47, 0x6c, 0x77, 0x6d, 0x22, 0x7e,
+ 0x90, 0x1e, 0xac, 0x97, 0x59, 0x24, 0x39, 0x4b, 0x59, 0x24, 0x39, 0x4d,
+ 0xe4, 0x19, 0xb4, 0x39, 0x4a, 0xb, 0x70, 0xa5, 0xbf, 0x3, 0xe6, 0xe4, 0x7a,
+ 0xb3, 0x39, 0xa3, 0x7a, 0xb3, 0x39, 0x48, 0x4c, 0xaa, 0x68, 0x3, 0x12, 0x32,
+ 0x20, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0x12, 0x1c, 0xa1, 0x7a, 0xb3,
+ 0x8d, 0x91, 0x12, 0x1c, 0xc1, 0x12, 0x31, 0x6f, 0x12, 0x37, 0xdb, 0x12,
+ 0xb9, 0x8f, 0x74, 0x1, 0x12, 0x32, 0x2b, 0x12, 0xa9, 0x83, 0x12, 0x32, 0x20,
+ 0xd2, 0x26, 0x7e, 0x18, 0x76, 0xab, 0x7a, 0x1f, 0x3, 0xdc, 0x7e, 0x18, 0x7c,
+ 0x4b, 0x7a, 0x1f, 0x3, 0xe0, 0x22, 0x7e, 0x34, 0x9, 0xc4, 0x6d, 0x22, 0x7a,
+ 0x27, 0x3, 0xf9, 0x7a, 0x37, 0x3, 0xfb, 0x22, 0x12, 0xda, 0x56, 0xd2, 0x4,
+ 0x12, 0xb, 0xc5, 0x12, 0x1c, 0x41, 0x12, 0x37, 0xa0, 0x12, 0x31, 0x6f, 0xa2,
+ 0x0, 0xe4, 0x33, 0x2, 0x32, 0x2b, 0xe4, 0x7a, 0xb3, 0x9a, 0x7b, 0x12, 0xc9,
+ 0xa8, 0x12, 0xc9, 0xb4, 0xc2, 0x4, 0x12, 0x30, 0xca, 0x12, 0xcb, 0xe9, 0x40,
+ 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x7b, 0xd2, 0x4, 0x2, 0x30, 0xca, 0x30,
+ 0x1e, 0x42, 0xc2, 0x1e, 0x12, 0x30, 0x27, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x7e,
+ 0x73, 0x9a, 0xec, 0xbe, 0x73, 0x9b, 0xa8, 0x68, 0x9, 0x7a, 0x73, 0x9b, 0xa8,
+ 0xd2, 0x0, 0x12, 0x32, 0xa8, 0x7e, 0xb3, 0x9a, 0xca, 0x54, 0xfe, 0x7a, 0xb3,
+ 0x9a, 0xca, 0x7e, 0xb3, 0x9b, 0x5, 0xb4, 0x1, 0x3, 0x12, 0xb, 0xe7, 0x7e,
+ 0xb3, 0x9a, 0xcb, 0x60, 0x8, 0x12, 0x51, 0x42, 0xe4, 0x7a, 0xb3, 0x38, 0x83,
+ 0x12, 0x32, 0xc0, 0x7e, 0x37, 0x38, 0x79, 0x4d, 0x33, 0x68, 0x15, 0xd2, 0x4,
+ 0x12, 0xb, 0xc5, 0x12, 0x13, 0x20, 0x7e, 0xb3, 0x9a, 0xca, 0x54, 0xfd, 0x7a,
+ 0xb3, 0x9a, 0xca, 0x2, 0x32, 0xc0, 0x22, 0xca, 0xf8, 0xc2, 0x0, 0x7e, 0xf3,
+ 0x9b, 0xa8, 0x20, 0xb, 0x3, 0x30, 0xc, 0x3, 0xc3, 0x81, 0x56, 0x7e, 0x24,
+ 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x12, 0x4f,
+ 0x4e, 0x78, 0x2, 0x81, 0x55, 0x7c, 0xbf, 0x12, 0x75, 0xd8, 0x50, 0x2, 0xd2,
+ 0x0, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x30, 0x0, 0x1f, 0x7e, 0x73, 0x8d, 0x93,
+ 0xa, 0x37, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x13, 0x7e, 0x73, 0x8d, 0x92, 0xa,
+ 0x37, 0x5e, 0x34, 0x0, 0x4, 0x78, 0x7, 0xd2, 0x2b, 0x12, 0xca, 0xdd, 0x80,
+ 0x2, 0xc2, 0x2b, 0xa2, 0x0, 0x92, 0x1, 0x7c, 0xbf, 0x12, 0x34, 0x8c, 0x40,
+ 0xb, 0x30, 0x2b, 0x5, 0x12, 0x37, 0x42, 0xc2, 0x2b, 0xc3, 0x81, 0x56, 0x30,
+ 0x2b, 0x3, 0x12, 0x34, 0x59, 0x7c, 0xbf, 0x7e, 0x73, 0x39, 0xdb, 0x12, 0x35,
+ 0x19, 0xe4, 0x7c, 0x7f, 0x12, 0x57, 0x18, 0x30, 0x2b, 0xf, 0x7e, 0x18, 0x27,
+ 0xe0, 0x7a, 0x1d, 0x33, 0x12, 0xd9, 0x4c, 0x12, 0x26, 0xb9, 0x80, 0x6, 0x12,
+ 0xd9, 0x4c, 0x12, 0xce, 0x8e, 0x30, 0x2b, 0x6, 0x12, 0x37, 0x42, 0x12, 0x34,
+ 0x59, 0x12, 0x35, 0x13, 0x20, 0xb, 0x3, 0x30, 0xc, 0x5, 0xc2, 0x2b, 0xc3,
+ 0x80, 0x62, 0x12, 0x32, 0xc0, 0x7c, 0xbf, 0x12, 0x75, 0xe4, 0xe4, 0x12,
+ 0x32, 0x2b, 0x12, 0x5d, 0x65, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x6e,
+ 0x70, 0xff, 0x5e, 0x73, 0x8d, 0x93, 0x7a, 0x73, 0x8d, 0x93, 0x12, 0x36,
+ 0xb7, 0x30, 0x2b, 0x34, 0xc2, 0x2b, 0x7e, 0x34, 0x27, 0xe0, 0x7e, 0x24, 0xb,
+ 0xb8, 0x7e, 0x14, 0x23, 0x28, 0x12, 0x2d, 0x3e, 0xbe, 0x34, 0x2, 0x58, 0x50,
+ 0xc, 0x7e, 0xb3, 0x8d, 0x92, 0x44, 0x4, 0x7a, 0xb3, 0x8d, 0x92, 0x80, 0xa,
+ 0x7e, 0xb3, 0x8d, 0x93, 0x54, 0xfb, 0x7a, 0xb3, 0x8d, 0x93, 0x7e, 0x8, 0x18,
+ 0x80, 0x12, 0x70, 0xf9, 0x12, 0xcb, 0x3a, 0xd3, 0x80, 0x1, 0xd3, 0xda, 0xf8,
+ 0x22, 0x7e, 0xa3, 0x9b, 0xa8, 0x74, 0x8, 0xa4, 0x9, 0xb5, 0x9b, 0x28, 0xca,
+ 0xf8, 0x7c, 0xfb, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0x34, 0x4, 0xc0, 0xca,
+ 0x39, 0x12, 0x37, 0x88, 0xda, 0x39, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x4, 0xc0,
+ 0xca, 0x39, 0x12, 0x37, 0x88, 0xda, 0x39, 0x12, 0x17, 0x2a, 0xda, 0xf8,
+ 0x22, 0xca, 0x79, 0x7c, 0xfb, 0xc2, 0x2, 0x7c, 0xbf, 0x12, 0xad, 0x40, 0x6c,
+ 0xee, 0xbe, 0xf0, 0x2, 0x74, 0x1e, 0x78, 0x5, 0x12, 0x37, 0x71, 0x80, 0xa,
+ 0xac, 0xbe, 0x49, 0x35, 0x39, 0x5d, 0x49, 0x25, 0x39, 0x5b, 0x7a, 0x1d,
+ 0x2b, 0x74, 0x1e, 0xac, 0xbe, 0x9, 0xb5, 0x39, 0x56, 0x60, 0x37, 0xd2, 0x4,
+ 0x12, 0xb, 0xc5, 0x30, 0x2b, 0x3, 0x12, 0x34, 0x59, 0x7c, 0xbf, 0x7c, 0x7e,
+ 0x12, 0x35, 0x19, 0xd2, 0x2, 0x30, 0x2b, 0x13, 0x74, 0x1e, 0x12, 0x37, 0x71,
+ 0x7a, 0x1d, 0x33, 0x12, 0x37, 0x49, 0x12, 0x37, 0x66, 0x12, 0x26, 0xb9,
+ 0x80, 0xd, 0x12, 0x37, 0x49, 0x74, 0x1e, 0xac, 0xbe, 0x12, 0x37, 0x66, 0x12,
+ 0xce, 0x8e, 0x20, 0xb, 0x3, 0x30, 0xc, 0xf, 0x30, 0x2b, 0x3, 0x12, 0x34,
+ 0x59, 0x30, 0x2, 0x3, 0x12, 0x35, 0x13, 0xc3, 0x80, 0x8, 0xb, 0xe0, 0xbe,
+ 0xe0, 0x3, 0x40, 0x8a, 0xd3, 0xda, 0x79, 0x22, 0x7c, 0xbf, 0x7e, 0x73, 0x39,
+ 0x45, 0xd2, 0x16, 0x74, 0x1e, 0xac, 0xb7, 0x9, 0xb5, 0x39, 0x49, 0x12, 0x1b,
+ 0x53, 0x2, 0x12, 0xa6, 0xca, 0x3b, 0x7c, 0xdb, 0x7e, 0x34, 0x3, 0xe8, 0x7a,
+ 0x35, 0x30, 0x7e, 0x34, 0x3e, 0x80, 0x7a, 0x35, 0x32, 0x7e, 0x37, 0x8d,
+ 0x94, 0xb, 0x36, 0x7a, 0x35, 0x2c, 0x12, 0x37, 0x5b, 0x7e, 0x90, 0x3, 0xac,
+ 0x9d, 0x9, 0xa4, 0x9b, 0x59, 0xa, 0xda, 0x6d, 0xcc, 0x7e, 0x14, 0x5, 0xdc,
+ 0x7f, 0x16, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x9, 0x74, 0x9b, 0x57, 0x7c, 0xb7,
+ 0x60, 0xc, 0x1e, 0x14, 0x1e, 0x4, 0x50, 0x3, 0x4e, 0x20, 0x80, 0x14, 0x78,
+ 0xf4, 0x7d, 0x21, 0x7a, 0x25, 0x2e, 0x7e, 0xf4, 0x0, 0x4, 0x7c, 0xb7, 0x60,
+ 0x5, 0x3e, 0xf4, 0x14, 0x78, 0xfb, 0xa, 0xea, 0xbd, 0xef, 0x68, 0x16, 0x7e,
+ 0x14, 0x3e, 0x80, 0x12, 0x37, 0xf2, 0x7d, 0xe3, 0x7a, 0xe5, 0x32, 0x7e,
+ 0x14, 0x3, 0xe8, 0x12, 0x37, 0xf2, 0x7a, 0x35, 0x30, 0x12, 0x36, 0xc8, 0x7e,
+ 0x34, 0x2, 0xd8, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34,
+ 0x2, 0xd8, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x13, 0x60, 0x12, 0x70,
+ 0xf9, 0x7e, 0xc0, 0x5, 0x12, 0x32, 0x99, 0xbe, 0xc0, 0x7, 0x58, 0x13, 0x7e,
+ 0x34, 0x0, 0x1, 0x7c, 0xbc, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7c,
+ 0xb7, 0xf5, 0x2b, 0x80, 0x3, 0x75, 0x2b, 0xc0, 0xbe, 0xc0, 0x6, 0x58, 0x24,
+ 0x6d, 0x77, 0x80, 0x18, 0xa, 0x2d, 0x7e, 0x34, 0x2, 0xd8, 0xad, 0x32, 0x2d,
+ 0x37, 0x2e, 0x34, 0x5a, 0x0, 0x7e, 0x39, 0xb0, 0x45, 0x2b, 0x7a, 0x39, 0xb0,
+ 0xb, 0x74, 0x7e, 0x37, 0x8d, 0x94, 0xbd, 0x37, 0x38, 0xe0, 0x12, 0x36, 0xc6,
+ 0x12, 0x5d, 0x6c, 0x12, 0xb, 0xc0, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1d, 0x34,
+ 0x7e, 0x35, 0x30, 0x7a, 0x35, 0x3a, 0x7e, 0x35, 0x32, 0x7a, 0x35, 0x3c,
+ 0x7c, 0xbc, 0x7e, 0x35, 0x2e, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x51, 0x2b, 0x7c,
+ 0x4d, 0x12, 0xcc, 0xaa, 0x20, 0xb, 0x77, 0x30, 0xc, 0x2, 0x80, 0x72, 0x1b,
+ 0xc0, 0xbe, 0xc0, 0x0, 0x48, 0x2, 0xa1, 0xc3, 0x7e, 0xb3, 0x9a, 0xdc, 0xb4,
+ 0x2, 0x9, 0x7e, 0xb3, 0x9a, 0xdd, 0xbe, 0xb0, 0x2, 0x68, 0x34, 0x6d, 0x77,
+ 0x80, 0x28, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x13, 0x60, 0xbe, 0x35,
+ 0x30, 0x28, 0x19, 0xbe, 0x35, 0x32, 0x50, 0x14, 0x9, 0x77, 0x91, 0xfe, 0xbe,
+ 0x70, 0xff, 0x68, 0xb, 0xa, 0xd, 0x12, 0x37, 0xe9, 0x2d, 0x27, 0x19, 0x72,
+ 0x5a, 0x0, 0xb, 0x74, 0x7e, 0x37, 0x8d, 0x94, 0xbd, 0x37, 0x38, 0xd0, 0x12,
+ 0x36, 0xc6, 0x12, 0x5d, 0x6c, 0x7c, 0xbd, 0x12, 0x75, 0xd8, 0x50, 0x15,
+ 0x7e, 0x8, 0x62, 0x88, 0x7e, 0x35, 0x2c, 0x74, 0xc, 0x12, 0x0, 0x2e, 0x74,
+ 0x3, 0x7e, 0x8, 0x62, 0x88, 0x12, 0x5d, 0x6c, 0x12, 0x36, 0xb7, 0x12, 0x37,
+ 0xfc, 0xda, 0x3b, 0x22, 0xe4, 0x7a, 0xb3, 0x9b, 0xb0, 0x2, 0x36, 0xbf, 0x6d,
+ 0x33, 0x7a, 0x37, 0x3, 0xd6, 0x22, 0x7c, 0xbd, 0xa, 0xd, 0x7e, 0x14, 0x2,
+ 0xd8, 0xad, 0x10, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0x22, 0x7c, 0x9b, 0x6c,
+ 0x88, 0x4c, 0x99, 0x7e, 0x70, 0x3c, 0x68, 0xe, 0x12, 0x37, 0x51, 0x4e, 0xa0,
+ 0x80, 0x12, 0x37, 0x7c, 0x12, 0x38, 0x5b, 0x80, 0xc, 0x12, 0x37, 0x51, 0x5e,
+ 0xa0, 0x7f, 0x12, 0x37, 0x7c, 0x12, 0xcc, 0x9c, 0x7c, 0xab, 0x7e, 0x70, 0x3,
+ 0xac, 0x78, 0x19, 0xa3, 0x9b, 0x57, 0x7e, 0x30, 0x3c, 0xac, 0x38, 0x12,
+ 0x1a, 0xbb, 0x74, 0x3, 0xac, 0xb8, 0x12, 0xd7, 0x0, 0x74, 0x3, 0x12, 0x14,
+ 0xcb, 0x74, 0xee, 0xac, 0xb8, 0x12, 0x75, 0xca, 0x7d, 0x3f, 0x74, 0x3c,
+ 0xac, 0xb8, 0x49, 0x25, 0x8e, 0x28, 0x12, 0x12, 0x86, 0x7d, 0x3f, 0xb, 0x35,
+ 0x74, 0x3c, 0xac, 0xb8, 0x12, 0x12, 0x82, 0xb, 0x80, 0xbe, 0x80, 0x4, 0x40,
+ 0x9a, 0x22, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0xa2, 0x1, 0x92, 0x3,
+ 0x7e, 0xd, 0x2b, 0x22, 0xac, 0x78, 0x2e, 0x34, 0x8e, 0x28, 0xb, 0x38, 0x50,
+ 0x22, 0xe4, 0x12, 0x36, 0xd7, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xff, 0x22, 0x49,
+ 0x35, 0x39, 0x61, 0x49, 0x25, 0x39, 0x5f, 0x7c, 0xbf, 0x22, 0xac, 0xbe,
+ 0x49, 0x35, 0x39, 0x65, 0x49, 0x25, 0x39, 0x63, 0x22, 0x1b, 0x38, 0x50,
+ 0x74, 0x8, 0xac, 0xb8, 0x9, 0xb5, 0x9b, 0x28, 0x22, 0xa, 0x3f, 0x6d, 0x22,
+ 0x7e, 0x14, 0x0, 0x26, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x2e, 0x4, 0x0, 0xff,
+ 0x2e, 0x8, 0x3, 0x4, 0xa, 0x2f, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0xca, 0xf8,
+ 0x7c, 0xfb, 0x12, 0xc9, 0x94, 0x12, 0x34, 0x59, 0x1b, 0xf0, 0x68, 0x11,
+ 0x1b, 0xf0, 0x68, 0x15, 0x1b, 0xf1, 0x68, 0x16, 0xb, 0xf2, 0x78, 0x17, 0x12,
+ 0xc9, 0xd0, 0x80, 0x12, 0x12, 0xca, 0x5, 0x12, 0xca, 0x55, 0x80, 0xa, 0x12,
+ 0xc9, 0xe9, 0x80, 0x5, 0x74, 0x1, 0x12, 0xca, 0x6a, 0x12, 0xcc, 0x10, 0xda,
+ 0xf8, 0x22, 0x7e, 0x34, 0xd, 0xac, 0x2, 0x32, 0x9d, 0x7e, 0x37, 0x75, 0x92,
+ 0x2, 0x32, 0x9d, 0x7e, 0x14, 0x2, 0xd8, 0xad, 0x10, 0x7d, 0x21, 0x22, 0x7f,
+ 0x16, 0x12, 0x1, 0x63, 0x7d, 0x1f, 0x2, 0x1, 0x6c, 0x74, 0x1, 0x12, 0x36,
+ 0xd7, 0xe4, 0x7a, 0xb3, 0x39, 0xff, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12,
+ 0x3a, 0x3d, 0x7e, 0xa3, 0x9a, 0xf2, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3,
+ 0x9b, 0x28, 0x7c, 0xbf, 0x12, 0x38, 0x23, 0xda, 0xf8, 0x22, 0x7c, 0x9b,
+ 0x7e, 0x50, 0x8, 0xac, 0x59, 0x9, 0xa2, 0x9b, 0x28, 0x7e, 0x70, 0x3, 0xac,
+ 0x79, 0x19, 0xa3, 0x9b, 0x59, 0x7c, 0xba, 0x12, 0x38, 0x50, 0x19, 0xa3,
+ 0x9b, 0x57, 0x74, 0x8, 0xac, 0xb9, 0x9, 0xb5, 0x9b, 0x28, 0x12, 0x38, 0x50,
+ 0x19, 0xa3, 0x9b, 0x58, 0x22, 0x12, 0x38, 0x5b, 0x7c, 0xab, 0x7e, 0x70, 0x3,
+ 0xac, 0x79, 0x22, 0x6c, 0xaa, 0xa, 0x3b, 0x12, 0x3a, 0x26, 0x80, 0x4, 0x1e,
+ 0x34, 0xb, 0xa0, 0xbe, 0x34, 0x0, 0x4, 0x38, 0xf6, 0x7c, 0xba, 0x22, 0xca,
+ 0x3b, 0x7c, 0x97, 0x12, 0x38, 0x53, 0x9, 0xb3, 0x9b, 0x58, 0xf5, 0x29, 0x7e,
+ 0x70, 0x8, 0xac, 0x79, 0x9, 0xb3, 0x9b, 0x28, 0xa, 0x1b, 0x12, 0x3a, 0x26,
+ 0x7d, 0x13, 0x6d, 0x33, 0x7e, 0xb3, 0x9b, 0x41, 0xf5, 0x28, 0x7c, 0xb9,
+ 0x12, 0x75, 0xd8, 0x92, 0x1, 0x20, 0x1, 0xa, 0x6d, 0x22, 0x7a, 0x27, 0x39,
+ 0xc1, 0x7a, 0x27, 0x39, 0xc3, 0x20, 0x1, 0x2, 0x21, 0xd4, 0x4c, 0xaa, 0x68,
+ 0x2, 0x21, 0xd4, 0x7e, 0xa3, 0x82, 0xf, 0x7e, 0xb3, 0x82, 0xe, 0xf5, 0x27,
+ 0x7e, 0x51, 0x28, 0x7e, 0x68, 0x18, 0x80, 0x7c, 0xe5, 0xbe, 0xe0, 0x4, 0x28,
+ 0x3, 0x7e, 0xe0, 0x4, 0x7e, 0x40, 0x1, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c,
+ 0xff, 0x80, 0x16, 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5,
+ 0xbd, 0xbe, 0x28, 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc,
+ 0xef, 0x38, 0xe6, 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc,
+ 0xa4, 0x38, 0xd2, 0xe5, 0x28, 0xa, 0xdb, 0x7e, 0x43, 0x82, 0xa, 0xa, 0xc4,
+ 0x12, 0x3a, 0x14, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c, 0xff, 0x80, 0x16,
+ 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5, 0xbd, 0xbe, 0x28,
+ 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc, 0x5f, 0x38, 0xe6,
+ 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc, 0xa4, 0x38, 0xd2,
+ 0xa, 0xde, 0xe5, 0x27, 0xa, 0xcb, 0x12, 0x3a, 0x14, 0x80, 0x2a, 0x12, 0x39,
+ 0xed, 0x6c, 0xff, 0x80, 0x16, 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12,
+ 0x39, 0xe5, 0xbd, 0xbe, 0x28, 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39,
+ 0xde, 0xbc, 0xef, 0x38, 0xe6, 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb,
+ 0x40, 0xbc, 0xa4, 0x38, 0xd2, 0x7e, 0xd3, 0x82, 0xa, 0xac, 0xda, 0x7d, 0xd6,
+ 0x12, 0x3a, 0x1a, 0x80, 0x2a, 0x12, 0x39, 0xed, 0x6c, 0xff, 0x80, 0x16,
+ 0x12, 0x3a, 0x4, 0x50, 0x2, 0x80, 0x3, 0x12, 0x39, 0xe5, 0xbd, 0xbe, 0x28,
+ 0x2, 0x80, 0x3, 0x12, 0x39, 0xf6, 0x12, 0x39, 0xde, 0xbc, 0x5f, 0x38, 0xe6,
+ 0x12, 0x39, 0xd7, 0x50, 0x2, 0x7d, 0x3f, 0xb, 0x40, 0xbc, 0xa4, 0x38, 0xd2,
+ 0x7e, 0x27, 0x39, 0xc1, 0x7a, 0x27, 0x39, 0xc3, 0x6d, 0x22, 0xe5, 0x29,
+ 0x60, 0x5, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x2f, 0x11, 0x2f, 0x11, 0x12, 0x1,
+ 0x6c, 0x7d, 0xe3, 0x7a, 0xe7, 0x39, 0xc1, 0xda, 0x3b, 0x22, 0x7d, 0xf4,
+ 0x9d, 0xfe, 0xbd, 0x3f, 0x22, 0xa, 0xba, 0x2d, 0xb, 0xb, 0xf0, 0x22, 0x2d,
+ 0x9d, 0x7d, 0x8c, 0xb, 0x4a, 0x40, 0x22, 0x6d, 0x44, 0x7d, 0x4, 0x7e, 0xe4,
+ 0x7f, 0xff, 0x22, 0xa, 0xe4, 0x2d, 0xe0, 0x3e, 0xe4, 0x7f, 0x56, 0x2d, 0xbe,
+ 0xb, 0x5a, 0xe0, 0x22, 0xa, 0x94, 0x2d, 0x90, 0x3e, 0x94, 0x7f, 0x56, 0x2d,
+ 0xb9, 0xb, 0x5a, 0xb0, 0xbd, 0xb4, 0x22, 0x9d, 0xcd, 0xa, 0xda, 0xad, 0xdc,
+ 0x3e, 0xd4, 0x2e, 0xd4, 0x18, 0x80, 0x6d, 0xcc, 0x7e, 0x40, 0x1, 0x22, 0xa,
+ 0x3b, 0x6d, 0x22, 0x7e, 0x14, 0x0, 0x26, 0x12, 0x1, 0x63, 0x2e, 0x24, 0x0,
+ 0xff, 0x2e, 0x18, 0x3, 0x2, 0xb, 0x1a, 0x30, 0x22, 0x7e, 0x63, 0x9a, 0xed,
+ 0x7e, 0x70, 0x8, 0xac, 0x67, 0xb, 0x36, 0x7e, 0x43, 0x9a, 0xee, 0x7e, 0x50,
+ 0x8, 0xac, 0x45, 0xb, 0x26, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x28, 0x12, 0xc7,
+ 0x14, 0x7d, 0x53, 0x3e, 0x54, 0x7e, 0x44, 0x0, 0xa, 0x8d, 0x54, 0x1b, 0x54,
+ 0x7c, 0xab, 0x7e, 0xb3, 0x9a, 0xf2, 0xbc, 0xba, 0x28, 0xf, 0x7a, 0xa3, 0x9a,
+ 0xf2, 0x7e, 0x37, 0x38, 0x79, 0x4e, 0x70, 0x4, 0x7a, 0x37, 0x38, 0x79, 0x22,
+ 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18, 0x75, 0x6b, 0x7e, 0x8, 0x9b,
+ 0x23, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e,
+ 0x18, 0x75, 0x73, 0x7e, 0x8, 0x9b, 0x2b, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e,
+ 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18, 0x75, 0x7b, 0x7e, 0x8, 0x9b, 0x33,
+ 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x18,
+ 0x75, 0x83, 0x7e, 0x8, 0x9b, 0x3b, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x6c, 0x88,
+ 0x7c, 0xb8, 0x12, 0x38, 0x23, 0xb, 0x80, 0xbe, 0x80, 0x4, 0x40, 0xf4, 0x2,
+ 0x3a, 0xdf, 0x7e, 0x8, 0x9a, 0x4c, 0x7e, 0x34, 0x0, 0x2c, 0xe4, 0x12, 0x0,
+ 0x2e, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x9a, 0x4c, 0x7a, 0xb3, 0x9a, 0x4e,
+ 0x7a, 0xb3, 0x9a, 0x4f, 0x7a, 0xb3, 0x9a, 0x50, 0x7a, 0x37, 0x9a, 0x62,
+ 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x64, 0xe4, 0x7a, 0xb3, 0x9a, 0x65, 0x74, 0x2,
+ 0x7a, 0xb3, 0x9a, 0x66, 0x7a, 0x37, 0x9a, 0x6d, 0x74, 0xb, 0x7a, 0xb3, 0x9a,
+ 0x6f, 0xe4, 0x7a, 0xb3, 0x9a, 0x70, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x71, 0x7e,
+ 0xb3, 0x9b, 0x7f, 0x7e, 0x34, 0x0, 0x2, 0x7a, 0x37, 0x9a, 0x57, 0xb4, 0x1,
+ 0x30, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x59, 0x7a, 0xb3, 0x9a, 0x5a, 0x7a, 0xb3,
+ 0x9a, 0x5b, 0x74, 0x6, 0x7a, 0xb3, 0x9a, 0x5c, 0x74, 0x1, 0x7a, 0xb3, 0x9a,
+ 0x5d, 0x7a, 0xb3, 0x9a, 0x5e, 0x74, 0xb, 0x7a, 0xb3, 0x9a, 0x5f, 0xe4, 0x7a,
+ 0xb3, 0x9a, 0x60, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0x74, 0x1, 0x7a,
+ 0xb3, 0x9a, 0x59, 0xe4, 0x7a, 0xb3, 0x9a, 0x5a, 0x74, 0x1, 0x7a, 0xb3, 0x9a,
+ 0x5b, 0x7a, 0xb3, 0x9a, 0x5c, 0xe4, 0x7a, 0xb3, 0x9a, 0x5d, 0x74, 0x1, 0x7a,
+ 0xb3, 0x9a, 0x5e, 0x22, 0x12, 0x40, 0x84, 0x12, 0x71, 0x1, 0x12, 0x70, 0xc3,
+ 0x12, 0x3a, 0x82, 0x12, 0x71, 0x6d, 0x12, 0x71, 0x9f, 0x12, 0x71, 0x4f,
+ 0x12, 0x3b, 0xaa, 0x12, 0xb5, 0x5c, 0x12, 0x3f, 0xa0, 0x2, 0x1d, 0x2c, 0x12,
+ 0x3b, 0xda, 0x7e, 0x8, 0x67, 0x93, 0x74, 0xff, 0x12, 0x3b, 0xd7, 0x7e, 0x8,
+ 0x68, 0x97, 0x12, 0x3b, 0xd7, 0x7e, 0x8, 0x68, 0x15, 0x12, 0x0, 0x2e, 0x7e,
+ 0x8, 0x69, 0x19, 0x12, 0x3b, 0xe4, 0x7e, 0x8, 0x69, 0x69, 0x7e, 0x34, 0x0,
+ 0xd, 0xe4, 0x2, 0x0, 0x2e, 0x12, 0x0, 0x2e, 0x7e, 0x63, 0x75, 0x8c, 0x7e,
+ 0x70, 0xd, 0xac, 0x67, 0x22, 0xca, 0xf8, 0x6c, 0xaa, 0x80, 0x40, 0x7e, 0xf0,
+ 0x3, 0x7e, 0x90, 0x8, 0xac, 0x9a, 0x7f, 0x10, 0x2d, 0x34, 0x7a, 0x1b, 0xf0,
+ 0x74, 0x3, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x34, 0x7f,
+ 0xff, 0x7f, 0x70, 0x2d, 0xf4, 0x79, 0x37, 0x0, 0x2, 0x7f, 0x70, 0x2d, 0xf4,
+ 0x79, 0x37, 0x0, 0x4, 0xe4, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x6,
+ 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x7, 0xb, 0xa0, 0x12, 0x3c, 0x72,
+ 0x38, 0xbb, 0x12, 0xda, 0xec, 0x74, 0x2, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x1,
+ 0xa, 0x12, 0x8c, 0x28, 0x7e, 0x8, 0x1, 0x28, 0x12, 0x3c, 0x6b, 0x7e, 0x8,
+ 0x1, 0x32, 0x12, 0x3c, 0x6b, 0x7e, 0x8, 0x1, 0x14, 0x12, 0x3c, 0x6b, 0x7e,
+ 0x8, 0x1, 0x1e, 0x12, 0x3c, 0x6b, 0x7e, 0x8, 0x1, 0x3c, 0x12, 0x3c, 0x6b,
+ 0x7e, 0x8, 0x1, 0x46, 0x12, 0x8c, 0x30, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0,
+ 0xa, 0x2, 0x0, 0x2e, 0x7e, 0xb3, 0x75, 0x8c, 0xbc, 0xba, 0x22, 0xca, 0x69,
+ 0xca, 0xf8, 0x7e, 0x48, 0x69, 0x19, 0x6c, 0xaa, 0x80, 0x1a, 0x12, 0x9e, 0xb,
+ 0x19, 0x62, 0x67, 0x97, 0x74, 0xff, 0xa, 0x4a, 0x19, 0xb4, 0x92, 0x12, 0xe4,
+ 0x19, 0xb4, 0x91, 0xfe, 0x19, 0xb4, 0x92, 0x8, 0xb, 0xa0, 0x12, 0x3f, 0x50,
+ 0x38, 0xe1, 0x7e, 0x63, 0x69, 0x69, 0xa5, 0xbe, 0x0, 0x2e, 0x7e, 0xb3, 0x2,
+ 0x4a, 0x70, 0x2, 0xe1, 0x35, 0x6c, 0xaa, 0x80, 0x1b, 0x7e, 0x24, 0x7f, 0xff,
+ 0x7e, 0x30, 0x8, 0xac, 0x3a, 0x7f, 0x74, 0x2d, 0xf1, 0x79, 0x27, 0x0, 0x2,
+ 0x2d, 0x19, 0x7d, 0x8, 0x79, 0x20, 0x0, 0x4, 0xb, 0xa0, 0x12, 0x3c, 0x72,
+ 0x38, 0xe0, 0xe1, 0x35, 0x7e, 0xb3, 0x2, 0x4a, 0x70, 0x33, 0xbe, 0x60, 0x0,
+ 0x28, 0x2e, 0x6c, 0xaa, 0x80, 0x20, 0x12, 0x3f, 0x83, 0xac, 0x3a, 0x12,
+ 0x3f, 0x90, 0xac, 0x5a, 0x12, 0x3f, 0x66, 0x74, 0x1, 0xa, 0x4a, 0x19, 0xb4,
+ 0x91, 0xfe, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x19, 0xa2, 0x67, 0x97, 0xb, 0xa0,
+ 0x7e, 0x63, 0x69, 0x69, 0xbc, 0x6a, 0x38, 0xd8, 0xe1, 0x35, 0x6c, 0xaa,
+ 0x80, 0x19, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0x3f, 0x5e, 0x59, 0x42, 0x2d,
+ 0x32, 0x59, 0x42, 0x2d, 0x34, 0x59, 0x42, 0x2d, 0x5a, 0x59, 0x42, 0x2d,
+ 0x5c, 0xb, 0xa0, 0x12, 0x3f, 0x50, 0x38, 0xe2, 0x7e, 0x63, 0x2, 0x4a, 0xbe,
+ 0x63, 0x69, 0x69, 0x28, 0xa, 0xbe, 0x60, 0x2, 0x40, 0x5, 0x7e, 0x70, 0x1,
+ 0x80, 0x2, 0x6c, 0x77, 0x6c, 0xaa, 0xa1, 0xfe, 0x6c, 0xff, 0xa1, 0xf5, 0x7e,
+ 0x50, 0x8, 0xac, 0x5f, 0x7f, 0x64, 0x2d, 0xd2, 0x69, 0x6, 0x0, 0x2, 0xbe,
+ 0x4, 0x7f, 0xff, 0x78, 0x2, 0xa1, 0xf3, 0xa, 0x1f, 0x9, 0xb1, 0x92, 0x8,
+ 0x60, 0x2, 0xa1, 0xf3, 0xa5, 0xbf, 0x1, 0x60, 0x7e, 0x50, 0x2, 0xac, 0x5f,
+ 0x49, 0x42, 0x2, 0x5f, 0xbe, 0x44, 0x7f, 0xff, 0x68, 0x51, 0x49, 0xe2, 0x2,
+ 0x5f, 0x69, 0xf6, 0x0, 0x2, 0x7d, 0x4f, 0x9d, 0x4e, 0x2d, 0x4f, 0x49, 0xe2,
+ 0x2, 0x4b, 0x69, 0xf6, 0x0, 0x4, 0x7d, 0x2f, 0x9d, 0x2e, 0x2d, 0x2f, 0xbe,
+ 0x44, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x44, 0xbe, 0x24, 0x0, 0x0, 0x58, 0x2,
+ 0x6d, 0x22, 0x7e, 0xf7, 0x76, 0x1b, 0x1b, 0xf4, 0xbd, 0xf4, 0x50, 0x2, 0x7d,
+ 0x4f, 0x7e, 0xf7, 0x76, 0x29, 0x1b, 0xf4, 0xbd, 0xf2, 0x50, 0x2, 0x7d, 0x2f,
+ 0x12, 0x3f, 0x79, 0x59, 0x4f, 0x2d, 0x32, 0x59, 0x2f, 0x2d, 0x34, 0x80, 0xf,
+ 0x12, 0x3f, 0x79, 0x59, 0xf, 0x2d, 0x32, 0x69, 0x6, 0x0, 0x4, 0x59, 0xf,
+ 0x2d, 0x34, 0xa, 0xa, 0x19, 0xf0, 0x92, 0x12, 0x74, 0x1, 0x19, 0xb1, 0x92,
+ 0x8, 0x80, 0x9, 0xb, 0xf0, 0x12, 0x3f, 0x57, 0x28, 0x2, 0xa1, 0x53, 0xb,
+ 0xa0, 0x7e, 0x63, 0x2, 0x4a, 0xbc, 0x6a, 0x28, 0x2, 0xa1, 0x4f, 0x6c, 0xaa,
+ 0x80, 0x1a, 0x12, 0x3f, 0x6f, 0x69, 0x30, 0x0, 0x2, 0x7e, 0x50, 0x2, 0xac,
+ 0x5a, 0x59, 0x32, 0x2, 0x5f, 0x69, 0x30, 0x0, 0x4, 0x59, 0x32, 0x2, 0x4b,
+ 0xb, 0xa0, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7a, 0x38, 0xde, 0x6c, 0xaa, 0x80,
+ 0x2b, 0xa, 0x2a, 0x9, 0xb2, 0x92, 0x12, 0xb4, 0xff, 0x20, 0x6c, 0xff, 0x80,
+ 0x18, 0xa, 0x4f, 0x9, 0xb4, 0x92, 0x8, 0x70, 0xe, 0xa, 0x2a, 0x19, 0xf2,
+ 0x92, 0x12, 0x74, 0x1, 0x19, 0xb4, 0x92, 0x8, 0x80, 0x6, 0xb, 0xf0, 0xbc,
+ 0x7f, 0x38, 0xe4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xd1, 0x6c, 0xaa, 0x80, 0x1a,
+ 0x7e, 0x70, 0xd, 0xac, 0x7a, 0x49, 0x43, 0x67, 0x93, 0x12, 0x3f, 0x5e, 0x59,
+ 0x42, 0x2d, 0x5a, 0x49, 0x33, 0x67, 0x95, 0x59, 0x32, 0x2d, 0x5c, 0xb, 0xa0,
+ 0x7e, 0xb3, 0x69, 0x69, 0xbc, 0xba, 0x38, 0xde, 0x7e, 0x34, 0x2d, 0x32,
+ 0x7a, 0x37, 0x92, 0x1e, 0x7e, 0x34, 0x2d, 0x5a, 0x7a, 0x37, 0x92, 0x20,
+ 0x7e, 0x34, 0x2d, 0x82, 0x7a, 0x37, 0x92, 0x22, 0x7e, 0x73, 0x2, 0x4a, 0x7a,
+ 0x73, 0x92, 0x1c, 0x7e, 0x73, 0x69, 0x69, 0x7a, 0x73, 0x92, 0x1d, 0x7e, 0x8,
+ 0x92, 0x1c, 0x12, 0x2a, 0xf, 0x6c, 0xaa, 0x80, 0x4a, 0x7e, 0x70, 0xff, 0x6c,
+ 0xff, 0x80, 0x19, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x12, 0x2d, 0x82, 0xa,
+ 0x2a, 0xbd, 0x21, 0x78, 0x8, 0xa, 0x3f, 0x9, 0x73, 0x92, 0x12, 0x80, 0x7,
+ 0xb, 0xf0, 0x12, 0x3f, 0x57, 0x38, 0xe2, 0xbe, 0x70, 0xff, 0x68, 0x1e, 0x7e,
+ 0x50, 0xd, 0xac, 0x5a, 0x19, 0x72, 0x67, 0x97, 0x74, 0x1, 0xa, 0x47, 0x19,
+ 0xb4, 0x91, 0xfe, 0x12, 0x3f, 0x83, 0xac, 0x37, 0x12, 0x3f, 0x90, 0xac,
+ 0x57, 0x12, 0x3f, 0x66, 0xb, 0xa0, 0x7e, 0x63, 0x69, 0x69, 0xbc, 0x6a, 0x38,
+ 0xae, 0x6c, 0xaa, 0x80, 0x20, 0xa, 0x3a, 0x9, 0xb3, 0x91, 0xfe, 0xbe, 0xb0,
+ 0x1, 0x68, 0x13, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0x3f, 0x6f, 0x79, 0x40, 0x0,
+ 0x2, 0x2d, 0x39, 0x7d, 0x28, 0x79, 0x41, 0x0, 0x4, 0xb, 0xa0, 0x12, 0x3c,
+ 0x72, 0x38, 0xdb, 0x7f, 0x4, 0x7e, 0x18, 0x91, 0xfe, 0x12, 0x88, 0x29, 0x7a,
+ 0xb3, 0x2, 0x4a, 0x7f, 0x4, 0x7e, 0x18, 0x91, 0xfe, 0x12, 0x89, 0x58, 0xda,
+ 0xf8, 0xda, 0x69, 0x22, 0x7e, 0x63, 0x75, 0x8c, 0xbc, 0x6a, 0x22, 0x7e,
+ 0x63, 0x75, 0x8c, 0xbc, 0x6f, 0x22, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x3e, 0x24,
+ 0x22, 0x7f, 0x4, 0x2d, 0x12, 0x79, 0x40, 0x0, 0x4, 0x22, 0x7e, 0x70, 0x8,
+ 0xac, 0x7a, 0x7f, 0x4, 0x2d, 0x13, 0x22, 0x7e, 0xd0, 0x2, 0xac, 0xda, 0x7d,
+ 0xf6, 0x3e, 0xf4, 0x22, 0x7e, 0x90, 0xd, 0xac, 0x9a, 0x49, 0x24, 0x67, 0x93,
+ 0x7e, 0x30, 0x8, 0x22, 0x2d, 0x19, 0x7d, 0x8, 0x79, 0x20, 0x0, 0x2, 0x49,
+ 0x44, 0x67, 0x95, 0x7e, 0x50, 0x8, 0x22, 0x12, 0x1f, 0xd9, 0x68, 0x6, 0x12,
+ 0x3f, 0xdc, 0x2, 0x1f, 0xca, 0xe4, 0x12, 0x1f, 0xcc, 0x2, 0x3f, 0xb2, 0x12,
+ 0x1c, 0xb5, 0x5e, 0x60, 0x7f, 0x12, 0xd7, 0x27, 0x5e, 0x70, 0xf, 0x1b, 0xa,
+ 0x30, 0xc2, 0x1, 0x12, 0x3f, 0xcb, 0xd2, 0x8, 0x2, 0x15, 0x16, 0xa2, 0x1,
+ 0x92, 0x2, 0x7e, 0x8, 0x8d, 0xc4, 0x12, 0xd6, 0x5b, 0x12, 0x17, 0xfe, 0x2,
+ 0x12, 0x86, 0x12, 0xcc, 0x7f, 0x78, 0x6, 0xe4, 0x7a, 0xb3, 0x9b, 0xaf, 0x22,
+ 0x12, 0x1c, 0xb9, 0x5e, 0x70, 0xfb, 0x1b, 0xa, 0x30, 0x12, 0xc6, 0xb3, 0x12,
+ 0x3f, 0xf9, 0x2, 0xc5, 0x49, 0xd2, 0x1, 0x12, 0x3f, 0xcb, 0xd2, 0x6, 0x12,
+ 0x14, 0xe7, 0x7e, 0x34, 0x0, 0xa, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0x6d,
+ 0x33, 0x7a, 0x37, 0x38, 0x8e, 0x7a, 0xb3, 0x37, 0xdf, 0x7e, 0xb3, 0x9b,
+ 0x18, 0x70, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12, 0x40, 0x72, 0xc2, 0x0,
+ 0x12, 0x32, 0xa8, 0x7e, 0x34, 0x5, 0x20, 0xca, 0x39, 0x7e, 0x1f, 0x2d, 0x2a,
+ 0x7e, 0xf, 0x2d, 0x2e, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x12, 0x32, 0xc0, 0x12,
+ 0xb9, 0x8f, 0x2, 0x8, 0x2c, 0x74, 0x1, 0x7a, 0xb3, 0x8d, 0x91, 0x22, 0x12,
+ 0x40, 0x7b, 0x7e, 0x73, 0x9b, 0x7e, 0x7a, 0x73, 0x9a, 0xc3, 0x7e, 0xb3,
+ 0x9b, 0x18, 0x70, 0x5, 0x12, 0x40, 0x46, 0x80, 0x3, 0x12, 0x40, 0x72, 0xe4,
+ 0x7a, 0xb3, 0x69, 0x6a, 0x7a, 0xb3, 0x69, 0x69, 0x2, 0xa, 0xbf, 0x7e, 0x73,
+ 0x9a, 0xc2, 0x7a, 0x73, 0x8d, 0x91, 0x22, 0x7e, 0x73, 0x9b, 0xaf, 0x7a,
+ 0x73, 0x9a, 0xc8, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0x1b, 0xe4, 0x7a, 0xb3,
+ 0x9a, 0xbc, 0x7e, 0x73, 0x69, 0xe6, 0x7a, 0x73, 0x9a, 0xbe, 0x7e, 0x73,
+ 0x69, 0xe7, 0x7a, 0x73, 0x9a, 0xbf, 0x7e, 0x73, 0x75, 0x8c, 0x7a, 0x73,
+ 0x9a, 0xc1, 0x7a, 0xb3, 0x9a, 0xc2, 0x12, 0x40, 0x7b, 0x7a, 0xb3, 0x9a,
+ 0xca, 0x7a, 0xb3, 0x9a, 0xd0, 0x7e, 0x73, 0x69, 0xea, 0x7a, 0x73, 0x9a,
+ 0xda, 0x7e, 0x73, 0x69, 0xeb, 0x7a, 0x73, 0x9a, 0xdb, 0x7e, 0x73, 0x9b,
+ 0x68, 0x7a, 0x73, 0x9a, 0xdc, 0x7e, 0x73, 0x9b, 0x69, 0x7a, 0x73, 0x9a,
+ 0xdd, 0x7e, 0x73, 0x9b, 0x6a, 0x7a, 0x73, 0x9a, 0xde, 0x7e, 0x73, 0x9b,
+ 0x6b, 0x7a, 0x73, 0x9a, 0xdf, 0x7e, 0x73, 0x9b, 0x6c, 0x7a, 0x73, 0x9a,
+ 0xe0, 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0xec, 0x7e, 0x37, 0x76, 0x6c, 0x7a, 0x37,
+ 0x9a, 0xf9, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x18, 0x9b, 0x48, 0x7e,
+ 0x8, 0x9a, 0xfc, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x74, 0x2, 0x7a, 0xb3, 0x9a,
+ 0xc5, 0xe4, 0x7a, 0xb3, 0x9a, 0xcd, 0x74, 0x64, 0x7a, 0xb3, 0x9a, 0xce,
+ 0xe4, 0x7a, 0xb3, 0x9b, 0x5, 0x12, 0x32, 0xa, 0x2, 0x41, 0x2b, 0x7e, 0x34,
+ 0x0, 0x80, 0x12, 0x42, 0xef, 0x7e, 0x8, 0x37, 0xf2, 0x2, 0x41, 0x3d, 0x7e,
+ 0x8, 0x0, 0x27, 0x7f, 0x70, 0x12, 0x42, 0x6f, 0x7f, 0x7, 0x7e, 0x35, 0x2b,
+ 0x12, 0xc3, 0x29, 0xc2, 0x0, 0x12, 0x42, 0xbb, 0xd3, 0x22, 0xca, 0x79, 0x6c,
+ 0xff, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x42, 0xef, 0x12, 0x41, 0x39, 0x12, 0x42,
+ 0x60, 0x68, 0x4, 0x74, 0x70, 0x80, 0x2, 0xe5, 0x27, 0x7a, 0xb3, 0x67, 0x75,
+ 0x7e, 0x58, 0x69, 0x76, 0x12, 0x32, 0x99, 0x7e, 0x34, 0x18, 0x75, 0x7a,
+ 0x35, 0x2b, 0x7e, 0x34, 0x20, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x7e, 0x8, 0x69,
+ 0x76, 0x12, 0x41, 0x3d, 0x7e, 0x37, 0x69, 0x7a, 0x2e, 0x37, 0x69, 0x78,
+ 0xbe, 0x34, 0xff, 0xff, 0x68, 0x3, 0x4e, 0xf0, 0x1, 0x7e, 0x73, 0x69, 0x77,
+ 0xa, 0x27, 0x7e, 0xa3, 0x69, 0x76, 0xa, 0x3a, 0x12, 0x42, 0x68, 0x68, 0x3,
+ 0x4e, 0xf0, 0x2, 0x7e, 0xc7, 0x69, 0x78, 0x2e, 0xb4, 0x0, 0x6, 0x6c, 0xee,
+ 0x6d, 0xdd, 0x80, 0xb, 0x7f, 0x15, 0x2d, 0x3d, 0x7e, 0x1b, 0xb0, 0x6c, 0xeb,
+ 0xb, 0xd4, 0xbd, 0xcd, 0x38, 0xf1, 0xbc, 0xae, 0x68, 0x3, 0x4e, 0xf0, 0x4,
+ 0x7e, 0x34, 0x0, 0x4, 0x7a, 0x35, 0x2b, 0x7e, 0x34, 0x40, 0x0, 0x7e, 0x24,
+ 0x0, 0x1, 0x12, 0x41, 0x39, 0xe5, 0x2a, 0xa, 0x2b, 0xe5, 0x29, 0x12, 0x42,
+ 0x66, 0x78, 0xc, 0xe5, 0x29, 0xbe, 0xb0, 0xff, 0x68, 0x5, 0xe5, 0x2a, 0xb4,
+ 0xff, 0x3, 0x4e, 0xf0, 0x10, 0x12, 0x42, 0x60, 0x68, 0x3, 0x4e, 0xf0, 0x20,
+ 0x7e, 0xa1, 0x29, 0x74, 0x44, 0xa4, 0x7d, 0xc5, 0xe5, 0x29, 0x7a, 0xb3, 0x3,
+ 0xf1, 0x7e, 0x58, 0x4, 0x0, 0x7a, 0xc5, 0x2b, 0x7e, 0x34, 0x40, 0x4, 0x7e,
+ 0x24, 0x0, 0x1, 0x7f, 0x5, 0x12, 0x41, 0x3d, 0x6c, 0xee, 0x6d, 0xdd, 0x80,
+ 0xb, 0x7f, 0x15, 0x2d, 0x3d, 0x7e, 0x1b, 0x70, 0x6c, 0xe7, 0xb, 0xd4, 0xbd,
+ 0xcd, 0x38, 0xf1, 0x7f, 0x5, 0x7d, 0x3c, 0xe4, 0x12, 0x0, 0x2e, 0xbe, 0xe1,
+ 0x27, 0x68, 0x3, 0x4e, 0xf0, 0x40, 0x7a, 0xf3, 0x67, 0x74, 0x4c, 0xff, 0x68,
+ 0x6, 0x12, 0x42, 0xf7, 0x12, 0x0, 0x1e, 0xda, 0x79, 0x22, 0xe5, 0x28, 0xa,
+ 0x2b, 0xe5, 0x27, 0xa, 0x3b, 0x2d, 0x32, 0xbe, 0x34, 0x0, 0xff, 0x22, 0x7d,
+ 0x52, 0xf5, 0x2f, 0x7c, 0xb6, 0x7c, 0xa5, 0xa, 0x44, 0xf5, 0x2e, 0x7f, 0x21,
+ 0xf5, 0x2d, 0xd2, 0x0, 0x12, 0x42, 0xbb, 0x74, 0xb, 0x12, 0x42, 0x9c, 0xe5,
+ 0x2f, 0x12, 0x42, 0x9c, 0xe5, 0x2e, 0x12, 0x42, 0x9c, 0xe5, 0x2d, 0x12,
+ 0x42, 0x9c, 0xe4, 0x2, 0x42, 0x9c, 0x12, 0x42, 0xe7, 0x4e, 0x70, 0x3, 0x1b,
+ 0xa, 0x30, 0x12, 0xd7, 0x47, 0xa, 0x3b, 0x12, 0xda, 0xc9, 0x7e, 0x1f, 0x39,
+ 0xe4, 0x69, 0x31, 0x0, 0xe, 0x4d, 0x33, 0x78, 0xf4, 0xd3, 0x22, 0x12, 0x42,
+ 0xe7, 0x30, 0x0, 0x5, 0x5e, 0x70, 0xef, 0x80, 0x3, 0x4e, 0x70, 0x10, 0x1b,
+ 0xa, 0x30, 0x22, 0x75, 0xe7, 0x6b, 0xe4, 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24,
+ 0x0, 0xfe, 0x7a, 0x1b, 0xb0, 0x7e, 0x34, 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x75,
+ 0xe9, 0xff, 0x22, 0x7e, 0xf, 0x39, 0xe4, 0xb, 0xa, 0x30, 0x22, 0x7a, 0x35,
+ 0x2b, 0x7e, 0x18, 0x1f, 0x80, 0x22, 0x7e, 0x14, 0xf7, 0xf0, 0x7e, 0x4, 0x0,
+ 0xff, 0x7e, 0x34, 0x47, 0x52, 0x7e, 0x24, 0x55, 0x50, 0x12, 0x43, 0x44,
+ 0x7e, 0x34, 0x45, 0x20, 0x7e, 0x24, 0x41, 0x44, 0x79, 0x30, 0x0, 0x6, 0x79,
+ 0x20, 0x0, 0x4, 0x7e, 0x34, 0x99, 0x33, 0x7e, 0x24, 0x66, 0xcc, 0x79, 0x30,
+ 0x0, 0xa, 0x79, 0x20, 0x0, 0x8, 0x7e, 0x34, 0x41, 0x47, 0x7e, 0x24, 0x46,
+ 0x4c, 0x79, 0x30, 0x0, 0xe, 0x79, 0x20, 0x0, 0xc, 0x22, 0x69, 0x30, 0x0,
+ 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30, 0x0, 0x2, 0x1b, 0xa, 0x20,
+ 0x22, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x7e, 0xb3, 0x82, 0xd, 0xac, 0xbe,
+ 0xa, 0xaf, 0x2d, 0xa5, 0x7d, 0xba, 0x3e, 0xb4, 0x49, 0xbb, 0x4, 0x0, 0x7e,
+ 0x73, 0x81, 0xec, 0xa, 0x37, 0x9d, 0xb3, 0xbe, 0xb4, 0x0, 0x0, 0x18, 0x2,
+ 0x81, 0x5a, 0x7e, 0x1d, 0x10, 0x69, 0x11, 0x0, 0xf, 0xbd, 0x1b, 0x18, 0xb,
+ 0x2e, 0x34, 0x0, 0xa, 0x7e, 0x1b, 0xb0, 0x4, 0x7a, 0x1b, 0xb0, 0xe4, 0x7e,
+ 0x1d, 0x10, 0x7e, 0x1b, 0xa0, 0xa, 0x3a, 0xa, 0x2e, 0x9d, 0x23, 0xbe, 0x24,
+ 0x0, 0x0, 0x8, 0x8, 0xa, 0x1a, 0xa, 0x3e, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x32, 0x7e, 0xd, 0x10, 0x29, 0x60, 0x0, 0x1, 0xa, 0x26, 0xa, 0x4f,
+ 0x9d, 0x42, 0xbe, 0x44, 0x0, 0x0, 0x8, 0xa, 0xa, 0x16, 0xa, 0x2f, 0x9d,
+ 0x21, 0x7c, 0xa5, 0x80, 0x6, 0x6d, 0x22, 0x9d, 0x24, 0x7c, 0xa5, 0xbe, 0x70,
+ 0x1, 0x38, 0x5, 0xbe, 0xa0, 0x1, 0x28, 0x3d, 0x7e, 0x1d, 0x10, 0x29, 0x71,
+ 0x0, 0x4, 0xbe, 0x70, 0x3, 0x40, 0x10, 0x7e, 0x1d, 0x10, 0x29, 0x71, 0x0,
+ 0x5, 0xbe, 0x70, 0x3, 0x40, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2, 0x1, 0x7c,
+ 0xbe, 0x7c, 0x7f, 0x7e, 0xd, 0x10, 0x29, 0x60, 0x0, 0x2, 0x12, 0xcd, 0xeb,
+ 0xbe, 0xb0, 0x2, 0x68, 0x3, 0xb4, 0x3, 0x4, 0xe, 0xb4, 0x80, 0x5, 0xb4, 0x1,
+ 0x2, 0x6d, 0xbb, 0x7d, 0x5b, 0x1a, 0x4a, 0x1a, 0x48, 0x7e, 0xd, 0x10, 0x2e,
+ 0x14, 0x0, 0x13, 0x12, 0x43, 0x3b, 0x30, 0x26, 0x18, 0x7d, 0xda, 0x3e, 0xd4,
+ 0x7e, 0x1f, 0x3, 0xdc, 0x2d, 0x3d, 0xb, 0x1a, 0xc0, 0x7e, 0x1f, 0x3, 0xe0,
+ 0x2d, 0x3d, 0xb, 0x1a, 0xd0, 0x80, 0x4, 0xa, 0xce, 0xa, 0xdf, 0x7d, 0x1c,
+ 0x12, 0x46, 0xdb, 0x2e, 0x14, 0x0, 0x17, 0x12, 0x43, 0x3b, 0x7d, 0x1d, 0x12,
+ 0x46, 0xdb, 0x2e, 0x14, 0x0, 0x1b, 0x12, 0x43, 0x3b, 0xda, 0x79, 0x22, 0xca,
+ 0xd8, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x7e, 0x73, 0x82, 0xd, 0xa, 0x27,
+ 0x12, 0x46, 0x78, 0x7f, 0x21, 0x2d, 0x51, 0x7e, 0x2b, 0xb0, 0x60, 0x2, 0xa1,
+ 0x95, 0x74, 0x1, 0x12, 0x46, 0xb0, 0x7c, 0x7f, 0x12, 0x43, 0x4c, 0x12, 0x46,
+ 0xee, 0xa, 0x57, 0x1a, 0x4e, 0x1b, 0x44, 0xbd, 0x45, 0x48, 0x30, 0x12, 0x46,
+ 0xd0, 0x12, 0x46, 0xa3, 0x7e, 0x2b, 0xb0, 0x70, 0x25, 0x12, 0x46, 0x8c, 0x8,
+ 0xa, 0x7c, 0xbe, 0x14, 0x7c, 0x7f, 0x12, 0x44, 0x5d, 0x80, 0x16, 0x74, 0x2,
+ 0x1a, 0x2e, 0x1b, 0x24, 0xa, 0x3d, 0x12, 0x46, 0x7a, 0x12, 0x46, 0xb0, 0x14,
+ 0x12, 0x46, 0xc0, 0x14, 0x12, 0x45, 0x9a, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0,
+ 0x8, 0xa, 0x37, 0x1a, 0x5f, 0x7d, 0x45, 0x1b, 0x44, 0xbd, 0x43, 0x48, 0x38,
+ 0x12, 0x46, 0x99, 0x1b, 0x54, 0x7e, 0x2b, 0xb0, 0x70, 0x2e, 0x3e, 0x34,
+ 0x49, 0x23, 0x3, 0xfe, 0x12, 0x46, 0x92, 0x8, 0xb, 0x7c, 0x7f, 0x1b, 0x70,
+ 0x7c, 0xbe, 0x12, 0x44, 0x5d, 0x80, 0x18, 0x12, 0x46, 0x74, 0x2d, 0x31,
+ 0x1b, 0x34, 0x7a, 0x1b, 0xb0, 0x7c, 0xbe, 0x7c, 0x7f, 0x1b, 0x70, 0x12,
+ 0x46, 0xb8, 0x1b, 0x70, 0x12, 0x45, 0x9c, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0,
+ 0x7, 0xa, 0x57, 0x1a, 0x4e, 0xb, 0x44, 0xbd, 0x45, 0x58, 0x30, 0x12, 0x46,
+ 0xd0, 0x12, 0x46, 0xa3, 0x7e, 0x2b, 0xb0, 0x70, 0x25, 0x12, 0x46, 0x8c, 0x8,
+ 0xa, 0x7c, 0xbe, 0x4, 0x7c, 0x7f, 0x12, 0x44, 0x5d, 0x80, 0x16, 0x74, 0x2,
+ 0x1a, 0x2e, 0xb, 0x24, 0xa, 0x3d, 0x12, 0x46, 0x7a, 0x12, 0x46, 0xb0, 0x4,
+ 0x12, 0x46, 0xc0, 0x4, 0x12, 0x45, 0x9a, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0,
+ 0x9, 0xa, 0x37, 0x1a, 0x5f, 0x7d, 0x45, 0xb, 0x44, 0xbd, 0x43, 0x58, 0x36,
+ 0x12, 0x46, 0x99, 0x29, 0xb2, 0x0, 0x1, 0x70, 0x2d, 0x3e, 0x34, 0x49, 0x23,
+ 0x4, 0x2, 0x12, 0x46, 0x92, 0x8, 0xb, 0x7c, 0x7f, 0xb, 0x70, 0x7c, 0xbe,
+ 0x12, 0x44, 0x5d, 0x80, 0x17, 0x12, 0x46, 0x74, 0x2d, 0x31, 0x39, 0xb1, 0x0,
+ 0x1, 0x7c, 0xbe, 0x7c, 0x7f, 0xb, 0x70, 0x12, 0x46, 0xb8, 0xb, 0x70, 0x12,
+ 0x45, 0x9c, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7c, 0x7f, 0x7c, 0x6e, 0x7c,
+ 0x5f, 0xca, 0x3b, 0x7c, 0xf5, 0x7c, 0xe6, 0x7c, 0xd7, 0x7c, 0xcb, 0x7e,
+ 0x14, 0x7, 0xe7, 0x7e, 0x4, 0x0, 0xff, 0x12, 0x46, 0xc8, 0x7a, 0x1d, 0x32,
+ 0x7e, 0x14, 0x7, 0xeb, 0x7e, 0x4, 0x0, 0xff, 0x12, 0x46, 0xc8, 0x7a, 0x1d,
+ 0x36, 0x75, 0x3a, 0x0, 0x75, 0x3b, 0x0, 0x7e, 0x11, 0x3a, 0x3e, 0x10, 0x2e,
+ 0x11, 0x3b, 0x7c, 0x1, 0x2e, 0x0, 0x32, 0xa5, 0xe6, 0x1a, 0x4b, 0x1a, 0x5c,
+ 0x2d, 0x54, 0xf5, 0x3c, 0x2e, 0x10, 0x36, 0xa5, 0xe7, 0x1a, 0x4b, 0x1a,
+ 0x5d, 0x2d, 0x54, 0xf5, 0x3d, 0xbe, 0xe1, 0x3c, 0x78, 0x5, 0xbe, 0xf1, 0x3d,
+ 0x68, 0x61, 0x12, 0x46, 0xee, 0xbe, 0x71, 0x3c, 0x18, 0x59, 0x29, 0x70, 0x0,
+ 0x7, 0xbe, 0x71, 0x3c, 0x8, 0x50, 0x29, 0x70, 0x0, 0x8, 0xbe, 0x71, 0x3d,
+ 0x18, 0x47, 0x29, 0x70, 0x0, 0x9, 0xbe, 0x71, 0x3d, 0x8, 0x3e, 0x7e, 0x73,
+ 0x82, 0xd, 0xa, 0x27, 0xe5, 0x3c, 0x1a, 0x3b, 0xad, 0x32, 0xe5, 0x3d, 0x1a,
+ 0x9b, 0x2d, 0x93, 0x69, 0x30, 0x0, 0xd, 0x69, 0x20, 0x0, 0xb, 0x2d, 0x39,
+ 0x7e, 0x1b, 0xb0, 0x70, 0x1d, 0x7d, 0x89, 0x3e, 0x84, 0x49, 0x58, 0x4, 0x0,
+ 0x69, 0x80, 0x0, 0x11, 0xbd, 0x58, 0x18, 0xd, 0x74, 0x2, 0x7a, 0x1b, 0xb0,
+ 0xe5, 0x3c, 0x7e, 0x71, 0x3d, 0x12, 0x43, 0x4c, 0x5, 0x3b, 0xe5, 0x3b, 0xb4,
+ 0x2, 0x2, 0x80, 0x2, 0xa1, 0xcc, 0x5, 0x3a, 0xe5, 0x3a, 0xbe, 0xb0, 0x2,
+ 0x50, 0x2, 0xa1, 0xc9, 0xda, 0x3b, 0x22, 0x74, 0x2, 0xa, 0x2d, 0x1a, 0x3e,
+ 0xad, 0x32, 0x1a, 0x1f, 0x2d, 0x13, 0x7e, 0x7d, 0x10, 0x69, 0x37, 0x0, 0xd,
+ 0x69, 0x27, 0x0, 0xb, 0x22, 0x3e, 0x34, 0x49, 0x23, 0x4, 0x0, 0x69, 0x30,
+ 0x0, 0x11, 0xbd, 0x23, 0x22, 0x7e, 0xd3, 0x82, 0xd, 0xa, 0x2d, 0x1a, 0x3e,
+ 0xad, 0x32, 0x2d, 0x35, 0x69, 0x50, 0x0, 0xd, 0x69, 0x40, 0x0, 0xb, 0x2d,
+ 0x53, 0x22, 0x2d, 0x31, 0x7a, 0x1b, 0xb0, 0x7c, 0xbe, 0x22, 0x12, 0x43,
+ 0x4c, 0x7c, 0xbe, 0x7c, 0x7f, 0x22, 0x7c, 0x7f, 0x12, 0x43, 0x4c, 0x7c,
+ 0xbe, 0x22, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x22, 0x7e, 0xd3, 0x82,
+ 0xd, 0xa, 0x5d, 0xad, 0x54, 0x1a, 0x3f, 0x22, 0x1a, 0x2, 0x1a, 0x0, 0x7d,
+ 0x3b, 0x1a, 0x26, 0x1a, 0x24, 0x12, 0x1, 0x52, 0x7f, 0x21, 0x7e, 0xd, 0x10,
+ 0x22, 0x7e, 0xd, 0x10, 0x29, 0x70, 0x0, 0x6, 0x22, 0xe4, 0x12, 0x47, 0xb5,
+ 0x12, 0xc9, 0x82, 0x12, 0xc3, 0xae, 0x12, 0x47, 0x8e, 0x12, 0xc5, 0xd4,
+ 0x12, 0x32, 0x99, 0x12, 0xc6, 0xcb, 0x12, 0xc4, 0xcd, 0x12, 0xc5, 0xcf,
+ 0x12, 0xc4, 0xd2, 0x12, 0xc4, 0xd9, 0x12, 0xc5, 0x64, 0x12, 0xc5, 0x6e,
+ 0x12, 0xc5, 0x7e, 0x12, 0x47, 0x73, 0x12, 0x47, 0x99, 0x12, 0xc3, 0x7f,
+ 0x12, 0x41, 0x51, 0x12, 0x68, 0x96, 0x12, 0xc5, 0x90, 0x12, 0x51, 0xf9,
+ 0x12, 0xc8, 0x3e, 0xd2, 0xaf, 0x12, 0x47, 0x6a, 0x7e, 0x24, 0x43, 0x31,
+ 0x12, 0xd5, 0xf8, 0x12, 0x47, 0x6a, 0x7e, 0x24, 0x41, 0x21, 0x12, 0xd6,
+ 0x2c, 0x2, 0x47, 0x52, 0xa9, 0x27, 0xc1, 0x13, 0x12, 0x47, 0xa8, 0x78, 0xe,
+ 0x7e, 0x34, 0xf3, 0x1e, 0x12, 0xc6, 0xe, 0x7e, 0x34, 0xf4, 0xc1, 0x2, 0x31,
+ 0x2b, 0x22, 0x7e, 0xb3, 0x69, 0xe6, 0x7e, 0x73, 0x69, 0xe7, 0x22, 0x12,
+ 0xd7, 0x55, 0xe4, 0x7e, 0x34, 0x1, 0xf4, 0x2, 0x47, 0x7e, 0x7c, 0xab, 0x74,
+ 0x2, 0xa4, 0x7e, 0xf, 0x39, 0xf1, 0x2d, 0x15, 0x79, 0x30, 0x0, 0x10, 0x22,
+ 0xc2, 0x8d, 0xc2, 0x8f, 0x12, 0x68, 0xe7, 0xa9, 0xc0, 0x93, 0x22, 0x12,
+ 0x47, 0xa8, 0x78, 0x9, 0x7e, 0x34, 0xb4, 0x80, 0x74, 0xa, 0x2, 0x31, 0x2b,
+ 0x22, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x8, 0x0,
+ 0x22, 0xd2, 0xcf, 0xa9, 0xc7, 0xcb, 0xbe, 0xb0, 0x8, 0x50, 0x2, 0xf5, 0xcc,
+ 0x75, 0xe6, 0x0, 0xc2, 0x0, 0x2, 0x47, 0xc9, 0xa9, 0xd5, 0xc3, 0x12, 0xc5,
+ 0x45, 0xa2, 0x0, 0xa9, 0x97, 0xc1, 0x22, 0x12, 0xda, 0x1e, 0x7e, 0x70, 0x5,
+ 0xac, 0x78, 0x9, 0x53, 0x9b, 0x63, 0xbe, 0x53, 0x9a, 0xdc, 0x68, 0x8, 0x7e,
+ 0x53, 0x9a, 0xdc, 0x19, 0x53, 0x9b, 0x63, 0x9, 0x53, 0x9b, 0x64, 0xbe, 0x53,
+ 0x9a, 0xdd, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xdd, 0x19, 0x53, 0x9b, 0x64, 0x9,
+ 0x53, 0x9b, 0x65, 0xbe, 0x53, 0x9a, 0xde, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xde,
+ 0x19, 0x53, 0x9b, 0x65, 0x9, 0x53, 0x9b, 0x66, 0xbe, 0x53, 0x9a, 0xdf, 0x68,
+ 0x8, 0x7e, 0x53, 0x9a, 0xdf, 0x19, 0x53, 0x9b, 0x66, 0x9, 0x53, 0x9b, 0x67,
+ 0xbe, 0x53, 0x9a, 0xe0, 0x68, 0x8, 0x7e, 0x53, 0x9a, 0xe0, 0x19, 0x53, 0x9b,
+ 0x67, 0x12, 0x48, 0xa3, 0x12, 0x48, 0x44, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x17,
+ 0x8f, 0x9, 0xb3, 0x9b, 0x63, 0x9, 0x73, 0x9b, 0x64, 0x12, 0x48, 0xfe, 0x7e,
+ 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x8e, 0x3a, 0x6d, 0x0, 0x74, 0x5, 0xac,
+ 0xb8, 0x9, 0xb5, 0x9b, 0x65, 0x12, 0x48, 0xaf, 0x7e, 0x30, 0x3c, 0xac, 0x39,
+ 0x2e, 0x14, 0x8e, 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x9b,
+ 0x66, 0x12, 0x48, 0xc7, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x8e,
+ 0x3c, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x9b, 0x67, 0x12, 0x48,
+ 0xef, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0x70, 0xee, 0xac, 0x79, 0x2e, 0x34,
+ 0x1, 0x0, 0x2e, 0x34, 0x0, 0x9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14,
+ 0x8e, 0x3a, 0x6d, 0x0, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x3f, 0x1b, 0xa,
+ 0x30, 0x12, 0x4f, 0xdf, 0x2, 0x48, 0xbe, 0xb, 0xa, 0x30, 0x4d, 0x35, 0x1b,
+ 0xa, 0x30, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xcf, 0x1b, 0xa, 0x30, 0x54,
+ 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, 0x2, 0x48, 0xbe, 0x12, 0xda, 0x1e, 0x12,
+ 0x48, 0xa3, 0x7e, 0x70, 0x5, 0xac, 0x78, 0x12, 0x48, 0x44, 0x7e, 0x24, 0x0,
+ 0x2, 0x2, 0x17, 0x8f, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf3, 0x1b, 0xa, 0x30,
+ 0x12, 0x4f, 0xeb, 0x2, 0x16, 0xaf, 0xb, 0xa, 0x20, 0x5e, 0x40, 0xc3, 0x1b,
+ 0xa, 0x20, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61, 0xb, 0xa, 0x20, 0x4d,
+ 0x25, 0x1b, 0xa, 0x20, 0x7c, 0xb7, 0x12, 0x4f, 0xeb, 0x2, 0x16, 0xaf, 0x7c,
+ 0x9b, 0x29, 0x81, 0x0, 0x2, 0xa, 0xe8, 0x7d, 0x5e, 0x7c, 0xab, 0xe4, 0x7d,
+ 0xe5, 0x29, 0x81, 0x0, 0x3, 0xa, 0x58, 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4,
+ 0x2d, 0xe5, 0x29, 0x81, 0x0, 0x1, 0xa, 0xf8, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e,
+ 0xf4, 0x3e, 0xf4, 0x2d, 0xfe, 0x7e, 0x1b, 0x80, 0xa, 0x58, 0x2d, 0x5f, 0x1b,
+ 0xa, 0x50, 0x29, 0x81, 0x0, 0x4, 0xa, 0x38, 0x79, 0x30, 0x0, 0x2, 0xa, 0x59,
+ 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4, 0x22, 0x7c, 0x34, 0x7c, 0x25, 0x7c,
+ 0xa6, 0x7c, 0x17, 0x7c, 0xb, 0x12, 0x4f, 0xd5, 0x5e, 0x80, 0x3, 0x7c, 0xba,
+ 0x12, 0x4f, 0xdf, 0x4d, 0x45, 0x7c, 0xb0, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49,
+ 0x61, 0x4d, 0x45, 0x7c, 0xb1, 0x54, 0x3, 0x7c, 0xb, 0x6c, 0x11, 0x3e, 0x4,
+ 0x3e, 0x4, 0x4d, 0x40, 0x1b, 0x1a, 0x40, 0x7e, 0x34, 0xa0, 0x14, 0xb, 0x1a,
+ 0x40, 0x5e, 0x80, 0xc3, 0x7c, 0xb2, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61,
+ 0x2, 0x49, 0xb1, 0x4d, 0x45, 0x7c, 0xb3, 0x54, 0x3, 0xa, 0x5b, 0x7c, 0xab,
+ 0xe4, 0x3e, 0x54, 0x3e, 0x54, 0x4d, 0x45, 0x1b, 0x1a, 0x40, 0x22, 0x7e,
+ 0xb3, 0x9b, 0xa8, 0x7e, 0x70, 0x2, 0x7e, 0x60, 0x2, 0x7c, 0x36, 0x7c, 0xb7,
+ 0x12, 0x4f, 0xd5, 0x5e, 0x80, 0xc3, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x49, 0x61,
+ 0x2, 0x49, 0xb1, 0x7e, 0xb3, 0x9a, 0x7b, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41,
+ 0x82, 0x7e, 0x73, 0x9a, 0x78, 0xbe, 0x73, 0x9a, 0x7a, 0x28, 0x6c, 0x7e,
+ 0x63, 0x9a, 0x7a, 0x7e, 0x70, 0x9, 0xac, 0x67, 0x49, 0x53, 0x9a, 0x86, 0x7c,
+ 0xab, 0x7e, 0x43, 0x9a, 0x83, 0x7e, 0x50, 0x2, 0xac, 0x45, 0x2d, 0x32, 0x49,
+ 0x33, 0x9a, 0x88, 0x7a, 0x35, 0x16, 0x4d, 0x33, 0x68, 0x47, 0xd2, 0x34,
+ 0x1b, 0xa0, 0x68, 0x10, 0x1b, 0xa0, 0x68, 0xc, 0x1b, 0xa0, 0x68, 0x1a, 0x1b,
+ 0xa0, 0x68, 0x4, 0xb, 0xa2, 0x78, 0x31, 0xe4, 0x12, 0x4a, 0x83, 0x30, 0xf,
+ 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x4f, 0x59, 0x80, 0x1f, 0x74,
+ 0x1, 0x12, 0x4a, 0x83, 0x30, 0xf, 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1,
+ 0x12, 0x4f, 0x59, 0x74, 0x3, 0x7e, 0x70, 0x3, 0x6c, 0x66, 0x6c, 0x55, 0x6c,
+ 0x44, 0x12, 0x49, 0x68, 0x12, 0xcc, 0x7, 0x38, 0x18, 0x74, 0x2, 0x7a, 0xb3,
+ 0x9a, 0x7b, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xc, 0x12, 0x49, 0xc6, 0x12, 0x1c,
+ 0xb5, 0x5e, 0x70, 0xef, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x3b, 0x7c, 0xcb, 0x7e,
+ 0x35, 0x16, 0x6d, 0x22, 0x7f, 0x41, 0x7e, 0xd3, 0x9a, 0x83, 0x4c, 0xcc,
+ 0x68, 0x4, 0x7e, 0x48, 0x18, 0x80, 0x20, 0x34, 0x2, 0x61, 0xd4, 0xa9, 0xd7,
+ 0xea, 0x7e, 0x77, 0x8d, 0x94, 0x7e, 0xa4, 0x0, 0x9, 0x7e, 0xb3, 0x69, 0xec,
+ 0x60, 0x3d, 0x4c, 0xcc, 0x78, 0xc, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x4b, 0xe8,
+ 0x12, 0x4b, 0xd7, 0x78, 0xf6, 0x6d, 0xbb, 0x80, 0x21, 0x12, 0x4f, 0xcc,
+ 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x82, 0x11, 0x12, 0x4f,
+ 0x52, 0x68, 0x5, 0x12, 0x4c, 0x17, 0x80, 0x7, 0x6d, 0x11, 0x12, 0x4c, 0x26,
+ 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0, 0x40, 0xd9, 0x80, 0x3c, 0x4c,
+ 0xcc, 0x78, 0x12, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x4b, 0xe8, 0x2d, 0x21,
+ 0x59, 0x32, 0x8e, 0x0, 0x12, 0x4b, 0xdd, 0x78, 0xf0, 0x6d, 0xbb, 0x12, 0x4f,
+ 0xcc, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x82, 0x10, 0x12,
+ 0x4f, 0x52, 0x68, 0x5, 0x12, 0x4c, 0x17, 0x80, 0x7, 0x6d, 0x11, 0x12, 0x4c,
+ 0x26, 0xb, 0xa4, 0x12, 0x4c, 0x34, 0x78, 0xdc, 0x7f, 0x4, 0x2e, 0x14, 0x0,
+ 0x0, 0x7d, 0x5a, 0x3e, 0x54, 0x7e, 0x1f, 0x8f, 0x18, 0x2d, 0x35, 0x12, 0xaf,
+ 0x13, 0x7e, 0x37, 0x8d, 0x94, 0x2d, 0xa3, 0x7e, 0xb3, 0x69, 0xec, 0x60,
+ 0x45, 0x6d, 0x33, 0x7d, 0xb3, 0x12, 0x4f, 0x45, 0x60, 0x5, 0x3e, 0x14, 0x14,
+ 0x78, 0xfb, 0x7e, 0x53, 0x82, 0x10, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22,
+ 0x68, 0x5, 0x12, 0x4b, 0xfa, 0x80, 0x7, 0x6d, 0x22, 0x12, 0x4c, 0x9, 0xb,
+ 0xa4, 0x12, 0x4c, 0x34, 0x78, 0xd9, 0x4c, 0xcc, 0x78, 0x58, 0x7d, 0xb3,
+ 0x12, 0x4b, 0xe4, 0x7d, 0x1b, 0x3e, 0x14, 0x2d, 0x21, 0x59, 0x32, 0x8e, 0x0,
+ 0x12, 0x4b, 0xdd, 0x78, 0xee, 0x80, 0x42, 0x6d, 0x33, 0x7d, 0xb3, 0x80,
+ 0x24, 0x12, 0x4f, 0x45, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53,
+ 0x82, 0x11, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x4b, 0xfa,
+ 0x80, 0x7, 0x6d, 0x22, 0x12, 0x4c, 0x9, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4,
+ 0x0, 0x0, 0x40, 0xd6, 0x4c, 0xcc, 0x78, 0xe, 0x7d, 0xb3, 0x12, 0x4b, 0xe4,
+ 0x7d, 0x1b, 0x3e, 0x14, 0x12, 0x4b, 0xd7, 0x78, 0xf4, 0xa9, 0xc7, 0xea,
+ 0xc2, 0x34, 0xda, 0x3b, 0x22, 0x2d, 0x21, 0x59, 0x32, 0x8e, 0xa, 0xb, 0xb4,
+ 0xbe, 0xb4, 0x0, 0x5, 0x22, 0x7d, 0x1b, 0x2d, 0x1a, 0x3e, 0x14, 0x7e, 0x1f,
+ 0x8f, 0x18, 0x2d, 0x31, 0x69, 0x31, 0x0, 0x6, 0x7e, 0x50, 0x14, 0xac, 0x5d,
+ 0x22, 0x7d, 0x2a, 0xb, 0xa4, 0x3e, 0x24, 0x7e, 0xf, 0x8f, 0x18, 0x2d, 0x12,
+ 0xb, 0xa, 0x20, 0x7d, 0x17, 0xb, 0x74, 0x3e, 0x14, 0x2d, 0x19, 0x7d, 0x8,
+ 0x1b, 0xa, 0x20, 0x22, 0x7d, 0x1a, 0xb, 0xa4, 0x3e, 0x14, 0x7e, 0x1f, 0x8f,
+ 0x18, 0x2d, 0x31, 0xb, 0x1a, 0x10, 0x7d, 0x7, 0xb, 0x74, 0x3e, 0x4, 0x7f,
+ 0x14, 0x2d, 0x30, 0x1b, 0x1a, 0x10, 0x22, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x4,
+ 0x22, 0xca, 0x79, 0x7e, 0x97, 0x82, 0x35, 0x7a, 0x97, 0x92, 0x0, 0x7e, 0xf3,
+ 0x82, 0xd, 0x6d, 0xaa, 0x74, 0x4, 0xac, 0xbf, 0x7a, 0x57, 0x92, 0x2, 0x7d,
+ 0x85, 0x2e, 0x87, 0x92, 0x0, 0x7a, 0x87, 0x92, 0x4, 0x7e, 0x1f, 0x39, 0xed,
+ 0x69, 0x81, 0x0, 0x18, 0x7a, 0x87, 0x91, 0xfe, 0x7e, 0xe3, 0x82, 0xa, 0x12,
+ 0xda, 0x17, 0x6d, 0x88, 0xa1, 0x9b, 0x7e, 0x8, 0x92, 0x6, 0x12, 0x74, 0xb3,
+ 0x12, 0x61, 0x91, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2d, 0x3a, 0x12, 0x4e,
+ 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4e, 0x2e,
+ 0x12, 0x4e, 0x13, 0xbe, 0xb4, 0x0, 0x4, 0x78, 0xe2, 0x6d, 0xbb, 0xa, 0x3f,
+ 0xad, 0x3b, 0x2e, 0x37, 0x92, 0x2, 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24,
+ 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4e, 0x2e, 0x12, 0x4e, 0x13, 0xbe,
+ 0xb4, 0x0, 0x5, 0x78, 0xe0, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2d, 0x39,
+ 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12,
+ 0x4e, 0x2e, 0x3e, 0x34, 0x2e, 0x34, 0x92, 0x34, 0x12, 0x4e, 0x19, 0xbe,
+ 0xb4, 0x0, 0x4, 0x78, 0xdc, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2e, 0x37,
+ 0x92, 0x4, 0x12, 0x4e, 0x2, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d,
+ 0x3f, 0x12, 0x4e, 0x2e, 0x3e, 0x34, 0x2e, 0x34, 0x92, 0x34, 0x12, 0x4e,
+ 0x19, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xda, 0x12, 0xd8, 0xe0, 0x7e, 0x8, 0x92,
+ 0x6, 0x12, 0x17, 0x8b, 0x12, 0xd8, 0xe0, 0x7e, 0x8, 0x92, 0x34, 0x12, 0x17,
+ 0x2a, 0x12, 0x53, 0xca, 0x30, 0xf, 0xf, 0x7e, 0x8, 0x3a, 0x0, 0x7e, 0x34,
+ 0x5, 0x20, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x80, 0x6c, 0xa9, 0xd7, 0xea, 0x6d,
+ 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2d, 0x2a, 0x12, 0xd8, 0x27, 0x2d,
+ 0xa, 0x12, 0xd8, 0xce, 0x2d, 0x29, 0x3e, 0x24, 0x59, 0x32, 0x3a, 0x0, 0x12,
+ 0x4c, 0x34, 0x78, 0xe3, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2e,
+ 0x27, 0x92, 0x2, 0x12, 0xd8, 0x27, 0x2e, 0x7, 0x92, 0x2, 0x12, 0xd8, 0xce,
+ 0x2e, 0x27, 0x92, 0x4, 0x3e, 0x24, 0x59, 0x32, 0x3a, 0x0, 0x12, 0x4b, 0xdd,
+ 0x78, 0xdd, 0xa9, 0xc7, 0xea, 0xb, 0xa4, 0x7e, 0x37, 0x92, 0x2, 0xb, 0x34,
+ 0x7a, 0x37, 0x92, 0x2, 0xb, 0x94, 0x7e, 0x37, 0x92, 0x4, 0xb, 0x34, 0x7a,
+ 0x37, 0x92, 0x4, 0xb, 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x28, 0x2, 0x81, 0x74,
+ 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x56, 0x6d, 0x88, 0x7d, 0xa8, 0xa, 0x2e, 0x1b,
+ 0x24, 0xa, 0x3f, 0xad, 0x32, 0x7d, 0x93, 0x2e, 0x97, 0x92, 0x0, 0x80, 0x3c,
+ 0x6d, 0xbb, 0x80, 0x2c, 0xa, 0x5f, 0xad, 0x5b, 0x7d, 0x15, 0x2d, 0x1a, 0x3e,
+ 0x14, 0x49, 0x31, 0x3a, 0x0, 0x7d, 0x29, 0x9d, 0x25, 0x3e, 0x24, 0x49, 0x22,
+ 0x3a, 0x0, 0x59, 0x21, 0x3a, 0x0, 0xa, 0x5f, 0xad, 0x5b, 0x7d, 0x19, 0x9d,
+ 0x15, 0x3e, 0x14, 0x59, 0x31, 0x3a, 0x0, 0xb, 0xb4, 0xa, 0x1e, 0xbd, 0x1b,
+ 0x38, 0xce, 0xb, 0xa4, 0xb, 0x94, 0xb, 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x38,
+ 0xbe, 0xda, 0x79, 0x22, 0x3e, 0x34, 0x49, 0xf3, 0x6f, 0xcb, 0x7d, 0x5f,
+ 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x22, 0x3e, 0x34, 0x2e, 0x34,
+ 0x92, 0x6, 0xb, 0x38, 0xe0, 0x4d, 0xe2, 0x1b, 0x38, 0xe0, 0xb, 0xb4, 0x22,
+ 0x7a, 0x37, 0x81, 0xfb, 0x7e, 0x37, 0x81, 0xed, 0x1e, 0x34, 0x1e, 0x34,
+ 0x1e, 0x34, 0x1e, 0x34, 0x1e, 0x34, 0x22, 0x7e, 0x37, 0x75, 0x96, 0x12,
+ 0x4e, 0x2c, 0x7a, 0x73, 0x59, 0x3b, 0x7e, 0x37, 0x75, 0x98, 0x12, 0x4f,
+ 0x23, 0x7a, 0x73, 0x59, 0x3c, 0x7e, 0x37, 0x75, 0x9e, 0x12, 0x4e, 0x2c,
+ 0x7a, 0x73, 0x59, 0x3d, 0x7e, 0x37, 0x75, 0xa0, 0x12, 0x4f, 0x23, 0x7a,
+ 0x73, 0x59, 0x3e, 0xe4, 0x7a, 0xb3, 0x59, 0x3f, 0x7e, 0x37, 0x75, 0xa8,
+ 0x12, 0x4e, 0x2c, 0x7a, 0x73, 0x59, 0x40, 0x7e, 0x34, 0x0, 0x6a, 0xca, 0x39,
+ 0x7e, 0x18, 0x75, 0xac, 0x7e, 0x8, 0x59, 0x41, 0x12, 0x0, 0x6e, 0x1b, 0xfd,
+ 0x7e, 0x73, 0x67, 0x74, 0x7a, 0x73, 0x59, 0x48, 0x7e, 0x73, 0x67, 0x74,
+ 0x7a, 0x73, 0x59, 0x49, 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0xa, 0x12, 0x4f,
+ 0x2e, 0xe4, 0x7a, 0xb3, 0x39, 0xfe, 0x80, 0x20, 0x12, 0xbe, 0x95, 0x12,
+ 0x72, 0x17, 0x7e, 0xb3, 0x82, 0x9, 0x70, 0x14, 0x7e, 0xb3, 0x39, 0xfe, 0x70,
+ 0xe, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x8, 0x7e, 0x37, 0x75, 0xaa, 0x7a, 0x37,
+ 0x81, 0xed, 0x7e, 0xb3, 0x59, 0x46, 0x60, 0x41, 0x7e, 0x27, 0x81, 0xed,
+ 0x7e, 0x34, 0x0, 0xa, 0xad, 0x32, 0x12, 0x4e, 0x30, 0x7a, 0x37, 0x81, 0xed,
+ 0x7e, 0x17, 0x81, 0xef, 0x7e, 0x24, 0x0, 0xa, 0xad, 0x12, 0x7d, 0x31, 0x12,
+ 0x4f, 0x27, 0x7a, 0x37, 0x81, 0xef, 0x7e, 0x37, 0x81, 0xf9, 0xad, 0x32,
+ 0x12, 0x4f, 0x27, 0x7a, 0x37, 0x81, 0xf9, 0x6d, 0x33, 0x9e, 0x37, 0x81,
+ 0xf9, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73, 0x59, 0x3c, 0x7e,
+ 0xb3, 0x59, 0x3f, 0xbe, 0xb0, 0xaa, 0x68, 0x3, 0x12, 0x72, 0x31, 0x22, 0x7a,
+ 0x73, 0x59, 0x3b, 0x7e, 0x37, 0x81, 0xef, 0xe, 0x34, 0xe, 0x34, 0xe, 0x34,
+ 0xe, 0x34, 0xe, 0x34, 0x22, 0x12, 0x72, 0xe, 0x12, 0x72, 0x5, 0x12, 0x71,
+ 0xfc, 0x12, 0x72, 0x22, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73,
+ 0x59, 0x3c, 0x22, 0x7d, 0x2b, 0x7c, 0xb5, 0x7e, 0x14, 0x0, 0x1, 0x22, 0x7e,
+ 0x73, 0x8d, 0x93, 0x6c, 0x66, 0x5c, 0x75, 0x4d, 0x33, 0x22, 0x7e, 0xa3,
+ 0x9a, 0x83, 0xa, 0x3a, 0x19, 0xb3, 0x9a, 0x7c, 0xa2, 0xac, 0x92, 0xa, 0x7e,
+ 0xf, 0x39, 0xed, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x8, 0x7e,
+ 0x34, 0x10, 0x0, 0x79, 0x30, 0x0, 0x2, 0xc2, 0xac, 0x12, 0xd8, 0x3e, 0xa2,
+ 0xa, 0x92, 0xac, 0x22, 0x30, 0x1a, 0x42, 0x30, 0x1b, 0x11, 0x12, 0xd9, 0xf3,
+ 0x68, 0x9, 0x12, 0x57, 0x4d, 0x7e, 0xb3, 0x3, 0xd4, 0x70, 0xfa, 0x12, 0x32,
+ 0xc0, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x2, 0x27, 0x7e, 0xb3, 0x9b, 0xa8, 0x7e,
+ 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x8d,
+ 0x92, 0x12, 0x4f, 0x52, 0x78, 0x5, 0x12, 0x4f, 0x4e, 0x68, 0x7, 0x74, 0x1,
+ 0x7a, 0xb3, 0x9a, 0x7c, 0x22, 0x2, 0x32, 0xc0, 0x22, 0x7d, 0x3b, 0x7c, 0xb7,
+ 0x7e, 0x24, 0x0, 0x1, 0x22, 0x7e, 0x34, 0xa0, 0x12, 0x6d, 0x22, 0xb, 0x1a,
+ 0x40, 0x22, 0x54, 0x3, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab, 0xe4,
+ 0x22, 0x54, 0x3, 0xa, 0x3b, 0x7d, 0x23, 0x7c, 0x45, 0x6c, 0x55, 0x3e, 0x24,
+ 0x3e, 0x24, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xe, 0x74, 0x14, 0x7a, 0xb3,
+ 0x38, 0x78, 0x74, 0x13, 0x7a, 0xb3, 0x37, 0xd3, 0x80, 0x10, 0x7e, 0x73,
+ 0x37, 0xde, 0x7a, 0x73, 0x38, 0x78, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x37,
+ 0xd3, 0xe4, 0x7a, 0xb3, 0x37, 0xd5, 0x22, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0xa,
+ 0x7e, 0xa7, 0x82, 0x37, 0x7e, 0xb7, 0x82, 0x35, 0x80, 0x3, 0x12, 0x50, 0x6f,
+ 0xe4, 0x12, 0x14, 0xcb, 0x12, 0x50, 0x66, 0x12, 0x50, 0x78, 0x7e, 0x8, 0x6f,
+ 0xcb, 0x12, 0x50, 0x84, 0x2e, 0x14, 0x6f, 0xcb, 0x12, 0x50, 0x54, 0x6d,
+ 0x22, 0x2, 0x17, 0x2a, 0x6d, 0x0, 0x7d, 0x2b, 0x12, 0x17, 0x2a, 0x7d, 0x3b,
+ 0x2e, 0x34, 0x1, 0x0, 0x7e, 0x8, 0x82, 0x41, 0x22, 0x7e, 0x34, 0x1, 0x0,
+ 0x7e, 0x8, 0x82, 0x41, 0x22, 0x7e, 0xa7, 0x82, 0x35, 0x7e, 0xb7, 0x82, 0x37,
+ 0x22, 0x7e, 0x24, 0x0, 0x4, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x1, 0x4, 0x22,
+ 0x7d, 0x2a, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x1, 0x0, 0x7d, 0x1a, 0x3e, 0x14,
+ 0x22, 0x7c, 0x7b, 0x7e, 0xa0, 0xff, 0x7c, 0xb7, 0x24, 0x8c, 0x68, 0x24,
+ 0x24, 0xfb, 0x68, 0x30, 0x14, 0x68, 0x4c, 0x14, 0x68, 0x3a, 0x14, 0x68,
+ 0x4b, 0x14, 0x68, 0x48, 0x24, 0x7, 0x78, 0x70, 0x7e, 0x1f, 0x39, 0xed, 0x69,
+ 0x51, 0x0, 0xe, 0x5e, 0x54, 0x0, 0x4, 0x7c, 0xab, 0x80, 0x60, 0x7e, 0x1f,
+ 0x39, 0xed, 0x69, 0x51, 0x0, 0x6, 0x5e, 0x54, 0x0, 0x1, 0x7c, 0xab, 0x80,
+ 0x50, 0x7e, 0x1f, 0x39, 0xed, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x4, 0x0,
+ 0xa, 0x56, 0x80, 0x7, 0x12, 0x47, 0xa8, 0xa, 0x56, 0x1e, 0x54, 0x1e, 0x54,
+ 0x1e, 0x54, 0x7c, 0xab, 0x80, 0x31, 0x7e, 0xa1, 0xef, 0x80, 0x2c, 0x7e,
+ 0x63, 0x9b, 0x7c, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x9b, 0x7c, 0xa, 0x26, 0x9,
+ 0xa2, 0x9b, 0x88, 0x7e, 0xb3, 0x9a, 0xe2, 0x4, 0x7a, 0xb3, 0x9a, 0xe2, 0x70,
+ 0x9, 0x7e, 0xb3, 0x9a, 0xe1, 0x4, 0x7a, 0xb3, 0x9a, 0xe1, 0xa5, 0xbf, 0x7d,
+ 0x3, 0x75, 0xf, 0x7c, 0x7c, 0xba, 0x22, 0x24, 0x8a, 0x78, 0x19, 0x7e, 0xf,
+ 0x39, 0xed, 0xa5, 0xbf, 0x0, 0x8, 0x12, 0x1c, 0xb9, 0x5e, 0x70, 0xfb, 0x80,
+ 0x6, 0x12, 0x1c, 0xb9, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x79,
+ 0x7e, 0x73, 0x82, 0xd, 0x7e, 0xf3, 0x82, 0xc, 0xac, 0xf7, 0xd2, 0x4, 0x12,
+ 0xb, 0xc5, 0x12, 0x70, 0xf5, 0x12, 0x4f, 0xfa, 0xc2, 0x0, 0x12, 0xd, 0x27,
+ 0xd2, 0xac, 0xc2, 0xa8, 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x83, 0x12, 0xda, 0x5d,
+ 0x12, 0x4c, 0x3b, 0xd2, 0x0, 0x12, 0xd, 0x27, 0x7e, 0xb3, 0x9a, 0xcb, 0xb4,
+ 0x1, 0x45, 0x20, 0xf, 0x42, 0x6d, 0xff, 0x80, 0x3a, 0x7d, 0xbf, 0x3e, 0xb4,
+ 0x49, 0xeb, 0x3a, 0x0, 0x7d, 0x3e, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0,
+ 0x46, 0x12, 0x1, 0x63, 0x7e, 0x8, 0x0, 0x44, 0x12, 0x1, 0xbf, 0x7f, 0x61,
+ 0x9e, 0x68, 0x0, 0x78, 0xbe, 0xe4, 0x0, 0x1e, 0x8, 0xa, 0xbe, 0x68, 0x0,
+ 0x32, 0x18, 0x4, 0x7e, 0x68, 0x0, 0x32, 0x7d, 0xed, 0x59, 0xeb, 0x3a, 0x0,
+ 0xb, 0xf4, 0xbd, 0x7f, 0x38, 0xc2, 0x12, 0x51, 0xcf, 0x12, 0x28, 0x41, 0x7e,
+ 0x34, 0x0, 0xc8, 0x12, 0x26, 0x98, 0xda, 0x79, 0x22, 0x12, 0xdb, 0x7, 0x74,
+ 0xaa, 0x7a, 0xb3, 0x9a, 0xcc, 0xe4, 0x7a, 0xb3, 0x9a, 0xcb, 0x7a, 0xb3,
+ 0x38, 0x83, 0xc2, 0x1d, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x3, 0x12, 0x51,
+ 0xf2, 0xd2, 0xac, 0xd2, 0xa8, 0x22, 0xa9, 0xd0, 0x9e, 0xa9, 0xd7, 0x9e,
+ 0x22, 0xd2, 0x0, 0x12, 0x52, 0x23, 0xa9, 0xd0, 0xcb, 0x75, 0x9f, 0x0, 0xa9,
+ 0xd0, 0x9e, 0xa9, 0xd4, 0x9e, 0x7e, 0x37, 0x9b, 0xac, 0xa, 0x56, 0xf5, 0x9d,
+ 0x7d, 0x53, 0xf5, 0x9c, 0xa9, 0xd3, 0x9e, 0xc2, 0x8a, 0xd2, 0xaa, 0xa9,
+ 0xc1, 0x9e, 0x2, 0x51, 0xf2, 0xa9, 0xd0, 0xce, 0x30, 0x0, 0x4, 0xa9, 0xd5,
+ 0xc9, 0x22, 0xa9, 0xc5, 0xc9, 0x22, 0x12, 0x52, 0x54, 0x12, 0xcc, 0x91,
+ 0x12, 0x1c, 0x87, 0xc2, 0x1, 0x12, 0x3f, 0xcb, 0x12, 0x55, 0xbd, 0x12, 0x52,
+ 0x23, 0x74, 0x1, 0x6c, 0x77, 0x12, 0x52, 0x7c, 0xd2, 0x0, 0x12, 0x52, 0x23,
+ 0x2, 0x1c, 0xc1, 0x74, 0x81, 0x7a, 0xb3, 0x9b, 0x7d, 0x22, 0x80, 0xb, 0x12,
+ 0x52, 0x54, 0x12, 0x53, 0x8b, 0x40, 0x16, 0x20, 0x12, 0x13, 0x12, 0x0, 0x46,
+ 0x70, 0xf0, 0x12, 0x52, 0x54, 0x12, 0x55, 0xb6, 0x74, 0x2, 0x7e, 0x70, 0x17,
+ 0x2, 0x52, 0x7c, 0x22, 0x7c, 0x6b, 0x7e, 0xb3, 0x9b, 0x7d, 0xb4, 0x81, 0x45,
+ 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x39, 0xa5, 0xbe, 0x1, 0x1c, 0xc2, 0xaf, 0xa,
+ 0x27, 0x5e, 0x24, 0x0, 0x2, 0x68, 0x2, 0xd2, 0x95, 0x7a, 0x71, 0xcd, 0xa9,
+ 0xd0, 0xce, 0xa9, 0xc6, 0xc9, 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x80, 0x19,
+ 0xa5, 0xbe, 0x2, 0x1b, 0xc2, 0xaf, 0x12, 0x0, 0x46, 0x70, 0xc, 0x7a, 0x71,
+ 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xd6, 0xc9, 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x7a, 0xb3, 0x9b, 0x7d, 0x22, 0x12, 0x0,
+ 0x46, 0x70, 0x2e, 0x12, 0x52, 0x54, 0x7e, 0xb3, 0x9b, 0xab, 0xb4, 0x1, 0xd,
+ 0x7e, 0x34, 0xf, 0xa0, 0x7a, 0x37, 0x3, 0xd8, 0xe4, 0x7a, 0xb3, 0x9b, 0xab,
+ 0x7e, 0x37, 0x3, 0xd8, 0x4d, 0x33, 0x78, 0x4, 0x74, 0x1, 0x80, 0x5, 0x12,
+ 0x55, 0xb6, 0x74, 0x2, 0x7e, 0x70, 0x3, 0x2, 0x52, 0x7c, 0x22, 0x24, 0x52,
+ 0x68, 0xb, 0x4, 0x78, 0x2a, 0x12, 0xda, 0x56, 0x7a, 0x37, 0x38, 0x90, 0x22,
+ 0x7e, 0x63, 0x82, 0xc, 0x7e, 0x73, 0x82, 0xd, 0xac, 0x76, 0x3e, 0x34, 0x7a,
+ 0x37, 0x37, 0xda, 0x1e, 0x34, 0xa, 0x36, 0x7a, 0x73, 0x9a, 0xd8, 0x7e, 0x37,
+ 0x37, 0xda, 0x1e, 0x34, 0x7a, 0x73, 0x9a, 0xd9, 0x22, 0x12, 0x53, 0xac,
+ 0x12, 0x53, 0x8e, 0x40, 0x6, 0x12, 0x53, 0x7d, 0x12, 0x0, 0x22, 0x12, 0x55,
+ 0xbd, 0x12, 0x54, 0x64, 0x80, 0x16, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0xd, 0x7e,
+ 0xb3, 0x9b, 0x83, 0x70, 0x7, 0x12, 0x52, 0xd0, 0x80, 0x5, 0x80, 0x0, 0x12,
+ 0x52, 0x5b, 0x30, 0x12, 0xe7, 0x7e, 0xb3, 0x9b, 0x83, 0xbe, 0xb0, 0x0, 0x28,
+ 0x5, 0x14, 0x7a, 0xb3, 0x9b, 0x83, 0xd2, 0x0, 0x12, 0x54, 0x64, 0xd2, 0x8,
+ 0x2, 0x15, 0x16, 0x12, 0x53, 0xac, 0x80, 0x3, 0x12, 0x52, 0x5b, 0x12, 0x53,
+ 0x8e, 0x50, 0xf8, 0x22, 0x12, 0x53, 0xac, 0x12, 0xdb, 0xb7, 0x40, 0x3, 0x12,
+ 0x53, 0xf1, 0x30, 0xb, 0x3, 0x12, 0x53, 0xf1, 0x7e, 0xb3, 0x9a, 0x7c, 0x70,
+ 0x6, 0x7e, 0xb3, 0x9a, 0x7d, 0x60, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x9b, 0xb1, 0x22, 0x20, 0x12, 0x6, 0x12, 0x55, 0xce, 0x12, 0x0, 0x22,
+ 0x12, 0x4f, 0x86, 0x12, 0x53, 0x8b, 0x40, 0x6, 0x12, 0x53, 0x7d, 0x2, 0x0,
+ 0x22, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x2, 0x80, 0xe, 0xb4, 0x1, 0xb,
+ 0x7e, 0xb3, 0x9b, 0x7f, 0xb4, 0x1, 0x4, 0xd2, 0x1d, 0x80, 0x3, 0x12, 0x1f,
+ 0xf6, 0x7e, 0xb3, 0x38, 0x83, 0xb4, 0x2, 0xf9, 0x74, 0x1, 0x7a, 0xb3, 0x38,
+ 0x83, 0x22, 0x30, 0x2e, 0x6, 0x12, 0xc4, 0x2f, 0x2, 0xc4, 0x48, 0x22, 0x12,
+ 0x54, 0x79, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x5, 0x12, 0x53, 0x36, 0x80, 0x3,
+ 0x12, 0x53, 0xb2, 0x2, 0x54, 0xf, 0x7e, 0xa0, 0x3b, 0x7e, 0xb3, 0x59, 0x60,
+ 0xb4, 0x1, 0xf, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x9, 0x7e, 0xb3, 0x3, 0xda,
+ 0x70, 0x3, 0x12, 0x55, 0x94, 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0x34, 0x7e,
+ 0xb3, 0x9b, 0xaf, 0x60, 0x26, 0x7e, 0x73, 0x3, 0xda, 0xbc, 0x7a, 0x78, 0x3,
+ 0x12, 0x55, 0x5c, 0x7e, 0xb3, 0x3, 0xda, 0x7a, 0xb3, 0x3, 0xd5, 0x4, 0x7a,
+ 0xb3, 0x3, 0xda, 0x7e, 0x73, 0x3, 0xda, 0xbe, 0x70, 0x3c, 0x28, 0x5, 0xe4,
+ 0x7a, 0xb3, 0x3, 0xda, 0x12, 0xb3, 0x48, 0x68, 0x3, 0x2, 0x55, 0x4f, 0x22,
+ 0xa2, 0x0, 0xa9, 0x95, 0xcb, 0xa2, 0x0, 0xa9, 0x92, 0xcb, 0xa2, 0x0, 0xa9,
+ 0x92, 0xca, 0xa2, 0x0, 0xa9, 0x91, 0xcb, 0x22, 0x30, 0x21, 0x24, 0xc2, 0x21,
+ 0x7e, 0x73, 0x59, 0x39, 0x7a, 0x73, 0x59, 0x60, 0x74, 0xff, 0x7a, 0xb3,
+ 0x59, 0x39, 0x7e, 0xa3, 0x59, 0x60, 0x4c, 0xaa, 0x78, 0x5, 0x12, 0x55, 0x4f,
+ 0x80, 0x7, 0xbe, 0xa0, 0x1, 0x78, 0x2, 0xd2, 0x19, 0x30, 0x19, 0x3, 0x12,
+ 0x55, 0x6d, 0x7e, 0x37, 0x9a, 0x21, 0xbe, 0x34, 0x0, 0x78, 0x28, 0x3, 0x12,
+ 0x55, 0x66, 0x7e, 0xb3, 0x59, 0x60, 0x14, 0x68, 0x58, 0x1b, 0xb1, 0x68,
+ 0x6f, 0x24, 0x3, 0x68, 0x2, 0xa1, 0x4b, 0x12, 0x55, 0xae, 0x38, 0xa, 0x12,
+ 0x55, 0xa6, 0x68, 0x5, 0x12, 0x55, 0x9e, 0x28, 0x15, 0x12, 0x36, 0xbf, 0x7e,
+ 0xb3, 0x59, 0x41, 0x30, 0xe0, 0x71, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x6b,
+ 0x30, 0x10, 0x68, 0x80, 0x27, 0x7e, 0xb3, 0x59, 0x41, 0x30, 0xe0, 0x5f,
+ 0x7e, 0x37, 0x3, 0xd6, 0x7e, 0x24, 0x3, 0xe8, 0x8d, 0x32, 0x7e, 0x53, 0x59,
+ 0x42, 0xa, 0x25, 0xbd, 0x32, 0x50, 0xc, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x45,
+ 0xbe, 0x34, 0x0, 0x1, 0x40, 0x3f, 0x2, 0x55, 0x6d, 0x12, 0x55, 0xae, 0x38,
+ 0x10, 0x7e, 0xb3, 0x59, 0x41, 0x60, 0xa, 0x12, 0x55, 0xa6, 0x68, 0x5, 0x12,
+ 0x55, 0x9e, 0x28, 0x3, 0x2, 0x55, 0xd7, 0xc2, 0x10, 0x22, 0x12, 0xdb, 0xb0,
+ 0x12, 0x52, 0x31, 0x12, 0xcc, 0x35, 0x12, 0x55, 0x4f, 0x7e, 0xb3, 0x9b,
+ 0xaf, 0x70, 0x3, 0x12, 0x32, 0xc0, 0x7e, 0xb3, 0x9b, 0xaf, 0x60, 0x6, 0x2,
+ 0x55, 0xe6, 0x12, 0x55, 0x66, 0x22, 0xe4, 0x7a, 0xb3, 0x59, 0x60, 0xd2,
+ 0x12, 0x12, 0x36, 0xbf, 0x2, 0x55, 0x5c, 0x12, 0x1f, 0xd9, 0x68, 0x4, 0xd2,
+ 0x1b, 0xc2, 0x18, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x59, 0x60, 0x22, 0x7e, 0xb3,
+ 0x9b, 0xaf, 0xb4, 0x1, 0xc, 0x7e, 0xb3, 0x2e, 0x75, 0x60, 0x6, 0xe4, 0x7a,
+ 0xb3, 0x59, 0x60, 0x22, 0xc2, 0x19, 0x12, 0x55, 0x66, 0x12, 0x36, 0xbf,
+ 0xe4, 0x7a, 0xb3, 0x3, 0xda, 0x7a, 0xb3, 0x3, 0xd5, 0x2, 0x55, 0x94, 0x12,
+ 0x1f, 0xd9, 0x68, 0x4, 0xd2, 0x18, 0xc2, 0x1b, 0x22, 0x7e, 0x73, 0x37, 0xd1,
+ 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xb3, 0x3, 0xe4, 0xbe, 0xb0, 0x1, 0x22, 0x7e,
+ 0x73, 0x69, 0x69, 0xbe, 0x70, 0x0, 0x22, 0xa9, 0xd5, 0xea, 0xa9, 0xc5, 0xea,
+ 0x22, 0xc2, 0x8, 0x12, 0x15, 0x16, 0xc2, 0x0, 0x22, 0x12, 0x53, 0xac, 0x12,
+ 0x53, 0x8e, 0x50, 0xfb, 0x22, 0x80, 0x3, 0x12, 0x52, 0x5b, 0x30, 0x12, 0xfa,
+ 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0x60, 0x5, 0x20, 0x10, 0x5, 0x80, 0x0, 0x2,
+ 0x55, 0x4f, 0x22, 0x30, 0x18, 0x7, 0xd2, 0x1a, 0xc2, 0x18, 0x2, 0x57, 0x86,
+ 0x30, 0x1b, 0x1b, 0x12, 0xd9, 0xf3, 0x68, 0xe, 0x12, 0x57, 0x4d, 0x80, 0x3,
+ 0x20, 0xb, 0x6, 0x7e, 0xb3, 0x3, 0xd4, 0x70, 0xf7, 0x30, 0xb, 0xe, 0x12,
+ 0x30, 0xa3, 0x80, 0x9, 0x30, 0x1a, 0x6, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x3,
+ 0x2, 0x32, 0xc0, 0x22, 0xca, 0x79, 0xd2, 0x0, 0x12, 0x55, 0xc5, 0x7e, 0xe3,
+ 0x9a, 0x84, 0xa, 0x3e, 0x9, 0xb3, 0x9a, 0x7c, 0x60, 0x3c, 0xa, 0x3b, 0x1b,
+ 0x34, 0x7c, 0xa7, 0x7a, 0xa3, 0x9a, 0xe7, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80,
+ 0x1, 0xe4, 0x7a, 0xb3, 0x2e, 0x74, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x9a, 0x7c,
+ 0x9, 0xf3, 0x9a, 0x7f, 0x7a, 0xf3, 0x9b, 0x84, 0x7c, 0xbe, 0x7c, 0x7f, 0x12,
+ 0x57, 0x18, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xb8, 0xaa, 0x7e, 0xb3, 0x9a,
+ 0x84, 0x4, 0x7a, 0xb3, 0x9a, 0x84, 0x7e, 0xb3, 0x2e, 0x74, 0xbe, 0xb0, 0x1,
+ 0x68, 0x7, 0x7e, 0xb3, 0x3, 0xfd, 0xb4, 0x3, 0x3b, 0x74, 0x3, 0xac, 0xbf,
+ 0x9, 0xb5, 0x9b, 0x59, 0x7e, 0xf, 0x2d, 0x26, 0x12, 0x27, 0x7f, 0x7c, 0xbe,
+ 0x7c, 0x7f, 0x12, 0x78, 0x7, 0x92, 0x0, 0x30, 0x0, 0x20, 0x7a, 0xe3, 0x2e,
+ 0x75, 0x7a, 0xe3, 0x9a, 0xe8, 0x12, 0xda, 0xf5, 0x7a, 0x73, 0x39, 0xc0,
+ 0x7a, 0xf3, 0x9b, 0xae, 0x12, 0xcd, 0x61, 0x7c, 0xbe, 0x7c, 0x7f, 0x12,
+ 0x76, 0xd5, 0x12, 0x77, 0xfc, 0x12, 0x57, 0x44, 0x7e, 0x73, 0x9a, 0x84, 0xa,
+ 0x37, 0xbd, 0x32, 0x48, 0x18, 0x12, 0x56, 0xee, 0xd2, 0x4, 0x12, 0xb, 0xc5,
+ 0x12, 0x30, 0xa3, 0x12, 0xb6, 0x33, 0x7e, 0x34, 0x8, 0x0, 0x12, 0x1f, 0xc1,
+ 0x12, 0x55, 0xe6, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0x38, 0x71, 0x7c, 0xbf,
+ 0x7c, 0x7e, 0x12, 0xb9, 0xac, 0x12, 0xc4, 0xdd, 0xda, 0x79, 0x22, 0x30,
+ 0x18, 0x6, 0x12, 0x1c, 0xb5, 0x12, 0xc7, 0xd, 0x22, 0xca, 0xf8, 0x6c, 0xff,
+ 0x12, 0x56, 0x1b, 0xb, 0xf0, 0x12, 0x57, 0x44, 0xa, 0x3f, 0xbd, 0x32, 0x48,
+ 0xf2, 0x7e, 0xb3, 0x9a, 0xe8, 0x7e, 0x73, 0x9b, 0xa8, 0x12, 0x57, 0x18,
+ 0xda, 0xf8, 0x22, 0x14, 0x68, 0x21, 0x14, 0x68, 0x25, 0xb, 0xb1, 0x78, 0x1a,
+ 0x7e, 0x8, 0xe, 0x40, 0x7a, 0xf, 0x2d, 0x26, 0x7e, 0x8, 0x1d, 0xa0, 0x7a,
+ 0xf, 0x2d, 0x2a, 0xa5, 0xbf, 0x2, 0xd, 0x7e, 0x18, 0x27, 0xe0, 0x80, 0x3,
+ 0x12, 0xd9, 0xcd, 0x7a, 0x1f, 0x2d, 0x2a, 0x22, 0x7e, 0x73, 0x9a, 0x85, 0xa,
+ 0x27, 0x1b, 0x24, 0x22, 0x12, 0x1c, 0xa1, 0x7a, 0xb3, 0x9b, 0xaf, 0x7e,
+ 0xb3, 0x9b, 0x7f, 0xb4, 0x1, 0x5, 0x12, 0x3f, 0xdc, 0x80, 0x7, 0x7e, 0x34,
+ 0x0, 0x2, 0x12, 0x57, 0xaa, 0x7e, 0xb3, 0x9b, 0xaf, 0x2, 0x37, 0xa4, 0xe4,
+ 0x7a, 0xb3, 0x59, 0x60, 0x12, 0x0, 0x40, 0x12, 0xcc, 0x8c, 0x12, 0x57, 0x4d,
+ 0x7e, 0xb3, 0x59, 0x5f, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x22, 0x7e, 0xb3, 0x9b,
+ 0x7f, 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x9b, 0xa8, 0x7a, 0xb3, 0x9b,
+ 0xaf, 0x12, 0x1c, 0x87, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x57, 0xaa,
+ 0x7e, 0xb3, 0x9b, 0xaf, 0x2, 0x37, 0xa4, 0x7e, 0xa3, 0x9b, 0xaf, 0x74, 0xb,
+ 0xa4, 0x59, 0x35, 0x9a, 0x4c, 0x22, 0xca, 0x3b, 0x7e, 0xd4, 0x3a, 0x0, 0x7e,
+ 0xb3, 0x9a, 0xcd, 0xb4, 0x1, 0x2, 0x80, 0x3, 0x2, 0x59, 0x5d, 0x12, 0xda,
+ 0x29, 0x7e, 0xb3, 0x38, 0x9c, 0x60, 0x12, 0x7e, 0xb3, 0x38, 0x9d, 0xbe,
+ 0xb0, 0x2, 0x50, 0x4, 0x4, 0x2, 0x59, 0x57, 0xe4, 0x7a, 0xb3, 0x38, 0x9c,
+ 0x7e, 0xc7, 0x38, 0x9a, 0x4d, 0xcc, 0x78, 0x22, 0x7d, 0x1d, 0x2e, 0x14, 0xa,
+ 0x40, 0x6d, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0x88, 0x12, 0x0, 0x2e, 0x7d,
+ 0x1d, 0x2e, 0x14, 0xf, 0x60, 0x6d, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0x77,
+ 0x12, 0x0, 0x2e, 0x7e, 0xc7, 0x38, 0x9a, 0xb, 0xc4, 0x7a, 0xc7, 0x38, 0x9a,
+ 0x7e, 0xb3, 0x9a, 0xcf, 0x4, 0x7a, 0xb3, 0x9a, 0xcf, 0x7e, 0xd3, 0x82, 0xd,
+ 0x7e, 0xc3, 0x82, 0xc, 0x6c, 0xee, 0x80, 0x25, 0x6c, 0xff, 0x80, 0x1b, 0x12,
+ 0x59, 0x8d, 0x7d, 0xf3, 0x7d, 0xcf, 0x12, 0x59, 0x9e, 0x58, 0x4, 0x59, 0xe3,
+ 0xa, 0x40, 0x12, 0x59, 0x77, 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf0,
+ 0xbc, 0xdf, 0x38, 0xe1, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xd7, 0x6d, 0xff, 0x7e,
+ 0xc7, 0x8d, 0x94, 0x2d, 0xcf, 0x12, 0x59, 0x9e, 0x58, 0x4, 0x59, 0xe3, 0xa,
+ 0x40, 0x12, 0x59, 0x77, 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf4, 0xbe,
+ 0xf4, 0x0, 0x4, 0x78, 0xe0, 0x7e, 0xc7, 0x38, 0x96, 0xbe, 0xc7, 0x38, 0x9a,
+ 0x68, 0x2, 0x21, 0x6b, 0x6c, 0xee, 0x80, 0x57, 0x6c, 0xff, 0x80, 0x4d, 0x12,
+ 0x59, 0x8d, 0x12, 0x59, 0x80, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x59, 0x6e, 0x8, 0x6, 0x49, 0x3, 0xa, 0x40,
+ 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, 0x12, 0xbe, 0x14, 0x0, 0x0,
+ 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, 0x6d, 0xcc, 0x9d, 0xc1, 0x80,
+ 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, 0xb, 0xf0, 0xbc, 0xdf, 0x38,
+ 0xaf, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xa5, 0x6d, 0xff, 0x7e, 0x37, 0x8d, 0x94,
+ 0x2d, 0x3f, 0x12, 0x59, 0x80, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x59, 0x6e, 0x8, 0x6, 0x49, 0x3, 0xa, 0x40,
+ 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8, 0x12, 0xbe, 0x14, 0x0, 0x0,
+ 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16, 0x6d, 0xcc, 0x9d, 0xc1, 0x80,
+ 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xf, 0x60, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40, 0xb, 0xf4, 0xbe, 0xf4, 0x0,
+ 0x4, 0x78, 0xaa, 0x7d, 0x3d, 0x2e, 0x34, 0xa, 0x40, 0x7a, 0x37, 0x38, 0x92,
+ 0x74, 0xaa, 0x7a, 0xb3, 0x9a, 0xcd, 0x6d, 0x33, 0x7a, 0x37, 0x38, 0x9a,
+ 0x74, 0x1, 0x7a, 0xb3, 0x38, 0x9c, 0xe4, 0x7a, 0xb3, 0x38, 0x9d, 0x80, 0xe,
+ 0x7e, 0x37, 0x38, 0x9a, 0x4d, 0x33, 0x68, 0x6, 0x6d, 0x33, 0x7a, 0x37, 0x38,
+ 0x9a, 0xda, 0x3b, 0x22, 0x49, 0x13, 0xa, 0x40, 0xbe, 0x14, 0x0, 0x0, 0x22,
+ 0x2d, 0xcd, 0x49, 0x3c, 0xf, 0x60, 0xbd, 0x3e, 0x22, 0x3e, 0x34, 0x2d, 0x3d,
+ 0x49, 0x23, 0xf, 0x60, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7c, 0xbe, 0x7c, 0x7f,
+ 0x7c, 0xa7, 0x7e, 0x73, 0x82, 0xd, 0xac, 0x7b, 0xa, 0x2a, 0x2d, 0x32, 0x22,
+ 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c, 0xb, 0x1a, 0xe0, 0x7d, 0x3c,
+ 0x2d, 0x3d, 0x49, 0x23, 0xa, 0x40, 0xbd, 0x2e, 0x22, 0x7e, 0x73, 0x67, 0x77,
+ 0x7a, 0x73, 0x67, 0x78, 0x7e, 0x73, 0x37, 0xd1, 0xa, 0x27, 0x7e, 0x73, 0x69,
+ 0x69, 0xa, 0x37, 0x2d, 0x32, 0x7a, 0x73, 0x69, 0x6a, 0xe4, 0x7a, 0xb3, 0x69,
+ 0x6d, 0x7e, 0x73, 0x9b, 0x7e, 0x7a, 0x73, 0x59, 0x66, 0x22, 0x7e, 0x54, 0x7,
+ 0xdb, 0x7e, 0x44, 0x0, 0xff, 0x12, 0x5c, 0xb7, 0x30, 0x20, 0x5a, 0xc2, 0x20,
+ 0x7e, 0x14, 0x0, 0xa5, 0x7e, 0x34, 0xff, 0xb0, 0x12, 0x5a, 0x45, 0x7e, 0x14,
+ 0xff, 0x5a, 0x7e, 0x34, 0xff, 0xb2, 0x1b, 0x1a, 0x10, 0x7e, 0x14, 0x0, 0xaa,
+ 0x7e, 0x34, 0xff, 0xb4, 0x1b, 0x1a, 0x10, 0x6d, 0x33, 0x12, 0x5b, 0xce,
+ 0x12, 0x5c, 0xa5, 0x78, 0xf8, 0x12, 0x5b, 0xdb, 0x7d, 0x13, 0x7e, 0x34,
+ 0xff, 0xb6, 0x12, 0x5a, 0x45, 0x7e, 0x33, 0x59, 0x7b, 0x7e, 0x34, 0xff,
+ 0xb8, 0x7a, 0x1b, 0x30, 0x7e, 0x33, 0x59, 0x7c, 0x7e, 0x34, 0xff, 0xba,
+ 0x7a, 0x1b, 0x30, 0x7e, 0x33, 0x59, 0x46, 0x7e, 0x34, 0xff, 0xbc, 0x7a,
+ 0x1b, 0x30, 0x22, 0x7e, 0x24, 0x0, 0xfe, 0x1b, 0x1a, 0x10, 0x22, 0x7e, 0x34,
+ 0x7, 0xb7, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92, 0x16, 0x12, 0x5c, 0x94,
+ 0x12, 0x5c, 0x9c, 0x1b, 0xa, 0x30, 0x7e, 0x24, 0x0, 0xa5, 0x7e, 0x14, 0xff,
+ 0xd0, 0x1b, 0xa, 0x20, 0x7e, 0x24, 0xff, 0x5a, 0x7e, 0x14, 0xff, 0xd2, 0x1b,
+ 0xa, 0x20, 0x7e, 0x24, 0x0, 0xaa, 0x7e, 0x14, 0xff, 0xd4, 0x1b, 0xa, 0x20,
+ 0x7e, 0x24, 0x0, 0x55, 0x7e, 0x14, 0xff, 0xd6, 0x1b, 0xa, 0x20, 0x7e, 0x24,
+ 0x0, 0x66, 0x7e, 0x14, 0xff, 0xd8, 0x1b, 0xa, 0x20, 0x7e, 0x24, 0x0, 0x99,
+ 0x7e, 0x14, 0xff, 0xda, 0x1b, 0xa, 0x20, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0x8c,
+ 0x59, 0x21, 0x92, 0x16, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x6, 0x40, 0xee, 0x7e,
+ 0x8, 0x92, 0x16, 0x12, 0x5b, 0x4f, 0x7d, 0x13, 0x7e, 0x34, 0xff, 0xdc, 0x2,
+ 0x5a, 0x45, 0x7e, 0x34, 0x7, 0xc3, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92,
+ 0xa, 0x12, 0x5c, 0x94, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0x8c, 0x59, 0x21, 0x92,
+ 0xa, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x6, 0x78, 0xee, 0x7e, 0x8, 0x92, 0xa,
+ 0x12, 0x5b, 0x4f, 0x7d, 0x23, 0x7e, 0x14, 0xff, 0xdc, 0x12, 0x5b, 0x56,
+ 0x78, 0x4a, 0x7e, 0x34, 0xff, 0xd2, 0x12, 0x5b, 0x47, 0x7d, 0x23, 0x6e,
+ 0x24, 0xff, 0xff, 0x7e, 0x14, 0xff, 0xd0, 0x12, 0x5b, 0x56, 0x78, 0x34,
+ 0x7e, 0x34, 0xff, 0xd4, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0xaa, 0x78, 0x27,
+ 0x7e, 0x34, 0xff, 0xd6, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x55, 0x78, 0x1a,
+ 0x7e, 0x34, 0xff, 0xd8, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x66, 0x78, 0xd,
+ 0x7e, 0x34, 0xff, 0xda, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0x99, 0x68, 0x3,
+ 0x2, 0x5a, 0x4d, 0x22, 0x7e, 0x24, 0x0, 0xfe, 0xb, 0x1a, 0x30, 0x22, 0x7e,
+ 0x34, 0x0, 0xc, 0x2, 0x5b, 0xe3, 0x7e, 0x4, 0x0, 0xfe, 0xb, 0xa, 0x30, 0xbd,
+ 0x32, 0x22, 0x7e, 0x54, 0x7, 0xe1, 0x7e, 0x44, 0x0, 0xff, 0x12, 0x5c, 0xb7,
+ 0x6d, 0x33, 0x12, 0x5b, 0xce, 0x12, 0x5c, 0xa5, 0x78, 0xf8, 0x12, 0x5b,
+ 0xdb, 0x7d, 0x23, 0x7e, 0x14, 0xff, 0xb6, 0x12, 0x5b, 0x56, 0x78, 0x4a,
+ 0x7e, 0x34, 0xff, 0xb2, 0x12, 0x5b, 0x47, 0x7d, 0x23, 0x6e, 0x24, 0xff,
+ 0xff, 0x7e, 0x14, 0xff, 0xb0, 0x12, 0x5b, 0x56, 0x78, 0x34, 0x7e, 0x34,
+ 0xff, 0xb4, 0x12, 0x5b, 0x47, 0xbe, 0x34, 0x0, 0xaa, 0x78, 0x27, 0x7e, 0x34,
+ 0xff, 0xb8, 0x7e, 0x24, 0x0, 0xfe, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x7b,
+ 0x7e, 0x34, 0xff, 0xba, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x7c, 0x7e,
+ 0x34, 0xff, 0xbc, 0x7e, 0x1b, 0x70, 0x7a, 0x73, 0x59, 0x46, 0xd2, 0x1f,
+ 0x22, 0x7d, 0x13, 0x3e, 0x14, 0x7d, 0x51, 0x6d, 0x44, 0x2e, 0x44, 0x0, 0xfe,
+ 0x22, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, 0x0, 0x6, 0x7d, 0x23, 0x7e, 0x34,
+ 0xff, 0xff, 0x6d, 0x55, 0x80, 0x2b, 0x7f, 0x70, 0x2d, 0xf5, 0x7e, 0x7b,
+ 0x80, 0x6c, 0x99, 0x6d, 0xff, 0x7d, 0xe4, 0x6d, 0xe3, 0x5e, 0xe4, 0x80, 0x0,
+ 0x68, 0x8, 0x3e, 0x34, 0x6e, 0x34, 0x10, 0x21, 0x80, 0x2, 0x3e, 0x34, 0x3e,
+ 0x44, 0xb, 0xf4, 0xbe, 0xf4, 0x0, 0x8, 0x78, 0xe2, 0xb, 0x54, 0xbd, 0x25,
+ 0x38, 0xd1, 0x22, 0x7e, 0x34, 0x7, 0xcf, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14,
+ 0x91, 0xfe, 0x74, 0xc, 0x12, 0x2, 0x3d, 0x12, 0x5a, 0xc6, 0x7e, 0xb3, 0x3,
+ 0xfd, 0xb4, 0x1, 0x53, 0x7e, 0x53, 0x9b, 0xa8, 0xa5, 0xbd, 0x1, 0x4b, 0x6d,
+ 0x11, 0x7d, 0x31, 0x80, 0x19, 0xa, 0x45, 0x7e, 0x54, 0x2, 0xd8, 0xad, 0x54,
+ 0x7d, 0x5, 0x2d, 0x1, 0x9, 0x40, 0x5a, 0x0, 0xbe, 0x40, 0x5, 0x50, 0x2, 0xb,
+ 0x34, 0xb, 0x14, 0x7e, 0x43, 0x82, 0xd, 0x7e, 0xb3, 0x82, 0xc, 0xac, 0xb4,
+ 0xbd, 0x51, 0x38, 0xd9, 0xbe, 0x34, 0x0, 0x50, 0x28, 0x15, 0x12, 0x5c, 0x9c,
+ 0xb, 0xa, 0x30, 0xbe, 0x34, 0x0, 0x5, 0x50, 0xc, 0xb, 0x34, 0x1b, 0xa, 0x30,
+ 0x75, 0xe9, 0xff, 0x22, 0x2, 0x5a, 0x4d, 0x22, 0x2e, 0x28, 0xff, 0xd0, 0xb,
+ 0x2a, 0x20, 0x22, 0x74, 0xc, 0x12, 0x2, 0x3d, 0x6d, 0x33, 0x22, 0x7e, 0x14,
+ 0xff, 0xde, 0x7e, 0x4, 0x0, 0xfe, 0x22, 0x2e, 0x28, 0xff, 0xb0, 0xb, 0x2a,
+ 0x20, 0x59, 0x21, 0x91, 0xfe, 0xb, 0x34, 0xbe, 0x34, 0x0, 0x3, 0x22, 0x69,
+ 0x32, 0x0, 0x4, 0x69, 0x22, 0x0, 0x2, 0xb, 0x2a, 0x10, 0x7a, 0x1f, 0x92,
+ 0x0, 0x7a, 0x17, 0x91, 0xfe, 0x22, 0xca, 0xf8, 0x7e, 0xf3, 0x9b, 0xa8, 0x20,
+ 0xb, 0x3, 0x30, 0xc, 0x3, 0xc3, 0xa1, 0x62, 0xc2, 0x2c, 0x12, 0x5d, 0x65,
+ 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x8d, 0x92, 0x6c, 0x44,
+ 0x5c, 0x57, 0x4d, 0x22, 0x68, 0x6f, 0x4e, 0x73, 0x8d, 0x93, 0x7a, 0x73,
+ 0x8d, 0x93, 0xd2, 0x4, 0x12, 0xb, 0xc5, 0x7c, 0xbf, 0x12, 0xb9, 0x59, 0x40,
+ 0x3, 0xc3, 0x80, 0x59, 0x20, 0xb, 0x6, 0x20, 0xc, 0x3, 0x30, 0x2c, 0x3,
+ 0xc3, 0x80, 0x4d, 0x12, 0x5c, 0x1d, 0x12, 0x5d, 0x65, 0x60, 0x5, 0x3e, 0x34,
+ 0x14, 0x78, 0xfb, 0x6e, 0x70, 0xff, 0x5e, 0x73, 0x8d, 0x92, 0x7a, 0x73,
+ 0x8d, 0x92, 0xbe, 0xf0, 0x1, 0x78, 0x29, 0x7e, 0x34, 0x2, 0xd8, 0xca, 0x39,
+ 0x7e, 0x18, 0x5c, 0xd8, 0x7e, 0x8, 0x5f, 0xb0, 0x12, 0x0, 0x6e, 0x1b, 0xfd,
+ 0x74, 0x2, 0x7e, 0x8, 0x5f, 0xb0, 0x12, 0x5d, 0x6c, 0x7e, 0xb3, 0x8d, 0x92,
+ 0x54, 0xfb, 0x7a, 0xb3, 0x8d, 0x92, 0x12, 0x5f, 0xc6, 0x12, 0xcb, 0x3a,
+ 0xd3, 0x80, 0x1, 0xd3, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbf,
+ 0x22, 0xca, 0x3b, 0x7f, 0x60, 0x7c, 0xab, 0x6d, 0xee, 0xbe, 0xa0, 0x4, 0x40,
+ 0x2, 0xc1, 0x8c, 0x74, 0x8, 0xa4, 0x9, 0xb5, 0x9b, 0x27, 0xf5, 0x36, 0x12,
+ 0x5f, 0xbc, 0x60, 0xa, 0x7e, 0x67, 0x82, 0x37, 0x7e, 0x37, 0x82, 0x35, 0x80,
+ 0x8, 0x7e, 0x67, 0x82, 0x35, 0x7e, 0x37, 0x82, 0x37, 0x7a, 0x35, 0x34, 0x7e,
+ 0xb5, 0x34, 0x2d, 0xb6, 0x7e, 0x8, 0x8f, 0x20, 0x7e, 0x34, 0x1, 0x6d, 0x74,
+ 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x90, 0x8d, 0x7e, 0x34, 0x1, 0x6d, 0x12,
+ 0x0, 0x2e, 0x6d, 0x77, 0x80, 0xf, 0x12, 0x5f, 0xa4, 0x60, 0x5, 0x12, 0x5f,
+ 0x90, 0x80, 0x3, 0x12, 0x5f, 0x9a, 0xb, 0x74, 0xbd, 0x67, 0x38, 0xed, 0x7d,
+ 0x76, 0x80, 0xf, 0x12, 0x5f, 0xa4, 0x60, 0x5, 0x12, 0x5f, 0x9a, 0x80, 0x3,
+ 0x12, 0x5f, 0x90, 0xb, 0x74, 0xbd, 0xb7, 0x38, 0xed, 0x6d, 0x33, 0x7d, 0xf3,
+ 0x7d, 0xe3, 0x7d, 0x73, 0x7d, 0x27, 0x1e, 0x24, 0x1e, 0x24, 0x7c, 0xaf,
+ 0x7e, 0x7, 0x8d, 0xe8, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x4, 0x14, 0x78, 0xfb,
+ 0x5e, 0x4, 0x0, 0xf, 0x7e, 0x17, 0x8d, 0xec, 0x12, 0x5f, 0x87, 0x78, 0x2,
+ 0x7d, 0xf2, 0x7e, 0x7, 0x8d, 0xfa, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x4, 0x14,
+ 0x78, 0xfb, 0x5e, 0x4, 0x0, 0xf, 0x7e, 0x17, 0x8d, 0xfe, 0x12, 0x5f, 0x87,
+ 0x78, 0x2, 0x7d, 0xe2, 0xb, 0x76, 0xbe, 0x74, 0x0, 0xf, 0x40, 0xb8, 0x12,
+ 0x5f, 0xd1, 0x7d, 0x73, 0x7d, 0x37, 0x2d, 0x3f, 0x9, 0x73, 0x8f, 0x20, 0x19,
+ 0x77, 0x90, 0x44, 0x7d, 0x37, 0x2d, 0x3e, 0x9, 0x73, 0x90, 0x8d, 0x19, 0x77,
+ 0x91, 0xb1, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x24, 0x78, 0xe0, 0x7e, 0x71, 0x36,
+ 0x74, 0xee, 0xac, 0x7b, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x35, 0x7a,
+ 0x35, 0x37, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x18, 0x8f, 0x20, 0x12, 0x5f, 0x52,
+ 0x12, 0x17, 0x8f, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x18, 0x90, 0x8d, 0x12, 0x5f,
+ 0x52, 0x12, 0x17, 0x2a, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x7f, 0x71, 0x7e,
+ 0xa0, 0x25, 0x6c, 0x77, 0x6c, 0x66, 0x6c, 0x55, 0x6c, 0x44, 0xe1, 0x2e,
+ 0x7c, 0x97, 0xac, 0x9a, 0xa, 0xd4, 0x2d, 0x4d, 0x7e, 0xf0, 0x49, 0xac, 0xf7,
+ 0x7d, 0xd7, 0xa5, 0xbc, 0x0, 0xb, 0x7e, 0xc4, 0x1, 0x24, 0x12, 0x5f, 0x40,
+ 0x7d, 0xc7, 0x80, 0x2a, 0xa5, 0xbc, 0x12, 0x12, 0x7e, 0xc4, 0x1, 0x47, 0x12,
+ 0x5f, 0x40, 0x7d, 0xb7, 0x7e, 0xc4, 0x1, 0x48, 0x12, 0x5f, 0x7b, 0x80, 0x14,
+ 0xa5, 0xbc, 0x24, 0x15, 0x7e, 0xc4, 0x1, 0x6b, 0x12, 0x5f, 0x40, 0x7d, 0xb7,
+ 0x7e, 0xc4, 0x1, 0x6c, 0x12, 0x5f, 0x7b, 0x12, 0x5f, 0x6c, 0x80, 0x3f, 0xbe,
+ 0x40, 0x12, 0x50, 0x1e, 0x7e, 0xb4, 0x1, 0x25, 0x9d, 0xbd, 0xa, 0xc6, 0x2d,
+ 0xcb, 0x12, 0x5f, 0x42, 0x7d, 0xb7, 0x7e, 0xa4, 0x1, 0x26, 0x9d, 0xad, 0xa,
+ 0xc6, 0x12, 0x5f, 0x61, 0xb, 0x61, 0x80, 0x1c, 0x7e, 0xb4, 0x1, 0x49, 0x9d,
+ 0xbd, 0xa, 0xc5, 0x2d, 0xcb, 0x12, 0x5f, 0x42, 0x7d, 0xb7, 0x7e, 0xa4, 0x1,
+ 0x4a, 0x9d, 0xad, 0xa, 0xc5, 0x12, 0x5f, 0x61, 0xb, 0x51, 0xb, 0x40, 0xbc,
+ 0xa4, 0x28, 0x2, 0xc1, 0xa0, 0xb, 0x70, 0xbe, 0x70, 0x5, 0x50, 0x2, 0xc1,
+ 0x98, 0xda, 0x79, 0x22, 0x9d, 0xcd, 0x7f, 0x57, 0x2d, 0xbc, 0x7e, 0x5b,
+ 0xb0, 0xa, 0xbb, 0x7d, 0x7b, 0x7c, 0xef, 0x6c, 0xff, 0x22, 0x12, 0x5e, 0x8f,
+ 0x7e, 0x35, 0x37, 0x7e, 0x8, 0x94, 0xd6, 0x7e, 0x24, 0x0, 0xb9, 0x22, 0x2d,
+ 0xca, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b, 0xb0, 0xa, 0xcb, 0x2d, 0xcb, 0x7e,
+ 0xf0, 0x2, 0xac, 0xf9, 0x7f, 0x50, 0x2d, 0xb7, 0x1b, 0x5a, 0xc0, 0x22, 0x9d,
+ 0xcd, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b, 0xb0, 0xa, 0xcb, 0x22, 0xa, 0x12,
+ 0x5e, 0x14, 0x0, 0xf, 0xbd, 0x1, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x70, 0x19,
+ 0x72, 0x90, 0x8d, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x70, 0x19, 0x72, 0x8f, 0x20,
+ 0x22, 0x7d, 0xa7, 0x3e, 0xa4, 0x49, 0x2a, 0x82, 0x51, 0x7e, 0xb3, 0x69,
+ 0xec, 0x7f, 0x6, 0x22, 0xe5, 0xe9, 0x20, 0xe7, 0x3, 0x2, 0x5a, 0x4d, 0x22,
+ 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7e, 0xb3, 0x69, 0xec, 0x22, 0x7e, 0xb3, 0x8d,
+ 0x93, 0x44, 0x4, 0x7a, 0xb3, 0x8d, 0x93, 0x22, 0x7e, 0x14, 0x0, 0x49, 0x7d,
+ 0x5f, 0xad, 0x51, 0x7d, 0xf5, 0xad, 0x1e, 0x7d, 0xe1, 0x22, 0x12, 0xd5,
+ 0xf1, 0x12, 0x5f, 0xe9, 0x2, 0xa, 0xbf, 0x7e, 0x8, 0x3, 0xd2, 0x2, 0x5f,
+ 0xf0, 0xb, 0xa, 0x30, 0xbe, 0x37, 0x9b, 0x77, 0x28, 0x6, 0x9e, 0x37, 0x9b,
+ 0x77, 0x80, 0x2, 0x6d, 0x33, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xb3, 0x39, 0xfc,
+ 0x4, 0x7a, 0xb3, 0x39, 0xfc, 0x7e, 0x73, 0x39, 0xfc, 0x7a, 0x73, 0x59, 0x4c,
+ 0x22, 0x7e, 0x37, 0x3, 0xf9, 0xb, 0x34, 0x7a, 0x37, 0x3, 0xf9, 0x7e, 0x37,
+ 0x3, 0xfb, 0xbe, 0x37, 0x3, 0xf9, 0x28, 0x3, 0x2, 0x61, 0x91, 0x22, 0x7e,
+ 0xa3, 0x9a, 0x4b, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0xb, 0x34, 0xbe, 0x37, 0x9b,
+ 0x1c, 0x40, 0x39, 0x7e, 0x37, 0x9b, 0x1c, 0xb, 0x34, 0x7a, 0x37, 0x9b, 0x1c,
+ 0xbe, 0x34, 0x0, 0x1, 0x78, 0x5, 0x7e, 0xb3, 0x59, 0x8e, 0x22, 0xbe, 0x34,
+ 0x0, 0x2, 0x78, 0x3, 0x7c, 0xba, 0x22, 0xbe, 0x34, 0x0, 0x2, 0x50, 0x9,
+ 0x7d, 0x23, 0x1b, 0x25, 0x9, 0xb2, 0x3, 0xeb, 0x22, 0x9e, 0x34, 0x0, 0x3,
+ 0x2e, 0x37, 0x96, 0x5a, 0x7e, 0x39, 0xb0, 0x22, 0x74, 0xff, 0x22, 0x70, 0x3,
+ 0x2, 0x61, 0x79, 0xbe, 0xb0, 0x3, 0x38, 0x13, 0x30, 0x24, 0x6, 0x7e, 0x18,
+ 0x3, 0x10, 0x80, 0x4, 0x7e, 0x18, 0x3, 0x6a, 0x7a, 0x1f, 0x3, 0xc4, 0x80,
+ 0x5, 0xbe, 0xb0, 0x6e, 0x38, 0xe, 0xa, 0x1b, 0x7e, 0x1f, 0x3, 0xc4, 0x2d,
+ 0x31, 0x1b, 0x34, 0x7e, 0x1b, 0xb0, 0x22, 0xbe, 0xb0, 0xd3, 0x68, 0x3, 0xb4,
+ 0xd4, 0x10, 0xb4, 0xd3, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x1c, 0x80, 0x2,
+ 0x15, 0xf, 0x2, 0x60, 0x2f, 0xb4, 0xf6, 0x7, 0x12, 0x61, 0x3e, 0xb, 0x1a,
+ 0x50, 0x22, 0xb4, 0xf7, 0x9, 0x12, 0x61, 0x3e, 0xb, 0x1a, 0x30, 0xa, 0x56,
+ 0x22, 0xbe, 0xb0, 0xf8, 0x68, 0x3, 0xb4, 0xf9, 0x1c, 0xb4, 0xf8, 0x8, 0x6d,
+ 0x33, 0x7a, 0x37, 0x9b, 0x1c, 0x80, 0x2, 0x15, 0xf, 0x7e, 0x37, 0x9b, 0x1c,
+ 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x9b, 0x1c, 0x2, 0x0, 0x66, 0xbe, 0xb0,
+ 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x3, 0x2, 0x61, 0x47, 0xb4, 0x80, 0x3, 0x2,
+ 0x70, 0x9e, 0xbe, 0xb0, 0x80, 0x28, 0xc, 0xbe, 0xb0, 0xef, 0x38, 0x7, 0xa,
+ 0x3b, 0x9, 0xb3, 0x58, 0xbb, 0x22, 0xb4, 0xfc, 0x5, 0x7e, 0xb3, 0x59, 0x62,
+ 0x22, 0xb4, 0xfd, 0x5, 0xa2, 0x2f, 0xe4, 0x33, 0x22, 0xb4, 0xfe, 0x8, 0x12,
+ 0x61, 0x99, 0x9, 0xb5, 0x9b, 0x23, 0x22, 0x74, 0xff, 0x22, 0x7e, 0x34, 0x0,
+ 0x9, 0x7e, 0x24, 0x0, 0xff, 0x22, 0xb4, 0xeb, 0x5, 0xe4, 0x7a, 0xb3, 0x9b,
+ 0x22, 0x7e, 0x73, 0x9b, 0x22, 0xa, 0x27, 0x2e, 0x24, 0x0, 0x6, 0x12, 0x61,
+ 0xa1, 0x7c, 0xab, 0x7c, 0xb7, 0x4, 0x7a, 0xb3, 0x9b, 0x22, 0xb4, 0x3, 0xb,
+ 0xe4, 0x7a, 0xb3, 0x9b, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x20, 0x75, 0xf,
+ 0xeb, 0x7c, 0xba, 0x22, 0x7e, 0x73, 0x9a, 0xbc, 0x7c, 0xa7, 0x5e, 0xa0, 0xf,
+ 0x7c, 0xb7, 0x23, 0x54, 0x1, 0x3, 0x54, 0x80, 0x4e, 0xb3, 0x9b, 0x1f, 0x4c,
+ 0xba, 0x22, 0xe5, 0x9a, 0x60, 0x3, 0xa9, 0xd6, 0xdf, 0x22, 0x7e, 0xa3, 0x9b,
+ 0xa8, 0x74, 0x8, 0xa4, 0x22, 0x7a, 0x51, 0x82, 0x7a, 0x41, 0x83, 0xe4, 0x93,
+ 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0xab, 0x7c,
+ 0xb7, 0x54, 0x7, 0xa, 0x2b, 0x2e, 0x24, 0x0, 0x5e, 0x12, 0x61, 0xa1, 0x7c,
+ 0x7b, 0x4c, 0x66, 0x68, 0xb, 0xa, 0x2a, 0x12, 0x67, 0xd9, 0x4c, 0xb7, 0x7a,
+ 0x29, 0xb0, 0x22, 0x7c, 0xb7, 0x64, 0xff, 0xa, 0x2a, 0x2e, 0x24, 0x65, 0xd8,
+ 0x7e, 0x29, 0x70, 0x5c, 0x7b, 0x7a, 0x29, 0x70, 0x22, 0xca, 0x3b, 0x74, 0x4,
+ 0x7a, 0xb3, 0x92, 0x8, 0xc2, 0x0, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0x2, 0x81,
+ 0x75, 0x30, 0x2a, 0x2, 0x81, 0x75, 0x7e, 0xa3, 0x67, 0x62, 0xbe, 0xa0, 0x1,
+ 0x78, 0x1b, 0x7e, 0xb3, 0x67, 0x78, 0x70, 0x15, 0x7e, 0xb3, 0x65, 0x60,
+ 0x7a, 0xb3, 0x59, 0xea, 0x7e, 0xb3, 0x65, 0x61, 0x7a, 0xb3, 0x59, 0xeb,
+ 0xe4, 0x7a, 0xb3, 0x59, 0xec, 0xbe, 0xa0, 0x0, 0x28, 0x63, 0xc2, 0x1, 0x6c,
+ 0xdd, 0x80, 0x47, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xe3, 0x65, 0x60, 0x9,
+ 0xf3, 0x65, 0x61, 0x7e, 0xb3, 0x59, 0xea, 0xa, 0x2b, 0x1a, 0xce, 0x12, 0x64,
+ 0x86, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc3, 0xbe, 0xc4,
+ 0x0, 0x2, 0x58, 0x1d, 0x7e, 0xb3, 0x59, 0xeb, 0xa, 0x2b, 0x1a, 0xcf, 0x12,
+ 0x64, 0x86, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc3, 0xbe,
+ 0xc4, 0x0, 0x2, 0x58, 0x2, 0xd2, 0x1, 0xb, 0xd0, 0xbc, 0xad, 0x38, 0xb5,
+ 0x30, 0x1, 0xc, 0x7e, 0xb3, 0x59, 0xec, 0xbe, 0xb0, 0xc8, 0x50, 0xb, 0x4,
+ 0x80, 0x4, 0xe4, 0x80, 0x1, 0xe4, 0x7a, 0xb3, 0x59, 0xec, 0xbe, 0xa0, 0x2,
+ 0x50, 0x2, 0x81, 0x75, 0x7e, 0xb3, 0x69, 0x6a, 0xb4, 0x1, 0x2, 0x80, 0x2,
+ 0x81, 0x75, 0x6d, 0x0, 0x6c, 0xdd, 0x80, 0x23, 0x74, 0x2, 0xac, 0xbd, 0x9,
+ 0xe5, 0x65, 0x60, 0x9, 0xf5, 0x65, 0x61, 0x12, 0x64, 0x78, 0x7d, 0x43, 0xbd,
+ 0x40, 0x8, 0xc, 0x7d, 0x4, 0x7a, 0xe3, 0x67, 0x6a, 0x7a, 0xf3, 0x67, 0x6b,
+ 0x7c, 0xcd, 0xb, 0xd0, 0x12, 0x64, 0x7f, 0x38, 0xd8, 0x6c, 0xdd, 0x81, 0x68,
+ 0xbc, 0xcd, 0x78, 0x2, 0x81, 0x66, 0x74, 0x2, 0xac, 0xbd, 0x9, 0x75, 0x65,
+ 0x60, 0x7a, 0x73, 0x92, 0x2, 0x9, 0x75, 0x65, 0x61, 0x7a, 0x73, 0x92, 0x3,
+ 0x7e, 0x73, 0x67, 0x6a, 0x7a, 0x73, 0x92, 0x4, 0x7e, 0x63, 0x67, 0x6b, 0x7a,
+ 0x63, 0x92, 0x5, 0xbe, 0x73, 0x92, 0x2, 0x28, 0x6, 0x7e, 0x73, 0x92, 0x2,
+ 0x80, 0x4, 0x7e, 0x73, 0x92, 0x4, 0x7a, 0x73, 0x91, 0xfe, 0x7e, 0x73, 0x92,
+ 0x4, 0xbe, 0x73, 0x92, 0x2, 0x50, 0x6, 0x7e, 0x73, 0x92, 0x2, 0x80, 0x4,
+ 0x7e, 0x73, 0x92, 0x4, 0x7a, 0x73, 0x92, 0x0, 0x7e, 0x73, 0x92, 0x5, 0xbe,
+ 0x73, 0x92, 0x3, 0x28, 0x6, 0x7e, 0x63, 0x92, 0x3, 0x80, 0x4, 0x7e, 0x63,
+ 0x92, 0x5, 0x7a, 0x63, 0x91, 0xff, 0xbe, 0x73, 0x92, 0x3, 0x50, 0x6, 0x7e,
+ 0x73, 0x92, 0x3, 0x80, 0x4, 0x7e, 0x73, 0x92, 0x5, 0x7a, 0x73, 0x92, 0x1,
+ 0x7e, 0x63, 0x91, 0xfe, 0x1a, 0x56, 0x7e, 0x63, 0x92, 0x0, 0x1a, 0x16, 0x9d,
+ 0x15, 0xb, 0x14, 0x7c, 0x63, 0x7a, 0x63, 0x92, 0x6, 0x7e, 0x63, 0x91, 0xff,
+ 0x1a, 0x26, 0x1a, 0x37, 0x9d, 0x32, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x7, 0x12,
+ 0x2e, 0x38, 0x7d, 0xd3, 0x7e, 0x73, 0x92, 0x7, 0xbe, 0x73, 0x92, 0x6, 0x50,
+ 0x5b, 0x7e, 0xb3, 0x91, 0xff, 0xbe, 0xb0, 0x0, 0x8, 0x5, 0x14, 0x7a, 0xb3,
+ 0x91, 0xff, 0x12, 0x67, 0xf2, 0x7e, 0xb3, 0x92, 0x1, 0x1a, 0x1b, 0xbd, 0x1c,
+ 0x58, 0x5, 0x4, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0xe3, 0x92, 0x0, 0x12, 0x2e,
+ 0x38, 0x7d, 0x3, 0x80, 0x26, 0x1b, 0xe0, 0x6d, 0x44, 0x7e, 0xf3, 0x92, 0x1,
+ 0x80, 0xe, 0x12, 0x64, 0x78, 0xbd, 0x34, 0x8, 0x5, 0x12, 0x64, 0x78, 0x7d,
+ 0x43, 0x1b, 0xf0, 0x7e, 0x73, 0x91, 0xff, 0xbc, 0x7f, 0x8, 0xea, 0xbd, 0x40,
+ 0x58, 0x2, 0x7d, 0x4, 0x7e, 0x73, 0x91, 0xfe, 0xbc, 0x7e, 0x48, 0xd2, 0x80,
+ 0x5e, 0x7e, 0xb3, 0x91, 0xfe, 0xbe, 0xb0, 0x0, 0x8, 0x5, 0x14, 0x7a, 0xb3,
+ 0x91, 0xfe, 0x7e, 0x73, 0x82, 0xe, 0xa, 0xc7, 0x1b, 0xc4, 0x7e, 0xb3, 0x92,
+ 0x0, 0x1a, 0x1b, 0xbd, 0x1c, 0x58, 0x5, 0x4, 0x7a, 0xb3, 0x92, 0x0, 0x7e,
+ 0xf3, 0x92, 0x1, 0x12, 0x2e, 0x38, 0x7d, 0x3, 0x80, 0x26, 0x1b, 0xf0, 0x6d,
+ 0x44, 0x7e, 0xe3, 0x92, 0x0, 0x80, 0xe, 0x12, 0x64, 0x78, 0xbd, 0x34, 0x8,
+ 0x5, 0x12, 0x64, 0x78, 0x7d, 0x43, 0x1b, 0xe0, 0x7e, 0x73, 0x91, 0xfe, 0xbc,
+ 0x7e, 0x8, 0xea, 0xbd, 0x40, 0x58, 0x2, 0x7d, 0x4, 0x7e, 0x73, 0x91, 0xff,
+ 0xbc, 0x7f, 0x48, 0xd2, 0x7e, 0x73, 0x92, 0x8, 0xa, 0x37, 0xad, 0x3d, 0x7e,
+ 0x24, 0x0, 0xa, 0x12, 0x1, 0x20, 0xbd, 0x30, 0x58, 0x12, 0x7e, 0x73, 0x59,
+ 0xec, 0xbe, 0x70, 0x28, 0x50, 0x9, 0x7c, 0xbd, 0x6c, 0x77, 0x12, 0x61, 0xaa,
+ 0xd2, 0x0, 0xb, 0xd0, 0x12, 0x64, 0x7f, 0x28, 0x2, 0x41, 0xd1, 0x30, 0x0,
+ 0x3, 0x12, 0x64, 0x8f, 0xda, 0x3b, 0x22, 0x7c, 0xbe, 0x7c, 0x7f, 0x2, 0x2e,
+ 0x40, 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x7d, 0x22, 0x7d, 0x3c, 0x9d, 0x32,
+ 0xbe, 0x34, 0x0, 0x0, 0x22, 0xca, 0x79, 0x6c, 0xff, 0x6c, 0xee, 0x80, 0x31,
+ 0x7c, 0xbe, 0x12, 0x67, 0x50, 0x60, 0x28, 0x7e, 0x34, 0x0, 0x2, 0xca, 0x39,
+ 0xac, 0x7e, 0x2e, 0x34, 0x65, 0x60, 0x6d, 0x22, 0x7e, 0x30, 0x2, 0xac, 0x3f,
+ 0x2e, 0x14, 0x65, 0x60, 0x6d, 0x0, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7c, 0xbf,
+ 0x7e, 0x70, 0x1, 0x12, 0x61, 0xaa, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0x67, 0xd2,
+ 0x38, 0xca, 0x7a, 0xf3, 0x67, 0x62, 0xda, 0x79, 0x22, 0xca, 0xf8, 0x12,
+ 0x67, 0xcb, 0x7e, 0xb3, 0x67, 0x62, 0x70, 0x5, 0x12, 0x67, 0x99, 0x80, 0x65,
+ 0x7e, 0xb3, 0x59, 0x8b, 0x70, 0x5f, 0x7e, 0xb3, 0x59, 0x7d, 0xbe, 0xb0, 0x1,
+ 0x68, 0x56, 0x12, 0xb3, 0x5a, 0x92, 0x1, 0x20, 0x2a, 0x2, 0xc2, 0x0, 0x30,
+ 0x0, 0x9, 0x12, 0x67, 0x45, 0x7a, 0xb3, 0x3, 0xe5, 0x80, 0xa, 0x30, 0x1,
+ 0xd, 0x12, 0x67, 0x45, 0x7a, 0xb3, 0x3, 0xe6, 0x74, 0x1, 0x7a, 0xb3, 0x3,
+ 0xe4, 0x7e, 0xb3, 0x3, 0xe5, 0x60, 0x10, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x65,
+ 0x4c, 0x12, 0x67, 0x3e, 0x38, 0xf8, 0xd2, 0x2, 0x80, 0x14, 0x7e, 0xb3, 0x3,
+ 0xe6, 0x60, 0xe, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x65, 0x4c, 0x12, 0x67, 0x3e,
+ 0x38, 0xf8, 0xd2, 0x2, 0x30, 0x2, 0x3, 0x12, 0x64, 0x8f, 0xda, 0xf8, 0x22,
+ 0x7c, 0xbf, 0x6c, 0x77, 0x12, 0x61, 0xaa, 0xb, 0xf0, 0x22, 0x12, 0x64, 0xd4,
+ 0x12, 0x85, 0x49, 0x12, 0x64, 0x8f, 0x12, 0x61, 0xe5, 0x2, 0x65, 0x65, 0xca,
+ 0x3b, 0x7e, 0xd3, 0x67, 0x62, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18,
+ 0x65, 0x60, 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x6c, 0x11,
+ 0x75, 0x27, 0x0, 0x6c, 0xcc, 0xc1, 0x42, 0x7e, 0x44, 0x3, 0xff, 0x7e, 0xe0,
+ 0xff, 0x6c, 0xff, 0x80, 0x5f, 0x7c, 0xbf, 0x12, 0x67, 0x50, 0x60, 0x56,
+ 0x12, 0x67, 0x71, 0xbe, 0x0, 0xff, 0x68, 0x4e, 0x9, 0x5, 0x91, 0xff, 0xa,
+ 0x10, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0x3, 0x59, 0xae, 0xa, 0x30, 0x7d,
+ 0x23, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x31, 0x80, 0x4,
+ 0x6d, 0x33, 0x9d, 0x32, 0x12, 0x67, 0x71, 0xa, 0xf0, 0x74, 0x2, 0xac, 0xbc,
+ 0x9, 0x5, 0x59, 0xad, 0xa, 0x10, 0x7d, 0x21, 0x9d, 0x2f, 0xbe, 0x24, 0x0,
+ 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x12, 0x2d, 0x13,
+ 0xbd, 0x41, 0x28, 0x4, 0x7d, 0x41, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38,
+ 0x9d, 0xbe, 0xe0, 0xff, 0x68, 0x46, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0xb3,
+ 0x91, 0xfe, 0x9, 0x73, 0x91, 0xff, 0x12, 0x2e, 0x40, 0x7d, 0x23, 0x74, 0x2,
+ 0xac, 0xbe, 0x9, 0xb5, 0x91, 0xfe, 0x12, 0x0, 0xfb, 0xbd, 0x23, 0x48, 0x25,
+ 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0x3, 0x91, 0xfe, 0x7e, 0xa1, 0x27, 0x74,
+ 0x2, 0xa4, 0x19, 0x5, 0x92, 0x3a, 0x9, 0x3, 0x91, 0xff, 0x19, 0x5, 0x92,
+ 0x3b, 0x74, 0xff, 0x19, 0xb3, 0x91, 0xfe, 0xb, 0x10, 0x5, 0x27, 0xb, 0xc0,
+ 0x7e, 0x3, 0x59, 0xe9, 0xbc, 0xc, 0x28, 0x2, 0xa1, 0x87, 0x7c, 0xc1, 0x80,
+ 0x6b, 0x6d, 0x0, 0x7e, 0xe0, 0xff, 0x6c, 0xff, 0x80, 0x39, 0x7c, 0xbf, 0x12,
+ 0x67, 0x50, 0x60, 0x30, 0x7e, 0x30, 0x2, 0xac, 0x3f, 0x9, 0xb1, 0x91, 0xfe,
+ 0xbe, 0xb0, 0xff, 0x68, 0x22, 0x9, 0x71, 0x91, 0xff, 0x12, 0x2e, 0x40, 0x7d,
+ 0x43, 0xbd, 0x4, 0x58, 0x15, 0x7e, 0x70, 0x2, 0xac, 0x7f, 0x9, 0xb3, 0x91,
+ 0xfe, 0xf5, 0x28, 0x9, 0xb3, 0x91, 0xff, 0xf5, 0x29, 0x7d, 0x4, 0x7c, 0xef,
+ 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xc3, 0xbe, 0xe0, 0xff, 0x68, 0x1e, 0x7e, 0xa1,
+ 0x28, 0x12, 0x67, 0xe1, 0x19, 0xa1, 0x92, 0x3a, 0xe5, 0x29, 0x19, 0xb1,
+ 0x92, 0x3b, 0x7e, 0xa0, 0xff, 0x7e, 0x30, 0x2, 0xac, 0x3e, 0x19, 0xa1, 0x91,
+ 0xfe, 0x5, 0x27, 0xb, 0xc0, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7c, 0x38, 0x8d,
+ 0x7e, 0xa3, 0x75, 0x8d, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x92, 0x3a,
+ 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0xd1, 0x27, 0x12,
+ 0x67, 0x7a, 0x7e, 0x8, 0x59, 0xad, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xbe, 0xd0,
+ 0x0, 0x28, 0x38, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x91, 0xfe,
+ 0x7e, 0x8, 0x65, 0x60, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0xa, 0x3d, 0x3e, 0x34,
+ 0xca, 0x39, 0x7e, 0x18, 0x91, 0xfe, 0x7e, 0x8, 0x59, 0xad, 0x12, 0x0, 0x6e,
+ 0x1b, 0xfd, 0x6c, 0xcc, 0x80, 0xa, 0x7c, 0xbc, 0x7e, 0x70, 0x1, 0x12, 0x61,
+ 0xaa, 0xb, 0xc0, 0xbc, 0xdc, 0x38, 0xf2, 0x7a, 0xd3, 0x59, 0xe9, 0x7a, 0xd3,
+ 0x67, 0x62, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x73, 0x67, 0x62, 0x50, 0x4, 0x7a,
+ 0x73, 0x67, 0x62, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x7f,
+ 0x22, 0x7e, 0x37, 0x76, 0x5e, 0x7a, 0x37, 0x3, 0xe9, 0x74, 0x1, 0x22, 0x7c,
+ 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0xa, 0x2b, 0x9, 0xa2, 0x65, 0xd8, 0x7c, 0xb7,
+ 0x54, 0x7, 0xa, 0x3b, 0x2e, 0x34, 0x0, 0x5e, 0x7a, 0x71, 0x82, 0x7a, 0x61,
+ 0x83, 0xe4, 0x93, 0x5c, 0xba, 0x22, 0x74, 0x2, 0xac, 0xbf, 0x9, 0x5, 0x91,
+ 0xfe, 0x22, 0x7e, 0x63, 0x75, 0x8c, 0x7e, 0x70, 0x2, 0xac, 0x67, 0x22, 0x12,
+ 0x67, 0x7a, 0x7e, 0x8, 0x30, 0xf1, 0xe4, 0x12, 0x0, 0x2e, 0x12, 0x67, 0x7a,
+ 0x7e, 0x8, 0x2e, 0x7a, 0x2, 0x0, 0x2e, 0x7e, 0x37, 0x3, 0xe9, 0xbe, 0x34,
+ 0x0, 0x0, 0x28, 0x7, 0x1b, 0x34, 0x7a, 0x37, 0x3, 0xe9, 0x22, 0xe4, 0x12,
+ 0x67, 0xe9, 0x7a, 0xb3, 0x3, 0xe4, 0x22, 0xca, 0x59, 0xca, 0x1b, 0xca, 0xb,
+ 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x21, 0xcf, 0xd0, 0x82, 0xd0, 0x83, 0xda, 0xb,
+ 0xda, 0x1b, 0xda, 0x59, 0x32, 0xc2, 0x0, 0xc2, 0x1, 0xc2, 0x2, 0x22, 0x7e,
+ 0x73, 0x67, 0x62, 0xbc, 0x7e, 0x22, 0x2e, 0x24, 0x65, 0xd8, 0x7e, 0x29,
+ 0xb0, 0x22, 0x7e, 0x31, 0x27, 0x74, 0x2, 0xac, 0x3b, 0x22, 0x7a, 0xb3, 0x3,
+ 0xe5, 0x7a, 0xb3, 0x3, 0xe6, 0x22, 0x7e, 0x73, 0x82, 0xf, 0xa, 0xc7, 0x1b,
+ 0xc4, 0x22, 0xca, 0xb8, 0xca, 0x78, 0xa9, 0xc0, 0x93, 0xa9, 0xd3, 0xa7,
+ 0x12, 0x68, 0x1e, 0x75, 0x8, 0x0, 0x7e, 0x73, 0x37, 0xdf, 0xbe, 0x70, 0x6,
+ 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x37, 0xdf, 0xda, 0x78, 0xda, 0xb8, 0x32, 0x75,
+ 0x8, 0x0, 0xc2, 0x95, 0xa9, 0xc2, 0x93, 0x22, 0x7a, 0xb3, 0x9a, 0xbc, 0xc4,
+ 0x54, 0x7, 0xbe, 0xb0, 0x4, 0x68, 0x3, 0xb4, 0x2, 0x4, 0x74, 0x3, 0x80, 0x7,
+ 0x60, 0x3, 0xb4, 0x1, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x59, 0x62, 0x22, 0x74,
+ 0x1, 0x7a, 0xb3, 0x59, 0x62, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x22, 0xbe, 0xb0,
+ 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x33, 0x7e, 0x27, 0x9b, 0x20, 0x4d, 0x22, 0x78,
+ 0xe, 0xa5, 0xbf, 0xaa, 0xa, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x27, 0x9b, 0x20,
+ 0x15, 0xf, 0x7e, 0x27, 0x9b, 0x20, 0xbe, 0x24, 0x0, 0x1, 0x78, 0x10, 0xa5,
+ 0xbf, 0x9, 0x6, 0x7e, 0x34, 0x0, 0x2, 0x80, 0x2, 0x6d, 0x33, 0x7a, 0x37,
+ 0x9b, 0x20, 0x75, 0xf, 0xea, 0x22, 0xc4, 0x54, 0xf0, 0x7a, 0xb3, 0x9b, 0x1f,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x9a, 0xbc, 0x7e, 0xb3, 0x9b, 0x1e, 0x54, 0xfb,
+ 0x7a, 0xb3, 0x9b, 0x1e, 0x7e, 0x8, 0x3, 0x10, 0x12, 0x68, 0xef, 0x7e, 0x8,
+ 0x3, 0x6a, 0x7e, 0x34, 0x0, 0x3e, 0x12, 0x0, 0x2e, 0x7e, 0x18, 0x3, 0x10,
+ 0x7a, 0x1f, 0x3, 0xc4, 0x75, 0x8, 0x0, 0x75, 0xf, 0x0, 0x7e, 0xb3, 0x9a,
+ 0xbc, 0xf5, 0x91, 0x2, 0x68, 0xce, 0x12, 0x68, 0xe7, 0x7e, 0xb3, 0x67, 0x75,
+ 0x54, 0xfe, 0xf5, 0x92, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd4, 0x95, 0xd2,
+ 0xad, 0xd2, 0x97, 0xd2, 0x94, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2, 0x91,
+ 0x22, 0x7e, 0x34, 0x0, 0x3e, 0x74, 0xff, 0x2, 0x0, 0x2e, 0xca, 0x3b, 0x7c,
+ 0xdb, 0x75, 0x27, 0x0, 0x6c, 0xcc, 0x75, 0x28, 0x0, 0x75, 0x29, 0x0, 0x6c,
+ 0xee, 0x75, 0x2c, 0x3, 0x7e, 0x18, 0x69, 0x19, 0x7a, 0x1f, 0x92, 0x2, 0x75,
+ 0x2d, 0x0, 0x7e, 0x18, 0x3, 0x10, 0x7a, 0x1f, 0x92, 0x6, 0x7e, 0xb3, 0x69,
+ 0x72, 0x70, 0xe, 0x7e, 0xb3, 0x69, 0x6e, 0x70, 0x8, 0x7e, 0xb3, 0x69, 0x6f,
+ 0x70, 0x2, 0x61, 0x56, 0x30, 0x24, 0xa, 0x7e, 0x8, 0x3, 0x6a, 0x7a, 0xf,
+ 0x92, 0x6, 0x80, 0x4, 0x7a, 0x1f, 0x92, 0x6, 0x7e, 0xf, 0x92, 0x6, 0x12,
+ 0x68, 0xef, 0x7e, 0xf, 0x92, 0x6, 0x2e, 0x14, 0x0, 0x3e, 0x7e, 0x34, 0x0,
+ 0x1c, 0x12, 0x9, 0xfc, 0x41, 0x95, 0x74, 0xd, 0xac, 0xbf, 0x49, 0x35, 0x68,
+ 0x15, 0x7a, 0x37, 0x91, 0xfe, 0x74, 0xd, 0xac, 0xbf, 0x49, 0x35, 0x68, 0x17,
+ 0x12, 0x6b, 0xaa, 0xf5, 0x2a, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x2a,
+ 0x38, 0x2, 0x41, 0x93, 0x7e, 0xa1, 0x2a, 0x5e, 0xa0, 0xf, 0x74, 0x8, 0xa4,
+ 0x7e, 0x1f, 0x92, 0x2, 0x2d, 0x35, 0x7e, 0x1b, 0xb0, 0xf5, 0x2c, 0x7e, 0x18,
+ 0x91, 0xfe, 0x7a, 0x1d, 0x2e, 0x7e, 0x18, 0x92, 0x0, 0x7a, 0x1d, 0x32, 0xe5,
+ 0x2a, 0x7e, 0x8, 0x0, 0x2c, 0x7e, 0x37, 0x91, 0xfe, 0x7e, 0x27, 0x92, 0x0,
+ 0x12, 0x6c, 0xda, 0xe5, 0x2c, 0xbe, 0xb0, 0x3, 0x78, 0x2, 0x41, 0x93, 0xe5,
+ 0x2c, 0xb4, 0x1, 0x3a, 0x75, 0x2b, 0x0, 0x80, 0x2c, 0x7e, 0x71, 0x2b, 0x74,
+ 0xd, 0xac, 0x7b, 0x9, 0xb3, 0x2, 0x78, 0x54, 0xf, 0xbe, 0xb1, 0x2a, 0x78,
+ 0x18, 0x49, 0x33, 0x2, 0x74, 0x7a, 0x37, 0x91, 0xfe, 0x7e, 0xa1, 0x2b, 0x74,
+ 0xd, 0xa4, 0x49, 0x35, 0x2, 0x76, 0x7a, 0x37, 0x92, 0x0, 0x80, 0xb, 0x5,
+ 0x2b, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x2b, 0x38, 0xcb, 0x85, 0x27,
+ 0x2e, 0x7e, 0x8, 0x0, 0x28, 0x7e, 0x18, 0x0, 0x29, 0x7c, 0xbf, 0x12, 0x6b,
+ 0xb7, 0x30, 0x23, 0x8, 0xc2, 0x23, 0x75, 0x28, 0x28, 0x75, 0x29, 0xa, 0x7e,
+ 0x37, 0x91, 0xfe, 0x5e, 0x60, 0xf, 0x7a, 0x37, 0x91, 0xfe, 0x7e, 0x37, 0x92,
+ 0x0, 0x5e, 0x60, 0xf, 0x7a, 0x37, 0x92, 0x0, 0x74, 0xd, 0xac, 0xbf, 0x9,
+ 0x75, 0x68, 0x19, 0xa, 0x57, 0x12, 0x49, 0x61, 0x7d, 0x35, 0x2e, 0x37, 0x92,
+ 0x0, 0x12, 0x6b, 0xaa, 0xbe, 0xb0, 0xff, 0x68, 0x18, 0xe5, 0x2c, 0xbe, 0xb0,
+ 0x1, 0x68, 0x2, 0x5, 0x27, 0xb, 0xe0, 0xe5, 0x2c, 0x12, 0x4f, 0xe1, 0x7d,
+ 0x35, 0x2e, 0x37, 0x91, 0xfe, 0x80, 0x8, 0x7e, 0x37, 0x91, 0xfe, 0x2e, 0x34,
+ 0xc0, 0x0, 0x7a, 0x37, 0x91, 0xfe, 0x12, 0x6b, 0x8a, 0x79, 0x30, 0x0, 0x2,
+ 0x7e, 0x37, 0x92, 0x0, 0x12, 0x6b, 0x8a, 0x79, 0x30, 0x0, 0x4, 0x7e, 0xa1,
+ 0x28, 0x12, 0x6b, 0x9e, 0x39, 0xa1, 0x0, 0x6, 0x7e, 0xa1, 0x29, 0x12, 0x6b,
+ 0x9e, 0x39, 0xa1, 0x0, 0x7, 0xb, 0xc0, 0xb, 0xf0, 0x7e, 0x73, 0x81, 0xeb,
+ 0xbc, 0x7f, 0x28, 0x2, 0x21, 0x5c, 0x7e, 0xb3, 0x59, 0x8b, 0xb4, 0x1, 0x52,
+ 0x74, 0x1, 0x12, 0x6b, 0x95, 0x7e, 0x73, 0x59, 0x8e, 0x7e, 0xf, 0x92, 0x6,
+ 0x39, 0x70, 0x0, 0x40, 0x7e, 0xb3, 0x69, 0x6f, 0xb4, 0x1, 0x3e, 0x7e, 0x73,
+ 0x9a, 0x4b, 0x7e, 0xf, 0x92, 0x6, 0x39, 0x70, 0x0, 0x41, 0x6c, 0xff, 0x80,
+ 0x20, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x96, 0x60, 0x12, 0x6b, 0x8e, 0x79,
+ 0x30, 0x0, 0x42, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x96, 0x62, 0x12, 0x6b,
+ 0x8e, 0x79, 0x30, 0x0, 0x44, 0xb, 0xf0, 0x7e, 0x73, 0x9a, 0x4b, 0xbc, 0x7f,
+ 0x38, 0xd8, 0x80, 0x4, 0xe4, 0x12, 0x6b, 0x95, 0xe5, 0x27, 0x7e, 0x1f, 0x92,
+ 0x6, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x33, 0x69, 0x6b, 0x7e, 0x1f, 0x92, 0x6,
+ 0x7a, 0x1b, 0x30, 0x7e, 0xb3, 0x59, 0x8b, 0xb4, 0x1, 0x1c, 0x7e, 0xb3, 0x69,
+ 0x6f, 0xb4, 0x1, 0x28, 0x74, 0x64, 0x7a, 0xb3, 0x9b, 0x83, 0xc2, 0x95, 0x75,
+ 0x2d, 0x1, 0x4c, 0xdd, 0x68, 0x16, 0xb2, 0x24, 0xc2, 0x86, 0x80, 0x10, 0xbe,
+ 0xe0, 0x0, 0x28, 0xe, 0x75, 0x2d, 0x1, 0x4c, 0xdd, 0x68, 0x4, 0xb2, 0x24,
+ 0xc2, 0x86, 0x12, 0x6c, 0xc8, 0xe4, 0x7a, 0xb3, 0x69, 0x72, 0x7a, 0xb3,
+ 0x69, 0x6e, 0x7a, 0xb3, 0x69, 0x6f, 0x80, 0x6, 0x4c, 0xdd, 0x68, 0x2, 0xd2,
+ 0x86, 0x6c, 0xff, 0x80, 0xe, 0x12, 0x6c, 0xb8, 0x2e, 0x34, 0x68, 0x15, 0x2e,
+ 0x14, 0x2, 0x74, 0x12, 0x6c, 0xc0, 0x12, 0x3f, 0x57, 0x38, 0xed, 0x4c, 0xee,
+ 0x78, 0xe, 0x7e, 0x70, 0xd, 0xac, 0x67, 0x7e, 0x8, 0x2, 0x74, 0x74, 0xff,
+ 0x12, 0x0, 0x2e, 0xe5, 0x2d, 0xda, 0x3b, 0x22, 0x74, 0x6, 0xac, 0xbc, 0x7e,
+ 0xf, 0x92, 0x6, 0x2d, 0x15, 0x22, 0x7e, 0x1f, 0x92, 0x6, 0x39, 0xb1, 0x0,
+ 0x3e, 0x22, 0x7e, 0x30, 0x6, 0xac, 0x3c, 0x7e, 0x1f, 0x92, 0x6, 0x2d, 0x31,
+ 0x22, 0x7a, 0x37, 0x92, 0x0, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xb5, 0x68, 0x19,
+ 0x22, 0xca, 0x79, 0x7c, 0xfb, 0x7f, 0x51, 0x7f, 0x40, 0x74, 0xd, 0xac, 0xbf,
+ 0x9, 0xb5, 0x68, 0x1a, 0xf5, 0x2f, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xb5, 0x68,
+ 0x1b, 0x1e, 0xb0, 0xbe, 0xb0, 0xf, 0x28, 0x2, 0x74, 0xf, 0xc4, 0x54, 0xf0,
+ 0xf5, 0x30, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xe5, 0x68, 0x19, 0x7e, 0x73, 0x81,
+ 0xeb, 0xbc, 0x7e, 0x28, 0x58, 0x7e, 0xb3, 0x69, 0x70, 0x70, 0x28, 0x75,
+ 0x31, 0xf, 0x7e, 0x8, 0x0, 0x2f, 0xa, 0x3e, 0x2e, 0x34, 0x2, 0xfb, 0x6d,
+ 0x22, 0x74, 0x1, 0x12, 0x6c, 0x6c, 0x75, 0x31, 0x20, 0x7e, 0x8, 0x0, 0x30,
+ 0xa, 0x3e, 0x2e, 0x34, 0x3, 0x6, 0x74, 0x10, 0x12, 0x6c, 0x6c, 0x80, 0xe,
+ 0xa, 0x3e, 0x9, 0xb3, 0x2, 0xfb, 0xf5, 0x2f, 0x9, 0xb3, 0x3, 0x6, 0xf5,
+ 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x69, 0x19, 0xb4, 0x1, 0x11, 0xe4,
+ 0xa, 0x3e, 0x19, 0xb3, 0x2, 0xfb, 0x19, 0xb3, 0x3, 0x6, 0x75, 0x2f, 0x0,
+ 0x75, 0x30, 0x0, 0x7e, 0xb3, 0x81, 0xff, 0xb4, 0xff, 0x11, 0x85, 0x2e, 0x2f,
+ 0x75, 0x2f, 0x0, 0x12, 0x6b, 0xae, 0xbe, 0xb0, 0xff, 0x68, 0x3, 0x75, 0x2f,
+ 0x1, 0xe5, 0x2f, 0x7a, 0x4b, 0xb0, 0xe5, 0x30, 0x7a, 0x5b, 0xb0, 0xda, 0x79,
+ 0x22, 0x7c, 0x9b, 0x7e, 0x1b, 0xa0, 0x4c, 0xaa, 0x78, 0x7, 0x7e, 0xb, 0xb0,
+ 0x7a, 0x1b, 0xb0, 0x22, 0xa, 0xda, 0x7e, 0xb, 0x80, 0xa, 0xe8, 0x7d, 0xfe,
+ 0x9d, 0xfd, 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xed, 0x80, 0x4, 0x6d,
+ 0xee, 0x9d, 0xef, 0xe5, 0x31, 0xa, 0xfb, 0xbd, 0xef, 0x8, 0xf, 0xbc, 0x8a,
+ 0x7c, 0xba, 0x28, 0x4, 0x2c, 0xb9, 0x80, 0x2, 0x9c, 0xb9, 0x7a, 0x1b, 0xb0,
+ 0x7e, 0x1b, 0x70, 0x7a, 0xb, 0x70, 0x22, 0x74, 0x1, 0x2, 0x68, 0xf8, 0x7e,
+ 0x30, 0xd, 0xac, 0x3f, 0x7d, 0x31, 0x22, 0x74, 0xd, 0x12, 0x1, 0xf3, 0xb,
+ 0xf0, 0x22, 0x7e, 0xb3, 0x3, 0xc8, 0x4, 0x7a, 0xb3, 0x3, 0xc8, 0x7e, 0x73,
+ 0x3, 0xc8, 0x7a, 0x73, 0x59, 0x4a, 0x22, 0x7d, 0xf2, 0x7d, 0xe3, 0x7f, 0x60,
+ 0x7c, 0xab, 0x7e, 0xb3, 0x9b, 0xa8, 0x60, 0x6, 0x7e, 0xb3, 0x9b, 0xaf, 0x70,
+ 0x3, 0xc2, 0x22, 0x22, 0x7e, 0xb7, 0x76, 0x1b, 0x1b, 0xb4, 0x20, 0x22, 0x2,
+ 0xc1, 0xf7, 0x7e, 0x73, 0x69, 0x69, 0xbe, 0x70, 0x1, 0x28, 0x17, 0x7e, 0x63,
+ 0x2, 0x73, 0xbc, 0x6a, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4, 0x2,
+ 0x4, 0xe4, 0x7a, 0x6b, 0xb0, 0xc2, 0x22, 0x22, 0xa5, 0xbf, 0x0, 0x71, 0x7e,
+ 0xb3, 0x2, 0x73, 0xbc, 0xba, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4,
+ 0x1, 0x5e, 0xe4, 0x7a, 0x6b, 0xb0, 0x7e, 0x7, 0x2, 0xf6, 0x7e, 0x1d, 0x2e,
+ 0x1b, 0x1a, 0x0, 0x7e, 0x7, 0x2, 0xf8, 0x7e, 0x1d, 0x32, 0x1b, 0x1a, 0x0,
+ 0xd2, 0x23, 0x6c, 0x77, 0x7e, 0x10, 0x8, 0xac, 0x1a, 0x19, 0x70, 0x69, 0x19,
+ 0x7e, 0x10, 0x8, 0xac, 0x1a, 0x19, 0x70, 0x69, 0x1a, 0x7e, 0xb3, 0x2, 0x4a,
+ 0x4, 0x7a, 0xb3, 0x2, 0x4a, 0xe4, 0x7a, 0xb3, 0x69, 0x6e, 0x12, 0x6f, 0xe3,
+ 0x7e, 0x7, 0x2, 0xf6, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x59, 0x3, 0x69, 0x1b,
+ 0x7e, 0x7, 0x2, 0xf8, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x59, 0x3, 0x69, 0x1d,
+ 0x7c, 0xba, 0x12, 0x6f, 0xed, 0xc2, 0x22, 0x22, 0x7e, 0xb3, 0x2, 0x73, 0xbc,
+ 0xba, 0x68, 0x2, 0xe1, 0x82, 0x7e, 0x6b, 0xb0, 0xb4, 0x2, 0x22, 0xe4, 0x7a,
+ 0x6b, 0xb0, 0x5, 0x18, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x12, 0x0, 0xa3,
+ 0xbe, 0x34, 0x0, 0x2, 0x18, 0xd, 0xe5, 0x18, 0xbe, 0xb0, 0x4, 0x50, 0x6,
+ 0x74, 0x3, 0x7a, 0x6b, 0xb0, 0x22, 0x7d, 0xde, 0x9e, 0xd7, 0x2, 0xf6, 0x7d,
+ 0xd, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x7e, 0xc4, 0x0, 0x5, 0xad, 0x3c,
+ 0xbe, 0x4, 0x0, 0x14, 0x8, 0x6, 0x7e, 0x4, 0x0, 0x14, 0x80, 0xa, 0xbe, 0x4,
+ 0xff, 0xec, 0x58, 0x4, 0x7e, 0x4, 0xff, 0xec, 0x7e, 0xa3, 0x2, 0xfa, 0xbe,
+ 0xa0, 0x1, 0x78, 0x4d, 0xbe, 0x34, 0x0, 0x0, 0x18, 0x2, 0xc1, 0xf4, 0x7e,
+ 0x47, 0x2, 0xf8, 0x9d, 0x43, 0xbe, 0x44, 0x0, 0x4b, 0x58, 0x6, 0x7e, 0x44,
+ 0x0, 0x4b, 0x80, 0x1b, 0xbe, 0x34, 0x0, 0x3, 0x8, 0x15, 0xbe, 0x44, 0x0,
+ 0x69, 0x58, 0xf, 0x7d, 0x34, 0x9e, 0x34, 0x0, 0x5a, 0x12, 0x6f, 0xdc, 0x7d,
+ 0x43, 0x2e, 0x44, 0x0, 0x4b, 0x12, 0x6f, 0x97, 0x7e, 0x17, 0x2, 0xf6, 0x12,
+ 0x6f, 0xd5, 0x58, 0x4, 0x6d, 0x11, 0x80, 0x58, 0xbd, 0xb1, 0x50, 0x54, 0x7d,
+ 0x1b, 0x80, 0x50, 0xbe, 0xa0, 0x2, 0x78, 0x53, 0xbe, 0x34, 0x0, 0x0, 0x48,
+ 0x2, 0xc1, 0xf4, 0x7d, 0x2c, 0x12, 0x1, 0x20, 0x7e, 0x47, 0x2, 0xf8, 0x9d,
+ 0x43, 0x7e, 0xc7, 0x76, 0x29, 0x7d, 0xec, 0x1b, 0xe4, 0xbd, 0xe4, 0x50, 0x2,
+ 0x7d, 0x4e, 0xb, 0xf5, 0xbe, 0xf7, 0x2, 0xf8, 0x50, 0xc, 0x7d, 0xfc, 0x9e,
+ 0xf4, 0x0, 0xb, 0xbd, 0xf4, 0x50, 0x2, 0x7d, 0x4e, 0x12, 0x6f, 0x97, 0x12,
+ 0x6f, 0x9e, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x4, 0x6d, 0x11, 0x80, 0x6, 0xbd,
+ 0xb1, 0x50, 0x2, 0x7d, 0x1b, 0x7e, 0x1d, 0x2e, 0x1b, 0x1a, 0x10, 0x80, 0x59,
+ 0xbe, 0xa0, 0x3, 0x78, 0x29, 0x7d, 0xd, 0xbe, 0x4, 0x0, 0x0, 0x58, 0x4c,
+ 0x12, 0x6f, 0x9e, 0x7e, 0x7, 0x76, 0x1b, 0x1b, 0x4, 0xbd, 0x1, 0x50, 0x2,
+ 0x7d, 0x10, 0x12, 0x6f, 0xb7, 0x58, 0x4, 0x6d, 0x44, 0x80, 0x31, 0x12, 0x6f,
+ 0xae, 0x50, 0x2c, 0x7d, 0x40, 0x80, 0x28, 0xbe, 0xa0, 0x4, 0x78, 0x26, 0x7d,
+ 0xd, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x1e, 0x12, 0x6f, 0x9e, 0xbe, 0x14, 0x0, 0x0,
+ 0x58, 0x2, 0x6d, 0x11, 0x12, 0x6f, 0xb7, 0x58, 0x4, 0x6d, 0x44, 0x80, 0x7,
+ 0x12, 0x6f, 0xae, 0x50, 0x2, 0x7d, 0x40, 0x12, 0x6f, 0x97, 0xc2, 0x22, 0x22,
+ 0xbe, 0xf4, 0x0, 0x50, 0x28, 0x25, 0xbe, 0xf4, 0x0, 0xcd, 0x50, 0x1f, 0xbe,
+ 0xe4, 0x1, 0x7c, 0x28, 0x19, 0xbe, 0xe4, 0x2, 0xbc, 0x50, 0x13, 0x7e, 0xb3,
+ 0x69, 0x69, 0xb4, 0x1, 0xc, 0x7e, 0x6b, 0xb0, 0x70, 0x7, 0x12, 0x6f, 0x83,
+ 0x74, 0x1, 0x80, 0x59, 0xbe, 0xf4, 0x7, 0xc2, 0x28, 0x25, 0xbe, 0xe4, 0x0,
+ 0x1e, 0x28, 0x1f, 0xbe, 0xe4, 0x4, 0x1a, 0x50, 0x19, 0x7e, 0xb3, 0x69, 0x69,
+ 0xb4, 0x1, 0x12, 0x7e, 0x6b, 0xb0, 0x70, 0xd, 0x7e, 0xb3, 0x59, 0x47, 0x70,
+ 0x3c, 0x12, 0x6f, 0x83, 0x74, 0x2, 0x80, 0x2e, 0xbe, 0xe4, 0x4, 0x5, 0x28,
+ 0x11, 0x7e, 0xb3, 0x69, 0x69, 0xb4, 0x1, 0xa, 0x7e, 0x6b, 0xb0, 0x70, 0x5,
+ 0x12, 0x6f, 0x83, 0x80, 0x17, 0xbe, 0xe4, 0x0, 0x32, 0x50, 0x18, 0x7e, 0xb3,
+ 0x69, 0x69, 0xb4, 0x1, 0x11, 0x7e, 0x6b, 0xb0, 0x70, 0xc, 0x12, 0x6f, 0x83,
+ 0x74, 0x4, 0x7a, 0xb3, 0x2, 0xfa, 0x75, 0x18, 0x0, 0x22, 0x74, 0x3, 0x7a,
+ 0x6b, 0xb0, 0x7a, 0xa3, 0x2, 0x73, 0x7a, 0xe7, 0x2, 0xf6, 0x7a, 0xf7, 0x2,
+ 0xf8, 0xd2, 0x22, 0x22, 0x7e, 0x1d, 0x32, 0x1b, 0x1a, 0x40, 0x22, 0x7e,
+ 0x24, 0x0, 0x2, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x7e, 0x17, 0x2, 0xf6, 0x9d,
+ 0x13, 0x22, 0x7e, 0x7, 0x76, 0x29, 0x1b, 0x4, 0xbd, 0x4, 0x22, 0x7e, 0x1d,
+ 0x2e, 0x1b, 0x1a, 0x10, 0x7d, 0x3f, 0x9e, 0x37, 0x2, 0xf8, 0x7e, 0x24, 0x0,
+ 0x2, 0x12, 0x1, 0x20, 0x7e, 0x47, 0x2, 0xf8, 0x9d, 0x43, 0xbe, 0x44, 0x0,
+ 0x0, 0x22, 0x9d, 0x10, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x7e, 0x24, 0x0, 0x2,
+ 0x2, 0x1, 0x20, 0x7e, 0xb3, 0x69, 0x69, 0x4, 0x7a, 0xb3, 0x69, 0x69, 0x22,
+ 0x7c, 0xab, 0x74, 0x1, 0xa, 0x3a, 0x19, 0xb3, 0x1, 0x32, 0x22, 0x7c, 0x6b,
+ 0x24, 0xdd, 0x68, 0x42, 0x24, 0xfd, 0x68, 0x3e, 0x1b, 0xb1, 0x68, 0x3a,
+ 0x24, 0xfa, 0x68, 0x36, 0x14, 0x68, 0x33, 0x80, 0x0, 0xa5, 0xbe, 0x25, 0x7,
+ 0xd2, 0x21, 0x7a, 0x73, 0x59, 0x39, 0x22, 0xbe, 0x60, 0x40, 0x68, 0x9, 0xbe,
+ 0x60, 0x41, 0x68, 0x4, 0xa5, 0xbe, 0xb, 0x2, 0xd2, 0x20, 0xa5, 0xbe, 0x50,
+ 0xa, 0xa5, 0xbf, 0x1, 0x6, 0x74, 0x5, 0x7a, 0xb3, 0x9b, 0x83, 0xa, 0x26,
+ 0x19, 0x72, 0x59, 0x3b, 0xd2, 0x1f, 0x22, 0x7e, 0x34, 0x59, 0x3b, 0x30,
+ 0x1f, 0x42, 0xc2, 0x1f, 0x7e, 0x39, 0x50, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a,
+ 0x27, 0x81, 0xed, 0x9, 0x53, 0x0, 0x1, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a,
+ 0x27, 0x81, 0xef, 0x9, 0x53, 0x0, 0x2, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a,
+ 0x27, 0x81, 0xf3, 0x9, 0x53, 0x0, 0x3, 0xa, 0x25, 0x12, 0x16, 0xf6, 0x7a,
+ 0x27, 0x81, 0xf5, 0x9, 0x73, 0x0, 0x5, 0x12, 0x70, 0x93, 0x3e, 0x34, 0x7a,
+ 0x37, 0x81, 0xfd, 0x7e, 0x37, 0x81, 0xed, 0x7a, 0x37, 0x59, 0xab, 0x22, 0xa,
+ 0x37, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x22, 0x7e, 0x57,
+ 0x75, 0x96, 0xbe, 0x54, 0x0, 0xc0, 0x50, 0x6, 0x7e, 0x54, 0x0, 0xc0, 0x80,
+ 0xa, 0xbe, 0x54, 0x1, 0x20, 0x28, 0x4, 0x7e, 0x54, 0x1, 0x20, 0x1e, 0x54,
+ 0x1e, 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x22, 0x7e, 0x18, 0x1d,
+ 0xa0, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e, 0x18, 0x4, 0x0, 0x7a, 0x1f, 0x2d, 0x2e,
+ 0x7e, 0xf, 0x2d, 0x2a, 0x12, 0x70, 0xf9, 0x7e, 0xf, 0x2d, 0x2e, 0x7e, 0x34,
+ 0x5, 0x20, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x2d, 0x0, 0x7e, 0x34, 0x0, 0x26,
+ 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x2e, 0x74, 0x22, 0x7e, 0x8, 0x3a, 0x0, 0x7e,
+ 0x34, 0x5, 0x20, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0xb, 0x87, 0xca, 0x39,
+ 0x7e, 0x18, 0x69, 0xe4, 0x7e, 0x8, 0x82, 0xa, 0x12, 0x0, 0x6e, 0x1b, 0xfd,
+ 0x7e, 0x37, 0x82, 0x37, 0x2e, 0x37, 0x82, 0x35, 0x7a, 0x37, 0x8d, 0x94,
+ 0x7e, 0x73, 0x75, 0x8d, 0x7a, 0x73, 0x39, 0xf7, 0x7e, 0xb3, 0x69, 0xea,
+ 0x7e, 0x73, 0x69, 0xeb, 0x12, 0x0, 0x29, 0x7e, 0xb3, 0x76, 0x16, 0x70, 0x6,
+ 0x7e, 0x63, 0x82, 0xd, 0x80, 0x4, 0x7e, 0x63, 0x82, 0xc, 0x7e, 0x70, 0x40,
+ 0xac, 0x67, 0x1b, 0x34, 0x7a, 0x37, 0x8d, 0x96, 0x22, 0x7e, 0x8, 0x65, 0x60,
+ 0x7e, 0x34, 0x2, 0x19, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x63, 0x75, 0x8d, 0x7e,
+ 0x70, 0xd, 0xac, 0x67, 0x7e, 0x8, 0x65, 0xdc, 0x74, 0xff, 0x2, 0x0, 0x2e,
+ 0x7e, 0x37, 0x76, 0x42, 0x7a, 0x37, 0x67, 0x7b, 0x7e, 0x37, 0x76, 0x44,
+ 0x7a, 0x37, 0x67, 0x7d, 0x7e, 0x37, 0x76, 0x46, 0x7a, 0x37, 0x67, 0x7f,
+ 0x7e, 0x73, 0x76, 0x48, 0x7a, 0x73, 0x67, 0x81, 0x7e, 0x73, 0x76, 0x49,
+ 0x7a, 0x73, 0x67, 0x82, 0xe4, 0x7a, 0xb3, 0x67, 0x86, 0x7a, 0xb3, 0x67,
+ 0x87, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0x7a, 0x73, 0x81, 0xeb, 0x12, 0x72, 0x5,
+ 0x12, 0x72, 0xe, 0x12, 0x71, 0xfc, 0x12, 0x72, 0x17, 0x12, 0x72, 0x31, 0x6d,
+ 0x33, 0x9e, 0x37, 0x75, 0xa2, 0x7a, 0x37, 0x81, 0xf7, 0x12, 0x72, 0x22,
+ 0x7a, 0x37, 0x81, 0xfb, 0x7e, 0x73, 0x75, 0xd8, 0x7a, 0x73, 0x81, 0xff,
+ 0x7e, 0x73, 0x75, 0x8f, 0x7a, 0x73, 0x82, 0x0, 0xbe, 0x70, 0x14, 0x50, 0x6,
+ 0x74, 0x14, 0x7a, 0xb3, 0x82, 0x0, 0x7e, 0x37, 0x75, 0x90, 0x7a, 0x37, 0x82,
+ 0x1, 0x7e, 0x37, 0x75, 0xa8, 0x7a, 0x37, 0x81, 0xfd, 0xe4, 0x7a, 0xb3, 0x82,
+ 0x3, 0x7a, 0xb3, 0x82, 0x4, 0x22, 0x7e, 0x37, 0x75, 0x98, 0x7a, 0x37, 0x81,
+ 0xef, 0x22, 0x7e, 0x73, 0x75, 0x8e, 0x7a, 0x73, 0x81, 0xec, 0x22, 0x7e,
+ 0x37, 0x75, 0x96, 0x7a, 0x37, 0x81, 0xed, 0x22, 0x6d, 0x33, 0x9e, 0x37,
+ 0x75, 0x9a, 0x7a, 0x37, 0x81, 0xf1, 0x22, 0x7e, 0x37, 0x75, 0xa4, 0x7a,
+ 0x37, 0x81, 0xf9, 0x6d, 0x33, 0x9e, 0x37, 0x75, 0xa6, 0x22, 0x7e, 0x37,
+ 0x75, 0x9e, 0x7a, 0x37, 0x81, 0xf3, 0x7e, 0x37, 0x75, 0xa0, 0x7a, 0x37,
+ 0x81, 0xf5, 0x22, 0x12, 0x17, 0x1, 0x12, 0x74, 0xb0, 0x2, 0x72, 0x4b, 0xca,
+ 0xf8, 0x12, 0x74, 0xbb, 0x12, 0x72, 0x64, 0x6c, 0xff, 0x7c, 0xbf, 0x12,
+ 0x18, 0x67, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0xf4, 0xda, 0xf8, 0x22, 0xca,
+ 0x3b, 0x6d, 0xee, 0x12, 0x5f, 0xbc, 0x60, 0xa, 0x7e, 0x97, 0x82, 0x37, 0x7e,
+ 0x87, 0x82, 0x35, 0x80, 0x8, 0x7e, 0x97, 0x82, 0x35, 0x7e, 0x87, 0x82, 0x37,
+ 0x7d, 0xd8, 0x2d, 0xd9, 0x7e, 0x8, 0x93, 0x70, 0x12, 0x74, 0xb3, 0x6d, 0xbb,
+ 0x80, 0x38, 0x12, 0x74, 0xa3, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60,
+ 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34,
+ 0x2e, 0x34, 0x93, 0x9e, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60, 0x5,
+ 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34,
+ 0x2e, 0x34, 0x93, 0x70, 0x12, 0x74, 0x98, 0xbd, 0x9b, 0x38, 0xc4, 0x7d,
+ 0xb9, 0x80, 0x38, 0x12, 0x74, 0xa3, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4e, 0xa,
+ 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e,
+ 0x34, 0x2e, 0x34, 0x93, 0x70, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4e, 0xa, 0x60,
+ 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4e, 0x2e, 0x3e, 0x34,
+ 0x2e, 0x34, 0x93, 0x9e, 0x12, 0x74, 0x98, 0xbd, 0xdb, 0x38, 0xc4, 0x6d,
+ 0xbb, 0x80, 0x1e, 0x7d, 0xb, 0x3e, 0x4, 0x49, 0x20, 0x69, 0xee, 0x12, 0x74,
+ 0x8d, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x12, 0x74, 0x4d, 0x3e, 0x24,
+ 0x2e, 0x24, 0x93, 0x70, 0x12, 0x74, 0x82, 0x7e, 0x73, 0x69, 0xed, 0xa, 0x37,
+ 0xbd, 0x3b, 0x38, 0xd8, 0x6d, 0xbb, 0x80, 0x1e, 0x7d, 0xb, 0x3e, 0x4, 0x49,
+ 0x20, 0x69, 0xff, 0x12, 0x74, 0x8d, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb,
+ 0x12, 0x74, 0x4d, 0x3e, 0x24, 0x2e, 0x24, 0x93, 0x9e, 0x12, 0x74, 0x82,
+ 0x7e, 0x73, 0x69, 0xfe, 0xa, 0x37, 0xbd, 0x3b, 0x38, 0xd8, 0x6d, 0x33, 0x7d,
+ 0xf3, 0x7d, 0xe3, 0x7d, 0xb3, 0x7d, 0xab, 0x1e, 0xa4, 0x1e, 0xa4, 0x7d,
+ 0x2b, 0x7c, 0xa5, 0x7e, 0x17, 0x8d, 0xe8, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x14,
+ 0x14, 0x78, 0xfb, 0x5e, 0x14, 0x0, 0xf, 0x7e, 0x27, 0x8d, 0xec, 0x12, 0x74,
+ 0x6e, 0x78, 0x2, 0x7d, 0xfa, 0x7e, 0x17, 0x8d, 0xfa, 0x7c, 0xba, 0x60, 0x5,
+ 0x1e, 0x14, 0x14, 0x78, 0xfb, 0x5e, 0x14, 0x0, 0xf, 0x7e, 0x27, 0x8d, 0xfe,
+ 0x12, 0x74, 0x6e, 0x78, 0x2, 0x7d, 0xea, 0xb, 0xb6, 0xbe, 0xb4, 0x0, 0xf,
+ 0x40, 0xb6, 0x12, 0x5f, 0xd1, 0x7d, 0xb3, 0x7d, 0xab, 0x2e, 0xa4, 0x1, 0x24,
+ 0x7d, 0x5b, 0x2d, 0x5f, 0x12, 0x74, 0x77, 0x3e, 0x44, 0x49, 0x74, 0x93,
+ 0x70, 0x5e, 0x54, 0x0, 0xf, 0x60, 0x5, 0x1e, 0x74, 0x14, 0x78, 0xfb, 0x12,
+ 0x74, 0x65, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7d, 0x2a, 0x12, 0x74,
+ 0x53, 0x3e, 0x24, 0x2e, 0x24, 0x93, 0x70, 0x12, 0x74, 0x5c, 0x7d, 0x5b,
+ 0x2d, 0x5e, 0x12, 0x74, 0x77, 0x3e, 0x44, 0x49, 0x74, 0x93, 0x9e, 0x5e,
+ 0x54, 0x0, 0xf, 0x60, 0x5, 0x1e, 0x74, 0x14, 0x78, 0xfb, 0x12, 0x74, 0x65,
+ 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7d, 0x2a, 0x12, 0x74, 0x53, 0x3e,
+ 0x24, 0x2e, 0x24, 0x93, 0x9e, 0x12, 0x74, 0x5c, 0xb, 0xb4, 0xbe, 0xb4, 0x0,
+ 0x24, 0x78, 0x92, 0x6d, 0xbb, 0x7e, 0x74, 0x0, 0xee, 0xad, 0x7b, 0x2e, 0x74,
+ 0x1, 0x1e, 0x7d, 0x37, 0x7e, 0x8, 0x93, 0x70, 0x12, 0x17, 0x8b, 0x7d, 0x37,
+ 0x7e, 0x8, 0x93, 0x9e, 0x12, 0x17, 0x2a, 0x12, 0x4c, 0x34, 0x40, 0xdf, 0xda,
+ 0x3b, 0x22, 0x7d, 0x13, 0x6e, 0x14, 0xff, 0xff, 0x1e, 0x24, 0x1e, 0x24,
+ 0x1e, 0x24, 0x1e, 0x24, 0x22, 0xb, 0x28, 0x30, 0x4d, 0x31, 0x1b, 0x28, 0x30,
+ 0x22, 0x7d, 0x5a, 0x5e, 0x54, 0x0, 0xf, 0xa, 0x1f, 0x22, 0xa, 0x24, 0x5e,
+ 0x24, 0x0, 0xf, 0xbd, 0x12, 0x22, 0x7d, 0x45, 0x1e, 0x44, 0x1e, 0x44, 0x1e,
+ 0x44, 0x1e, 0x44, 0x22, 0xb, 0x28, 0x30, 0x5d, 0x31, 0x1b, 0x28, 0x30, 0xb,
+ 0xb4, 0x22, 0x7d, 0x52, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x34, 0x0, 0x1, 0x22,
+ 0xb, 0x38, 0xc0, 0x4d, 0xc2, 0x1b, 0x38, 0xc0, 0xb, 0xb4, 0x22, 0x7d, 0xcb,
+ 0x3e, 0xc4, 0x49, 0xac, 0x82, 0x51, 0x7e, 0xb3, 0x69, 0xec, 0x22, 0x2, 0x17,
+ 0x40, 0x7e, 0x34, 0x0, 0x5c, 0xe4, 0x2, 0x0, 0x2e, 0x6c, 0xaa, 0x7e, 0x30,
+ 0x3c, 0xac, 0x3a, 0x12, 0x1a, 0xd3, 0x7e, 0x34, 0x0, 0x3c, 0xe4, 0x12, 0x0,
+ 0x2e, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40, 0xe9, 0x22, 0xca, 0xd8, 0xca, 0x79,
+ 0x7c, 0xf7, 0x7c, 0xeb, 0x6c, 0xdd, 0x74, 0x8, 0xac, 0xbd, 0x19, 0xe5, 0x9b,
+ 0x25, 0x19, 0xf5, 0x9b, 0x26, 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x78, 0xed, 0x6c,
+ 0xdd, 0x74, 0xee, 0xac, 0xbd, 0x12, 0x75, 0xca, 0x7a, 0xf1, 0x29, 0x7e,
+ 0x70, 0x3c, 0xac, 0x7d, 0x7d, 0x13, 0x12, 0x1a, 0xc7, 0x2e, 0x34, 0x8e,
+ 0x5a, 0x6d, 0x22, 0x7c, 0xbe, 0x12, 0x75, 0x3f, 0x7d, 0x3f, 0xb, 0x34, 0x74,
+ 0x3c, 0xac, 0xbd, 0x49, 0x25, 0x8e, 0x2a, 0x12, 0x75, 0x33, 0xac, 0xbd,
+ 0x12, 0x75, 0xd1, 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x40, 0xc6, 0xda, 0x79, 0xda,
+ 0xd8, 0x22, 0x12, 0x12, 0x86, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x19, 0x74, 0x3c,
+ 0x22, 0xb, 0xa, 0x40, 0x5e, 0x80, 0xc7, 0x1b, 0xa, 0x40, 0x54, 0x7, 0xa,
+ 0x5b, 0x7d, 0x45, 0x7c, 0x89, 0x6c, 0x99, 0x3e, 0x44, 0x3e, 0x44, 0x3e,
+ 0x44, 0xb, 0xa, 0x50, 0x4d, 0x54, 0x12, 0x75, 0x7f, 0x5e, 0x20, 0xe3, 0x1b,
+ 0x1a, 0x10, 0xe5, 0x29, 0x54, 0x7, 0xa, 0x1b, 0x7d, 0x1, 0x7c, 0x1, 0x6c,
+ 0x11, 0x3e, 0x4, 0x3e, 0x4, 0xb, 0x1a, 0x10, 0x4d, 0x10, 0x1b, 0x1a, 0x10,
+ 0x22, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x10, 0x22, 0xb, 0xa, 0x50, 0x4e, 0xa0,
+ 0x10, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x50, 0x4e, 0x54, 0x40, 0xa, 0x1b, 0x1a,
+ 0x50, 0xb, 0xa, 0x50, 0x30, 0x9, 0xc, 0x4e, 0xa0, 0x8, 0x12, 0x75, 0x7f,
+ 0x4e, 0x14, 0x20, 0x5, 0x80, 0xa, 0x5e, 0xa0, 0xf7, 0x12, 0x75, 0x7f, 0x5e,
+ 0x14, 0xdf, 0xfa, 0x1b, 0x1a, 0x10, 0x22, 0xb, 0xa, 0x50, 0x5e, 0xa0, 0xef,
+ 0x12, 0x75, 0x7f, 0x5e, 0x14, 0xbf, 0xf5, 0x1b, 0x1a, 0x10, 0x22, 0x7d,
+ 0xf5, 0x2e, 0xf4, 0x1, 0x0, 0x22, 0x49, 0x25, 0x8e, 0x5a, 0x2, 0x12, 0x86,
+ 0xd2, 0x2, 0x60, 0x3, 0xb4, 0x2, 0x2, 0xc2, 0x2, 0xa2, 0x2, 0x22, 0xca,
+ 0xf8, 0x7c, 0x8b, 0x7e, 0x68, 0x1d, 0xa0, 0x7e, 0x93, 0x82, 0xd, 0x7a, 0x93,
+ 0x91, 0xff, 0x7e, 0x93, 0x82, 0xc, 0x7a, 0x93, 0x91, 0xfe, 0x12, 0x77, 0x9,
+ 0x6d, 0x33, 0x7a, 0x37, 0x92, 0x8, 0xbe, 0x80, 0x2, 0x78, 0x6, 0x7e, 0x68,
+ 0x27, 0xe0, 0x80, 0x4, 0x7e, 0x68, 0x1d, 0xa0, 0x6c, 0xff, 0x7e, 0x70, 0x1e,
+ 0xac, 0x7f, 0x9, 0xb3, 0x39, 0x56, 0x60, 0x77, 0xbe, 0x80, 0x2, 0x78, 0x6,
+ 0x49, 0xf3, 0x39, 0x65, 0x80, 0x4, 0x49, 0xf3, 0x39, 0x5d, 0x7d, 0x3f, 0x7a,
+ 0x37, 0x92, 0x2, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x4, 0x7d, 0x3f, 0x12, 0x76,
+ 0xba, 0x12, 0x27, 0x50, 0x7e, 0xb3, 0x9b, 0xa8, 0x12, 0x75, 0xd8, 0x40, 0xd,
+ 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x1f, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x18,
+ 0x12, 0x76, 0xcc, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x34, 0x22, 0xc0, 0x7a, 0x37,
+ 0x92, 0x4, 0x12, 0x76, 0xcc, 0x12, 0x76, 0xba, 0x12, 0x27, 0x50, 0x30, 0x2b,
+ 0x18, 0x12, 0x76, 0xc3, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x34, 0x27, 0xe0, 0x7a,
+ 0x37, 0x92, 0x4, 0x12, 0x76, 0xc3, 0x12, 0x76, 0xba, 0x12, 0x27, 0x50, 0x6c,
+ 0xaa, 0x7e, 0x70, 0x1e, 0xac, 0x7f, 0x19, 0xa3, 0x39, 0x56, 0xb, 0xf0, 0xbe,
+ 0xf0, 0x3, 0x50, 0x2, 0xc1, 0x16, 0xda, 0xf8, 0x22, 0x7a, 0x37, 0x92, 0x8,
+ 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x2, 0x7d, 0x3f, 0x7a, 0x37, 0x92,
+ 0x4, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x6, 0x7e, 0x8, 0x91, 0xfe,
+ 0x22, 0x74, 0x1e, 0xac, 0xbf, 0x49, 0x35, 0x39, 0x65, 0x22, 0x74, 0x1e,
+ 0xac, 0xbf, 0x49, 0x35, 0x39, 0x61, 0x22, 0x12, 0x77, 0x9c, 0x60, 0x2e,
+ 0x12, 0x77, 0x4f, 0x68, 0x29, 0xa5, 0xb8, 0x0, 0x14, 0x74, 0x1e, 0xa5, 0xb9,
+ 0x2, 0x7, 0xa4, 0x49, 0xf5, 0x39, 0x65, 0x80, 0xa, 0xa4, 0x49, 0xf5, 0x39,
+ 0x5d, 0x80, 0x3, 0x12, 0x77, 0x94, 0x12, 0x77, 0xb1, 0x12, 0x77, 0x9, 0x6d,
+ 0x33, 0x12, 0x76, 0xa4, 0x2, 0x27, 0x50, 0x22, 0xe4, 0x7a, 0xb3, 0x92, 0x0,
+ 0x7a, 0xb3, 0x92, 0x1, 0x22, 0x12, 0x77, 0x9c, 0x60, 0x36, 0x12, 0x77, 0x4f,
+ 0x68, 0x31, 0xa5, 0xb8, 0x0, 0x1a, 0xa5, 0xb9, 0x1, 0x9, 0x74, 0x1e, 0xa4,
+ 0x49, 0xf5, 0x39, 0x5d, 0x80, 0x10, 0xa5, 0xb9, 0x2, 0xc, 0x74, 0x1e, 0xa4,
+ 0x49, 0xf5, 0x39, 0x65, 0x80, 0x3, 0x12, 0x77, 0x94, 0x12, 0x77, 0xb1, 0x12,
+ 0x77, 0x9, 0x7e, 0x34, 0x0, 0x10, 0x12, 0x76, 0xa4, 0x2, 0x27, 0x50, 0x22,
+ 0x7e, 0xb3, 0x39, 0xc0, 0x12, 0x77, 0x71, 0x7c, 0xab, 0x7e, 0x30, 0x2, 0xac,
+ 0x3a, 0x49, 0x41, 0x76, 0x60, 0x7e, 0x23, 0x39, 0xdb, 0x7e, 0x30, 0x2, 0xac,
+ 0x23, 0x49, 0x11, 0x76, 0x60, 0xbd, 0x14, 0x22, 0x7c, 0x7b, 0x6c, 0xaa,
+ 0x6c, 0x66, 0x7e, 0x50, 0x2, 0xac, 0x56, 0x49, 0x12, 0x76, 0x60, 0xa, 0x27,
+ 0xbd, 0x21, 0x78, 0x4, 0x7c, 0xa6, 0x80, 0x7, 0xb, 0x60, 0xbe, 0x60, 0x3,
+ 0x40, 0xe6, 0x7c, 0xba, 0x22, 0x74, 0x1e, 0xa4, 0x49, 0xf5, 0x39, 0x61,
+ 0x22, 0x7c, 0x17, 0x7c, 0xb, 0x7e, 0xb3, 0x8d, 0x91, 0x22, 0x7e, 0x8, 0x91,
+ 0xfe, 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x73, 0x82, 0xd,
+ 0x7a, 0x73, 0x91, 0xff, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x91, 0xfe, 0x22,
+ 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x92, 0x7e, 0xb3, 0x67, 0x83, 0xb4, 0x1, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x92, 0x12, 0x9b, 0xf6, 0x28, 0x5, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x92, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x92,
+ 0x7e, 0xb3, 0x3, 0xe4, 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x92, 0x7e,
+ 0xb3, 0x9b, 0xa8, 0x2, 0x75, 0xd8, 0x7e, 0x8, 0x9, 0x20, 0x7e, 0x1f, 0x2d,
+ 0x2e, 0x2, 0x27, 0x36, 0x7c, 0x67, 0x7c, 0x7b, 0xd2, 0x1, 0x7e, 0xb3, 0x3,
+ 0xfd, 0xb4, 0x3, 0x4b, 0x7c, 0xb6, 0x12, 0x75, 0xd8, 0x50, 0x44, 0x7e, 0xa3,
+ 0x9a, 0xc5, 0xbe, 0xa0, 0x2, 0x40, 0x31, 0x12, 0x25, 0xee, 0x68, 0x28, 0x7e,
+ 0x63, 0x39, 0xfd, 0xa, 0x26, 0x2e, 0x24, 0x0, 0x4e, 0x12, 0x61, 0xa1, 0x24,
+ 0xff, 0x92, 0x1, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x39, 0xfd, 0x7e, 0x63, 0x39,
+ 0xfd, 0xbe, 0x60, 0x8, 0x40, 0x15, 0xe4, 0x7a, 0xb3, 0x39, 0xfd, 0x80, 0xe,
+ 0xd2, 0x1, 0x80, 0xa, 0xbc, 0xa7, 0x78, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2,
+ 0x1, 0xa2, 0x1, 0x22, 0x7c, 0x4b, 0x74, 0x2, 0xac, 0xb4, 0x9, 0x55, 0x65,
+ 0x60, 0x9, 0x65, 0x65, 0x61, 0x7e, 0x73, 0x67, 0x6a, 0xbc, 0x75, 0x78, 0xa,
+ 0x7e, 0x73, 0x67, 0x6b, 0xbc, 0x76, 0x78, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca,
+ 0x3b, 0xc2, 0x2, 0x7e, 0xf3, 0x67, 0x62, 0x7e, 0x87, 0x67, 0x68, 0xbe, 0x84,
+ 0x0, 0xc8, 0x58, 0x2, 0xc2, 0x2a, 0x12, 0x2d, 0x55, 0x92, 0x0, 0x4c, 0xff,
+ 0x78, 0x2, 0x21, 0x60, 0x20, 0x0, 0x18, 0x7e, 0x87, 0x3, 0xf2, 0xbe, 0x84,
+ 0x0, 0x32, 0x38, 0x2, 0x21, 0x5a, 0x7e, 0x87, 0x3, 0xf7, 0xbe, 0x84, 0x0,
+ 0x64, 0x38, 0x2, 0x21, 0x5a, 0x7e, 0x73, 0x82, 0xe, 0xa, 0x87, 0x1b, 0x84,
+ 0x7d, 0x38, 0x7c, 0xe7, 0x7e, 0x73, 0x82, 0xf, 0xa, 0x67, 0x1b, 0x64, 0x30,
+ 0x0, 0x15, 0x7e, 0x37, 0x67, 0x68, 0x12, 0x79, 0x68, 0x7d, 0x93, 0xbe, 0x94,
+ 0x3, 0x20, 0x50, 0xa, 0x7e, 0x94, 0x3, 0x20, 0x80, 0x4, 0x7e, 0x94, 0x1,
+ 0x90, 0x6c, 0xcc, 0x80, 0x64, 0x7c, 0xbc, 0x12, 0x67, 0x50, 0x60, 0x5b,
+ 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x12, 0x7f, 0x45, 0x7d, 0x83, 0xe5, 0x27, 0xbe,
+ 0xb0, 0x0, 0x28, 0x3e, 0xbe, 0xe1, 0x27, 0x28, 0x39, 0xe5, 0x28, 0xbe, 0xb0,
+ 0x2, 0x28, 0x32, 0xbe, 0xd1, 0x27, 0x28, 0x2d, 0xbd, 0x89, 0x50, 0x29, 0xe5,
+ 0x27, 0x7e, 0x71, 0x28, 0x7e, 0x8, 0x0, 0x29, 0x12, 0xba, 0xf3, 0x24, 0xff,
+ 0x92, 0x1, 0x20, 0x1, 0x2, 0x80, 0xb, 0x7e, 0x37, 0x67, 0x68, 0x12, 0x79,
+ 0x68, 0xbd, 0x38, 0x8, 0x9, 0x7c, 0xbc, 0x6c, 0x77, 0x12, 0x61, 0xaa, 0xd2,
+ 0x2, 0x7c, 0xbc, 0x12, 0x78, 0x62, 0x50, 0x5, 0x30, 0x2, 0x2, 0xd2, 0x2a,
+ 0xb, 0xc0, 0xbc, 0xfc, 0x38, 0x98, 0x30, 0x2, 0x3, 0x12, 0x64, 0x8f, 0xda,
+ 0x3b, 0x22, 0x7c, 0xb9, 0x12, 0x2e, 0x26, 0x7e, 0x24, 0x0, 0x3, 0x2, 0x1,
+ 0x20, 0xca, 0x79, 0x7c, 0x5, 0x7c, 0x96, 0x7c, 0xf7, 0x7c, 0x1b, 0x12, 0x79,
+ 0x63, 0x12, 0x7e, 0xd4, 0xbe, 0x17, 0x92, 0xd, 0x8, 0x4, 0x7a, 0x17, 0x92,
+ 0xd, 0x12, 0x7e, 0xdd, 0x7a, 0xf3, 0x92, 0x3, 0x12, 0x7d, 0x4, 0x7c, 0x6f,
+ 0x12, 0x7c, 0xe4, 0x7a, 0x73, 0x92, 0x7, 0x12, 0x7e, 0xcc, 0x7e, 0xf3, 0x92,
+ 0x4, 0x80, 0x19, 0x7e, 0xe3, 0x92, 0x6, 0x80, 0x9, 0x7c, 0xbf, 0x7c, 0x7e,
+ 0x12, 0x43, 0x4c, 0xb, 0xe0, 0x7e, 0x73, 0x92, 0x7, 0xbc, 0x7e, 0x38, 0xef,
+ 0xb, 0xf0, 0x7e, 0x73, 0x92, 0x5, 0xbc, 0x7f, 0x38, 0xdf, 0x12, 0x7d, 0x35,
+ 0xda, 0x79, 0x22, 0xca, 0xf8, 0x7c, 0xf6, 0x7c, 0x87, 0x7c, 0x9b, 0xa, 0x2f,
+ 0x7d, 0x32, 0x3e, 0x34, 0xb, 0x34, 0x7c, 0xb7, 0xbc, 0xf9, 0x38, 0x14, 0xa,
+ 0xf8, 0x1b, 0xf4, 0xa, 0x3f, 0x9d, 0xf3, 0xa, 0x39, 0xbd, 0x3f, 0x18, 0x6,
+ 0x7c, 0xab, 0xa, 0x39, 0x80, 0x1d, 0xbc, 0xf9, 0x28, 0xd, 0xa, 0x39, 0xa,
+ 0x5f, 0x2d, 0x53, 0xb, 0x54, 0x7c, 0xab, 0xe4, 0x80, 0x10, 0xa, 0x3f, 0xa,
+ 0x58, 0x2d, 0x53, 0xa, 0x39, 0x9d, 0x53, 0x7c, 0xab, 0x9d, 0x32, 0x7c, 0xb7,
+ 0x7a, 0xb, 0xb0, 0x7c, 0xba, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7c, 0x5, 0x7c,
+ 0x96, 0x7c, 0xc7, 0x7c, 0x1b, 0x7e, 0xd3, 0x82, 0xd, 0x12, 0x79, 0x63, 0x12,
+ 0x7e, 0xd4, 0xbe, 0x17, 0x92, 0xd, 0x8, 0x4, 0x7a, 0x17, 0x92, 0xd, 0x12,
+ 0x7e, 0xdd, 0x7a, 0xc3, 0x92, 0x3, 0x12, 0x7d, 0x4, 0x7c, 0x6c, 0x12, 0x7c,
+ 0xe4, 0x7a, 0x73, 0x92, 0x7, 0x7e, 0x18, 0x92, 0x1d, 0x7a, 0x1f, 0x92, 0x9,
+ 0x7e, 0x33, 0x91, 0xfe, 0xac, 0x3d, 0x7e, 0x73, 0x91, 0xff, 0xa, 0x7, 0x2d,
+ 0x10, 0x7d, 0x1, 0x3e, 0x4, 0x49, 0x0, 0x4, 0x0, 0xb, 0x4, 0x7e, 0x24, 0x0,
+ 0x5, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x7e, 0x27, 0x3, 0xf4, 0xbe, 0x24, 0x0,
+ 0x0, 0x28, 0x9, 0x7e, 0x24, 0x0, 0x4, 0x7d, 0x30, 0x12, 0x1, 0x20, 0x9f,
+ 0x22, 0x7a, 0x2d, 0x2e, 0x6d, 0x22, 0x7a, 0x27, 0x92, 0xf, 0x6d, 0x77, 0x7e,
+ 0xa3, 0x92, 0x4, 0x80, 0x41, 0x7e, 0x53, 0x92, 0x6, 0x80, 0x31, 0x7c, 0x3a,
+ 0xac, 0x3d, 0xa, 0x45, 0x2d, 0x14, 0x7d, 0x41, 0x3e, 0x44, 0x49, 0xf4, 0x4,
+ 0x0, 0xe4, 0x19, 0xb1, 0x92, 0x1d, 0xbd, 0x3f, 0x58, 0x16, 0xbd, 0xf, 0x8,
+ 0x12, 0x7d, 0x4f, 0x7d, 0xbf, 0x1a, 0x48, 0x1a, 0xa8, 0x7e, 0x6d, 0x2e,
+ 0x2f, 0x65, 0x7a, 0x6d, 0x2e, 0xb, 0x74, 0xb, 0x50, 0x7e, 0x43, 0x92, 0x7,
+ 0xbc, 0x45, 0x38, 0xc7, 0xb, 0xa0, 0x7e, 0x43, 0x92, 0x5, 0xbc, 0x4a, 0x38,
+ 0xb7, 0xbe, 0x74, 0x0, 0x0, 0x28, 0xc, 0x7e, 0x1d, 0x2e, 0x7d, 0x17, 0x12,
+ 0x1, 0x6c, 0x7a, 0x37, 0x92, 0xf, 0x12, 0x7e, 0xcc, 0x7e, 0x73, 0x91, 0xff,
+ 0x7e, 0xb3, 0x91, 0xfe, 0x12, 0x44, 0x5d, 0x12, 0x7d, 0x35, 0xda, 0x3b,
+ 0x22, 0xca, 0x3b, 0x75, 0x2d, 0x0, 0x6c, 0xee, 0x12, 0x7f, 0x2, 0x7c, 0xdb,
+ 0xc2, 0x0, 0x6c, 0xff, 0x7e, 0xb3, 0x82, 0xe, 0xf5, 0x2b, 0x7e, 0xb3, 0x82,
+ 0xf, 0xf5, 0x2c, 0xe4, 0x7a, 0xb3, 0x3, 0xff, 0x7e, 0xb3, 0x2e, 0x74, 0xb4,
+ 0x1, 0x2, 0x80, 0x2, 0x81, 0xb2, 0x7e, 0xa3, 0x67, 0x62, 0xbe, 0xa0, 0x4,
+ 0x38, 0xe, 0x7e, 0xe0, 0x1, 0xc2, 0x0, 0xbe, 0xa0, 0x1, 0x78, 0x1d, 0x80,
+ 0x13, 0x80, 0x19, 0xbe, 0xd0, 0x2, 0x38, 0x1c, 0xbe, 0xd0, 0x1, 0x40, 0x17,
+ 0xd2, 0x0, 0xbe, 0xd0, 0x1, 0x78, 0x8, 0x75, 0x27, 0x5, 0x75, 0x28, 0x5,
+ 0x80, 0xa, 0x75, 0x27, 0x4, 0x75, 0x28, 0x4, 0x80, 0x2, 0x6c, 0xee, 0x6c,
+ 0xcc, 0x81, 0x9e, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0xb3, 0x65, 0x60, 0xf5,
+ 0x29, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2a, 0x30, 0x0, 0xc, 0x12, 0x7c, 0xb5,
+ 0x50, 0x5, 0x7e, 0xe0, 0x1, 0x80, 0x2, 0x6c, 0xee, 0xe5, 0x2a, 0xbe, 0xb0,
+ 0x0, 0x40, 0x9, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x38, 0x2, 0x6c, 0xee, 0xbe,
+ 0xe0, 0x1, 0x78, 0x8, 0x12, 0x7c, 0xda, 0x12, 0x7a, 0x1f, 0x81, 0x72, 0x75,
+ 0x27, 0x3, 0x75, 0x28, 0x3, 0x7e, 0x63, 0x67, 0x62, 0xbe, 0x60, 0x6, 0x40,
+ 0x17, 0x12, 0x7c, 0xb5, 0x50, 0x47, 0xbe, 0xd0, 0x1, 0x78, 0x2, 0x80, 0x1a,
+ 0xbe, 0xd0, 0x2, 0x38, 0x33, 0x80, 0x29, 0x80, 0x2f, 0x80, 0x35, 0xbe, 0x60,
+ 0x4, 0x40, 0x38, 0x12, 0x7c, 0xb5, 0x50, 0x2b, 0xbe, 0xd0, 0x1, 0x78, 0x8,
+ 0x75, 0x27, 0x5, 0x75, 0x28, 0x5, 0x80, 0x7a, 0xbe, 0xd0, 0x2, 0x38, 0x2,
+ 0x80, 0x7, 0x7e, 0xb3, 0x67, 0x62, 0xb4, 0x4, 0x8, 0x75, 0x27, 0x3, 0x75,
+ 0x28, 0x3, 0x80, 0x64, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, 0x80, 0x5c, 0x75,
+ 0x27, 0x1, 0x75, 0x28, 0x1, 0x80, 0x54, 0xe5, 0x29, 0xbe, 0xb0, 0x1, 0x28,
+ 0xe, 0xe5, 0x2b, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x29, 0xa, 0x3b, 0xbd, 0x32,
+ 0x48, 0x3, 0x75, 0x27, 0x2, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x28, 0xe, 0xe5,
+ 0x2c, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x2a, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x3,
+ 0x75, 0x28, 0x2, 0xc2, 0x1, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c, 0x6c, 0x12,
+ 0xcd, 0xeb, 0xbe, 0xb0, 0xff, 0x68, 0x6, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2,
+ 0x7c, 0xbc, 0x7e, 0x8, 0x0, 0x27, 0x7e, 0x18, 0x0, 0x28, 0x12, 0x7f, 0x55,
+ 0x12, 0x7c, 0xda, 0x12, 0x79, 0x6f, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xb3,
+ 0x65, 0xe2, 0xbe, 0xb1, 0x2d, 0x28, 0x2, 0xf5, 0x2d, 0x7e, 0xb3, 0x76, 0x16,
+ 0xb4, 0x1, 0x11, 0x7d, 0x13, 0x2e, 0x14, 0x65, 0xdc, 0x6d, 0x0, 0x2e, 0x34,
+ 0x65, 0xde, 0x6d, 0x22, 0x12, 0x7f, 0x36, 0xb, 0xf0, 0xb, 0xc0, 0x7e, 0x73,
+ 0x67, 0x62, 0xbc, 0x7c, 0x28, 0x2, 0x61, 0x78, 0x7a, 0xf3, 0x67, 0x62, 0xe5,
+ 0x2d, 0x7a, 0xb3, 0x3, 0xff, 0xda, 0x3b, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a,
+ 0x7c, 0xab, 0x4c, 0x77, 0x68, 0x18, 0x7e, 0xb3, 0x82, 0xf, 0x14, 0xbc, 0xb7,
+ 0x68, 0xf, 0x4c, 0xaa, 0x68, 0xb, 0x7e, 0xb3, 0x82, 0xe, 0x14, 0xbc, 0xba,
+ 0x68, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe5, 0x27, 0x7e, 0x71, 0x28, 0x7c, 0x6c,
+ 0x7c, 0x5f, 0x22, 0x7e, 0x8, 0x92, 0x6, 0x12, 0x79, 0xcc, 0x7a, 0xb3, 0x92,
+ 0x7, 0x7e, 0x73, 0x92, 0x4, 0x2e, 0x73, 0x92, 0x5, 0x7a, 0x73, 0x92, 0x5,
+ 0x7e, 0x73, 0x92, 0x6, 0x2e, 0x73, 0x92, 0x7, 0x22, 0xe4, 0x7a, 0xb3, 0x92,
+ 0x8, 0x9f, 0x11, 0x7a, 0x1f, 0x92, 0x11, 0x7a, 0x1f, 0x92, 0x15, 0x7a, 0x1f,
+ 0x92, 0x19, 0x7e, 0xb3, 0x91, 0xfe, 0x7e, 0x73, 0x82, 0xc, 0x7c, 0x61, 0x7e,
+ 0x8, 0x92, 0x4, 0x12, 0x79, 0xcc, 0x7a, 0xb3, 0x92, 0x5, 0x7e, 0xb3, 0x91,
+ 0xff, 0x7e, 0x73, 0x82, 0xd, 0x22, 0x7e, 0xd, 0x10, 0x69, 0x30, 0x0, 0x15,
+ 0x69, 0x20, 0x0, 0x13, 0xbe, 0x18, 0x0, 0x0, 0x78, 0xc, 0x7e, 0x18, 0x0,
+ 0x1, 0x79, 0x30, 0x0, 0x15, 0x79, 0x20, 0x0, 0x13, 0x20, 0x26, 0x28, 0x74,
+ 0x6, 0x7e, 0xd, 0x10, 0x2e, 0x14, 0x0, 0x17, 0x12, 0x46, 0xc8, 0x2f, 0x11,
+ 0x14, 0x78, 0xfb, 0x12, 0x43, 0x44, 0x74, 0x6, 0x7e, 0xd, 0x10, 0x2e, 0x14,
+ 0x0, 0x1b, 0x12, 0x46, 0xc8, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x12, 0x43, 0x44,
+ 0x7e, 0x7d, 0x10, 0x69, 0xb7, 0x0, 0x15, 0x69, 0xa7, 0x0, 0x13, 0x69, 0x37,
+ 0x0, 0x19, 0x69, 0x27, 0x0, 0x17, 0x7f, 0x5, 0x12, 0x1, 0xbf, 0x7d, 0xd3,
+ 0x69, 0x37, 0x0, 0x1d, 0x69, 0x27, 0x0, 0x1b, 0x7f, 0x5, 0x12, 0x1, 0xbf,
+ 0x30, 0x26, 0x19, 0xbe, 0xd4, 0x0, 0x0, 0x58, 0x2, 0x6d, 0xdd, 0xbe, 0x34,
+ 0x0, 0x0, 0x58, 0x2, 0x6d, 0x33, 0x12, 0x7e, 0xc4, 0x59, 0xd5, 0x65, 0xdc,
+ 0x80, 0x11, 0x7d, 0x2d, 0x2e, 0x24, 0x0, 0x20, 0x12, 0x7e, 0xc4, 0x59, 0x25,
+ 0x65, 0xdc, 0x2e, 0x34, 0x0, 0x20, 0x59, 0x35, 0x65, 0xde, 0x29, 0xa7, 0x0,
+ 0xa, 0x29, 0x67, 0x0, 0x3, 0x7e, 0x70, 0xd, 0xac, 0x67, 0x19, 0xa3, 0x65,
+ 0xe2, 0x9, 0x53, 0x65, 0xe2, 0xbe, 0x50, 0x2d, 0x28, 0x6, 0x74, 0x2d, 0x19,
+ 0xb3, 0x65, 0xe2, 0x29, 0xb7, 0x0, 0x2, 0x12, 0x2e, 0x26, 0x7d, 0xb3, 0xbe,
+ 0xb4, 0x0, 0x0, 0x18, 0x4, 0x7e, 0xb4, 0x0, 0x1, 0x6c, 0xaa, 0x7e, 0x6d,
+ 0x10, 0x29, 0x76, 0x0, 0x1, 0x4c, 0x77, 0x68, 0xb, 0x7e, 0x63, 0x82, 0xf,
+ 0x7c, 0xb6, 0x14, 0xbc, 0x7b, 0x78, 0x5, 0x2e, 0xa0, 0x6, 0x80, 0xf, 0xbe,
+ 0x70, 0x1, 0x68, 0x8, 0x7c, 0xb6, 0x24, 0xfe, 0xbc, 0x7b, 0x78, 0x2, 0xb,
+ 0xa2, 0x7e, 0x6b, 0x70, 0x4c, 0x77, 0x68, 0xb, 0x7e, 0x63, 0x82, 0xe, 0x7c,
+ 0xb6, 0x14, 0xbc, 0x7b, 0x78, 0x5, 0x2e, 0xa0, 0x6, 0x80, 0xf, 0xbe, 0x70,
+ 0x1, 0x68, 0x8, 0x7c, 0xb6, 0x24, 0xfe, 0xbc, 0x7b, 0x78, 0x2, 0xb, 0xa2,
+ 0xa, 0x3a, 0x6d, 0x22, 0x7e, 0x33, 0x82, 0x0, 0xa, 0x13, 0x6d, 0x0, 0x9f,
+ 0x1, 0x69, 0xf6, 0x0, 0x15, 0x69, 0xe6, 0x0, 0x13, 0x7f, 0x17, 0x12, 0x1,
+ 0xbf, 0x7d, 0x1b, 0x1a, 0x2, 0x1a, 0x0, 0xbf, 0x10, 0x28, 0x6, 0x7d, 0x3b,
+ 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0, 0x7f, 0x12, 0x1, 0x63, 0x7d, 0x1b,
+ 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x1, 0x6e, 0x7c, 0xa7, 0x29, 0x66, 0x0, 0x3,
+ 0x7e, 0x70, 0xd, 0xac, 0x67, 0x19, 0xa3, 0x65, 0xe1, 0x29, 0xa6, 0x0, 0x2,
+ 0x74, 0x2, 0xa4, 0x9, 0x55, 0x65, 0x60, 0x19, 0x53, 0x65, 0xe3, 0x9, 0x55,
+ 0x65, 0x61, 0x19, 0x53, 0x65, 0xe4, 0x59, 0xf3, 0x65, 0xe7, 0x59, 0xe3,
+ 0x65, 0xe5, 0x22, 0x29, 0xa7, 0x0, 0x3, 0x74, 0xd, 0xa4, 0x22, 0x7e, 0x18,
+ 0x91, 0xfe, 0x7a, 0x1d, 0x10, 0x22, 0x7a, 0x37, 0x92, 0xd, 0x7e, 0x17, 0x82,
+ 0x1, 0x22, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x85, 0x65, 0x60, 0x7a, 0x83, 0x91,
+ 0xfe, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x85, 0x65, 0x61, 0x7a, 0x83, 0x91, 0xff,
+ 0x7a, 0x93, 0x92, 0x0, 0x7a, 0x3, 0x92, 0x1, 0x7a, 0x13, 0x92, 0x2, 0x22,
+ 0x6c, 0x33, 0x6c, 0x22, 0x80, 0x20, 0x7c, 0xb2, 0x12, 0x67, 0x50, 0x60,
+ 0x17, 0x74, 0x2, 0xac, 0xb2, 0x9, 0x15, 0x65, 0x60, 0x9, 0x5, 0x65, 0x61,
+ 0x7c, 0xb1, 0x7c, 0x70, 0x12, 0x7c, 0xba, 0x50, 0x2, 0xb, 0x30, 0xb, 0x20,
+ 0x7e, 0x73, 0x67, 0x62, 0xbc, 0x72, 0x38, 0xd8, 0x7c, 0xb3, 0x22, 0x2, 0x7b,
+ 0xe, 0x7f, 0x20, 0xb, 0x2a, 0x10, 0xb, 0x1a, 0x0, 0x1b, 0x2a, 0x0, 0x1b,
+ 0x1a, 0x10, 0x22, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x27, 0x9, 0x73, 0x65, 0x61,
+ 0x7a, 0x71, 0x28, 0x2, 0x2e, 0x40, 0x7c, 0xab, 0x7e, 0xb3, 0x67, 0x78, 0x60,
+ 0x27, 0xb4, 0x1, 0x9, 0x7e, 0xb3, 0x67, 0x62, 0xbe, 0xb0, 0x2, 0x68, 0x1b,
+ 0x7e, 0xb3, 0x67, 0x62, 0xb4, 0x2, 0x14, 0x74, 0xd, 0xa4, 0x9, 0xb5, 0x65,
+ 0xe2, 0xbe, 0xb0, 0x14, 0x28, 0x8, 0x74, 0x4, 0x7a, 0xb, 0xb0, 0x7a, 0x1b,
+ 0xb0, 0x22, 0x7e, 0xb3, 0x9b, 0x84, 0xb4, 0x1, 0x6, 0x7e, 0xb3, 0x2e, 0x75,
+ 0x60, 0x43, 0x7e, 0xb3, 0x59, 0xed, 0x7e, 0x1f, 0x2d, 0x26, 0xb4, 0x11, 0xf,
+ 0x6d, 0x22, 0x7e, 0x14, 0x9, 0xc4, 0x12, 0x2d, 0x3e, 0x7d, 0xc3, 0x74, 0x22,
+ 0x80, 0xf, 0x7e, 0x24, 0x32, 0xc8, 0x7e, 0x14, 0x42, 0x68, 0x12, 0x2d, 0x3e,
+ 0x7d, 0xc3, 0x74, 0x11, 0x7a, 0xb3, 0x59, 0xed, 0x7e, 0xa3, 0x82, 0xd, 0x7e,
+ 0xb3, 0x82, 0xc, 0xa4, 0x7d, 0xd5, 0x1e, 0xd4, 0x1e, 0xd4, 0xbd, 0xdc, 0x50,
+ 0x3, 0x75, 0xe9, 0xff, 0x22, 0x2, 0x7f, 0xd9, 0xca, 0x79, 0x6c, 0xff, 0xc2,
+ 0x0, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0x6, 0x7e, 0xd4, 0x2, 0xbc, 0x80, 0x4,
+ 0x7e, 0xd4, 0x3, 0xe8, 0x7e, 0xb3, 0x82, 0x9, 0xb4, 0x1, 0x4, 0x7e, 0xd4,
+ 0x0, 0xf0, 0x7e, 0xc7, 0x67, 0x68, 0x6c, 0xee, 0x80, 0x71, 0xc2, 0x0, 0x7c,
+ 0xbe, 0x12, 0x2e, 0x26, 0x7d, 0xb3, 0x74, 0x2, 0xac, 0xbe, 0x9, 0xb5, 0x65,
+ 0x60, 0x12, 0x0, 0xfb, 0xbd, 0x3b, 0x58, 0x4, 0xd2, 0x0, 0x80, 0x26, 0x7e,
+ 0x73, 0x69, 0x6a, 0xbe, 0x73, 0x67, 0x62, 0x78, 0x1c, 0x7e, 0xa7, 0x39,
+ 0xf5, 0x1e, 0xa4, 0xbd, 0xac, 0x50, 0x12, 0x7c, 0xbe, 0x7e, 0x70, 0x1, 0x12,
+ 0x80, 0x87, 0x7d, 0x1d, 0x6d, 0x0, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x0, 0x30,
+ 0x0, 0x2a, 0x7c, 0xbe, 0x12, 0x67, 0x50, 0x60, 0x23, 0x7e, 0xa4, 0x0, 0xd,
+ 0xca, 0xa9, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x2e, 0x34, 0x65, 0xdc, 0x6d, 0x22,
+ 0x7e, 0x30, 0xd, 0xac, 0x3f, 0x2e, 0x14, 0x67, 0x93, 0x6d, 0x0, 0x12, 0x0,
+ 0x6e, 0x1b, 0xfd, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0x67, 0xd2, 0x38, 0x8a, 0x7a,
+ 0x73, 0x67, 0x77, 0x7a, 0xf3, 0x69, 0x69, 0x7a, 0xc7, 0x39, 0xf5, 0xda,
+ 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x9, 0xb2,
+ 0x65, 0x60, 0x9, 0x72, 0x65, 0x61, 0x7e, 0xa3, 0x76, 0x37, 0xbc, 0xab, 0x78,
+ 0x3, 0x9f, 0x11, 0x22, 0x2, 0x80, 0xa6, 0x7c, 0x16, 0x7c, 0x7, 0x7c, 0x9b,
+ 0x7e, 0x83, 0x82, 0xe, 0x7a, 0x83, 0x91, 0xfe, 0x7e, 0x83, 0x82, 0xf, 0x7a,
+ 0x83, 0x91, 0xff, 0x9f, 0x77, 0xa, 0x31, 0xa, 0x19, 0x9d, 0x13, 0x7c, 0x83,
+ 0x80, 0x7c, 0x7a, 0x81, 0x28, 0xbe, 0x80, 0x0, 0x58, 0xc, 0x1a, 0x58, 0x1a,
+ 0x19, 0x9d, 0x15, 0xa, 0x59, 0x2d, 0x51, 0xf5, 0x28, 0x7e, 0x73, 0x91, 0xfe,
+ 0xbc, 0x78, 0x18, 0xc, 0x1a, 0x59, 0x1a, 0x18, 0x9d, 0x15, 0xa, 0x59, 0x9d,
+ 0x51, 0xf5, 0x28, 0xa, 0x11, 0xa, 0x50, 0x9d, 0x51, 0xf5, 0x27, 0x80, 0x3a,
+ 0x85, 0x27, 0x29, 0xe5, 0x27, 0xbe, 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x27, 0x1a,
+ 0x5b, 0x1a, 0x10, 0x9d, 0x15, 0xa, 0x50, 0x2d, 0x51, 0xf5, 0x29, 0x7e, 0x73,
+ 0x91, 0xff, 0xbe, 0x71, 0x27, 0x18, 0xe, 0x1a, 0x30, 0xe5, 0x27, 0x1a, 0x1b,
+ 0x9d, 0x13, 0xa, 0x50, 0x9d, 0x51, 0xf5, 0x29, 0x12, 0x81, 0x55, 0x1a, 0x26,
+ 0x1a, 0x24, 0x2f, 0x71, 0x5, 0x27, 0xa, 0x21, 0xa, 0x30, 0x2d, 0x32, 0xe5,
+ 0x27, 0x1a, 0x1b, 0xbd, 0x13, 0x8, 0xb8, 0xb, 0x80, 0xa, 0x11, 0xa, 0x59,
+ 0x2d, 0x51, 0x1a, 0x18, 0xbd, 0x15, 0x18, 0x2, 0x1, 0xc8, 0x7f, 0x17, 0x22,
+ 0xe5, 0x28, 0x7e, 0x71, 0x29, 0x2, 0x2e, 0x40, 0xca, 0x79, 0x7f, 0x70, 0x75,
+ 0x2a, 0xff, 0x7e, 0xb3, 0x67, 0x62, 0xf5, 0x2b, 0x6c, 0x99, 0x6c, 0xff,
+ 0x6c, 0xee, 0x80, 0xd, 0xa, 0x1e, 0x12, 0x82, 0x6b, 0xbc, 0x7f, 0x40, 0x2,
+ 0x7c, 0xf7, 0xb, 0xe0, 0xe5, 0x2b, 0xbc, 0xbe, 0x38, 0xed, 0x7e, 0xe0, 0x1,
+ 0x41, 0x3f, 0x75, 0x2c, 0x0, 0x6d, 0xdd, 0x75, 0x27, 0x0, 0x41, 0x1b, 0x12,
+ 0x67, 0xe1, 0x9, 0xb1, 0x65, 0x60, 0xf5, 0x28, 0x9, 0xb1, 0x65, 0x61, 0xf5,
+ 0x29, 0xe5, 0x27, 0xa, 0x1b, 0x12, 0x82, 0x6b, 0xbc, 0x7e, 0x78, 0x6b, 0x5,
+ 0x2c, 0xe5, 0x2c, 0xb4, 0x1, 0x3, 0x12, 0x82, 0x64, 0xbe, 0xf0, 0x1, 0x78,
+ 0x4e, 0x7e, 0xa3, 0x39, 0x3b, 0xbe, 0xa0, 0xff, 0x68, 0x45, 0x7e, 0xb3,
+ 0x39, 0x3a, 0xa, 0x3b, 0xe5, 0x29, 0xa, 0xcb, 0x7d, 0x1c, 0x9d, 0x13, 0xbe,
+ 0x14, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc3, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc1,
+ 0xa, 0x3a, 0xe5, 0x28, 0xa, 0x1b, 0x7d, 0x51, 0x9d, 0x53, 0xbe, 0x54, 0x0,
+ 0x0, 0x8, 0x4, 0x9d, 0x13, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x15, 0x2d, 0x1c,
+ 0x7c, 0x83, 0xbe, 0x81, 0x2a, 0x50, 0x16, 0x12, 0x82, 0x64, 0x7a, 0x81,
+ 0x2a, 0x80, 0xe, 0x12, 0x81, 0x55, 0x7d, 0xc3, 0xbd, 0xdc, 0x58, 0x5, 0x7d,
+ 0xdc, 0x12, 0x82, 0x64, 0x5, 0x27, 0xe5, 0x2b, 0xbe, 0xb1, 0x27, 0x28, 0x2,
+ 0x21, 0x94, 0xe5, 0x2c, 0xbe, 0xb0, 0x0, 0x28, 0x12, 0x74, 0x2, 0xac, 0xb9,
+ 0x19, 0x5, 0x38, 0xa1, 0x74, 0x2, 0xac, 0xb9, 0x19, 0x15, 0x38, 0xa2, 0xb,
+ 0x90, 0xb, 0xe0, 0xbc, 0xfe, 0x40, 0x2, 0x21, 0x8a, 0xbe, 0x90, 0x1, 0x78,
+ 0x12, 0x7e, 0x83, 0x38, 0xa1, 0x7a, 0x83, 0x39, 0x3b, 0x7e, 0x83, 0x38,
+ 0xa2, 0x7a, 0x83, 0x39, 0x3a, 0x80, 0x3, 0x12, 0x86, 0x3d, 0x7c, 0xb9, 0xda,
+ 0x79, 0x22, 0x7e, 0x1, 0x28, 0x7e, 0x11, 0x29, 0x22, 0x7f, 0x17, 0x2d, 0x31,
+ 0x7e, 0x1b, 0x70, 0x22, 0xca, 0x3b, 0x7c, 0xfb, 0xc2, 0x2, 0xc2, 0x3, 0xc2,
+ 0x4, 0xd2, 0x5, 0x7e, 0xe3, 0x67, 0x62, 0xe4, 0x7a, 0xb3, 0x38, 0xde, 0x7a,
+ 0xb3, 0x38, 0xdf, 0x7a, 0xb3, 0x38, 0xa0, 0x7a, 0xb3, 0x39, 0x3e, 0x7e, 0x8,
+ 0x38, 0xe0, 0x7e, 0x73, 0x75, 0x8d, 0xa, 0x37, 0x12, 0x0, 0x2e, 0x7e, 0x73,
+ 0x75, 0x8d, 0xa, 0x37, 0x3e, 0x34, 0x7e, 0x8, 0x38, 0xa1, 0x12, 0x0, 0x2e,
+ 0xbe, 0xe0, 0x2, 0x50, 0x2, 0xa1, 0x3f, 0x12, 0xc2, 0x43, 0x6c, 0xdd, 0xa1,
+ 0x39, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x28, 0x9,
+ 0xb3, 0x65, 0x61, 0xf5, 0x29, 0x4c, 0xdd, 0x68, 0x5, 0x12, 0x85, 0x42, 0x70,
+ 0xa, 0xa, 0x3d, 0xb, 0x34, 0xa, 0x8d, 0x19, 0x78, 0x38, 0xe0, 0xa, 0x8d,
+ 0xb, 0x84, 0x7d, 0x38, 0x7c, 0xc7, 0xa1, 0x31, 0x7e, 0x70, 0x2, 0xac, 0x7c,
+ 0x9, 0xa3, 0x65, 0x60, 0x7a, 0xa1, 0x2a, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2b,
+ 0xa, 0x8a, 0xe5, 0x28, 0x12, 0x86, 0x32, 0x8, 0x4, 0x9d, 0x58, 0x80, 0x4,
+ 0x6d, 0x55, 0x9d, 0x54, 0xf5, 0x2c, 0xe5, 0x2b, 0xa, 0x8b, 0xe5, 0x29, 0x12,
+ 0x86, 0x32, 0x8, 0x4, 0x9d, 0x58, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x54, 0xf5,
+ 0x2d, 0xe5, 0x19, 0xbe, 0xb1, 0x2c, 0x28, 0x7, 0xe5, 0x19, 0xbe, 0xb1, 0x2d,
+ 0x38, 0x3e, 0xe5, 0x29, 0x60, 0x9, 0xe5, 0x29, 0xb4, 0x1, 0x2, 0x80, 0x2,
+ 0xa1, 0x2f, 0xe5, 0x2b, 0x60, 0x9, 0xe5, 0x2b, 0xb4, 0x1, 0x2, 0x80, 0x2,
+ 0xa1, 0x2f, 0xe5, 0x28, 0xbe, 0xb0, 0x5, 0x50, 0x2, 0xa1, 0x2f, 0xe5, 0x28,
+ 0xbe, 0xb0, 0xc, 0x28, 0x2, 0xa1, 0x2f, 0xe5, 0x2a, 0xbe, 0xb0, 0x5, 0x50,
+ 0x2, 0xa1, 0x2f, 0xe5, 0x2a, 0xbe, 0xb0, 0xc, 0x28, 0x2, 0xa1, 0x2f, 0x7e,
+ 0x94, 0x0, 0x51, 0x12, 0x81, 0x55, 0x7a, 0x35, 0x2f, 0xe5, 0x2a, 0x7e, 0x71,
+ 0x2b, 0x12, 0x2e, 0x40, 0x7a, 0x35, 0x31, 0x7e, 0x85, 0x2f, 0xbe, 0x85,
+ 0x31, 0x8, 0x5, 0x7e, 0x35, 0x31, 0x80, 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35,
+ 0x35, 0xbe, 0x85, 0x31, 0x58, 0x5, 0x7e, 0x85, 0x31, 0x80, 0x3, 0x7e, 0x85,
+ 0x2f, 0x7a, 0x85, 0x37, 0x7e, 0x85, 0x35, 0xe, 0x84, 0x7a, 0x85, 0x33, 0x75,
+ 0x2e, 0x0, 0xe5, 0x2c, 0xbe, 0xb0, 0x1, 0x38, 0x23, 0xe5, 0x2d, 0xbe, 0xb0,
+ 0x1, 0x38, 0x1c, 0x7c, 0xbf, 0x30, 0xe0, 0x17, 0x7e, 0xb3, 0x38, 0xa0, 0x4,
+ 0x7a, 0xb3, 0x38, 0xa0, 0x75, 0x2e, 0x1, 0x7e, 0xb3, 0x38, 0xde, 0x4, 0x7a,
+ 0xb3, 0x38, 0xde, 0x81, 0xa8, 0xe5, 0x19, 0xbe, 0xb1, 0x2c, 0x38, 0x2, 0x81,
+ 0xa8, 0xe5, 0x19, 0xbe, 0xb1, 0x2d, 0x38, 0x2, 0x81, 0xa8, 0x7c, 0xbf, 0x20,
+ 0xe1, 0x2, 0x81, 0xa8, 0xc2, 0x3, 0xe5, 0x2c, 0xbe, 0xb0, 0x2, 0x38, 0x9,
+ 0xe5, 0x2d, 0xbe, 0xb0, 0x2, 0x38, 0x2, 0xd2, 0x3, 0xe5, 0x28, 0x7e, 0x71,
+ 0x29, 0x7e, 0x61, 0x2a, 0x7e, 0x51, 0x2b, 0x12, 0xc0, 0x14, 0x1a, 0x26,
+ 0x1a, 0x24, 0x7a, 0x1d, 0x3f, 0x7e, 0x85, 0x31, 0x2e, 0x85, 0x2f, 0xe, 0x84,
+ 0x7a, 0x85, 0x39, 0xc2, 0x2, 0xbe, 0x18, 0x7f, 0xff, 0x78, 0x5, 0x9f, 0x11,
+ 0x7a, 0x1d, 0x3f, 0x7c, 0xbd, 0x7c, 0x7c, 0x7e, 0xd, 0x3f, 0x7e, 0x25, 0x39,
+ 0x12, 0x87, 0x3f, 0x92, 0x4, 0x12, 0x86, 0x68, 0x92, 0x1, 0x30, 0x1, 0x5,
+ 0x7e, 0x35, 0x37, 0x80, 0x3, 0x7e, 0x35, 0x35, 0x1a, 0x26, 0x1a, 0x24, 0x7a,
+ 0x1d, 0x3b, 0x7e, 0x87, 0x3, 0xf4, 0xbe, 0x84, 0x0, 0x0, 0x28, 0xa, 0xbe,
+ 0x94, 0x0, 0x4b, 0x8, 0x4, 0x7e, 0x94, 0x0, 0x4b, 0x7e, 0xb3, 0x59, 0x8b,
+ 0xb4, 0x1, 0x4, 0x7e, 0x94, 0x0, 0x3c, 0x7d, 0x19, 0x1a, 0x2, 0x1a, 0x0,
+ 0x7e, 0x1d, 0x3b, 0x12, 0x1, 0x52, 0x7e, 0x8, 0x0, 0x64, 0x12, 0x1, 0xbf,
+ 0x7f, 0x1, 0x7e, 0x1d, 0x3f, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x2, 0x30, 0x4,
+ 0x5, 0x20, 0x3, 0x2, 0xc2, 0x2, 0x30, 0x2, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x29,
+ 0x60, 0x5, 0xe5, 0x29, 0xb4, 0x1, 0x28, 0xe5, 0x2b, 0x60, 0x5, 0xe5, 0x2b,
+ 0xb4, 0x1, 0x1f, 0xe5, 0x28, 0xbe, 0xb0, 0x5, 0x40, 0x18, 0xe5, 0x28, 0xbe,
+ 0xb0, 0xc, 0x38, 0x11, 0xe5, 0x2a, 0xbe, 0xb0, 0x5, 0x40, 0xa, 0xe5, 0x2a,
+ 0xbe, 0xb0, 0xc, 0x38, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x2e, 0xbe, 0xb0, 0x0,
+ 0x28, 0x4f, 0xa, 0x8c, 0x9, 0xa8, 0x38, 0xe0, 0x4c, 0xaa, 0x78, 0xb, 0x12,
+ 0x85, 0x42, 0xa, 0x4c, 0x19, 0xb4, 0x38, 0xe0, 0x80, 0x3a, 0x12, 0x85, 0x42,
+ 0xf5, 0x43, 0xbc, 0xba, 0x28, 0x3, 0x7a, 0xa1, 0x43, 0x75, 0x27, 0x0, 0x80,
+ 0x24, 0xa, 0x8c, 0x9, 0x78, 0x38, 0xe0, 0xe5, 0x27, 0xa, 0x8b, 0x9, 0x68,
+ 0x38, 0xe0, 0xbc, 0x67, 0x68, 0xa, 0xa, 0x2d, 0x9, 0x72, 0x38, 0xe0, 0xbc,
+ 0x67, 0x78, 0x6, 0xe5, 0x43, 0x19, 0xb8, 0x38, 0xe0, 0x5, 0x27, 0xbe, 0xe1,
+ 0x27, 0x38, 0xd7, 0xb, 0xc0, 0xbc, 0xec, 0x28, 0x2, 0x41, 0xec, 0xb, 0xd0,
+ 0xbc, 0xed, 0x28, 0x2, 0x41, 0xbe, 0xda, 0x3b, 0x22, 0xa, 0x8d, 0x9, 0xb8,
+ 0x38, 0xe0, 0x22, 0xca, 0xd8, 0xca, 0x79, 0xc2, 0x0, 0x7e, 0xe0, 0x3, 0xe4,
+ 0x7a, 0xb3, 0x38, 0xdd, 0x7e, 0xd3, 0x69, 0x75, 0xbe, 0xd0, 0x4, 0x40, 0x5,
+ 0x75, 0x19, 0x4, 0x80, 0x3, 0x75, 0x19, 0x6, 0x12, 0xc0, 0xe8, 0x7e, 0xf3,
+ 0x67, 0x62, 0xbe, 0xf0, 0x1, 0x38, 0x2, 0xc1, 0x20, 0x7c, 0xbe, 0x12, 0x82,
+ 0x73, 0x4c, 0xdd, 0x78, 0x4, 0xc2, 0x0, 0x80, 0x5f, 0xbe, 0xd0, 0x1, 0x28,
+ 0xd, 0x7e, 0x73, 0x39, 0x3f, 0xbe, 0x71, 0x19, 0x28, 0x4, 0xc2, 0x0, 0x80,
+ 0x4d, 0xc2, 0x0, 0x7e, 0x53, 0x67, 0x62, 0xbc, 0x5d, 0x78, 0x11, 0x12, 0x86,
+ 0x48, 0x50, 0x5, 0x7e, 0xe0, 0x3, 0x80, 0x3, 0x7e, 0xe0, 0x1, 0xd2, 0x0,
+ 0x80, 0x32, 0x7e, 0x43, 0x38, 0xde, 0xa, 0x34, 0xa, 0x25, 0x7d, 0x12, 0x9d,
+ 0x13, 0xb, 0x14, 0xa, 0x3d, 0xbd, 0x31, 0x78, 0x7, 0x7e, 0xe0, 0x1, 0xd2,
+ 0x0, 0x80, 0x17, 0x7e, 0x73, 0x38, 0xa0, 0xa, 0x37, 0x9d, 0x23, 0xb, 0x24,
+ 0x7e, 0x73, 0x39, 0x40, 0xbd, 0x32, 0x78, 0x5, 0x7e, 0xe0, 0x3, 0xd2, 0x0,
+ 0x30, 0x0, 0x5, 0x7c, 0xbe, 0x12, 0x82, 0x73, 0x7e, 0x8, 0x38, 0xe0, 0x12,
+ 0x81, 0x5d, 0x7a, 0xb3, 0x38, 0xdd, 0x7e, 0xa3, 0x38, 0xdd, 0x7a, 0xa3,
+ 0x67, 0x62, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x38, 0xa1, 0x7e, 0x8,
+ 0x65, 0x60, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x73, 0x67, 0x62, 0x7a, 0x73,
+ 0x39, 0x40, 0x12, 0x86, 0xb9, 0x7a, 0xb3, 0x39, 0x3f, 0x80, 0xd, 0x74, 0x64,
+ 0x7a, 0xb3, 0x39, 0x3f, 0x7a, 0xf3, 0x39, 0x40, 0x12, 0x86, 0x3d, 0xda,
+ 0x79, 0xda, 0xd8, 0x22, 0xa, 0x5b, 0x7d, 0x45, 0x9d, 0x48, 0xbe, 0x44, 0x0,
+ 0x0, 0x22, 0x74, 0xff, 0x7a, 0xb3, 0x39, 0x3b, 0x7a, 0xb3, 0x39, 0x3a, 0x22,
+ 0x6c, 0xaa, 0x80, 0x12, 0x7e, 0x70, 0xd, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0xe2,
+ 0xbe, 0xb0, 0x10, 0x28, 0x2, 0xd3, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x78,
+ 0xbc, 0xba, 0x38, 0xe6, 0xc3, 0x22, 0xd2, 0x6, 0x7e, 0xa3, 0x67, 0x62, 0xbe,
+ 0xa0, 0x3, 0x50, 0x2, 0xc3, 0x22, 0x6c, 0x77, 0x80, 0x39, 0xa, 0x27, 0xb,
+ 0x24, 0x7c, 0x65, 0x80, 0x2b, 0x7e, 0x50, 0x2, 0xac, 0x56, 0x9, 0x12, 0x65,
+ 0x60, 0x7e, 0x30, 0x2, 0xac, 0x37, 0x9, 0xb1, 0x65, 0x60, 0xbc, 0xb1, 0x78,
+ 0x2, 0x80, 0xc, 0x9, 0x52, 0x65, 0x61, 0x9, 0xb1, 0x65, 0x61, 0xbc, 0xb5,
+ 0x78, 0x5, 0xc2, 0x6, 0xa2, 0x6, 0x22, 0xb, 0x60, 0xbc, 0xa6, 0x38, 0xd1,
+ 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xc3, 0xa2, 0x6, 0x22, 0xca, 0x3b, 0x7e, 0xa0,
+ 0x64, 0x6c, 0x77, 0x80, 0x69, 0xa, 0x27, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x57,
+ 0x7e, 0xf0, 0x2, 0xac, 0xf6, 0x9, 0xb7, 0x65, 0x60, 0xa, 0xb, 0x7e, 0xd0,
+ 0x2, 0xac, 0xd7, 0x9, 0xb6, 0x65, 0x60, 0xa, 0x2b, 0x7d, 0x12, 0x12, 0x6f,
+ 0xd5, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x9, 0x47,
+ 0x65, 0x61, 0xa, 0x44, 0x9, 0x46, 0x65, 0x61, 0xa, 0x14, 0x7d, 0x1, 0x9d,
+ 0x4, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d,
+ 0x10, 0x7c, 0x43, 0xbc, 0x45, 0x50, 0x4, 0x7c, 0x35, 0x80, 0x2, 0x7c, 0x34,
+ 0xbc, 0xa3, 0x28, 0x2, 0x7c, 0xa3, 0xb, 0x60, 0x7e, 0x23, 0x67, 0x62, 0xbc,
+ 0x26, 0x38, 0xa1, 0xb, 0x70, 0x7e, 0xb3, 0x67, 0x62, 0xbc, 0xb7, 0x38, 0x8f,
+ 0xbe, 0xa0, 0x64, 0x78, 0x2, 0x6c, 0xaa, 0x7c, 0xba, 0xda, 0x3b, 0x22, 0xca,
+ 0x69, 0x7d, 0x42, 0x7f, 0x70, 0x7c, 0x37, 0x7c, 0xab, 0x7e, 0x70, 0x2, 0x7c,
+ 0xd3, 0xac, 0xd7, 0x49, 0xd6, 0x38, 0xfe, 0x7c, 0x1a, 0xac, 0x17, 0x49,
+ 0x80, 0x38, 0xfe, 0x7d, 0xc8, 0x2d, 0xcd, 0x7e, 0xb4, 0x0, 0x2, 0x7d, 0x3c,
+ 0x7d, 0x2b, 0x12, 0x1, 0x20, 0x7d, 0x23, 0x7d, 0xa4, 0x9d, 0xa2, 0xbe, 0xa4,
+ 0x0, 0x0, 0x8, 0x6, 0x7d, 0x34, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d,
+ 0x3a, 0x7d, 0x24, 0x7d, 0xb4, 0x1a, 0x24, 0x1a, 0xa4, 0x7f, 0x65, 0x9f,
+ 0x67, 0x7d, 0x2d, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x7f, 0x5, 0x9f, 0x7,
+ 0x80, 0x10, 0x7d, 0x12, 0x1a, 0x2, 0x1a, 0x0, 0x6e, 0x14, 0xff, 0xff, 0x6e,
+ 0x4, 0xff, 0xff, 0xb, 0xc, 0x7d, 0x21, 0x7e, 0x14, 0x0, 0x4, 0xad, 0x13,
+ 0xbd, 0x12, 0x58, 0xf, 0xbe, 0x24, 0x0, 0x64, 0x8, 0x9, 0xbe, 0x34, 0x0,
+ 0x64, 0x8, 0x3, 0xd3, 0x80, 0x1, 0xc3, 0xda, 0x69, 0x22, 0xca, 0x79, 0x7c,
+ 0xab, 0xd2, 0x0, 0x6c, 0x99, 0x80, 0x48, 0x7e, 0xf0, 0xd, 0xac, 0xf9, 0x9,
+ 0xb7, 0x67, 0x97, 0xbc, 0xba, 0x78, 0x39, 0x49, 0x57, 0x67, 0x95, 0xbd,
+ 0x50, 0x38, 0x10, 0xbd, 0x51, 0x40, 0xc, 0x49, 0x17, 0x67, 0x93, 0xbd, 0x12,
+ 0x38, 0x4, 0xbd, 0x13, 0x50, 0x2, 0xc2, 0x0, 0x30, 0x0, 0x18, 0x49, 0x37,
+ 0x67, 0x93, 0xbe, 0x34, 0x2, 0xd0, 0x50, 0xe, 0xbe, 0x34, 0x1, 0x68, 0x28,
+ 0x8, 0xbe, 0x54, 0x0, 0x64, 0x50, 0x2, 0xc2, 0x0, 0xa2, 0x0, 0x80, 0xc, 0xb,
+ 0x90, 0x7e, 0xb3, 0x69, 0x69, 0xbc, 0xb9, 0x38, 0xb0, 0xa2, 0x0, 0xda, 0x79,
+ 0x22, 0x7f, 0x71, 0x7f, 0x60, 0x30, 0x32, 0x6, 0x7e, 0xb3, 0x9b, 0xae, 0x70,
+ 0x9, 0x7e, 0x8, 0x1, 0x3c, 0x12, 0x8c, 0x28, 0x1, 0xc6, 0x6c, 0x11, 0xa,
+ 0x31, 0x2d, 0x3f, 0x7d, 0x2e, 0x7e, 0x1b, 0xb0, 0x60, 0x9, 0xe4, 0xa, 0x31,
+ 0x19, 0xb3, 0x1, 0x3c, 0x80, 0x67, 0xa, 0x31, 0x9, 0xb3, 0x1, 0x3c, 0x60,
+ 0x5f, 0x7e, 0x70, 0xd, 0xac, 0x71, 0x2e, 0x34, 0x1, 0xc8, 0x7e, 0x23, 0x69,
+ 0x69, 0x7c, 0xb2, 0x4, 0x7a, 0xb3, 0x69, 0x69, 0x7e, 0x30, 0xd, 0xac, 0x23,
+ 0x12, 0x88, 0xcb, 0x7e, 0x90, 0xd, 0xac, 0x91, 0x49, 0x34, 0x1, 0xc8, 0x74,
+ 0x8, 0xac, 0xb1, 0x7f, 0x56, 0x2d, 0xb5, 0x79, 0x35, 0x0, 0x2, 0x49, 0x34,
+ 0x1, 0xca, 0x2d, 0x5d, 0x7d, 0x4c, 0x79, 0x32, 0x0, 0x4, 0x74, 0x1, 0xa,
+ 0x31, 0x2d, 0x3f, 0x7d, 0x2e, 0x7a, 0x1b, 0xb0, 0xa, 0x31, 0x9, 0x3, 0x1,
+ 0x0, 0xa, 0x11, 0x19, 0x1, 0x1, 0x14, 0x2e, 0x34, 0x1, 0x3c, 0x7e, 0x39,
+ 0xb0, 0x14, 0x7a, 0x39, 0xb0, 0xb, 0x10, 0xa5, 0xb9, 0xa, 0x2, 0x80, 0x2,
+ 0x1, 0x41, 0x7e, 0xb3, 0x69, 0x69, 0x22, 0x2e, 0x14, 0x67, 0x93, 0x74, 0xd,
+ 0x2, 0x1, 0xf3, 0xca, 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x6c, 0x11, 0x7e, 0x30,
+ 0xd, 0xac, 0x31, 0x7d, 0x31, 0x2e, 0x34, 0x67, 0x93, 0x2e, 0x14, 0x92, 0x8,
+ 0x12, 0x9e, 0x3, 0xa5, 0xb9, 0xa, 0xea, 0x7e, 0x8, 0x67, 0x93, 0x12, 0x8c,
+ 0x30, 0x6c, 0x11, 0x7e, 0x90, 0xd, 0xac, 0x91, 0x9, 0xd4, 0x92, 0xc, 0xbe,
+ 0xd0, 0xff, 0x68, 0x45, 0x74, 0x8, 0xac, 0xbd, 0x9, 0xc5, 0x69, 0x19, 0xbe,
+ 0xc0, 0x2, 0x68, 0x4, 0x4c, 0xcc, 0x78, 0x12, 0x7d, 0x34, 0x2e, 0x34, 0x92,
+ 0x8, 0x7e, 0x30, 0xd, 0xac, 0x3f, 0x12, 0x88, 0xcb, 0xb, 0xf0, 0x80, 0x22,
+ 0xbe, 0xc0, 0x1, 0x78, 0x1d, 0x7d, 0x34, 0x2e, 0x34, 0x92, 0x8, 0xa, 0x2e,
+ 0x7e, 0x3, 0x69, 0x69, 0xa, 0x40, 0x2d, 0x42, 0x7e, 0x54, 0x0, 0xd, 0xad,
+ 0x54, 0x7d, 0x15, 0x12, 0x88, 0xcb, 0xb, 0xe0, 0xb, 0x10, 0xbe, 0x10, 0xa,
+ 0x40, 0xa6, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7f, 0x51, 0x7f, 0x60, 0x7e, 0x8,
+ 0x92, 0x24, 0x12, 0x8c, 0x28, 0x7e, 0x8, 0x92, 0x2e, 0x12, 0x3c, 0x6b, 0x7e,
+ 0x8, 0x92, 0x38, 0x12, 0x8c, 0x30, 0x7e, 0x84, 0x0, 0x5a, 0x7a, 0x85, 0x2a,
+ 0x7e, 0x97, 0x76, 0x1b, 0x9e, 0x94, 0x0, 0x5b, 0x7e, 0x67, 0x76, 0x29, 0x9e,
+ 0x64, 0x0, 0x5b, 0x6c, 0xee, 0x61, 0x1, 0xa, 0x3e, 0x2d, 0x3b, 0x7d, 0x2a,
+ 0x7e, 0x1b, 0xb0, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x80, 0x12, 0x8c, 0x7,
+ 0xb4, 0x1, 0x6, 0x74, 0x3, 0x39, 0xb0, 0x0, 0x1, 0x2d, 0x3d, 0x7d, 0x2c,
+ 0x29, 0xb1, 0x0, 0x1, 0xb4, 0x3, 0x2, 0x80, 0x2, 0x41, 0x5c, 0xa, 0x3e, 0x9,
+ 0x63, 0x1, 0x14, 0xa, 0x2e, 0x9, 0x72, 0x1, 0x0, 0xbc, 0x67, 0x40, 0x2,
+ 0x41, 0x58, 0x7e, 0xb3, 0x9b, 0x84, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x58,
+ 0x7c, 0xbe, 0x7e, 0x35, 0x2a, 0x7d, 0x29, 0x7d, 0x18, 0x7d, 0x6, 0x12, 0x87,
+ 0xca, 0x50, 0x72, 0xa, 0x3e, 0x2e, 0x34, 0x1, 0x14, 0x7e, 0x39, 0xb0, 0x4,
+ 0x7a, 0x39, 0xb0, 0x74, 0x1, 0xa, 0x3e, 0x19, 0xb3, 0x92, 0x24, 0x7e, 0xa0,
+ 0x3, 0x12, 0x8b, 0xfa, 0x6c, 0xff, 0x80, 0x49, 0x7e, 0x70, 0xd, 0xac, 0x7f,
+ 0x9, 0xb3, 0x67, 0x97, 0xf5, 0x27, 0xbe, 0xe1, 0x27, 0x78, 0x37, 0x2e, 0x34,
+ 0x67, 0x93, 0x7e, 0x14, 0x0, 0x2c, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x7e, 0x8,
+ 0x67, 0x93, 0x7e, 0xb3, 0x69, 0x69, 0x7c, 0x7f, 0x12, 0x8d, 0x2e, 0x40,
+ 0x1b, 0x74, 0x2, 0xa, 0x3e, 0x19, 0xb3, 0x1, 0x3c, 0x7e, 0x70, 0xd, 0xac,
+ 0x7f, 0x12, 0x9d, 0xfb, 0xac, 0x3e, 0x2e, 0x14, 0x1, 0xc8, 0x74, 0xd, 0x12,
+ 0x1, 0xf3, 0xb, 0xf0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7f, 0x38, 0xaf, 0x41,
+ 0xf5, 0x6c, 0xaa, 0x80, 0x1f, 0x12, 0x8b, 0xdc, 0x29, 0xb1, 0x0, 0x1, 0x70,
+ 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x11, 0x12, 0x8b, 0xdc, 0x29, 0xb1, 0x0, 0x1,
+ 0xb4, 0x2, 0x2, 0x80, 0x2, 0x41, 0xf5, 0x7e, 0xa0, 0x2, 0x12, 0x8b, 0xfa,
+ 0x80, 0x75, 0x12, 0x8c, 0x7, 0xbe, 0xb0, 0x2, 0x68, 0x2, 0x70, 0x53, 0xa,
+ 0x2e, 0x9, 0xb2, 0x1, 0xa, 0x9, 0xa2, 0x1, 0x1e, 0xbc, 0xab, 0x50, 0x27,
+ 0xa, 0x2e, 0x9, 0xb2, 0x1, 0x32, 0x70, 0x1f, 0xa, 0x2e, 0x2e, 0x24, 0x1,
+ 0x1e, 0x7c, 0xba, 0x4, 0x7a, 0x29, 0xb0, 0x74, 0x2, 0x7a, 0xb, 0xb0, 0x74,
+ 0x1, 0xa, 0x2e, 0x19, 0xb2, 0x92, 0x2e, 0x19, 0xb2, 0x1, 0x28, 0x80, 0x36,
+ 0x74, 0x1, 0x7f, 0x6, 0x2d, 0x13, 0x7a, 0xb, 0xb0, 0xe4, 0xa, 0x2e, 0x19,
+ 0xb2, 0x1, 0x14, 0x19, 0xb2, 0x1, 0x1e, 0x19, 0xb2, 0x1, 0x28, 0x19, 0xb2,
+ 0x1, 0x32, 0x80, 0x18, 0x74, 0x3, 0x2d, 0x3d, 0x7d, 0x2c, 0x7a, 0x1b, 0xb0,
+ 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x1, 0x14, 0x19, 0xb3, 0x1, 0x1e, 0x19, 0xb3,
+ 0x1, 0x28, 0x12, 0x8b, 0xe5, 0x7e, 0xb, 0x70, 0x39, 0x70, 0x0, 0x1, 0xb,
+ 0xe0, 0x12, 0x8b, 0xd5, 0x28, 0x2, 0x21, 0x8e, 0x75, 0x28, 0x0, 0x6c, 0xee,
+ 0x80, 0x1d, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x9, 0x53, 0x67, 0x97, 0x7a, 0x51,
+ 0x27, 0xa, 0x25, 0x9, 0xb2, 0x92, 0x24, 0x70, 0x7, 0x2e, 0x34, 0x67, 0x93,
+ 0x12, 0x8c, 0x15, 0xb, 0xe0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7e, 0x38, 0xdb,
+ 0x75, 0x29, 0x0, 0x6c, 0xee, 0x80, 0x45, 0xa, 0x3e, 0x9, 0xb3, 0x92, 0x2e,
+ 0x60, 0x3b, 0x5, 0x29, 0x6c, 0xff, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xb3,
+ 0x1, 0x4a, 0xf5, 0x27, 0xbe, 0xe1, 0x27, 0x78, 0x20, 0x49, 0x23, 0x1, 0x46,
+ 0x12, 0x8b, 0xe5, 0x79, 0x20, 0x0, 0x2, 0x49, 0x23, 0x1, 0x48, 0x7f, 0x6,
+ 0x2d, 0x15, 0x79, 0x20, 0x0, 0x4, 0x2e, 0x34, 0x1, 0x46, 0x12, 0x8c, 0x15,
+ 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xc9, 0xb, 0xe0, 0x12, 0x8b,
+ 0xd5, 0x38, 0xb6, 0x7e, 0xf1, 0x28, 0x6c, 0xee, 0x80, 0x16, 0x12, 0x8b,
+ 0xdc, 0x7e, 0x1b, 0xb0, 0xb4, 0x1, 0xb, 0x7c, 0xaf, 0xb, 0xf0, 0x74, 0xd,
+ 0xa4, 0x19, 0xe5, 0x92, 0x3c, 0xb, 0xe0, 0x12, 0x8b, 0xd5, 0x38, 0xe5, 0x6c,
+ 0xee, 0x12, 0x8b, 0xee, 0x2e, 0x14, 0x1, 0x46, 0x74, 0xd, 0x12, 0x1, 0xf3,
+ 0x12, 0x8b, 0xee, 0x12, 0x88, 0xcb, 0xb, 0xe0, 0xbe, 0xe0, 0xa, 0x40, 0xe7,
+ 0xe5, 0x28, 0x7a, 0xb3, 0x69, 0x69, 0x7e, 0xb3, 0x2, 0x4a, 0x25, 0x29, 0x7a,
+ 0xb3, 0x2, 0x4a, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7e, 0x22,
+ 0x74, 0x8, 0xac, 0xbe, 0x7f, 0x16, 0x2d, 0x35, 0x22, 0x74, 0x8, 0xac, 0xbe,
+ 0x7f, 0x6, 0x2d, 0x15, 0x22, 0x7e, 0x30, 0xd, 0xac, 0x3e, 0x7d, 0x31, 0x2e,
+ 0x34, 0x92, 0x38, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7e, 0x2d, 0x3d, 0x7d, 0x2c,
+ 0x7a, 0x1b, 0xa0, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7e, 0x7f, 0x6, 0x2d, 0x13,
+ 0x29, 0xb0, 0x0, 0x1, 0x22, 0x7e, 0x31, 0x28, 0x7c, 0xb3, 0x4, 0xf5, 0x28,
+ 0x74, 0xd, 0xac, 0x3b, 0x2e, 0x14, 0x92, 0x38, 0x2, 0x1, 0xf3, 0x7e, 0x34,
+ 0x0, 0xa, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0x0, 0x82, 0x74, 0xff, 0x2, 0x0,
+ 0x2e, 0xca, 0xf8, 0x7f, 0x60, 0x6c, 0xff, 0x12, 0x8c, 0x6b, 0x30, 0xe2, 0x5,
+ 0x7c, 0xbf, 0x12, 0x8c, 0x75, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x78, 0xee, 0x6c,
+ 0xff, 0x12, 0x8c, 0x6b, 0x30, 0xe3, 0x5, 0x7c, 0xbf, 0x12, 0x8c, 0xfd, 0xb,
+ 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xee, 0x12, 0x88, 0xd4, 0xda, 0xf8, 0x22, 0xa,
+ 0x3f, 0x2d, 0x3d, 0x7d, 0x2c, 0x7e, 0x1b, 0xb0, 0x22, 0x7c, 0x1b, 0x7e, 0x3,
+ 0x75, 0x8c, 0xa, 0x30, 0x1b, 0x34, 0x7c, 0x7, 0x80, 0x12, 0xbc, 0x10, 0x68,
+ 0xc, 0x12, 0x8c, 0xf4, 0x9, 0xb1, 0x69, 0x19, 0xbe, 0xb0, 0x3, 0x68, 0x7,
+ 0x1b, 0x0, 0xbe, 0x0, 0x0, 0x58, 0xe9, 0xbe, 0x0, 0x0, 0x58, 0x2, 0x7c, 0x1,
+ 0x6c, 0x99, 0x80, 0x46, 0x1a, 0xe9, 0x7e, 0xf4, 0x0, 0xd, 0xad, 0xfe, 0x9,
+ 0x8f, 0x67, 0x97, 0xbc, 0x81, 0x78, 0x2a, 0x12, 0xbd, 0x67, 0x7d, 0x1f,
+ 0x12, 0x88, 0xcb, 0x1a, 0x29, 0x7e, 0x34, 0x0, 0xd, 0xad, 0x32, 0x19, 0x3,
+ 0x67, 0x97, 0xe4, 0x12, 0x8c, 0xf4, 0x19, 0xb1, 0x69, 0x1a, 0x19, 0xb1,
+ 0x69, 0x19, 0x12, 0x6f, 0xe3, 0x7c, 0xb0, 0x12, 0x6f, 0xed, 0x80, 0xa, 0xbc,
+ 0x80, 0x78, 0x6, 0x74, 0xff, 0x19, 0xbf, 0x67, 0x97, 0xb, 0x90, 0x7e, 0x83,
+ 0x75, 0x8c, 0xbc, 0x89, 0x18, 0xb2, 0x22, 0x1a, 0x10, 0x3e, 0x14, 0x3e,
+ 0x14, 0x3e, 0x14, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0xb7, 0x9, 0xb5, 0x69,
+ 0x19, 0xb4, 0x1, 0x23, 0x7e, 0x63, 0x69, 0x69, 0x80, 0x15, 0x7e, 0x50, 0xd,
+ 0xac, 0x56, 0x9, 0x32, 0x67, 0x97, 0xbc, 0x37, 0x78, 0x6, 0x74, 0xff, 0x19,
+ 0xb2, 0x67, 0x97, 0xb, 0x60, 0xbe, 0x60, 0xa, 0x40, 0xe6, 0x12, 0xbd, 0x7c,
+ 0x22, 0xca, 0x79, 0x7c, 0x6b, 0x85, 0x33, 0x3f, 0x7e, 0xa1, 0x34, 0x6c,
+ 0x55, 0x80, 0x67, 0xbc, 0x57, 0x68, 0x61, 0x7e, 0x90, 0xd, 0xac, 0x95, 0x7f,
+ 0x70, 0x2d, 0xf4, 0x29, 0x47, 0x0, 0x7, 0x7a, 0x41, 0x40, 0x29, 0xb7, 0x0,
+ 0x8, 0xf5, 0x41, 0xe5, 0x3f, 0xa, 0xfb, 0xa, 0x44, 0x9d, 0x4f, 0xbe, 0x44,
+ 0x0, 0x0, 0x8, 0xb, 0xe5, 0x3f, 0xa, 0xeb, 0xe5, 0x40, 0x12, 0x8d, 0xb4,
+ 0x80, 0x3, 0x12, 0x8d, 0xab, 0xf5, 0x42, 0xa, 0xfa, 0xe5, 0x41, 0xa, 0x4b,
+ 0x9d, 0x4f, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x9, 0xa, 0xea, 0xe5, 0x41, 0x12,
+ 0x8d, 0xb4, 0x80, 0x3, 0x12, 0x8d, 0xab, 0xf5, 0x43, 0xe5, 0x42, 0xbe, 0xb0,
+ 0x4, 0x38, 0xa, 0xe5, 0x43, 0xbe, 0xb0, 0x3, 0x38, 0x3, 0xd3, 0x80, 0x7,
+ 0xb, 0x50, 0xbc, 0x65, 0x38, 0x95, 0xc3, 0xda, 0x79, 0x22, 0x6e, 0x44, 0xff,
+ 0xff, 0xb, 0x44, 0x7c, 0xb9, 0x22, 0xa, 0xfb, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c,
+ 0xbf, 0x22, 0xca, 0x3b, 0xe4, 0x7a, 0xb3, 0x37, 0xd1, 0x12, 0xba, 0xeb,
+ 0x78, 0x2, 0xc1, 0x6c, 0x6c, 0xdd, 0x80, 0x64, 0x6c, 0xcc, 0x7e, 0x30, 0xd,
+ 0xac, 0x3d, 0x9, 0xf1, 0x67, 0x97, 0x5e, 0xf0, 0xf, 0x12, 0x8e, 0x6f, 0x9,
+ 0xb1, 0x67, 0x9a, 0x9, 0x71, 0x67, 0x9b, 0x49, 0x21, 0x67, 0x93, 0x49, 0x11,
+ 0x67, 0x95, 0x7c, 0x6f, 0x12, 0xbd, 0xea, 0x4c, 0xee, 0x78, 0xb, 0x7c, 0xbd,
+ 0x7c, 0x7f, 0x12, 0x8e, 0x78, 0x7c, 0xcb, 0x80, 0xe, 0xbe, 0xe0, 0x2, 0x78,
+ 0x9, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0x8f, 0x5e, 0x7c, 0xcb, 0x7c, 0x1d, 0x2e,
+ 0x10, 0x27, 0x7c, 0xbc, 0xa5, 0xf7, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x9, 0xb3,
+ 0x37, 0x0, 0xbe, 0xb0, 0xff, 0x50, 0x8, 0x2e, 0x34, 0x37, 0x0, 0x4, 0x7a,
+ 0x39, 0xb0, 0xb, 0xd0, 0x7e, 0x73, 0x69, 0x69, 0xbc, 0x7d, 0x38, 0x94, 0x7e,
+ 0x8, 0x0, 0x27, 0x12, 0xbd, 0x1, 0x6c, 0xff, 0xe4, 0xa, 0x3f, 0x19, 0xb3,
+ 0x91, 0xfe, 0x12, 0x8e, 0x6f, 0xbe, 0xe0, 0x1, 0x78, 0xb, 0x7c, 0xbf, 0x12,
+ 0xbd, 0x88, 0xa, 0x3f, 0x19, 0xb3, 0x91, 0xfe, 0xb, 0xf0, 0xbe, 0xf0, 0xa,
+ 0x78, 0xdf, 0x7e, 0x8, 0x91, 0xfe, 0x12, 0x8c, 0x39, 0xda, 0x3b, 0x22, 0x74,
+ 0x8, 0xac, 0xbf, 0x9, 0xe5, 0x69, 0x19, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c,
+ 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0x9b, 0x59,
+ 0x1b, 0xb1, 0x68, 0x1b, 0x14, 0x68, 0x29, 0x14, 0x68, 0x30, 0x24, 0x3, 0x78,
+ 0x37, 0x12, 0x8e, 0xff, 0x40, 0x7, 0x7c, 0xbd, 0x12, 0x8f, 0xfc, 0x50, 0x28,
+ 0x12, 0x8e, 0xec, 0x80, 0x23, 0x12, 0x8e, 0xff, 0x40, 0x7, 0x7c, 0xbd, 0x12,
+ 0x8f, 0xfc, 0x50, 0x17, 0x12, 0x8e, 0xec, 0x80, 0x12, 0x12, 0x8e, 0xff,
+ 0x50, 0xd, 0x12, 0x8e, 0xec, 0x80, 0x8, 0x12, 0x8e, 0xff, 0x50, 0x3, 0x12,
+ 0x8e, 0xec, 0x7e, 0xf0, 0x1, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x2e, 0x34, 0x67,
+ 0x93, 0x7e, 0x30, 0x15, 0xac, 0x3e, 0x2e, 0x14, 0x37, 0x7, 0x74, 0xd, 0x12,
+ 0x1, 0xf3, 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7e, 0xa0, 0x2, 0x7e,
+ 0x70, 0x15, 0xac, 0x7e, 0x19, 0xa3, 0x37, 0x1, 0x74, 0x14, 0x19, 0xb3, 0x37,
+ 0x6, 0x22, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x15, 0xac, 0x7e, 0x19, 0xa3, 0x37,
+ 0x1, 0x7c, 0xbe, 0x7c, 0x3b, 0x7e, 0xb3, 0x59, 0x47, 0x7e, 0x60, 0x8, 0xb4,
+ 0x1, 0x8, 0x7e, 0x70, 0x5, 0x7e, 0xa0, 0x8, 0x80, 0x6, 0x7e, 0x70, 0x6,
+ 0x7e, 0xa0, 0x9, 0x7e, 0x50, 0x15, 0xac, 0x53, 0x9, 0xb2, 0x36, 0xff, 0xbe,
+ 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x2, 0xa, 0x9, 0x22, 0x37, 0x3, 0xbc, 0x26,
+ 0x40, 0x1c, 0xd3, 0x22, 0xb4, 0x3, 0xa, 0x9, 0x22, 0x37, 0x5, 0xbc, 0x27,
+ 0x40, 0xf, 0xd3, 0x22, 0xb4, 0x4, 0xa, 0x9, 0xb2, 0x37, 0x5, 0xbc, 0xba,
+ 0x40, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x12,
+ 0x8f, 0xf4, 0x9, 0xb3, 0x37, 0x1, 0xb4, 0x1, 0x2a, 0x7c, 0xbe, 0x7c, 0x7f,
+ 0x6c, 0x66, 0x12, 0xbc, 0x74, 0x50, 0x2, 0x80, 0x2c, 0x7c, 0xbf, 0x12, 0x8f,
+ 0xd, 0x40, 0x7, 0x7c, 0xbe, 0x12, 0x8f, 0xfc, 0x50, 0x63, 0x7e, 0xa0, 0x2,
+ 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x12, 0x8e, 0xf4, 0x80, 0x56, 0x80, 0x54,
+ 0xb4, 0x2, 0x54, 0x7c, 0xbe, 0x7c, 0x7f, 0x7e, 0x60, 0x1, 0x12, 0xbc, 0x74,
+ 0x50, 0xc, 0x12, 0x8f, 0xf4, 0x19, 0xa3, 0x37, 0x1, 0x7e, 0xa0, 0x2, 0x80,
+ 0x3c, 0x7c, 0xbf, 0x12, 0x8f, 0xd, 0x40, 0x7, 0x7c, 0xbe, 0x12, 0x8f, 0xfc,
+ 0x50, 0xe, 0x7e, 0xa0, 0x14, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x19, 0xa3, 0x37,
+ 0x6, 0x80, 0x1d, 0x7e, 0x90, 0x15, 0xac, 0x9f, 0x9, 0xb4, 0x37, 0x6, 0x60,
+ 0xc, 0x7d, 0x34, 0x2e, 0x34, 0x37, 0x6, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x6,
+ 0x74, 0x1, 0x19, 0xb4, 0x37, 0x1, 0x7e, 0xa0, 0x1, 0x7c, 0xba, 0xda, 0x79,
+ 0x22, 0x6c, 0xaa, 0x7e, 0x70, 0x15, 0xac, 0x7f, 0x22, 0xca, 0xf8, 0x7c,
+ 0x7b, 0xc2, 0x0, 0x7e, 0x90, 0xd, 0xac, 0x97, 0x9, 0xa4, 0x67, 0x9a, 0x4c,
+ 0xaa, 0x78, 0x5, 0x7e, 0xf0, 0x1, 0x80, 0xd, 0xbe, 0xa0, 0x11, 0x78, 0x5,
+ 0x7e, 0xf0, 0x10, 0x80, 0x3, 0xc3, 0x80, 0x44, 0x9, 0x94, 0x67, 0x9b, 0x7c,
+ 0xba, 0x7c, 0x79, 0x12, 0x2e, 0x40, 0x7d, 0x3, 0xbe, 0x4, 0x3, 0x20, 0x8,
+ 0x3, 0xc3, 0x80, 0x2e, 0x7c, 0xbf, 0x7c, 0x79, 0x12, 0x2e, 0x40, 0x7d, 0x13,
+ 0xbe, 0x14, 0x0, 0x0, 0x58, 0x5, 0xd2, 0x0, 0xd3, 0x80, 0x1a, 0x7d, 0x30,
+ 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x11, 0x2f, 0x11, 0x2f, 0x11, 0xb, 0x14, 0x12,
+ 0x1, 0x6c, 0xbe, 0x70, 0x32, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0xda, 0xf8,
+ 0x22, 0xa, 0x3b, 0x9, 0xb3, 0x1, 0x28, 0x22, 0xca, 0x3b, 0x7e, 0xb3, 0x69,
+ 0x75, 0xf5, 0x29, 0x75, 0x3b, 0xa, 0x7e, 0x68, 0x69, 0x19, 0x7e, 0x58, 0x67,
+ 0x93, 0x74, 0xa, 0x7a, 0xb3, 0x92, 0x8, 0x74, 0x2, 0x7a, 0xb3, 0x92, 0x9,
+ 0x7e, 0x84, 0x0, 0x64, 0x7a, 0x85, 0x31, 0x7e, 0x97, 0x76, 0x1b, 0x7d, 0x39,
+ 0x9e, 0x34, 0x0, 0x65, 0x7a, 0x35, 0x33, 0x7a, 0x85, 0x35, 0x7e, 0x77, 0x76,
+ 0x29, 0x7d, 0x87, 0x9e, 0x84, 0x0, 0x65, 0x7a, 0x85, 0x37, 0x6d, 0x88, 0x7a,
+ 0x85, 0x39, 0x1b, 0x94, 0x9e, 0x74, 0x0, 0x3d, 0x6c, 0xdd, 0xc1, 0xb1, 0x7e,
+ 0x50, 0xd, 0xac, 0x5d, 0x7f, 0x75, 0x2d, 0xf2, 0x29, 0xc7, 0x0, 0x4, 0xbe,
+ 0xc0, 0xa, 0x40, 0x2, 0xc1, 0xaf, 0xb, 0x7a, 0x30, 0xbe, 0x35, 0x39, 0x28,
+ 0x4, 0xbd, 0x39, 0x40, 0x5, 0x75, 0x27, 0x1, 0x80, 0x3, 0x75, 0x27, 0x0,
+ 0x69, 0x37, 0x0, 0x2, 0xbd, 0x38, 0x28, 0x4, 0xbd, 0x37, 0x40, 0x5, 0x75,
+ 0x28, 0x1, 0x80, 0x3, 0x75, 0x28, 0x0, 0x74, 0x8, 0xac, 0xbc, 0x7f, 0x6,
+ 0x2d, 0x15, 0x7e, 0xb, 0xb0, 0xb4, 0x2, 0x2, 0x80, 0x2, 0xc1, 0x94, 0x12,
+ 0x96, 0xef, 0xb, 0x7a, 0x10, 0x7d, 0x31, 0x9d, 0x30, 0x7a, 0x37, 0x92, 0x2,
+ 0x49, 0x55, 0x2f, 0xc7, 0x7f, 0x75, 0x2d, 0xf2, 0x69, 0x27, 0x0, 0x2, 0x7d,
+ 0x2, 0x9d, 0x5, 0x7a, 0x7, 0x92, 0x4, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x6, 0x7e,
+ 0x37, 0x92, 0x2, 0x80, 0x6, 0x6d, 0x33, 0x9e, 0x37, 0x92, 0x2, 0x7a, 0x37,
+ 0x91, 0xfe, 0x7e, 0x37, 0x92, 0x4, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x6, 0x7e,
+ 0x37, 0x92, 0x4, 0x80, 0x6, 0x6d, 0x33, 0x9e, 0x37, 0x92, 0x4, 0x7a, 0x37,
+ 0x92, 0x0, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xcb, 0x7d, 0x32, 0x9d,
+ 0x30, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22,
+ 0x9d, 0x23, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xc9, 0x12, 0x6f, 0xd5,
+ 0x8, 0xf, 0x74, 0xd, 0xac, 0xbd, 0x2d, 0x5b, 0x7d, 0x4a, 0xb, 0x2a, 0x30,
+ 0x9d, 0x30, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31, 0x2d, 0x32, 0x7a, 0x37, 0x92,
+ 0x6, 0x12, 0x96, 0xbb, 0x29, 0xb1, 0x0, 0x5, 0xf5, 0x2b, 0x12, 0x96, 0xbb,
+ 0x29, 0xb1, 0x0, 0x6, 0xf5, 0x2c, 0x12, 0x96, 0xce, 0x69, 0x30, 0x0, 0xb,
+ 0x69, 0x20, 0x0, 0x9, 0x7a, 0x1d, 0x2d, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0x75,
+ 0x2f, 0xc0, 0xbe, 0x71, 0x2b, 0x50, 0xc, 0x7e, 0xa1, 0x2b, 0x7e, 0x70, 0x1f,
+ 0xac, 0x7c, 0x19, 0xa3, 0x2f, 0xc0, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0x75, 0x2f,
+ 0xc1, 0xbe, 0x71, 0x2c, 0x50, 0xc, 0x7e, 0xa1, 0x2c, 0x7e, 0x70, 0x1f, 0xac,
+ 0x7c, 0x19, 0xa3, 0x2f, 0xc1, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xbb,
+ 0xbe, 0xa0, 0xfa, 0x50, 0xf, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x2e, 0x34, 0x2f,
+ 0xbb, 0x7c, 0xba, 0x4, 0x7a, 0x39, 0xb0, 0x7c, 0xbc, 0x12, 0x90, 0x68, 0x60,
+ 0xa, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xb5, 0x2f, 0xba, 0xf5, 0x3b, 0x75, 0x2a,
+ 0x0, 0xe5, 0x29, 0xbe, 0xb0, 0x8, 0x40, 0x11, 0x7e, 0x37, 0x92, 0x6, 0xbe,
+ 0x34, 0x0, 0x50, 0x50, 0x33, 0x75, 0x2a, 0x1e, 0x80, 0x36, 0x80, 0x2c, 0xe5,
+ 0x29, 0xbe, 0xb0, 0x5, 0x40, 0x14, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34, 0x0,
+ 0x3c, 0x50, 0x5, 0x75, 0x2a, 0x14, 0x80, 0x1e, 0x75, 0x2a, 0xa, 0x80, 0x19,
+ 0xe5, 0x29, 0xbe, 0xb0, 0x3, 0x40, 0x12, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34,
+ 0x0, 0x32, 0x50, 0x5, 0x75, 0x2a, 0xf, 0x80, 0x3, 0x75, 0x2a, 0x7, 0x7e,
+ 0x30, 0x1f, 0xac, 0x3c, 0x9, 0xb1, 0x2f, 0xbe, 0x60, 0x2, 0x61, 0xac, 0x9,
+ 0x71, 0x2f, 0xbb, 0xbe, 0x70, 0x12, 0x40, 0x2, 0x61, 0x4e, 0x9, 0x41, 0x2f,
+ 0xba, 0x7e, 0x50, 0x3, 0xac, 0x45, 0x7e, 0x71, 0x2b, 0x74, 0x2, 0xac, 0x7b,
+ 0xbd, 0x23, 0x58, 0x23, 0xe5, 0x2b, 0xbe, 0xb0, 0x28, 0x28, 0x1c, 0x12,
+ 0x79, 0x68, 0x19, 0x71, 0x2f, 0xba, 0x7e, 0x73, 0x69, 0x69, 0xbe, 0x70, 0x3,
+ 0x50, 0x1b, 0xe5, 0x2b, 0xa, 0x3b, 0x1e, 0x34, 0x19, 0x71, 0x2f, 0xba, 0x80,
+ 0xf, 0x9, 0x71, 0x2f, 0xc0, 0xbe, 0x70, 0x19, 0x50, 0x6, 0x74, 0xa, 0x19,
+ 0xb1, 0x2f, 0xba, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x50, 0xf, 0x7d, 0x1, 0x2e,
+ 0x4, 0x2f, 0xc2, 0x7e, 0x9, 0xb0, 0x4, 0x7a, 0x9, 0xb0, 0x80, 0x5, 0xe4,
+ 0x19, 0xb1, 0x2f, 0xc2, 0x9, 0x71, 0x2f, 0xc0, 0xbe, 0x70, 0xa0, 0x38, 0x2,
+ 0x61, 0x99, 0x9, 0x61, 0x2f, 0xc2, 0xbe, 0x60, 0x3, 0x40, 0x2, 0x61, 0x99,
+ 0xa, 0x37, 0xe5, 0x2b, 0xa, 0xb, 0x2e, 0x4, 0x0, 0x14, 0xbd, 0x3, 0x48,
+ 0x10, 0x9, 0x71, 0x2f, 0xc1, 0xa, 0x7, 0x7e, 0xa1, 0x2c, 0x74, 0x2, 0xa4,
+ 0xbd, 0x50, 0x58, 0x7d, 0x7e, 0x7, 0x92, 0x0, 0x2e, 0x7, 0x91, 0xfe, 0xbe,
+ 0x4, 0x0, 0x64, 0x50, 0x8, 0x6d, 0x0, 0x7a, 0x7, 0x91, 0xfe, 0x80, 0x10,
+ 0x7e, 0x7, 0x91, 0xfe, 0x1e, 0x4, 0x1e, 0x4, 0x7a, 0x7, 0x91, 0xfe, 0x1e,
+ 0x4, 0x1e, 0x4, 0x7a, 0x7, 0x92, 0x0, 0x74, 0x2, 0x19, 0xb1, 0x2f, 0xbf,
+ 0x80, 0x4b, 0xe5, 0x2b, 0xbe, 0xb0, 0xc8, 0x28, 0x11, 0x7e, 0x37, 0x92, 0x6,
+ 0xbe, 0x34, 0x0, 0x64, 0x50, 0x20, 0x7e, 0xa0, 0x1e, 0x80, 0x16, 0x80, 0x19,
+ 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x28, 0x20, 0x7e, 0x37, 0x92, 0x6, 0xbe, 0x34,
+ 0x0, 0x46, 0x50, 0x8, 0x7e, 0xa0, 0x19, 0x12, 0x96, 0xc4, 0x80, 0x1a, 0x7e,
+ 0x34, 0x7f, 0xff, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xc9, 0x80, 0xc,
+ 0x12, 0x97, 0xa, 0xbe, 0xa3, 0x92, 0x8, 0x28, 0x3, 0x12, 0x97, 0x37, 0x12,
+ 0x96, 0xd7, 0xbe, 0x34, 0x0, 0x4, 0x50, 0xa, 0x6d, 0x33, 0x7a, 0x37, 0x91,
+ 0xfe, 0x7a, 0x37, 0x92, 0x0, 0x12, 0x96, 0xbb, 0xb, 0x1a, 0x10, 0xbe, 0x15,
+ 0x31, 0x40, 0x13, 0xbe, 0x15, 0x33, 0x38, 0xe, 0x69, 0x31, 0x0, 0x2, 0xbe,
+ 0x35, 0x35, 0x40, 0x5, 0xbe, 0x35, 0x37, 0x28, 0x4, 0xd2, 0x0, 0x80, 0x2,
+ 0xc2, 0x0, 0x7e, 0x44, 0x0, 0x3, 0x7e, 0x7d, 0x2d, 0x7f, 0x17, 0x7d, 0x14,
+ 0x12, 0x1, 0x63, 0x12, 0x97, 0x1d, 0xbf, 0x10, 0x58, 0x5, 0x75, 0x2a, 0x64,
+ 0x80, 0x6b, 0x7f, 0x7, 0x2f, 0x0, 0x12, 0x97, 0x2a, 0xbf, 0x1, 0x58, 0x2,
+ 0x80, 0x36, 0x12, 0x97, 0x2a, 0x7d, 0x14, 0x12, 0x1, 0x63, 0x7f, 0x1, 0x7e,
+ 0x1d, 0x2d, 0x2f, 0x11, 0x2f, 0x11, 0xbf, 0x10, 0x58, 0x26, 0x75, 0x2a, 0xa,
+ 0x12, 0x96, 0xd7, 0xbe, 0x34, 0x0, 0x64, 0x50, 0x3d, 0x74, 0x1f, 0xac, 0xbc,
+ 0x49, 0x35, 0x2f, 0xc3, 0xbe, 0x34, 0x0, 0x1e, 0x50, 0x2f, 0xe5, 0x2b, 0xbe,
+ 0xb0, 0xa0, 0x28, 0x28, 0x75, 0x2a, 0x32, 0x80, 0x23, 0x12, 0x97, 0x1, 0x60,
+ 0x1e, 0x12, 0x97, 0xa, 0xbe, 0xa0, 0xa, 0x28, 0xe, 0x7e, 0x70, 0xa, 0x7e,
+ 0x50, 0x1f, 0xac, 0x5c, 0x19, 0x72, 0x2f, 0xba, 0x80, 0x8, 0xbe, 0xa0, 0x2,
+ 0x28, 0x3, 0x12, 0x97, 0x37, 0x30, 0x0, 0xf, 0x12, 0x97, 0x1, 0xb4, 0x1,
+ 0x9, 0x75, 0x2a, 0x0, 0x7e, 0xa0, 0x1, 0x12, 0x96, 0xc4, 0x12, 0x97, 0x1d,
+ 0x7e, 0x1d, 0x2d, 0x2f, 0x10, 0x7e, 0x8, 0x0, 0x2, 0x12, 0x1, 0xbf, 0x74,
+ 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xd7, 0x59, 0x25, 0x2f, 0xd5, 0x12,
+ 0x96, 0xd7, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xc3, 0x12, 0x96,
+ 0xbb, 0xb, 0x1a, 0x30, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f, 0xcd, 0x12,
+ 0x96, 0xbb, 0x69, 0x31, 0x0, 0x2, 0x74, 0x1f, 0xac, 0xbc, 0x59, 0x35, 0x2f,
+ 0xcf, 0x12, 0x96, 0xf8, 0xbe, 0x71, 0x2a, 0x50, 0x6, 0x7e, 0xa1, 0x2a, 0x12,
+ 0x96, 0xc4, 0x7c, 0xbc, 0x12, 0x90, 0x68, 0x60, 0x6, 0x7e, 0xa1, 0x3b, 0x12,
+ 0x96, 0xc4, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x9, 0x53, 0x2f, 0xba, 0xa, 0x25,
+ 0xbe, 0x27, 0x91, 0xfe, 0x28, 0x42, 0xbe, 0x27, 0x92, 0x0, 0x28, 0x3c, 0xe5,
+ 0x27, 0xbe, 0xb0, 0x1, 0x68, 0xa, 0x49, 0x13, 0x2f, 0xc5, 0x12, 0x96, 0xbb,
+ 0x1b, 0x1a, 0x10, 0xe5, 0x28, 0xbe, 0xb0, 0x1, 0x68, 0xf, 0x74, 0x1f, 0xac,
+ 0xbc, 0x49, 0x35, 0x2f, 0xc7, 0x12, 0x96, 0xce, 0x79, 0x30, 0x0, 0x2, 0x7e,
+ 0x70, 0x1f, 0xac, 0x7c, 0x9, 0xb3, 0x2f, 0xbf, 0x60, 0x2, 0xc1, 0xaf, 0x74,
+ 0x1, 0x19, 0xb3, 0x2f, 0xbf, 0xc1, 0xaf, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5,
+ 0x2f, 0xbf, 0x4c, 0xaa, 0x78, 0x2, 0xa1, 0xcc, 0xe5, 0x29, 0xb4, 0x1, 0x34,
+ 0xbe, 0xa0, 0x2, 0x78, 0x1b, 0x7e, 0x37, 0x91, 0xfe, 0xbe, 0x34, 0x0, 0x3c,
+ 0x38, 0xc, 0x7e, 0x37, 0x92, 0x0, 0xbe, 0x34, 0x0, 0x3c, 0x38, 0x2, 0xa1,
+ 0xcc, 0x7e, 0xa0, 0x4, 0x80, 0x7e, 0x12, 0x96, 0xf8, 0xbe, 0x70, 0x28, 0x28,
+ 0x79, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0, 0x28, 0x72, 0x7e, 0xa0, 0x8, 0x80, 0x6a,
+ 0x7e, 0x27, 0x91, 0xfe, 0xbe, 0x24, 0x0, 0x3b, 0x38, 0xa, 0x7e, 0x37, 0x92,
+ 0x0, 0xbe, 0x34, 0x0, 0x3b, 0x28, 0xa, 0x7e, 0xa0, 0x8, 0x12, 0x96, 0xe0,
+ 0x28, 0x51, 0x80, 0x2a, 0xbe, 0x24, 0x0, 0x27, 0x38, 0x6, 0xbe, 0x34, 0x0,
+ 0x27, 0x28, 0xa, 0x7e, 0xa0, 0x6, 0x12, 0x96, 0xe0, 0x28, 0x3b, 0x80, 0x14,
+ 0xbe, 0x24, 0x0, 0x5, 0x50, 0x6, 0xbe, 0x34, 0x0, 0x5, 0x40, 0x1b, 0x7e,
+ 0xa0, 0x4, 0x12, 0x96, 0xe0, 0x28, 0x25, 0x7e, 0x30, 0x1f, 0xac, 0x3c, 0x2e,
+ 0x14, 0x2f, 0xbd, 0x7e, 0x19, 0xb0, 0xb, 0xb2, 0x7a, 0x19, 0xb0, 0x80, 0x12,
+ 0xbe, 0x24, 0x0, 0x2, 0x50, 0x6, 0xbe, 0x34, 0x0, 0x2, 0x40, 0x6, 0x7e,
+ 0xa0, 0x3, 0x12, 0x97, 0x13, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xbd,
+ 0xbe, 0xa0, 0x1, 0x28, 0x75, 0x7e, 0x70, 0x1f, 0xac, 0x7c, 0x2e, 0x34, 0x2f,
+ 0xbd, 0x7c, 0xba, 0x14, 0x7a, 0x39, 0xb0, 0x7e, 0x37, 0x91, 0xfe, 0xbe,
+ 0x34, 0x0, 0xc8, 0x40, 0x11, 0x7e, 0x37, 0x92, 0x0, 0xbe, 0x34, 0x0, 0xc8,
+ 0x40, 0x7, 0xe5, 0x2b, 0xbe, 0xb0, 0x46, 0x28, 0x46, 0x74, 0x1f, 0xac, 0xbc,
+ 0x9, 0x75, 0x2f, 0xbd, 0xa, 0x27, 0x7e, 0x37, 0x92, 0x2, 0x12, 0x1, 0x20,
+ 0x12, 0x96, 0xef, 0x2d, 0x3, 0x7e, 0x30, 0xd, 0xac, 0x3d, 0x7f, 0x15, 0x2d,
+ 0x31, 0x1b, 0x1a, 0x0, 0x7e, 0x10, 0x1f, 0xac, 0x1c, 0x9, 0x70, 0x2f, 0xbd,
+ 0xa, 0x27, 0x7e, 0x37, 0x92, 0x4, 0x12, 0x1, 0x20, 0x7d, 0x23, 0x49, 0x30,
+ 0x2f, 0xc7, 0x2d, 0x32, 0x2d, 0x1b, 0x7d, 0xa, 0x79, 0x30, 0x0, 0x2, 0x80,
+ 0x5, 0x6c, 0xaa, 0x12, 0x97, 0x13, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x1f, 0xac,
+ 0x7c, 0x19, 0xa3, 0x2f, 0xbe, 0xe4, 0x19, 0xb3, 0x2f, 0xbf, 0x12, 0x96,
+ 0xce, 0xb, 0xa, 0x20, 0x59, 0x23, 0x2f, 0xc5, 0x69, 0x20, 0x0, 0x2, 0x59,
+ 0x23, 0x2f, 0xc7, 0x9, 0xb3, 0x2f, 0xba, 0xbe, 0xb3, 0x92, 0x8, 0x40, 0xa,
+ 0x7e, 0xa3, 0x92, 0x9, 0x19, 0xa3, 0x2f, 0xba, 0x80, 0x2a, 0xbe, 0xb0, 0x1,
+ 0x28, 0x25, 0x2e, 0x34, 0x2f, 0xba, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x1b,
+ 0x74, 0x8, 0xac, 0xbc, 0x7f, 0x16, 0x2d, 0x35, 0x7e, 0x1b, 0xb0, 0x70, 0xe,
+ 0x7c, 0xbc, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x7f, 0x5, 0x2d, 0x13, 0x12, 0xa9,
+ 0x8f, 0xb, 0xd0, 0x12, 0x97, 0x48, 0x28, 0x2, 0x1, 0xc1, 0xda, 0x3b, 0x22,
+ 0x74, 0xd, 0xac, 0xbd, 0x7f, 0x15, 0x2d, 0x35, 0x22, 0x7e, 0x70, 0x1f, 0xac,
+ 0x7c, 0x19, 0xa3, 0x2f, 0xba, 0x22, 0x74, 0xd, 0xac, 0xbd, 0x7f, 0x5, 0x2d,
+ 0x15, 0x22, 0x7e, 0x37, 0x92, 0x0, 0x2e, 0x37, 0x91, 0xfe, 0x22, 0x7e, 0x30,
+ 0x1f, 0xac, 0x3c, 0x19, 0xa1, 0x2f, 0xbd, 0xe5, 0x2b, 0xbe, 0xb0, 0xa0,
+ 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x49, 0x5, 0x2f, 0xc5, 0x22, 0x74, 0x1f, 0xac,
+ 0xbc, 0x9, 0x75, 0x2f, 0xba, 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xb5, 0x2f,
+ 0xbe, 0x22, 0x74, 0x1f, 0xac, 0xbc, 0x9, 0xa5, 0x2f, 0xba, 0x22, 0x7e, 0x70,
+ 0x1f, 0xac, 0x7c, 0x19, 0xa3, 0x2f, 0xbd, 0x22, 0x74, 0x1f, 0xac, 0xbc,
+ 0x49, 0x15, 0x2f, 0xd7, 0x49, 0x5, 0x2f, 0xd5, 0x22, 0x74, 0x1f, 0xac, 0xbc,
+ 0x49, 0x35, 0x2f, 0xd7, 0x49, 0x25, 0x2f, 0xd5, 0x22, 0x7e, 0x70, 0x1f,
+ 0xac, 0x7c, 0x2e, 0x34, 0x2f, 0xba, 0x7c, 0xba, 0x24, 0xfe, 0x7a, 0x39,
+ 0xb0, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7d, 0x22, 0xca, 0x3b, 0x7c,
+ 0xfb, 0x6c, 0xee, 0xe1, 0xe4, 0x6c, 0xdd, 0x80, 0x16, 0x74, 0xd, 0xac, 0xbd,
+ 0x9, 0x65, 0x68, 0x9b, 0x74, 0xd, 0xac, 0xbe, 0x9, 0x75, 0x67, 0x97, 0xbc,
+ 0x67, 0x68, 0x7, 0xb, 0xd0, 0x12, 0x97, 0x48, 0x38, 0xe5, 0x12, 0x97, 0x48,
+ 0x28, 0x6f, 0x7e, 0x50, 0xd, 0xac, 0x5d, 0x9, 0xc2, 0x68, 0x9b, 0x49, 0x42,
+ 0x68, 0x99, 0x74, 0xd, 0xac, 0xbe, 0x49, 0xa5, 0x67, 0x95, 0x7d, 0x3a, 0x9d,
+ 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xa4, 0x80, 0x4, 0x6d, 0xaa,
+ 0x9d, 0xa3, 0x49, 0x42, 0x68, 0x97, 0x49, 0xb5, 0x67, 0x93, 0x7d, 0x3b,
+ 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xb4, 0x80, 0x4, 0x6d,
+ 0xbb, 0x9d, 0xb3, 0x2d, 0xba, 0x74, 0x8, 0xac, 0xbc, 0x9, 0xb5, 0x69, 0x19,
+ 0xb4, 0x1, 0xe, 0x6d, 0xaa, 0x74, 0x2, 0xac, 0xbc, 0x59, 0xa5, 0x2e, 0x7a,
+ 0x59, 0xa5, 0x30, 0xf1, 0x7d, 0x3b, 0x7c, 0xbd, 0x7c, 0x5e, 0x7c, 0x4c,
+ 0x12, 0x97, 0xed, 0xb, 0xe0, 0xbc, 0xfe, 0x28, 0x2, 0xe1, 0x57, 0xda, 0x3b,
+ 0x22, 0x2, 0x97, 0xf0, 0xca, 0x3b, 0x7c, 0xc4, 0x7c, 0xd5, 0x7c, 0xeb, 0x7d,
+ 0xf3, 0x7e, 0xd4, 0xff, 0xfc, 0x7e, 0x7, 0x81, 0xfd, 0xbd, 0x3, 0x38, 0x6,
+ 0x7e, 0x14, 0x1, 0x0, 0x80, 0x19, 0x6d, 0x22, 0x7c, 0x56, 0x7c, 0x67, 0x6c,
+ 0x77, 0x7d, 0x10, 0x12, 0x1, 0x6c, 0x7d, 0x13, 0xbe, 0x14, 0x0, 0x10, 0x50,
+ 0x4, 0x7e, 0x14, 0x0, 0x10, 0x74, 0x2, 0xac, 0xbc, 0x49, 0x5, 0x30, 0xf1,
+ 0xbd, 0xf, 0x28, 0x6, 0x49, 0x15, 0x2e, 0x7a, 0x80, 0x4, 0x59, 0x15, 0x2e,
+ 0x7a, 0x59, 0xf5, 0x30, 0xf1, 0xa, 0xc, 0x9, 0xa0, 0x2e, 0x8e, 0x4c, 0xaa,
+ 0x68, 0x40, 0xbe, 0xa0, 0xff, 0x78, 0xa, 0x7e, 0xf0, 0xff, 0xe4, 0x19, 0xb0,
+ 0x2e, 0x8e, 0x80, 0x29, 0xa, 0x3a, 0x7e, 0xc4, 0x0, 0x8, 0x9d, 0xc3, 0x7d,
+ 0x3c, 0x7c, 0xb7, 0x7e, 0xc4, 0x0, 0x2, 0x60, 0x5, 0x3e, 0xc4, 0x14, 0x78,
+ 0xfb, 0x2e, 0xc4, 0x0, 0x23, 0x7d, 0x3c, 0x7c, 0xf7, 0x2e, 0x4, 0x2e, 0x8e,
+ 0x7c, 0xba, 0x14, 0x7a, 0x9, 0xb0, 0xa, 0xf, 0xbd, 0x1, 0x50, 0x2, 0x7d,
+ 0x10, 0xbe, 0x14, 0x1, 0x0, 0x28, 0x4, 0x7e, 0x14, 0x1, 0x0, 0x7e, 0xa3,
+ 0x69, 0x69, 0xbe, 0xa0, 0x3, 0x40, 0x2, 0x21, 0x1d, 0x7e, 0x50, 0xd, 0xac,
+ 0x5e, 0x49, 0x42, 0x68, 0x97, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x49, 0xc3, 0x67,
+ 0x93, 0x7d, 0xc, 0x9d, 0x4, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc4, 0x80,
+ 0x4, 0x6d, 0xcc, 0x9d, 0xc0, 0x49, 0x22, 0x68, 0x99, 0x49, 0x3, 0x67, 0x95,
+ 0x7d, 0x30, 0x12, 0x64, 0x88, 0x8, 0x4, 0x9d, 0x2, 0x80, 0x4, 0x6d, 0x0,
+ 0x9d, 0x3, 0xbe, 0xc4, 0x5, 0xdc, 0x38, 0x6, 0xbe, 0x4, 0x5, 0xdc, 0x28,
+ 0x38, 0xbe, 0x14, 0x0, 0xfa, 0x28, 0x32, 0x7e, 0x10, 0x2, 0xac, 0x1d, 0x9,
+ 0x70, 0x65, 0x60, 0x9, 0xb0, 0x65, 0x61, 0xbe, 0x70, 0x1, 0x28, 0x20, 0x7e,
+ 0x63, 0x82, 0xe, 0xa, 0x46, 0x1b, 0x45, 0xa, 0x7, 0xbd, 0x4, 0x58, 0x12,
+ 0xbe, 0xb0, 0x1, 0x28, 0xd, 0x12, 0x67, 0xf2, 0xa, 0xb, 0xbd, 0xc, 0x58,
+ 0x4, 0x7e, 0x14, 0x0, 0x77, 0xbe, 0xa0, 0x5, 0x28, 0x4, 0x1e, 0x14, 0x1e,
+ 0x14, 0x7e, 0x90, 0xd, 0xac, 0x9e, 0x49, 0x4, 0x68, 0x97, 0x74, 0xd, 0xac,
+ 0xbd, 0x49, 0xe5, 0x67, 0x93, 0x7d, 0xce, 0x9d, 0xc0, 0xbe, 0xc4, 0x0, 0x0,
+ 0x8, 0x6, 0x7d, 0xfe, 0x9d, 0xf0, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xfc, 0x7d,
+ 0x31, 0xad, 0x3f, 0x7c, 0x76, 0x7c, 0x65, 0xa, 0x24, 0x7d, 0xf3, 0x5d, 0xfd,
+ 0xbd, 0xe0, 0x74, 0xd, 0x28, 0xc, 0x12, 0x99, 0xc8, 0x7d, 0xc0, 0x2d, 0xcf,
+ 0x1b, 0xe8, 0xc0, 0x80, 0x8, 0x12, 0x99, 0xc8, 0x9d, 0xf, 0x1b, 0xe8, 0x0,
+ 0x7e, 0x50, 0xd, 0xac, 0x5e, 0x49, 0x32, 0x68, 0x99, 0x74, 0xd, 0xac, 0xbd,
+ 0x49, 0xe5, 0x67, 0x95, 0x7d, 0xe, 0x9d, 0x3, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x6,
+ 0x7d, 0xfe, 0x9d, 0xf3, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xf0, 0xad, 0x1f, 0x7c,
+ 0x32, 0x7c, 0x21, 0xa, 0x0, 0x7d, 0xf1, 0x5d, 0xfd, 0xbd, 0xe3, 0x28, 0xf,
+ 0x7d, 0xe2, 0x2e, 0xe4, 0x68, 0x99, 0x7d, 0x23, 0x2d, 0x2f, 0x1b, 0xe8,
+ 0x20, 0x80, 0xe, 0x7e, 0x50, 0xd, 0xac, 0x5e, 0x2e, 0x24, 0x68, 0x99, 0x9d,
+ 0x3f, 0x1b, 0x28, 0x30, 0xda, 0x3b, 0x22, 0xac, 0xbe, 0x7d, 0xe5, 0x2e,
+ 0xe4, 0x68, 0x97, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x69, 0x69, 0x70, 0x17,
+ 0xe4, 0x7a, 0xb3, 0x69, 0x72, 0x12, 0x9b, 0xf6, 0x28, 0x1f, 0x74, 0x1, 0x7a,
+ 0xb3, 0x69, 0x6e, 0xe4, 0x7a, 0xb3, 0x69, 0x71, 0x80, 0x12, 0x74, 0x1, 0x7a,
+ 0xb3, 0x69, 0x72, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x6, 0x74, 0x1, 0x7a, 0xb3,
+ 0x69, 0x6d, 0x12, 0x9b, 0xfe, 0xca, 0x59, 0x7e, 0x18, 0x67, 0x93, 0x7e, 0x8,
+ 0x68, 0x15, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x7e, 0x73, 0x69, 0xd0, 0xbe, 0x70,
+ 0x0, 0x28, 0x25, 0x6c, 0xff, 0x80, 0x1c, 0x74, 0xd, 0xac, 0xbf, 0x12, 0x9a,
+ 0x4c, 0x74, 0xd, 0xac, 0xbf, 0x59, 0x35, 0x68, 0x15, 0x12, 0x9a, 0xcc, 0x74,
+ 0xd, 0xac, 0xbf, 0x59, 0x35, 0x68, 0x17, 0xb, 0xf0, 0x12, 0x9a, 0x45, 0x38,
+ 0xdf, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x75, 0x8c, 0xbc, 0x7f, 0x22, 0x49,
+ 0x35, 0x67, 0x93, 0x7e, 0xe7, 0x76, 0x1b, 0x7d, 0xfe, 0x7e, 0xb3, 0x69,
+ 0xd0, 0x70, 0x1, 0x22, 0x7e, 0xb3, 0x76, 0x16, 0xb4, 0x1, 0x8, 0x7e, 0x27,
+ 0x76, 0x29, 0x1b, 0x24, 0x80, 0x4, 0x7d, 0x2e, 0x1b, 0x24, 0x7e, 0xb3, 0x76,
+ 0x1f, 0xa, 0xeb, 0xbd, 0xe3, 0x28, 0x1f, 0x7d, 0xe, 0x9d, 0x3, 0x7e, 0x17,
+ 0x76, 0x21, 0x12, 0x9a, 0xc3, 0xa, 0x5b, 0x6d, 0x44, 0xbf, 0x2, 0x40, 0x4,
+ 0x7f, 0x2, 0x1b, 0xc, 0x1b, 0x2c, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x27, 0x7e,
+ 0xb3, 0x76, 0x20, 0x12, 0x9b, 0x50, 0x50, 0x1c, 0x7d, 0x3, 0x9d, 0xe, 0x7e,
+ 0x17, 0x76, 0x23, 0x12, 0x9a, 0xc3, 0xa, 0xdb, 0x6d, 0xcc, 0xbf, 0x6, 0x40,
+ 0x4, 0x7f, 0x6, 0x1b, 0xc, 0x12, 0x9b, 0x47, 0x80, 0x2, 0x7d, 0x13, 0x7d,
+ 0x31, 0x22, 0xad, 0x10, 0x6d, 0x0, 0x7c, 0x32, 0x7c, 0x21, 0x22, 0x49, 0x35,
+ 0x67, 0x95, 0x9f, 0x0, 0x7e, 0xe7, 0x76, 0x29, 0x7d, 0xfe, 0x7e, 0xb3, 0x69,
+ 0xd0, 0x70, 0x1, 0x22, 0x7e, 0xb3, 0x76, 0x16, 0xb4, 0x1, 0x6, 0x7e, 0x27,
+ 0x76, 0x1b, 0x80, 0x2, 0x7d, 0x2e, 0x7e, 0xb3, 0x76, 0x2d, 0xa, 0xeb, 0xbd,
+ 0xe3, 0x28, 0x1f, 0x7d, 0xe, 0x9d, 0x3, 0x7e, 0x17, 0x76, 0x2f, 0x12, 0x9a,
+ 0xc3, 0x1a, 0x0, 0xa, 0x5b, 0x6d, 0x44, 0xbf, 0x2, 0x48, 0x4, 0x7f, 0x2,
+ 0x1b, 0xc, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x2d, 0x7e, 0xb3, 0x76, 0x2e, 0x12,
+ 0x9b, 0x50, 0x50, 0x22, 0xbd, 0x23, 0x40, 0x20, 0x7d, 0x3, 0x9d, 0xe, 0x7e,
+ 0x17, 0x76, 0x31, 0x12, 0x9a, 0xc3, 0x1a, 0x0, 0xa, 0xdb, 0x6d, 0xcc, 0xbf,
+ 0x6, 0x48, 0x4, 0x7f, 0x6, 0x1b, 0xc, 0x12, 0x9b, 0x47, 0x80, 0x2, 0x7d,
+ 0x13, 0x7d, 0x31, 0x22, 0x7d, 0x5f, 0x9d, 0x54, 0x6d, 0x44, 0x2f, 0x2, 0x22,
+ 0xa, 0x4b, 0x7d, 0xe2, 0x9d, 0xe4, 0xbd, 0xe3, 0x22, 0xca, 0x3b, 0x7c, 0xf7,
+ 0x7c, 0xeb, 0x74, 0xd, 0xac, 0xbe, 0x12, 0x9a, 0x4c, 0x7d, 0x63, 0x74, 0xd,
+ 0xac, 0xbe, 0x12, 0x9a, 0xcc, 0x7d, 0x23, 0x12, 0x8f, 0xf4, 0x19, 0xa3,
+ 0x36, 0xff, 0x7e, 0xb3, 0x59, 0x47, 0xb4, 0x1, 0xe, 0x7e, 0x84, 0x0, 0x2d,
+ 0x7e, 0x94, 0x4, 0xa, 0x7e, 0xa4, 0x0, 0x37, 0x80, 0xc, 0x7e, 0x84, 0x0,
+ 0x1e, 0x7e, 0x94, 0x4, 0x19, 0x7e, 0xa4, 0x0, 0x19, 0x7e, 0xb4, 0x8, 0xe7,
+ 0xbd, 0x86, 0x28, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x48, 0xbe, 0x24, 0x8,
+ 0xe7, 0x38, 0x42, 0x74, 0x1, 0x80, 0x3a, 0xbd, 0x96, 0x50, 0x10, 0xbe, 0x24,
+ 0x0, 0x0, 0x40, 0x34, 0xbe, 0x24, 0x8, 0xe7, 0x38, 0x2e, 0x74, 0x2, 0x80,
+ 0x26, 0xbd, 0xa2, 0x28, 0x10, 0xbe, 0x64, 0x0, 0x0, 0x40, 0x20, 0xbe, 0x64,
+ 0x4, 0x37, 0x38, 0x1a, 0x74, 0x3, 0x80, 0x12, 0xbd, 0xb2, 0x50, 0x12, 0xbe,
+ 0x64, 0x0, 0x0, 0x40, 0xc, 0xbe, 0x64, 0x4, 0x37, 0x38, 0x6, 0x74, 0x4,
+ 0x19, 0xb3, 0x36, 0xff, 0x9, 0xb3, 0x36, 0xff, 0xda, 0x3b, 0x22, 0x7e, 0x73,
+ 0x69, 0x6a, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xa3, 0x75, 0x8c, 0x74, 0xd, 0xa4,
+ 0x22, 0xca, 0x79, 0x7e, 0xf3, 0x69, 0x69, 0x7e, 0xe3, 0x69, 0x6a, 0x7c,
+ 0xbf, 0x7c, 0x7e, 0x12, 0x9c, 0x47, 0x7c, 0xbf, 0x12, 0x9c, 0xa1, 0x4c,
+ 0xee, 0x78, 0x14, 0x12, 0x9b, 0xfe, 0xca, 0x59, 0x7e, 0x18, 0x67, 0x93,
+ 0x7e, 0x8, 0x68, 0x97, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0x80, 0xb, 0x7e, 0xb3,
+ 0x69, 0x70, 0x70, 0x5, 0x7c, 0xbf, 0x12, 0x97, 0x4f, 0x7c, 0xbf, 0x12, 0x9e,
+ 0x14, 0xda, 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xa5, 0xbf, 0x0, 0xd, 0xbe,
+ 0x60, 0x0, 0x28, 0x5, 0xe4, 0x7a, 0xb3, 0x69, 0x70, 0x2, 0x67, 0x84, 0xa5,
+ 0xbe, 0x0, 0x12, 0x6c, 0xaa, 0x80, 0x9, 0x12, 0x9e, 0xb, 0x19, 0x62, 0x68,
+ 0x9b, 0xb, 0xa0, 0x12, 0x3f, 0x50, 0x38, 0xf2, 0x6c, 0xaa, 0x80, 0x26, 0x7e,
+ 0x30, 0xd, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x93, 0xb, 0x18, 0x20, 0x12, 0x16,
+ 0xf8, 0x1b, 0x18, 0x20, 0x7e, 0x30, 0xd, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x95,
+ 0xb, 0x18, 0x20, 0x12, 0x16, 0xf8, 0x1b, 0x18, 0x20, 0xb, 0xa0, 0xbc, 0x7a,
+ 0x38, 0xd6, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x7e, 0xf3, 0x75, 0x8c, 0x7e,
+ 0x70, 0xd, 0xac, 0x7f, 0x7e, 0x8, 0x91, 0xfe, 0x74, 0xff, 0x12, 0x0, 0x2e,
+ 0xe4, 0x6c, 0x77, 0x7c, 0x6e, 0x12, 0x9d, 0x1c, 0x7c, 0x7e, 0x7c, 0x6f,
+ 0x12, 0x9d, 0x1c, 0x7c, 0x1b, 0x6c, 0x0, 0x80, 0x36, 0x6c, 0x99, 0x80, 0x17,
+ 0x74, 0xd, 0xac, 0xb9, 0x9, 0xa5, 0x92, 0x2, 0x7e, 0x30, 0xd, 0xac, 0x30,
+ 0x9, 0x81, 0x67, 0x97, 0xbc, 0x8a, 0x68, 0x6, 0xb, 0x90, 0xbc, 0x19, 0x38,
+ 0xe5, 0xbc, 0x19, 0x78, 0x11, 0x7e, 0x70, 0xd, 0xac, 0x70, 0x12, 0x9d, 0xfb,
+ 0xac, 0x31, 0x2e, 0x14, 0x91, 0xfe, 0x12, 0x9e, 0x3, 0xb, 0x0, 0xbc, 0xf0,
+ 0x38, 0xc6, 0x74, 0xd, 0xac, 0xbf, 0xca, 0x59, 0x7e, 0x18, 0x91, 0xfe, 0x7e,
+ 0x8, 0x68, 0x97, 0x12, 0x0, 0x6e, 0x1b, 0xfd, 0xda, 0x79, 0x22, 0x7e, 0x8,
+ 0x91, 0xfe, 0xca, 0x69, 0xca, 0xf8, 0x7f, 0x70, 0x7c, 0x86, 0x7c, 0xf7,
+ 0x7c, 0xab, 0x6c, 0x99, 0xa1, 0xe0, 0x7c, 0x3f, 0xa1, 0xd8, 0x7e, 0x10, 0xd,
+ 0xac, 0x19, 0x9, 0x20, 0x68, 0x9b, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0xb0,
+ 0x67, 0x97, 0xbc, 0xb2, 0x68, 0x2, 0xa1, 0xd6, 0xbe, 0x20, 0xff, 0x78, 0x2,
+ 0xa1, 0xd6, 0x7e, 0xd0, 0x8, 0xac, 0xd2, 0x9, 0xb6, 0x69, 0x19, 0x70, 0xa,
+ 0x7d, 0x30, 0x2e, 0x34, 0x67, 0x93, 0x6d, 0x22, 0x80, 0xb, 0x7e, 0x70, 0xd,
+ 0xac, 0x79, 0x2e, 0x34, 0x68, 0x97, 0x6d, 0x22, 0x29, 0x11, 0x0, 0x4, 0x12,
+ 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x4, 0xb, 0x1a, 0x0, 0x12, 0x9d, 0xf1, 0x1b,
+ 0x6a, 0x0, 0x69, 0x1, 0x0, 0x2, 0x12, 0x9d, 0xf1, 0x79, 0x6, 0x0, 0x2, 0x7e,
+ 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67, 0x98, 0x12, 0x9d, 0xf1, 0x39, 0x16,
+ 0x0, 0x5, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67, 0x99, 0x12, 0x9d,
+ 0xf1, 0x39, 0x16, 0x0, 0x6, 0x7e, 0x10, 0xd, 0xac, 0x13, 0x9, 0x10, 0x67,
+ 0x9a, 0x12, 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x7, 0x7e, 0x10, 0xd, 0xac, 0x13,
+ 0x9, 0x10, 0x67, 0x9b, 0x12, 0x9d, 0xf1, 0x39, 0x16, 0x0, 0x8, 0xb, 0xa0,
+ 0x80, 0x8, 0xb, 0x30, 0xbc, 0x83, 0x28, 0x2, 0xa1, 0x34, 0xb, 0x90, 0x7e,
+ 0x23, 0x75, 0x8c, 0xbc, 0x29, 0x28, 0x2, 0xa1, 0x30, 0x7c, 0xba, 0xda, 0xf8,
+ 0xda, 0x69, 0x22, 0x7e, 0xd0, 0xd, 0xac, 0xda, 0x7f, 0x67, 0x2d, 0xd6, 0x22,
+ 0x2e, 0x34, 0x67, 0x93, 0x7e, 0x30, 0xd, 0x22, 0x74, 0xd, 0x12, 0x1, 0xf3,
+ 0xb, 0x10, 0x22, 0x7e, 0x60, 0xff, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x22, 0x6c,
+ 0xaa, 0x80, 0x63, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x49, 0x32, 0x68, 0x97, 0x12,
+ 0x4e, 0x2e, 0x59, 0x32, 0x67, 0x93, 0x7e, 0x50, 0xd, 0xac, 0x5a, 0x49, 0x32,
+ 0x68, 0x99, 0x12, 0x4e, 0x2e, 0x59, 0x32, 0x67, 0x95, 0x7e, 0x90, 0xd, 0xac,
+ 0x9a, 0x9, 0xb4, 0x68, 0x9b, 0x19, 0xb4, 0x67, 0x97, 0x7e, 0x90, 0xd, 0xac,
+ 0x9a, 0x9, 0xb4, 0x68, 0x9c, 0x19, 0xb4, 0x67, 0x98, 0x7e, 0x90, 0xd, 0xac,
+ 0x9a, 0x9, 0xb4, 0x68, 0x9d, 0x19, 0xb4, 0x67, 0x99, 0x7e, 0x90, 0xd, 0xac,
+ 0x9a, 0x9, 0xb4, 0x68, 0x9e, 0x19, 0xb4, 0x67, 0x9a, 0x7e, 0x90, 0xd, 0xac,
+ 0x9a, 0x9, 0xb4, 0x68, 0x9f, 0x19, 0xb4, 0x67, 0x9b, 0xb, 0xa0, 0x12, 0x3c,
+ 0x72, 0x38, 0x98, 0x22, 0xca, 0x3b, 0x6d, 0xdd, 0x7d, 0x8d, 0x7e, 0x73,
+ 0x69, 0x69, 0x7a, 0x71, 0x3b, 0xbe, 0x70, 0x0, 0x28, 0x1a, 0x7e, 0x37, 0x36,
+ 0xf3, 0xb, 0x34, 0x7a, 0x37, 0x36, 0xf3, 0xbe, 0x34, 0x0, 0x64, 0x28, 0xe,
+ 0x7e, 0x34, 0x0, 0x64, 0x7a, 0x37, 0x36, 0xf3, 0x80, 0x4, 0x7a, 0xd7, 0x36,
+ 0xf3, 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0x4, 0x74, 0x3, 0x80, 0x7, 0x7e,
+ 0xb3, 0x36, 0xa2, 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x36, 0xa2, 0x7e, 0xd7, 0x2e,
+ 0x78, 0xbe, 0xd7, 0x9b, 0xa9, 0x28, 0x12, 0x7e, 0x54, 0xff, 0xff, 0x9e,
+ 0x57, 0x2e, 0x78, 0x2e, 0x57, 0x9b, 0xa9, 0xb, 0x54, 0xf5, 0x3a, 0x80, 0xa,
+ 0x7e, 0x57, 0x9b, 0xa9, 0x9e, 0x57, 0x2e, 0x78, 0xf5, 0x3a, 0x7e, 0xd7,
+ 0x9b, 0xa9, 0x7a, 0xd7, 0x2e, 0x78, 0x7e, 0xb3, 0x69, 0x70, 0x60, 0x3, 0x2,
+ 0xa8, 0x17, 0xc2, 0x28, 0x7e, 0xa4, 0x67, 0x93, 0x7e, 0x8, 0x92, 0xd2, 0x12,
+ 0xd5, 0x86, 0xe5, 0x3b, 0x60, 0x6, 0x7e, 0xb3, 0x69, 0x6a, 0x70, 0x3c, 0x6c,
+ 0xff, 0x6c, 0xaa, 0x80, 0x2e, 0xa, 0x4f, 0x19, 0xa4, 0x36, 0x8e, 0xe4, 0x19,
+ 0xb4, 0x36, 0x98, 0x6d, 0xdd, 0x7e, 0x70, 0x2, 0xac, 0x7f, 0x59, 0xd3, 0x36,
+ 0xcb, 0x59, 0xd3, 0x36, 0xdf, 0x7e, 0x70, 0xff, 0x7e, 0x50, 0xd, 0xac, 0x5f,
+ 0x19, 0x72, 0x31, 0x10, 0x74, 0x1, 0x19, 0xb4, 0x36, 0xf5, 0xb, 0xf0, 0x7e,
+ 0xb3, 0x75, 0x8c, 0xbc, 0xbf, 0x38, 0xca, 0xe4, 0x7a, 0xb3, 0x2e, 0x77,
+ 0x7e, 0xb3, 0x2f, 0xb9, 0x60, 0x6, 0x7e, 0xb3, 0x82, 0x4, 0x60, 0xb, 0x12,
+ 0xa8, 0xe6, 0x60, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0x77, 0x6c, 0xff, 0x2,
+ 0xa6, 0x76, 0x7e, 0x50, 0xd, 0xac, 0x5f, 0x9, 0xe2, 0x67, 0x97, 0x5e, 0xe0,
+ 0xf, 0x12, 0x8b, 0xd5, 0x38, 0x3, 0x2, 0xa6, 0x74, 0x7e, 0x10, 0x8, 0xac,
+ 0x1e, 0x9, 0xa0, 0x69, 0x19, 0xbe, 0xa0, 0x1, 0x78, 0x3, 0x2, 0xa6, 0x51,
+ 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x7d, 0x13, 0x2e, 0x14, 0x36, 0xcb, 0xb, 0x18,
+ 0xd0, 0xb, 0xd4, 0x1b, 0x18, 0xd0, 0x4c, 0xaa, 0x78, 0x1a, 0x49, 0x42, 0x67,
+ 0x93, 0x74, 0x4, 0xac, 0xbe, 0x59, 0x45, 0x36, 0xa3, 0x49, 0x22, 0x67, 0x95,
+ 0x59, 0x25, 0x36, 0xa5, 0x6d, 0xdd, 0x59, 0xd3, 0x36, 0xdf, 0x6c, 0xdd, 0x2,
+ 0xa6, 0x47, 0x7e, 0x10, 0xd, 0xac, 0x1d, 0x9, 0xc0, 0x31, 0x10, 0xbc, 0xce,
+ 0x68, 0x3, 0x2, 0xa6, 0x45, 0x7e, 0x70, 0x73, 0xac, 0x7c, 0x2e, 0x34, 0x32,
+ 0x10, 0x6d, 0x22, 0x7a, 0x1d, 0x2e, 0x12, 0xd9, 0x5b, 0x49, 0x10, 0x31, 0xc,
+ 0x49, 0x0, 0x31, 0xe, 0x12, 0xbc, 0x36, 0x7d, 0x93, 0x12, 0xd9, 0x5b, 0x74,
+ 0x4, 0xac, 0xbc, 0x49, 0x15, 0x36, 0xa3, 0x49, 0x5, 0x36, 0xa5, 0x12, 0xbc,
+ 0x36, 0x7a, 0x35, 0x2c, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x7d, 0xd3, 0x2e, 0xd4,
+ 0x36, 0xdf, 0xb, 0xd8, 0x20, 0x2d, 0x29, 0x1b, 0xd8, 0x20, 0x49, 0x23, 0x36,
+ 0xdf, 0xbe, 0x24, 0xf, 0xa0, 0x28, 0x8, 0x7e, 0x24, 0xf, 0xa0, 0x59, 0x23,
+ 0x36, 0xdf, 0xe5, 0x3a, 0x7a, 0xb3, 0x92, 0x8d, 0x7e, 0x50, 0xd, 0xac, 0x5f,
+ 0x2d, 0x2a, 0x9, 0x32, 0x0, 0x6, 0x7a, 0x33, 0x92, 0x8f, 0x7a, 0x97, 0x92,
+ 0x96, 0x7e, 0xd5, 0x2c, 0x7a, 0xd7, 0x92, 0x98, 0xb, 0x28, 0xd0, 0x7a, 0xd7,
+ 0x92, 0x9a, 0x49, 0x22, 0x0, 0x2, 0x7a, 0x27, 0x92, 0x9c, 0x49, 0x23, 0x36,
+ 0xcb, 0x7a, 0x27, 0x92, 0x9e, 0x49, 0xd3, 0x36, 0xdf, 0x7a, 0xd7, 0x92,
+ 0xa2, 0x74, 0xd, 0xac, 0xbd, 0x49, 0xd5, 0x31, 0xc, 0x7e, 0x47, 0x92, 0x9a,
+ 0x9d, 0x4d, 0x7a, 0x47, 0x92, 0x92, 0x49, 0x35, 0x31, 0xe, 0x7e, 0xd7, 0x92,
+ 0x9c, 0x9d, 0xd3, 0x7a, 0xd7, 0x92, 0x94, 0xa, 0xdc, 0x9, 0xad, 0x36, 0x8e,
+ 0xbe, 0xa0, 0x0, 0x28, 0x16, 0x12, 0xd9, 0xb7, 0x2e, 0x34, 0xff, 0xe9, 0x7e,
+ 0x14, 0x92, 0xa4, 0x74, 0x17, 0x12, 0x2, 0x3d, 0x7e, 0x87, 0x92, 0xad, 0x80,
+ 0x9, 0x7e, 0x8, 0x92, 0xa4, 0x12, 0xda, 0xe4, 0x6d, 0x88, 0xa, 0xdc, 0x9,
+ 0xad, 0x36, 0x8e, 0xbe, 0xa0, 0x2, 0x40, 0x12, 0x12, 0xd9, 0xb7, 0x2e, 0x34,
+ 0xff, 0xd2, 0x7e, 0x14, 0x92, 0xbb, 0x74, 0x17, 0x12, 0x2, 0x3d, 0x80, 0x7,
+ 0x7e, 0x8, 0x92, 0xbb, 0x12, 0xda, 0xe4, 0x6d, 0xdd, 0x7a, 0xd5, 0x28, 0x75,
+ 0x27, 0x0, 0x80, 0x12, 0x7e, 0xa1, 0x27, 0x12, 0xd9, 0xb7, 0x69, 0xd1, 0x0,
+ 0x9, 0x2e, 0xd5, 0x28, 0x7a, 0xd5, 0x28, 0x5, 0x27, 0xa, 0xdc, 0x9, 0x7d,
+ 0x36, 0x8e, 0xbe, 0x71, 0x27, 0x38, 0xe3, 0xbe, 0x70, 0x0, 0x28, 0xa, 0xa,
+ 0x27, 0x7e, 0x35, 0x28, 0x8d, 0x32, 0x7a, 0x35, 0x28, 0x7e, 0xd5, 0x28,
+ 0x7a, 0xd7, 0x92, 0xa0, 0x12, 0x67, 0xcb, 0xc2, 0x3, 0xc2, 0x4, 0xa, 0xdc,
+ 0x9, 0xbd, 0x36, 0xf5, 0x60, 0x2, 0x41, 0x6e, 0x7e, 0xa1, 0x3a, 0x74, 0x6,
+ 0xa4, 0x7d, 0xd5, 0x2e, 0xd4, 0x0, 0x14, 0xbd, 0xd8, 0x50, 0x6, 0xbd, 0xd9,
+ 0x50, 0x2, 0xd2, 0x28, 0x7e, 0xa3, 0x92, 0xa4, 0x74, 0x6, 0xa4, 0xbe, 0x57,
+ 0x92, 0xad, 0x50, 0x19, 0x7e, 0xa3, 0x92, 0xbb, 0x74, 0x6, 0xa4, 0xbe, 0x57,
+ 0x92, 0xc4, 0x50, 0xc, 0x7e, 0xd7, 0x92, 0xb7, 0xbe, 0xd4, 0x0, 0x14, 0x28,
+ 0x2, 0xd2, 0x1, 0xa2, 0x1, 0xe4, 0x33, 0x7a, 0xb3, 0x92, 0x90, 0x7e, 0xa1,
+ 0x3a, 0x74, 0x1e, 0xa4, 0x7d, 0xd5, 0x2d, 0xd8, 0xbd, 0xd9, 0x50, 0x4, 0xd2,
+ 0x3, 0x80, 0x12, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x38, 0xbd, 0x39, 0x50, 0x8,
+ 0xbe, 0x94, 0x0, 0x6e, 0x28, 0x2, 0xd2, 0x4, 0x30, 0x3, 0x6, 0xd2, 0x2,
+ 0x74, 0x64, 0x80, 0x14, 0x30, 0x4, 0xf, 0x30, 0x1, 0x6, 0xc2, 0x2, 0x74,
+ 0xa, 0x80, 0x8, 0xd2, 0x2, 0x74, 0xc8, 0x80, 0x2, 0x74, 0x14, 0x7a, 0xb3,
+ 0x92, 0x8e, 0x20, 0x2, 0x2, 0x41, 0x43, 0x7e, 0xd7, 0x92, 0xa0, 0xbe, 0xd4,
+ 0x0, 0xa, 0x28, 0x7b, 0x7e, 0xd7, 0x92, 0xb7, 0xbe, 0xd4, 0x0, 0xa, 0x28,
+ 0x71, 0x7e, 0xd7, 0x92, 0xce, 0xbe, 0xd4, 0x0, 0xa, 0x28, 0x67, 0x7e, 0xc7,
+ 0x92, 0xa9, 0x2e, 0xc7, 0x92, 0xb1, 0xbe, 0xc4, 0x0, 0x0, 0x58, 0x2, 0x6d,
+ 0xcc, 0x7e, 0xb7, 0x92, 0xab, 0x2e, 0xb7, 0x92, 0xb3, 0xbe, 0xb4, 0x0, 0x0,
+ 0x58, 0x2, 0x6d, 0xbb, 0x12, 0xd9, 0xae, 0x7d, 0x1c, 0x7d, 0xb, 0x12, 0xbc,
+ 0x36, 0x7d, 0xc3, 0x7e, 0xd7, 0x92, 0xb9, 0xbe, 0xd4, 0xf, 0xa0, 0x40, 0xa,
+ 0x7e, 0x27, 0x92, 0xb7, 0x7e, 0x34, 0x0, 0xa, 0x80, 0x13, 0x12, 0xdb, 0xc7,
+ 0x7e, 0x27, 0x92, 0xb7, 0x28, 0x6, 0x7e, 0x34, 0x0, 0x6, 0x80, 0x4, 0x7e,
+ 0x34, 0x0, 0x3, 0xad, 0x32, 0x7a, 0x35, 0x2a, 0x7e, 0xd5, 0x2a, 0xbd, 0xdc,
+ 0x28, 0x8, 0xc2, 0x2, 0x74, 0x28, 0x7a, 0xb3, 0x92, 0x8e, 0x7e, 0xb3, 0x2e,
+ 0x77, 0xb4, 0x1, 0xc, 0xc2, 0x2, 0xe4, 0x12, 0xd8, 0x87, 0x74, 0x6e, 0x7a,
+ 0xb3, 0x92, 0x8e, 0x7e, 0xa1, 0x3a, 0x74, 0xe, 0xa4, 0x7a, 0x55, 0x38, 0xbe,
+ 0x54, 0x0, 0xc8, 0x28, 0x2a, 0x7e, 0xd4, 0x0, 0xc8, 0x7a, 0xd5, 0x38, 0x80,
+ 0x21, 0xa, 0xdc, 0x2e, 0xd4, 0x36, 0xf5, 0x7e, 0xd9, 0xb0, 0x14, 0x7a, 0xd9,
+ 0xb0, 0x7e, 0xd4, 0x0, 0xb4, 0x7a, 0xd5, 0x38, 0x74, 0x78, 0x7a, 0xb3, 0x92,
+ 0x8e, 0xd2, 0x2, 0xe4, 0x7a, 0xb3, 0x92, 0x90, 0xa2, 0x2, 0xe4, 0x33, 0x7a,
+ 0xb3, 0x92, 0x91, 0xa, 0xdc, 0x9, 0xad, 0x36, 0x98, 0x4c, 0xaa, 0x78, 0x18,
+ 0x7e, 0xd5, 0x38, 0xbd, 0xd9, 0x40, 0x2, 0x81, 0xca, 0x20, 0x2, 0x2, 0x81,
+ 0xca, 0x74, 0x1, 0xa, 0x4c, 0x19, 0xb4, 0x36, 0x98, 0x81, 0xca, 0xbe, 0xa0,
+ 0x1, 0x68, 0x2, 0x81, 0x9e, 0x7e, 0x37, 0x92, 0xce, 0xbe, 0x34, 0x0, 0x3,
+ 0x50, 0x2d, 0x7e, 0x27, 0x92, 0xad, 0xbe, 0x24, 0x0, 0x50, 0x50, 0x23, 0x7e,
+ 0x27, 0x92, 0x9e, 0xbe, 0x24, 0x0, 0x14, 0x50, 0x19, 0x7e, 0x27, 0x92, 0xc6,
+ 0xbe, 0x24, 0x0, 0x1e, 0x50, 0xf, 0x7e, 0x27, 0x92, 0xaf, 0xbe, 0x24, 0x0,
+ 0x50, 0x50, 0x5, 0x7a, 0x85, 0x2a, 0x61, 0xcd, 0x7e, 0x27, 0x92, 0x9e, 0xbe,
+ 0x24, 0x0, 0xa, 0x50, 0x13, 0x7e, 0x27, 0x92, 0xb7, 0xbe, 0x24, 0x0, 0x8,
+ 0x28, 0x9, 0x7e, 0x53, 0x92, 0x8f, 0xbe, 0x50, 0xf, 0x40, 0x15, 0x7e, 0x27,
+ 0x92, 0xb7, 0xbe, 0x24, 0x0, 0xf, 0x28, 0x42, 0xbe, 0x34, 0x0, 0xf, 0x28,
+ 0x3c, 0x12, 0xdb, 0xc7, 0x50, 0x37, 0x7e, 0xa3, 0x92, 0xa4, 0xa, 0xa, 0x7d,
+ 0x18, 0x8d, 0x10, 0x7d, 0x1, 0x1e, 0x4, 0x12, 0xda, 0xb, 0xbe, 0x14, 0x0,
+ 0x78, 0x28, 0x7, 0x7e, 0x34, 0x0, 0x78, 0x7a, 0x35, 0x2a, 0xbe, 0xa0, 0xa,
+ 0x38, 0x2, 0x61, 0xcd, 0x7e, 0x35, 0x2a, 0xbe, 0x34, 0x0, 0x50, 0x50, 0x76,
+ 0x7e, 0x34, 0x0, 0x50, 0x7a, 0x35, 0x2a, 0x80, 0x6d, 0x7e, 0x73, 0x92, 0xa4,
+ 0xa, 0x7, 0x7e, 0x17, 0x92, 0xad, 0x8d, 0x10, 0x7d, 0x1, 0x12, 0xda, 0xb,
+ 0x7e, 0xa3, 0x92, 0xa6, 0x74, 0x2, 0xa4, 0x7e, 0x73, 0x92, 0x8f, 0xa, 0xd7,
+ 0xbd, 0xd5, 0x8, 0x2b, 0xbe, 0x24, 0x0, 0x1e, 0x50, 0x25, 0x7e, 0x63, 0x92,
+ 0xbd, 0xa, 0x16, 0x7d, 0x2d, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4,
+ 0x9d, 0xd1, 0x80, 0x4, 0x6d, 0xdd, 0x9d, 0xd2, 0xbe, 0xd4, 0x0, 0x5, 0x8,
+ 0x7, 0x12, 0xdb, 0xbf, 0x50, 0x22, 0x80, 0xa, 0xbe, 0x70, 0xf, 0x28, 0xb,
+ 0x12, 0xdb, 0xbf, 0x28, 0x16, 0x7e, 0xd4, 0x0, 0xc8, 0x80, 0xd, 0x7e, 0xd5,
+ 0x2a, 0xbe, 0xd4, 0x0, 0x78, 0x28, 0x7, 0x7e, 0xd4, 0x0, 0x78, 0x7a, 0xd5,
+ 0x2a, 0x7e, 0xd5, 0x2a, 0xbd, 0xd9, 0x28, 0x42, 0xd2, 0x0, 0x7e, 0xd7, 0x92,
+ 0x9e, 0xbe, 0xd4, 0x0, 0x8, 0x50, 0x11, 0x12, 0xda, 0xdb, 0x28, 0xc, 0x74,
+ 0x2, 0xa, 0x3c, 0x19, 0xb3, 0x36, 0x98, 0xc2, 0x0, 0x80, 0x7a, 0x7e, 0x37,
+ 0x92, 0xc6, 0xbe, 0x34, 0x0, 0x64, 0x28, 0x70, 0x12, 0xda, 0xdb, 0x28, 0x6b,
+ 0xbe, 0xd4, 0x0, 0x14, 0x50, 0x65, 0x7e, 0x73, 0x92, 0x8f, 0xbe, 0x70, 0x14,
+ 0x50, 0x5c, 0x12, 0xd8, 0x85, 0xc2, 0x0, 0x80, 0x55, 0x7e, 0xd5, 0x38, 0xbd,
+ 0xd9, 0x50, 0x8, 0x30, 0x2, 0x5, 0x74, 0x3, 0x12, 0xd8, 0x87, 0x7e, 0xd7,
+ 0x92, 0x9e, 0xbe, 0xd4, 0x0, 0x1e, 0x50, 0x3c, 0x7e, 0x73, 0x2e, 0x99, 0xbe,
+ 0x70, 0x2, 0x28, 0x18, 0x7e, 0xb3, 0x92, 0xa7, 0x70, 0x12, 0x12, 0xda, 0xd2,
+ 0x50, 0xd, 0x12, 0xd9, 0xae, 0x12, 0xaa, 0xf, 0x50, 0x20, 0x12, 0xd8, 0x85,
+ 0x80, 0x1b, 0x12, 0xda, 0xd2, 0x50, 0x16, 0x7e, 0xd7, 0x92, 0x98, 0xbe,
+ 0xd4, 0x0, 0x1e, 0x50, 0xc, 0x7e, 0xd7, 0x36, 0xf3, 0xbe, 0xd4, 0x0, 0x78,
+ 0x50, 0x2, 0xd2, 0x0, 0xa, 0xdc, 0x9, 0x8d, 0x36, 0x98, 0xbe, 0x80, 0x1,
+ 0x78, 0x1f, 0x12, 0xd9, 0xae, 0x7e, 0x17, 0x92, 0xc8, 0x7e, 0x7, 0x92, 0xca,
+ 0x12, 0xbc, 0x36, 0xbe, 0x34, 0x0, 0x3c, 0x50, 0x3c, 0xc2, 0x0, 0xe4, 0xa,
+ 0xdc, 0x19, 0xbd, 0x36, 0x8e, 0x80, 0x31, 0xbe, 0x80, 0x3, 0x78, 0x30, 0x74,
+ 0x1, 0x80, 0x29, 0xa, 0xdc, 0x9, 0xbd, 0x36, 0x98, 0xb4, 0x2, 0x23, 0x7e,
+ 0x73, 0x92, 0xbb, 0xa, 0x27, 0x7e, 0x37, 0x92, 0xc4, 0x8d, 0x32, 0x7d, 0x23,
+ 0x1e, 0x24, 0xe5, 0x3a, 0xa, 0x3b, 0xad, 0x32, 0x7a, 0x35, 0x2a, 0xbd, 0x39,
+ 0x28, 0x2, 0xd2, 0x0, 0xe4, 0x12, 0xd8, 0x87, 0x7e, 0xa1, 0x3a, 0x74, 0x5a,
+ 0xa4, 0x7a, 0x55, 0x32, 0xbe, 0x54, 0x5, 0x0, 0x28, 0xd, 0x7e, 0xb3, 0x36,
+ 0xa2, 0x70, 0x7, 0x7e, 0xd4, 0x5, 0x0, 0x7a, 0xd5, 0x32, 0x7e, 0xd5, 0x32,
+ 0xbd, 0xd9, 0x50, 0xc, 0x7e, 0xd7, 0x92, 0x9e, 0xbe, 0xd4, 0x0, 0x2, 0x28,
+ 0x2, 0xd2, 0x0, 0x20, 0x0, 0x2, 0xa1, 0x84, 0xe4, 0x12, 0xd8, 0x87, 0x7e,
+ 0x70, 0x8, 0xac, 0x7e, 0x9, 0xb3, 0x69, 0x19, 0x70, 0x8, 0x74, 0x3, 0x19,
+ 0xb3, 0x69, 0x19, 0x80, 0x2d, 0x74, 0x1, 0x19, 0xb3, 0x69, 0x19, 0x75, 0x27,
+ 0x0, 0x80, 0x19, 0x7e, 0x71, 0x27, 0x74, 0xd, 0xac, 0x7b, 0x9, 0x53, 0x68,
+ 0x9b, 0xbc, 0x5e, 0x78, 0x8, 0x74, 0xff, 0x19, 0xb3, 0x68, 0x9b, 0x80, 0xb,
+ 0x5, 0x27, 0x7e, 0x73, 0x75, 0x8c, 0xbe, 0x71, 0x27, 0x38, 0xde, 0x7e, 0xa0,
+ 0x3, 0x7e, 0x70, 0x8, 0xac, 0x7c, 0x19, 0xa3, 0x69, 0x1a, 0xe5, 0x3b, 0xbe,
+ 0xb0, 0x0, 0x28, 0x2f, 0x15, 0x3b, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x2e, 0x34,
+ 0x67, 0x93, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x7e, 0x71,
+ 0x3b, 0x74, 0xd, 0xac, 0x7b, 0x12, 0x9d, 0xfb, 0xac, 0x3f, 0x12, 0xbd, 0x75,
+ 0x7e, 0x34, 0x91, 0xfe, 0x7e, 0x31, 0x3b, 0x12, 0xbd, 0x71, 0x1b, 0xf0, 0xa,
+ 0xdc, 0x9, 0xad, 0x36, 0x98, 0xbe, 0xa0, 0x1, 0x78, 0x25, 0x7e, 0xb3, 0x92,
+ 0x8e, 0xbe, 0xb0, 0x78, 0x68, 0x46, 0x7e, 0x47, 0x92, 0xa9, 0x7e, 0x70, 0x4,
+ 0xac, 0x7c, 0x59, 0x43, 0x92, 0xd2, 0x7e, 0x47, 0x92, 0xab, 0x7e, 0x70, 0x4,
+ 0xac, 0x7c, 0x59, 0x43, 0x92, 0xd4, 0x80, 0x2a, 0xbe, 0xa0, 0x2, 0x78, 0x25,
+ 0x7e, 0xb3, 0x92, 0xa5, 0xbe, 0xb0, 0x78, 0x68, 0x1c, 0x7e, 0xd7, 0x92,
+ 0xc0, 0x3e, 0xd4, 0x74, 0x4, 0xac, 0xbc, 0x59, 0xd5, 0x92, 0xd2, 0x7e, 0xd7,
+ 0x92, 0xc2, 0x3e, 0xd4, 0x74, 0x4, 0xac, 0xbc, 0x59, 0xd5, 0x92, 0xd4, 0xa,
+ 0xdc, 0x9, 0xbd, 0x36, 0x8e, 0xb4, 0x5, 0x38, 0x75, 0x27, 0x0, 0x80, 0x1a,
+ 0x7e, 0xa1, 0x27, 0x74, 0x17, 0xa4, 0x7e, 0xd, 0x2e, 0x7f, 0x10, 0x2d, 0x35,
+ 0x2e, 0x34, 0x0, 0x17, 0x2d, 0x15, 0x74, 0x17, 0x12, 0x2, 0x14, 0x5, 0x27,
+ 0xe5, 0x27, 0xbe, 0xb0, 0x4, 0x40, 0xdf, 0x7e, 0x34, 0x92, 0x8d, 0x7e, 0xd,
+ 0x2e, 0x2e, 0x14, 0x0, 0x5c, 0x74, 0x17, 0x12, 0x2, 0x62, 0x80, 0x55, 0x7e,
+ 0x34, 0x92, 0x8d, 0xa, 0x2c, 0x9, 0xa2, 0x36, 0x8e, 0x74, 0x17, 0xa4, 0x7e,
+ 0xd, 0x2e, 0x2d, 0x15, 0x74, 0x17, 0x12, 0x2, 0x62, 0xa, 0xdc, 0x2e, 0xd4,
+ 0x36, 0x8e, 0x7e, 0xd9, 0xb0, 0x4, 0x7a, 0xd9, 0xb0, 0x80, 0x2f, 0xb, 0xd0,
+ 0x12, 0x97, 0x48, 0x28, 0x3, 0x2, 0x9f, 0xcd, 0x80, 0x23, 0x12, 0xd9, 0xff,
+ 0x6d, 0x33, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x36, 0xcb, 0x59, 0x35, 0x36,
+ 0xdf, 0x7e, 0xa0, 0xff, 0x7e, 0x70, 0xd, 0xac, 0x7e, 0x19, 0xa3, 0x31, 0x10,
+ 0x74, 0x1, 0x19, 0xbd, 0x36, 0xf5, 0xb, 0xf0, 0xe5, 0x3b, 0xbc, 0xbf, 0x28,
+ 0x3, 0x2, 0x9f, 0x72, 0x6c, 0xff, 0x80, 0xe, 0x12, 0x6c, 0xb8, 0x2e, 0x34,
+ 0x67, 0x93, 0x2e, 0x14, 0x92, 0xb, 0x12, 0x6c, 0xc0, 0x12, 0x9a, 0x45, 0x38,
+ 0xed, 0x6c, 0xff, 0xe1, 0x93, 0x74, 0xd, 0xac, 0xbf, 0x9, 0xe5, 0x67, 0x97,
+ 0xa, 0xde, 0x9, 0x7d, 0x36, 0x98, 0xbe, 0x70, 0x0, 0x38, 0x2, 0xe1, 0x91,
+ 0x6c, 0xdd, 0xe1, 0x8a, 0xa, 0x4e, 0x9, 0xa4, 0x36, 0x98, 0xbe, 0xa0, 0x1,
+ 0x78, 0x66, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x9, 0xb3, 0x31, 0x10, 0xbc, 0xbe,
+ 0x68, 0x2, 0xe1, 0x88, 0x7e, 0x50, 0x4, 0xac, 0x5e, 0x49, 0xd2, 0x92, 0xd2,
+ 0x49, 0xc3, 0x31, 0xc, 0x12, 0xd8, 0x70, 0x8, 0x4, 0x7d, 0xcd, 0x80, 0x9,
+ 0x7e, 0xd5, 0x36, 0xbd, 0xdc, 0x58, 0x2, 0x7d, 0xcd, 0x7e, 0x70, 0xd, 0xac,
+ 0x7f, 0x59, 0xc3, 0x67, 0x93, 0x7e, 0x70, 0x4, 0xac, 0x7e, 0x49, 0xd3, 0x92,
+ 0xd4, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x49, 0xb3, 0x31, 0xe, 0x12, 0xd8, 0xf2,
+ 0x8, 0x4, 0x7d, 0xbd, 0x80, 0x9, 0x7e, 0xd5, 0x36, 0xbd, 0xdb, 0x58, 0x2,
+ 0x7d, 0xbd, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x59, 0xb3, 0x67, 0x95, 0x80, 0x6d,
+ 0xbe, 0xa0, 0x2, 0x78, 0x5f, 0x7e, 0x70, 0xd, 0xac, 0x7d, 0x9, 0x53, 0x31,
+ 0x92, 0xbc, 0x5e, 0x78, 0x52, 0x74, 0x4, 0xac, 0xbe, 0x49, 0xd5, 0x92, 0xd2,
+ 0x49, 0xc3, 0x31, 0x8e, 0x12, 0xd8, 0x70, 0x8, 0x4, 0x7d, 0xcd, 0x80, 0x9,
+ 0x7e, 0xd5, 0x36, 0xbd, 0xdc, 0x58, 0x2, 0x7d, 0xcd, 0x74, 0xd, 0xac, 0xbf,
+ 0x59, 0xc5, 0x67, 0x93, 0x74, 0x4, 0xac, 0xbe, 0x49, 0xd5, 0x92, 0xd4, 0x74,
+ 0xd, 0xac, 0xbd, 0x49, 0xb5, 0x31, 0x90, 0x12, 0xd8, 0xf2, 0x8, 0x4, 0x7d,
+ 0xbd, 0x80, 0x9, 0x7e, 0xd5, 0x36, 0xbd, 0xdb, 0x58, 0x2, 0x7d, 0xbd, 0x74,
+ 0xd, 0xac, 0xbf, 0x59, 0xb5, 0x67, 0x95, 0x80, 0x9, 0xb, 0xd0, 0x12, 0x97,
+ 0x48, 0x28, 0x2, 0xc1, 0xb3, 0xb, 0xf0, 0xe5, 0x3b, 0xbc, 0xbf, 0x28, 0x2,
+ 0xc1, 0x9a, 0x6c, 0xff, 0x80, 0x1e, 0x12, 0x6c, 0xb8, 0x2e, 0x34, 0x31, 0xc,
+ 0x2e, 0x14, 0x31, 0x8e, 0x74, 0xd, 0x12, 0x1, 0xf3, 0x12, 0x6c, 0xb8, 0x2e,
+ 0x34, 0x92, 0xb, 0x2e, 0x14, 0x31, 0xc, 0x12, 0x6c, 0xc0, 0x12, 0x9a, 0x45,
+ 0x38, 0xdd, 0x6c, 0xff, 0x80, 0x41, 0x7e, 0x70, 0xd, 0xac, 0x7f, 0x9, 0xe3,
+ 0x31, 0x10, 0x7e, 0x53, 0x75, 0x8c, 0xbc, 0x5e, 0x28, 0x2e, 0x7e, 0x50, 0x8,
+ 0xac, 0x5e, 0x9, 0xb2, 0x69, 0x19, 0xbe, 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x3,
+ 0x1d, 0x12, 0xd9, 0xff, 0x6d, 0x22, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x25, 0x36,
+ 0xcb, 0x59, 0x25, 0x36, 0xdf, 0x74, 0xff, 0x19, 0xb3, 0x31, 0x10, 0x74, 0x1,
+ 0x19, 0xbd, 0x36, 0xf5, 0xb, 0xf0, 0x12, 0x9a, 0x45, 0x38, 0xba, 0xe5, 0x3b,
+ 0x7a, 0xb3, 0x69, 0x69, 0xe4, 0x7a, 0xb3, 0x30, 0xf0, 0xda, 0x3b, 0x22,
+ 0x6c, 0xaa, 0x7e, 0x63, 0x2e, 0x98, 0xe4, 0xa, 0x46, 0x19, 0xb4, 0x2e, 0x9a,
+ 0x6c, 0x77, 0x80, 0x2f, 0x7e, 0x50, 0xd, 0xac, 0x57, 0x49, 0x22, 0x67, 0x93,
+ 0x12, 0xa8, 0x8d, 0x59, 0x21, 0x2e, 0xa1, 0x7e, 0x50, 0xd, 0xac, 0x57, 0x49,
+ 0x22, 0x67, 0x95, 0x12, 0xa8, 0x8d, 0x59, 0x21, 0x2e, 0xa3, 0xa, 0x26, 0x2e,
+ 0x24, 0x2e, 0x9a, 0x7e, 0x29, 0xb0, 0x4, 0x7a, 0x29, 0xb0, 0xb, 0x70, 0x7e,
+ 0xb3, 0x69, 0x69, 0xbc, 0xb7, 0x38, 0xc9, 0x7e, 0xb3, 0x2e, 0x98, 0x4, 0x7a,
+ 0xb3, 0x2e, 0x98, 0xb4, 0x7, 0x5, 0xe4, 0x7a, 0xb3, 0x2e, 0x98, 0x6c, 0x77,
+ 0xa, 0x27, 0x9, 0x62, 0x2e, 0x9a, 0xbc, 0x6a, 0x28, 0x2, 0x7c, 0xa6, 0xb,
+ 0x70, 0xbe, 0x70, 0x7, 0x40, 0xed, 0x7a, 0xa3, 0x2e, 0x99, 0x22, 0xa, 0x16,
+ 0x9, 0x1, 0x2e, 0x9a, 0x7e, 0x10, 0x4, 0xac, 0x1, 0x7e, 0x30, 0x28, 0xac,
+ 0x36, 0x2d, 0x10, 0x22, 0x6c, 0xaa, 0x6c, 0x77, 0x80, 0x35, 0x7e, 0x50, 0xd,
+ 0xac, 0x57, 0x49, 0x42, 0x67, 0x93, 0x49, 0x22, 0x67, 0x95, 0xbe, 0x44, 0x0,
+ 0x40, 0x28, 0x20, 0x7e, 0x17, 0x76, 0x1b, 0x9e, 0x14, 0x0, 0x41, 0xbd, 0x14,
+ 0x28, 0x14, 0xbe, 0x24, 0x0, 0x40, 0x28, 0xe, 0x7e, 0x17, 0x76, 0x29, 0x9e,
+ 0x14, 0x0, 0x41, 0xbd, 0x12, 0x28, 0x2, 0xb, 0xa0, 0xb, 0x70, 0x7e, 0x63,
+ 0x69, 0x69, 0xbc, 0x67, 0x38, 0xc3, 0x7c, 0xba, 0x22, 0x7e, 0x73, 0x69,
+ 0x6a, 0xbe, 0x73, 0x69, 0x69, 0x78, 0x7e, 0x7e, 0xb3, 0x69, 0x69, 0xb4, 0x1,
+ 0x77, 0x7e, 0xb3, 0x31, 0x5, 0xbe, 0xb0, 0x2, 0x38, 0x13, 0x4, 0x7a, 0xb3,
+ 0x31, 0x5, 0x7e, 0x37, 0x67, 0x93, 0x7a, 0x37, 0x31, 0x8, 0x7e, 0x37, 0x67,
+ 0x95, 0x80, 0x6a, 0x7e, 0x37, 0x31, 0x6, 0xbe, 0x34, 0x6, 0xa4, 0x50, 0x4e,
+ 0x7e, 0x27, 0x67, 0x93, 0x7d, 0x12, 0x9e, 0x17, 0x31, 0x8, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0x8, 0x7d, 0x32, 0x9e, 0x37, 0x31, 0x8, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x31, 0x2e, 0x37, 0x31, 0x6, 0x7a, 0x37, 0x31, 0x6, 0x7e, 0x37, 0x67,
+ 0x95, 0x7d, 0x3, 0x9e, 0x7, 0x31, 0xa, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x8, 0x7d,
+ 0x13, 0x9e, 0x17, 0x31, 0xa, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x2e, 0x17,
+ 0x31, 0x6, 0x7a, 0x17, 0x31, 0x6, 0x7a, 0x27, 0x31, 0x8, 0x80, 0x12, 0x74,
+ 0x1, 0x22, 0xe4, 0x7a, 0xb3, 0x31, 0x5, 0x6d, 0x33, 0x7a, 0x37, 0x31, 0x6,
+ 0x7a, 0x37, 0x31, 0x8, 0x7a, 0x37, 0x31, 0xa, 0xe4, 0x22, 0x7e, 0x8, 0x2e,
+ 0x98, 0x7e, 0x34, 0x1, 0x21, 0xe4, 0x2, 0x0, 0x2e, 0x7f, 0x70, 0x7c, 0x9b,
+ 0x7e, 0xa0, 0xa, 0x7e, 0x30, 0x1f, 0xac, 0x39, 0x19, 0xa1, 0x2f, 0xba, 0xe4,
+ 0x19, 0xb1, 0x2f, 0xbb, 0x19, 0xb1, 0x2f, 0xbc, 0x74, 0x1, 0x19, 0xb1, 0x2f,
+ 0xbd, 0xe4, 0x19, 0xb1, 0x2f, 0xbe, 0x19, 0xb1, 0x2f, 0xbf, 0x29, 0x77, 0x0,
+ 0x5, 0x19, 0x71, 0x2f, 0xc0, 0x29, 0x77, 0x0, 0x6, 0x19, 0x71, 0x2f, 0xc1,
+ 0x19, 0xb1, 0x2f, 0xc2, 0x7e, 0x4, 0x7f, 0xff, 0x59, 0x1, 0x2f, 0xc3, 0xb,
+ 0x7a, 0x30, 0x59, 0x31, 0x2f, 0xc5, 0x69, 0x7, 0x0, 0x2, 0x59, 0x1, 0x2f,
+ 0xc7, 0x59, 0x31, 0x2f, 0xc9, 0x59, 0x1, 0x2f, 0xcb, 0x59, 0x31, 0x2f, 0xcd,
+ 0x59, 0x1, 0x2f, 0xcf, 0x7e, 0x4, 0x7f, 0xff, 0x59, 0x1, 0x2f, 0xd1, 0x59,
+ 0x1, 0x2f, 0xd3, 0x69, 0x37, 0x0, 0xb, 0x69, 0x27, 0x0, 0x9, 0x59, 0x31,
+ 0x2f, 0xd7, 0x59, 0x21, 0x2f, 0xd5, 0x22, 0x6c, 0xaa, 0x6c, 0x33, 0x80,
+ 0x4e, 0x7e, 0x90, 0x4, 0xac, 0x93, 0x7e, 0x10, 0x28, 0xac, 0x1a, 0x7d, 0xe0,
+ 0x2d, 0xe4, 0x49, 0xe, 0x2e, 0xa1, 0x7d, 0xf3, 0x9d, 0xf0, 0xbe, 0xf4, 0x0,
+ 0x0, 0x8, 0x6, 0x7d, 0x43, 0x9d, 0x40, 0x80, 0x4, 0x6d, 0x44, 0x9d, 0x4f,
+ 0x49, 0xde, 0x2e, 0xa3, 0x7d, 0xf2, 0x9d, 0xfd, 0xbe, 0xf4, 0x0, 0x0, 0x8,
+ 0x6, 0x7d, 0x2, 0x9d, 0xd, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0xf, 0xbe, 0x44, 0x0,
+ 0x50, 0x50, 0x8, 0xbe, 0x4, 0x0, 0x50, 0x50, 0x2, 0xd3, 0x22, 0xb, 0x30,
+ 0xa, 0xfa, 0x9, 0x2f, 0x2e, 0x9a, 0xbc, 0x23, 0x38, 0xa8, 0xb, 0xa0, 0xbe,
+ 0xa0, 0x7, 0x40, 0x9d, 0xc3, 0x22, 0x7e, 0xb3, 0x30, 0xf0, 0xbe, 0xb0, 0xfa,
+ 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x30, 0xf0, 0x22, 0xc2, 0x0, 0x7e, 0xa3, 0x2e,
+ 0x75, 0xbe, 0xa0, 0x2, 0x50, 0x2e, 0x7e, 0xb3, 0x67, 0x8c, 0x60, 0x21, 0xa,
+ 0x4a, 0x9, 0xb4, 0x39, 0xdf, 0xbe, 0xb3, 0x67, 0x82, 0x50, 0xc, 0x7d, 0x34,
+ 0x2e, 0x34, 0x39, 0xdf, 0x4, 0x7a, 0x39, 0xb0, 0x80, 0x10, 0xe4, 0x19, 0xb4,
+ 0x39, 0xdf, 0xd2, 0x0, 0x80, 0x7, 0xe4, 0xa, 0x3a, 0x19, 0xb3, 0x39, 0xdf,
+ 0x20, 0x0, 0x2a, 0x7e, 0xb3, 0x67, 0x8c, 0xb4, 0x1, 0x1e, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x92, 0x7e, 0x73, 0x67, 0x82, 0xbe, 0x73, 0x39, 0xde, 0x28, 0xc, 0xe4,
+ 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x39, 0xde, 0x4, 0x80, 0x4, 0xe4, 0x80,
+ 0x1, 0xe4, 0x7a, 0xb3, 0x39, 0xde, 0x7e, 0xb3, 0x67, 0x92, 0xb4, 0x1, 0x1a,
+ 0x7e, 0x73, 0x67, 0x81, 0xbe, 0x73, 0x39, 0xe2, 0x28, 0xc, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x92, 0x7e, 0xb3, 0x39, 0xe2, 0x4, 0x80, 0x6, 0x74, 0x1, 0x80, 0x2,
+ 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xe2, 0x22, 0x12, 0x77, 0xc2, 0x12, 0xaf, 0xdd,
+ 0x12, 0xab, 0x1f, 0x2, 0xaa, 0x85, 0x7e, 0x47, 0x67, 0x6c, 0x7e, 0x7, 0x81,
+ 0xf1, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x30, 0x7e, 0x14, 0x0, 0x4, 0x12, 0xab,
+ 0xcc, 0x8, 0x5, 0x7e, 0xa0, 0x4, 0x80, 0x1d, 0x7d, 0x30, 0x3e, 0x34, 0x12,
+ 0xab, 0xca, 0x8, 0x5, 0x7e, 0xa0, 0x3, 0x80, 0xf, 0x7d, 0x30, 0x12, 0xab,
+ 0xca, 0x8, 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x3, 0x7e, 0xa0, 0x1, 0x7e, 0xb3,
+ 0x67, 0x89, 0x60, 0x3, 0x7e, 0xa0, 0x4, 0x30, 0x2a, 0x3, 0x7e, 0xa0, 0x4,
+ 0x12, 0xaf, 0x7f, 0x60, 0x3, 0x7e, 0xa0, 0x1, 0xa, 0x2a, 0x7e, 0x37, 0x76,
+ 0x46, 0xad, 0x32, 0x7a, 0x37, 0x67, 0x7f, 0x7e, 0xb3, 0x76, 0x48, 0x7a,
+ 0xb3, 0x67, 0x81, 0x7e, 0xb3, 0x67, 0x62, 0xbe, 0xb0, 0x0, 0x28, 0x28, 0x7e,
+ 0xb3, 0x67, 0x83, 0x70, 0x22, 0x7e, 0x37, 0x67, 0x7f, 0xbe, 0x34, 0x0, 0x2,
+ 0x48, 0x9, 0x12, 0x6f, 0xdc, 0x7a, 0x37, 0x67, 0x7f, 0x80, 0xf, 0x7e, 0x63,
+ 0x67, 0x81, 0x7e, 0x70, 0x2, 0xac, 0x67, 0x7c, 0xb7, 0x7a, 0xb3, 0x67, 0x81,
+ 0x7e, 0xb3, 0x59, 0x60, 0xb4, 0x1, 0xe, 0x7e, 0x27, 0x67, 0x7f, 0x7e, 0x34,
+ 0x0, 0x5, 0xad, 0x32, 0x7a, 0x37, 0x67, 0x7f, 0x22, 0x3e, 0x34, 0x7d, 0x21,
+ 0x12, 0x1, 0x20, 0xbd, 0x34, 0x22, 0x12, 0xac, 0x4b, 0x12, 0xab, 0x13, 0x12,
+ 0xac, 0x30, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x67, 0x8c,
+ 0x60, 0x30, 0xe4, 0x7a, 0xb3, 0x39, 0xde, 0x7e, 0x8, 0x39, 0xdf, 0x7e, 0x34,
+ 0x0, 0x2, 0x12, 0x0, 0x2e, 0x7e, 0xa3, 0x9b, 0xae, 0x12, 0xac, 0x44, 0x60,
+ 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7c, 0xb9, 0x4e, 0xb3, 0x8d, 0x93, 0x7a,
+ 0xb3, 0x8d, 0x93, 0xbe, 0xa0, 0x1, 0x78, 0x3, 0x12, 0x5f, 0xc6, 0x12, 0xac,
+ 0x30, 0x40, 0x6, 0x12, 0xac, 0x7b, 0x12, 0xaf, 0xa2, 0x7e, 0xb3, 0x67, 0x92,
+ 0x60, 0x4, 0xe4, 0x2, 0xae, 0x66, 0x22, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0xc,
+ 0x7e, 0x73, 0x9b, 0x87, 0xbe, 0x73, 0x9b, 0xb0, 0x40, 0x2, 0xc3, 0x22, 0xd3,
+ 0x22, 0x7e, 0x44, 0x0, 0x1, 0x7c, 0xba, 0x22, 0x12, 0xad, 0x5, 0x12, 0xb5,
+ 0x72, 0x12, 0xaf, 0x84, 0x2, 0xac, 0x57, 0x7e, 0x27, 0x8d, 0x94, 0x1e, 0x24,
+ 0x1e, 0x24, 0xe4, 0x7a, 0xb3, 0x67, 0x89, 0x7e, 0x37, 0x67, 0x64, 0xbd,
+ 0x32, 0x38, 0x8, 0x7e, 0x37, 0x67, 0x66, 0xbd, 0x32, 0x28, 0x6, 0x74, 0x1,
+ 0x7a, 0xb3, 0x67, 0x89, 0x22, 0x7e, 0x18, 0x9, 0x20, 0x7a, 0x1d, 0x27, 0x7e,
+ 0x1f, 0x2d, 0x2a, 0x7f, 0x1, 0xe4, 0x2, 0xac, 0x8c, 0x7c, 0xab, 0x7f, 0x61,
+ 0x7f, 0x70, 0x12, 0xaf, 0x7, 0x7e, 0xb3, 0x82, 0xd, 0x7a, 0xb3, 0x91, 0xff,
+ 0x7e, 0xb3, 0x82, 0xc, 0x7a, 0xb3, 0x91, 0xfe, 0x7a, 0xa3, 0x92, 0x0, 0xe4,
+ 0x12, 0xaf, 0xac, 0x7e, 0x1d, 0x27, 0x7a, 0x37, 0x92, 0x4, 0x7d, 0x3f, 0x7a,
+ 0x37, 0x92, 0x6, 0x7e, 0x34, 0x0, 0x10, 0x12, 0xaf, 0x99, 0x2, 0x27, 0x50,
+ 0x7c, 0xab, 0x6c, 0x77, 0x7e, 0x63, 0x39, 0xdb, 0xbc, 0x67, 0x78, 0x8, 0x6c,
+ 0x66, 0x12, 0xac, 0xfb, 0xe4, 0x80, 0x17, 0x12, 0xac, 0x44, 0x60, 0x5, 0x3e,
+ 0x44, 0x14, 0x78, 0xfb, 0x12, 0xad, 0x87, 0x68, 0xc, 0x7e, 0x60, 0x1, 0x12,
+ 0xac, 0xfb, 0x74, 0x1, 0x19, 0xb4, 0x39, 0x56, 0xb, 0x70, 0xbe, 0x70, 0x3,
+ 0x40, 0xce, 0x22, 0x7e, 0x90, 0x1e, 0xac, 0x97, 0x19, 0x64, 0x39, 0x55,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x83, 0x75, 0x27, 0x0, 0x75, 0x28, 0x0, 0x7e,
+ 0xb3, 0x82, 0xc, 0xf5, 0x29, 0x7e, 0xb3, 0x82, 0xd, 0xf5, 0x2a, 0x7e, 0x8,
+ 0x0, 0x27, 0x7e, 0x37, 0x81, 0xef, 0x12, 0xad, 0x90, 0xe4, 0x33, 0x7a, 0xb3,
+ 0x67, 0x83, 0x12, 0xaf, 0xb7, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x87, 0x12,
+ 0xad, 0xda, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x88, 0x22, 0x7c, 0xab, 0x6c,
+ 0x77, 0x7e, 0x63, 0x39, 0xdb, 0xbc, 0x67, 0x78, 0x4, 0x6c, 0x66, 0x80, 0x22,
+ 0x12, 0xac, 0x44, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x12, 0xad, 0x87,
+ 0x68, 0x6, 0x7e, 0x60, 0x1, 0x12, 0xad, 0x7d, 0x7e, 0x63, 0x8d, 0x93, 0xa,
+ 0x26, 0x5d, 0x24, 0x68, 0x6, 0x7e, 0x60, 0x1, 0x12, 0xad, 0x7d, 0xb, 0x70,
+ 0xbe, 0x70, 0x3, 0x40, 0xc8, 0x22, 0x7e, 0x50, 0x1e, 0xac, 0x57, 0x19, 0x62,
+ 0x39, 0x56, 0x22, 0x7e, 0x63, 0x8d, 0x92, 0xa, 0x26, 0x5d, 0x24, 0x22, 0xca,
+ 0xd8, 0xca, 0x79, 0x7d, 0x43, 0x7f, 0x70, 0x7e, 0x73, 0x67, 0x62, 0xbe,
+ 0x70, 0x0, 0x28, 0x33, 0x6c, 0xff, 0x80, 0x2a, 0x74, 0x2, 0xac, 0xbf, 0x9,
+ 0xe5, 0x65, 0x60, 0x9, 0xd5, 0x65, 0x61, 0x7c, 0xbe, 0x7c, 0x7d, 0x12, 0x2e,
+ 0x40, 0x7d, 0xd3, 0x7f, 0x7, 0x7c, 0x7d, 0x12, 0xb5, 0xc5, 0x50, 0x7, 0xbd,
+ 0x4d, 0x58, 0x6, 0xd3, 0x80, 0xb, 0xd3, 0x80, 0x8, 0xb, 0xf0, 0x12, 0x67,
+ 0x3e, 0x38, 0xd1, 0xc3, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xd2, 0x0, 0x6c, 0x99,
+ 0x80, 0x35, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x5, 0x58, 0xfd, 0x9, 0x15, 0x58,
+ 0xfe, 0x12, 0xae, 0x5f, 0x74, 0x2, 0xac, 0xb9, 0x49, 0x25, 0x58, 0xc0, 0x7d,
+ 0xf3, 0x9d, 0xf2, 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x1f, 0x80, 0x4,
+ 0x6d, 0x11, 0x9d, 0x1f, 0xbe, 0x17, 0x67, 0x7b, 0x28, 0x4, 0xc2, 0x0, 0x80,
+ 0xa, 0xb, 0x90, 0x7e, 0x83, 0x58, 0xfc, 0xbc, 0x89, 0x38, 0xc3, 0x20, 0x0,
+ 0x31, 0x6c, 0x99, 0x80, 0x21, 0x74, 0x2, 0xac, 0xb9, 0x9, 0x5, 0x65, 0x60,
+ 0x9, 0x15, 0x65, 0x61, 0x12, 0xae, 0x5f, 0x74, 0x2, 0xac, 0xb9, 0x59, 0x35,
+ 0x58, 0xc0, 0x19, 0x5, 0x58, 0xfd, 0x19, 0x15, 0x58, 0xfe, 0xb, 0x90, 0x7e,
+ 0x73, 0x67, 0x62, 0xbc, 0x79, 0x38, 0xd7, 0x7a, 0x73, 0x58, 0xfc, 0x7e,
+ 0xb3, 0x67, 0x62, 0x70, 0x5, 0xe4, 0x7a, 0xb3, 0x58, 0xfc, 0xa2, 0x0, 0x22,
+ 0x7c, 0xb0, 0x7c, 0x71, 0x2, 0x2e, 0x40, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0xaf,
+ 0x7, 0x7e, 0x8, 0x92, 0xe, 0x7e, 0x34, 0x0, 0x5, 0x12, 0x0, 0x2e, 0x7e,
+ 0xa3, 0x82, 0xc, 0x7e, 0x73, 0x82, 0xd, 0x7e, 0xa7, 0x67, 0x7f, 0x7d, 0xca,
+ 0x3e, 0xc4, 0x3e, 0xc4, 0x4c, 0xff, 0x78, 0x76, 0x7e, 0xb7, 0x8d, 0x94,
+ 0x7a, 0x73, 0x91, 0xff, 0x7a, 0xa3, 0x91, 0xfe, 0x7e, 0xd4, 0x9, 0x20, 0x7a,
+ 0xd7, 0x92, 0x2, 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3, 0x7a, 0xd7, 0x92, 0x4,
+ 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3, 0x7a, 0xd7, 0x92, 0x6, 0x7d, 0x3a, 0x7c,
+ 0xb7, 0xf5, 0x27, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x18, 0x92, 0xe, 0x7d, 0x5a,
+ 0x12, 0x2b, 0xa8, 0x7e, 0x70, 0x4, 0x7d, 0xab, 0x3e, 0xa4, 0x49, 0xda, 0x9,
+ 0x20, 0xbd, 0xcd, 0x58, 0x10, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa,
+ 0x20, 0x2d, 0x2c, 0x1b, 0xa, 0x20, 0x80, 0x16, 0x6d, 0x22, 0x9d, 0x2c, 0xbd,
+ 0x2d, 0x8, 0xe, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0xa0, 0x9d,
+ 0xac, 0x1b, 0xa, 0xa0, 0xb, 0xb4, 0x1b, 0x70, 0x78, 0xc8, 0xda, 0xf8, 0x22,
+ 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x2, 0x0, 0x2e, 0x7f,
+ 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x96, 0x48, 0x12, 0xaf, 0xb, 0x7e, 0x73, 0x82,
+ 0xd, 0x7a, 0x73, 0x96, 0x49, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x96, 0x48,
+ 0x7a, 0xb3, 0x96, 0x4b, 0x7d, 0x3d, 0x7a, 0x37, 0x96, 0x4c, 0x7d, 0x3f,
+ 0x7a, 0x37, 0x96, 0x50, 0x7e, 0x8, 0x96, 0x48, 0x2, 0xaf, 0x45, 0xa9, 0xa6,
+ 0xcb, 0x92, 0x8, 0x12, 0xaf, 0x91, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0,
+ 0x46, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27, 0x39, 0xf9, 0x59, 0x32, 0x0, 0x4a,
+ 0x12, 0xaf, 0xc9, 0x59, 0x32, 0x0, 0x42, 0x12, 0xaf, 0x8a, 0x12, 0x4f, 0xe1,
+ 0x7e, 0x47, 0x39, 0xf9, 0x59, 0x54, 0x0, 0x4c, 0x12, 0x2c, 0x8b, 0xa2, 0x8,
+ 0xa9, 0x96, 0xcb, 0x22, 0x7e, 0xb3, 0x39, 0xa3, 0x22, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x86, 0x22, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x22, 0xa9, 0xd6, 0xcb,
+ 0x69, 0x30, 0x0, 0x4, 0x22, 0x7a, 0x37, 0x92, 0x8, 0x7e, 0x8, 0x91, 0xfe,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x62, 0x7a, 0xb3, 0x67, 0x63, 0x22, 0x7a,
+ 0xb3, 0x92, 0x1, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x2, 0x22, 0x7e, 0x37, 0x67,
+ 0x66, 0x2e, 0x37, 0x67, 0x64, 0xbe, 0x37, 0x67, 0x7d, 0x28, 0x2, 0xd3, 0x22,
+ 0xc3, 0x22, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c, 0x55, 0x29, 0x70, 0x0, 0x1,
+ 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x39, 0xf9, 0x22, 0xd2, 0x0, 0xe4, 0x7a,
+ 0xb3, 0x67, 0x8c, 0x7a, 0xb3, 0x67, 0x8f, 0x7e, 0xb3, 0x67, 0x84, 0xb4, 0x1,
+ 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x8c, 0x7e, 0xb3, 0x67, 0x88, 0x70, 0x2,
+ 0xc2, 0x0, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x2, 0xc2, 0x0, 0x20, 0x0, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x8c, 0x22, 0x12, 0xb3, 0x50, 0x12, 0xb0, 0x1e, 0x2,
+ 0xb0, 0x17, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xf8, 0x22, 0xca, 0x3b, 0x7e, 0x34,
+ 0x0, 0xb3, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0x24, 0x12,
+ 0x2, 0x3d, 0x7e, 0x34, 0x0, 0xd7, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x92,
+ 0x22, 0x74, 0x24, 0x12, 0x2, 0x3d, 0x75, 0x2d, 0x0, 0x6d, 0x33, 0x7a, 0x35,
+ 0x32, 0x7e, 0xa3, 0x82, 0xe, 0x7a, 0xa1, 0x34, 0x7e, 0xb3, 0x82, 0xf, 0xf5,
+ 0x35, 0x7e, 0x58, 0x4, 0x0, 0x7e, 0x38, 0x92, 0x46, 0xb, 0x75, 0x5e, 0xf0,
+ 0xfe, 0x6d, 0x66, 0x7e, 0xb3, 0x82, 0xc, 0xf5, 0x28, 0x7e, 0x48, 0x92, 0xb8,
+ 0xb, 0x95, 0x5e, 0x94, 0xff, 0xfe, 0x6d, 0x88, 0x85, 0x35, 0x37, 0xc2, 0x0,
+ 0xc2, 0x1, 0xd2, 0x2, 0x7f, 0x4, 0x7e, 0x1f, 0x2d, 0x2e, 0x7c, 0xba, 0x12,
+ 0xb3, 0x3, 0x6c, 0xaa, 0x80, 0x17, 0x7e, 0x70, 0x2, 0xac, 0x7a, 0x49, 0x23,
+ 0x91, 0xfe, 0x7f, 0x3, 0x2d, 0x13, 0x1b, 0xa, 0x20, 0x49, 0x43, 0x92, 0x22,
+ 0x12, 0xb2, 0xef, 0xe5, 0x28, 0xbc, 0xba, 0x38, 0xe3, 0x7e, 0x18, 0x92,
+ 0x92, 0x7a, 0x1d, 0x29, 0x7e, 0x34, 0x92, 0x94, 0x7e, 0x24, 0x0, 0x0, 0x7a,
+ 0x1d, 0x29, 0x5e, 0x70, 0xfe, 0x6d, 0x22, 0x7a, 0x1d, 0x29, 0x7a, 0x3d,
+ 0x36, 0xc2, 0x0, 0xc2, 0x1, 0xd2, 0x2, 0xc2, 0x3, 0x7e, 0xd, 0x29, 0x12,
+ 0xb2, 0x9f, 0x80, 0x21, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7e, 0x1d, 0x29, 0x2d,
+ 0x31, 0xb, 0x1a, 0x30, 0x7d, 0x23, 0xb, 0x24, 0x2d, 0x17, 0x7d, 0x6, 0x1b,
+ 0xa, 0x20, 0x7e, 0x44, 0xff, 0xff, 0x9d, 0x43, 0x12, 0xb2, 0xef, 0xe5, 0x28,
+ 0xbc, 0xba, 0x38, 0xd9, 0x7a, 0x3d, 0x36, 0x12, 0x67, 0xcb, 0xd2, 0x3, 0x7e,
+ 0x8, 0x2d, 0x0, 0x12, 0xb2, 0x9f, 0x80, 0x16, 0x7e, 0x70, 0x2, 0xac, 0x7a,
+ 0x49, 0x33, 0x2d, 0x0, 0xbe, 0x34, 0x7f, 0xff, 0x78, 0x5, 0x75, 0x2d, 0x1,
+ 0x80, 0x8, 0xb, 0xa0, 0xe5, 0x34, 0xbc, 0xba, 0x38, 0xe4, 0xe5, 0x2d, 0xb4,
+ 0x1, 0x5, 0x7e, 0x1d, 0x29, 0x80, 0x4, 0x7e, 0x18, 0x2d, 0x0, 0x7a, 0x1d,
+ 0x2e, 0x6c, 0xaa, 0x41, 0x89, 0x7e, 0x71, 0x35, 0xac, 0x7a, 0x7d, 0xb3,
+ 0x3e, 0xb4, 0x2e, 0xb4, 0x4, 0x0, 0x6d, 0xaa, 0x7e, 0x30, 0x2, 0xac, 0x3a,
+ 0x7f, 0x74, 0x2d, 0xf1, 0xb, 0x7a, 0x0, 0xbe, 0x4, 0x0, 0x14, 0x58, 0x7,
+ 0x12, 0xb3, 0x48, 0x78, 0x2, 0x41, 0x87, 0x30, 0x2a, 0x26, 0xbe, 0x4, 0x7,
+ 0xd0, 0x8, 0x6, 0x7e, 0x34, 0x3, 0x20, 0x80, 0x4a, 0xbe, 0x4, 0x3, 0xe8,
+ 0x8, 0x6, 0x7e, 0x34, 0x2, 0x58, 0x80, 0x3e, 0xbe, 0x4, 0x0, 0x0, 0x18, 0x2,
+ 0x41, 0x87, 0x7e, 0x34, 0x1, 0xf4, 0x80, 0x30, 0x7e, 0x44, 0x0, 0xc8, 0x7e,
+ 0x34, 0x0, 0x96, 0x7e, 0x24, 0x0, 0x64, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x2,
+ 0xc, 0x2e, 0x44, 0x0, 0xc8, 0x2e, 0x34, 0x0, 0xc8, 0x2e, 0x24, 0x0, 0xc8,
+ 0xbe, 0x4, 0x7, 0xd0, 0x8, 0x5, 0x1b, 0x7a, 0x40, 0x80, 0x1a, 0xbe, 0x4,
+ 0x3, 0xe8, 0x8, 0x5, 0x1b, 0x7a, 0x30, 0x80, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x18,
+ 0x2, 0x41, 0x87, 0x7f, 0x74, 0x2d, 0xf1, 0x1b, 0x7a, 0x20, 0x7e, 0xb3, 0x9b,
+ 0xaf, 0x70, 0xb, 0x7e, 0xf4, 0x1, 0x90, 0x2d, 0x19, 0x7d, 0x8, 0x1b, 0xa,
+ 0xf0, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7e, 0x7d, 0x2e, 0x2d, 0xf1, 0xb, 0x7a,
+ 0x0, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x7f, 0x64, 0x2d, 0xd1, 0xb, 0x6a, 0x10,
+ 0xbd, 0x10, 0x58, 0x5, 0x1b, 0x7a, 0x10, 0x80, 0x20, 0x7e, 0x30, 0x2, 0xac,
+ 0x3a, 0x2d, 0x19, 0x7d, 0x8, 0xb, 0xa, 0x10, 0x6d, 0xff, 0x9d, 0xf1, 0x12,
+ 0xb2, 0x94, 0xb, 0xa, 0xe0, 0xbd, 0xfe, 0x8, 0x6, 0x12, 0xb2, 0x94, 0x1b,
+ 0xa, 0xf0, 0x12, 0xb2, 0x94, 0xb, 0xa, 0x10, 0x7d, 0x1, 0xe, 0x4, 0x7a, 0x5,
+ 0x32, 0xbe, 0x14, 0x0, 0x0, 0x48, 0x1f, 0x75, 0x27, 0x0, 0x80, 0x11, 0xb,
+ 0x5a, 0x0, 0xbe, 0x5, 0x32, 0x8, 0x5, 0x9d, 0x1, 0x1b, 0x5a, 0x0, 0xb, 0xb5,
+ 0x5, 0x27, 0xe5, 0x35, 0xbe, 0xb1, 0x27, 0x38, 0xe8, 0x80, 0x2a, 0x75, 0x27,
+ 0x0, 0x80, 0x1e, 0xb, 0x5a, 0x0, 0xbe, 0x5, 0x32, 0x58, 0x12, 0x7e, 0xf0,
+ 0x2, 0xac, 0xfa, 0x7e, 0x7d, 0x2e, 0x2d, 0xf7, 0xb, 0x7a, 0xf0, 0x9d, 0xf,
+ 0x1b, 0x5a, 0x0, 0xb, 0xb5, 0x5, 0x27, 0xe5, 0x35, 0xbe, 0xb1, 0x27, 0x38,
+ 0xdb, 0xb, 0xa0, 0xe5, 0x34, 0xbc, 0xba, 0x28, 0x2, 0x21, 0x43, 0xda, 0x3b,
+ 0x22, 0x7e, 0xf0, 0x2, 0xac, 0xfa, 0x7e, 0xd, 0x2e, 0x2d, 0x17, 0x22, 0x7e,
+ 0x1f, 0x2d, 0x2e, 0x12, 0xb2, 0xa9, 0x6c, 0xaa, 0x22, 0x7f, 0x61, 0x7f,
+ 0x70, 0x7e, 0x8, 0x92, 0xde, 0x12, 0xaf, 0xb, 0x7e, 0x73, 0x82, 0xd, 0x7a,
+ 0x73, 0x92, 0xdf, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x92, 0xde, 0x7d, 0x3d,
+ 0x7a, 0x37, 0x92, 0xe2, 0x7e, 0x1d, 0x36, 0x7a, 0x37, 0x92, 0xe4, 0x7d,
+ 0x3f, 0x7a, 0x37, 0x92, 0xe6, 0xa2, 0x2, 0x12, 0xb3, 0x2c, 0x7e, 0x34, 0x80,
+ 0x0, 0x7a, 0x37, 0x92, 0xe8, 0xa2, 0x3, 0x92, 0x4, 0x7e, 0x8, 0x92, 0xde,
+ 0x2, 0x2b, 0x8d, 0xe5, 0x28, 0xa, 0x2b, 0xa, 0x3a, 0x2d, 0x32, 0x3e, 0x34,
+ 0x2d, 0x37, 0x7d, 0x26, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0x22, 0x7a, 0x37, 0x92,
+ 0xe2, 0x7d, 0x31, 0x7a, 0x37, 0x92, 0xe6, 0x7a, 0xb3, 0x92, 0xde, 0xe5,
+ 0x37, 0x7a, 0xb3, 0x92, 0xdf, 0x7e, 0x34, 0x80, 0x20, 0x7a, 0x37, 0x92,
+ 0xe8, 0xa2, 0x2, 0xe4, 0x12, 0xb3, 0x2c, 0x7e, 0x8, 0x92, 0xde, 0x2, 0x2b,
+ 0x37, 0x33, 0x7c, 0x6b, 0x3e, 0x60, 0xa2, 0x0, 0xe4, 0x33, 0x7c, 0x7b, 0x3e,
+ 0x70, 0x3e, 0x70, 0x4c, 0x76, 0xa2, 0x1, 0xe4, 0x33, 0x4c, 0x7b, 0x7a, 0x73,
+ 0x92, 0xe1, 0x22, 0x7e, 0xb3, 0x59, 0x62, 0xbe, 0xb0, 0x1, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x67, 0x8a, 0x7a, 0xb3, 0x67, 0x8b, 0x22, 0xca, 0x3b, 0x7e, 0xe3,
+ 0x82, 0xc, 0x7e, 0xd3, 0x82, 0xd, 0xc2, 0x33, 0x7e, 0xd7, 0x67, 0x68, 0xe,
+ 0xd4, 0x6c, 0xcc, 0x81, 0xd2, 0x7e, 0x30, 0x2, 0xac, 0x3c, 0x9, 0xb1, 0x65,
+ 0x60, 0x7a, 0xb3, 0x91, 0xfe, 0x9, 0x71, 0x65, 0x61, 0x7a, 0x73, 0x91, 0xff,
+ 0x12, 0x2e, 0x40, 0x7d, 0xc3, 0xbd, 0xdc, 0x8, 0x2, 0x81, 0xd0, 0xbe, 0xe3,
+ 0x91, 0xfe, 0x38, 0x2, 0x81, 0xd0, 0xbe, 0xd3, 0x91, 0xff, 0x38, 0x2, 0x81,
+ 0xd0, 0x7d, 0x1c, 0xe, 0x14, 0x7d, 0xec, 0xe, 0xe4, 0xe, 0xe4, 0x2d, 0xe1,
+ 0x6d, 0xff, 0x12, 0xb5, 0x47, 0x12, 0xb5, 0x4, 0x80, 0x32, 0x6c, 0x99, 0x7e,
+ 0xf3, 0x91, 0xfe, 0x80, 0x1e, 0x7c, 0xbf, 0x12, 0x2e, 0x3c, 0x7d, 0x3, 0xbd,
+ 0xe0, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4, 0xfb, 0x80, 0x8, 0x7e,
+ 0x73, 0x92, 0x2, 0xbc, 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0, 0x0, 0x58,
+ 0xdd, 0x4c, 0x99, 0x68, 0x8, 0x12, 0xb5, 0x17, 0x12, 0xb4, 0xe1, 0x58, 0xc9,
+ 0x12, 0xb5, 0x3a, 0x58, 0x38, 0x12, 0xb5, 0x4, 0x80, 0x2e, 0x12, 0xb5, 0x2d,
+ 0x80, 0x1e, 0x7c, 0xb8, 0x12, 0x2e, 0x3c, 0x7d, 0x3, 0xbd, 0xe0, 0x18, 0x9,
+ 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4, 0xe9, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x1,
+ 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38, 0xde, 0x4c, 0x99, 0x68,
+ 0x8, 0x12, 0xb5, 0x17, 0x12, 0xb4, 0xe1, 0x58, 0xcd, 0x12, 0xb5, 0x47, 0xa,
+ 0x5d, 0x1b, 0x54, 0x7e, 0x73, 0x91, 0xff, 0xa, 0x17, 0xbd, 0x15, 0x58, 0x77,
+ 0x12, 0xb4, 0xf2, 0x80, 0x2e, 0x6c, 0x99, 0x7e, 0xf3, 0x91, 0xfe, 0x80,
+ 0x1a, 0x7c, 0xbf, 0x12, 0xb5, 0x21, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12,
+ 0xb4, 0xfb, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x2, 0xbc, 0x7f, 0x58, 0x7, 0x1b,
+ 0xf0, 0xbe, 0xf0, 0x0, 0x58, 0xe1, 0x4c, 0x99, 0x68, 0x9, 0x12, 0xb5, 0xd,
+ 0xbe, 0xd3, 0x92, 0x0, 0x38, 0xcc, 0x12, 0xb5, 0x3a, 0x58, 0x39, 0x7e, 0x73,
+ 0x91, 0xff, 0x12, 0xb4, 0xf2, 0x80, 0x2a, 0x12, 0xb5, 0x2d, 0x80, 0x1a,
+ 0x7c, 0xb8, 0x12, 0xb5, 0x21, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0xb4,
+ 0xe9, 0x80, 0x8, 0x7e, 0x73, 0x92, 0x1, 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80,
+ 0xbc, 0xe8, 0x38, 0xe2, 0x4c, 0x99, 0x68, 0x9, 0x12, 0xb5, 0xd, 0xbe, 0xd3,
+ 0x92, 0x0, 0x38, 0xd0, 0x7e, 0x73, 0x76, 0x59, 0xa, 0x17, 0xbd, 0x1f, 0x38,
+ 0x14, 0xd2, 0x33, 0x7e, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x3, 0xe7, 0x7e, 0x73,
+ 0x91, 0xff, 0x7a, 0x73, 0x3, 0xe8, 0x80, 0xc, 0xb, 0xc0, 0x7e, 0x73, 0x67,
+ 0x62, 0xbc, 0x7c, 0x28, 0x2, 0x61, 0x70, 0xa2, 0x33, 0xda, 0x3b, 0x22, 0x7e,
+ 0x73, 0x92, 0x3, 0xbe, 0x70, 0x0, 0x22, 0xb, 0xf4, 0xb, 0x90, 0x7a, 0x83,
+ 0x92, 0x1, 0x22, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x0, 0x22, 0xb,
+ 0xf4, 0xb, 0x90, 0x7a, 0xf3, 0x92, 0x2, 0x22, 0x7e, 0x73, 0x91, 0xff, 0x7a,
+ 0x73, 0x92, 0x3, 0x22, 0x7e, 0xb3, 0x92, 0x0, 0x4, 0x7a, 0xb3, 0x92, 0x0,
+ 0x22, 0x7e, 0xb3, 0x92, 0x3, 0x14, 0x7a, 0xb3, 0x92, 0x3, 0x22, 0x7e, 0x73,
+ 0x92, 0x0, 0x12, 0x2e, 0x40, 0x7d, 0x3, 0xbd, 0xe0, 0x22, 0x6c, 0x99, 0x7e,
+ 0x83, 0x91, 0xfe, 0xa, 0x18, 0xb, 0x14, 0x7c, 0x83, 0x22, 0xa, 0x5e, 0x1b,
+ 0x54, 0x7e, 0x73, 0x91, 0xfe, 0xa, 0x17, 0xbd, 0x15, 0x22, 0x7e, 0x73, 0x91,
+ 0xfe, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x92, 0x1, 0x7e, 0x73, 0x91, 0xfe,
+ 0x7a, 0x73, 0x92, 0x2, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x3, 0xe9, 0xe4, 0x7a,
+ 0xb3, 0x3, 0xe7, 0x7a, 0xb3, 0x3, 0xe8, 0x7a, 0xb3, 0x3, 0xe4, 0x2, 0x67,
+ 0xe9, 0xe4, 0x7a, 0xb3, 0x67, 0x84, 0x7e, 0xa3, 0x67, 0x63, 0xbe, 0xa0, 0x0,
+ 0x28, 0x1d, 0x7e, 0x27, 0x81, 0xf1, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32, 0x7e,
+ 0x24, 0x0, 0x4, 0x12, 0x1, 0x20, 0xbe, 0x37, 0x67, 0x6c, 0x8, 0x6, 0x74,
+ 0x1, 0x7a, 0xb3, 0x67, 0x84, 0x7e, 0xb3, 0x67, 0x84, 0xb4, 0x1, 0x20, 0xbe,
+ 0xa0, 0x0, 0x28, 0x1b, 0xbe, 0xa0, 0x3, 0x50, 0x16, 0x7e, 0xb3, 0x67, 0x62,
+ 0xb4, 0x1, 0xf, 0x7e, 0x73, 0x65, 0x60, 0xbe, 0x73, 0x76, 0x37, 0x68, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x84, 0x22, 0x7c, 0x67, 0x7e, 0xb, 0x70, 0xbc, 0x7b,
+ 0x38, 0x1a, 0x29, 0x70, 0x0, 0x2, 0xbc, 0x7b, 0x28, 0x12, 0x29, 0x70, 0x0,
+ 0x1, 0xbc, 0x76, 0x38, 0xa, 0x29, 0x70, 0x0, 0x3, 0xbc, 0x76, 0x28, 0x2,
+ 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0x5b, 0x6c, 0x77, 0x6c, 0xaa, 0x74, 0x1e,
+ 0xac, 0x5b, 0x9, 0x62, 0x39, 0x49, 0x6c, 0x55, 0x7e, 0x10, 0x1e, 0xac, 0x15,
+ 0x9, 0x40, 0x39, 0x49, 0xa, 0x14, 0xa, 0x46, 0x9d, 0x14, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0xa, 0xa, 0x44, 0xa, 0xf6, 0x9d, 0x4f, 0x7c, 0x49, 0x80, 0x8,
+ 0x6e, 0x14, 0xff, 0xff, 0xb, 0x14, 0x7c, 0x43, 0xbc, 0x74, 0x50, 0x4, 0x7c,
+ 0x74, 0x7c, 0xa5, 0xb, 0x50, 0xbe, 0x50, 0x3, 0x40, 0xca, 0x7c, 0xba, 0x22,
+ 0xca, 0xf8, 0x12, 0xb6, 0xd1, 0xc2, 0x16, 0x7e, 0xb3, 0x39, 0x48, 0x60,
+ 0x63, 0x7e, 0xf3, 0x39, 0x46, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c,
+ 0xff, 0x7e, 0x24, 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78,
+ 0xfb, 0x7e, 0x73, 0x39, 0x42, 0x6c, 0x66, 0x5c, 0x75, 0xbe, 0x34, 0x0, 0x0,
+ 0x8, 0x9, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c, 0xff, 0x7e, 0xa3,
+ 0x39, 0x45, 0xbc, 0xaf, 0x78, 0x12, 0x7e, 0xb3, 0x39, 0x47, 0x4, 0x7a, 0xb3,
+ 0x39, 0x47, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0x2, 0x6c, 0xff, 0x7e, 0xb3,
+ 0x76, 0x6e, 0xbe, 0xb3, 0x39, 0x47, 0x38, 0x7, 0x7c, 0xba, 0x12, 0xb5, 0xea,
+ 0x7c, 0xfb, 0x12, 0xb6, 0xa6, 0x7a, 0xf3, 0x39, 0x41, 0xda, 0xf8, 0x22,
+ 0x7e, 0xb3, 0x9b, 0xa8, 0x7c, 0x7f, 0x2, 0x35, 0x19, 0xca, 0xf8, 0x7c, 0xfb,
+ 0xbe, 0xf0, 0x3, 0x50, 0x16, 0xbe, 0x70, 0x3, 0x50, 0x11, 0xd2, 0x4, 0x12,
+ 0xb, 0xc5, 0x12, 0xb6, 0xd1, 0x12, 0xb6, 0xa6, 0x7a, 0xf3, 0x39, 0x45, 0xd2,
+ 0x14, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x9b, 0x3b, 0x7a, 0x73, 0x39, 0xbf,
+ 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xdb, 0xbe, 0xd0, 0x80, 0x78, 0x17,
+ 0x7e, 0xe0, 0xff, 0x6c, 0xff, 0x12, 0xb7, 0x32, 0x38, 0x4, 0x7c, 0xe7, 0x7c,
+ 0xdf, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xf0, 0x80, 0x19, 0xbe, 0xd0, 0x81,
+ 0x78, 0x14, 0x6c, 0xee, 0x6c, 0xff, 0x12, 0xb7, 0x32, 0x40, 0x4, 0x7c, 0xe7,
+ 0x7c, 0xdf, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xf0, 0xbe, 0xd0, 0x3, 0x40,
+ 0x2, 0x6c, 0xdd, 0x7e, 0x73, 0x39, 0x45, 0xbc, 0x7d, 0x68, 0x5, 0x7c, 0xbd,
+ 0x12, 0xb6, 0xaf, 0x7a, 0xd3, 0x9a, 0xc6, 0xda, 0x79, 0xda, 0xd8, 0x22,
+ 0x74, 0x1e, 0xac, 0xbf, 0x9, 0x75, 0x39, 0x49, 0xbc, 0x7e, 0x22, 0x7c, 0xab,
+ 0x6c, 0x77, 0xbc, 0xa7, 0x78, 0x2a, 0x7e, 0x63, 0x9b, 0xa8, 0xa, 0x6, 0x12,
+ 0x36, 0xca, 0x12, 0xb7, 0xcb, 0x7e, 0x8, 0x1d, 0xa0, 0x59, 0x12, 0x39, 0x5d,
+ 0x59, 0x2, 0x39, 0x5b, 0x7e, 0x8, 0x22, 0xc0, 0x59, 0x12, 0x39, 0x61, 0x59,
+ 0x2, 0x39, 0x5f, 0x7e, 0x8, 0x27, 0xe0, 0x80, 0x4a, 0x7e, 0x50, 0x4, 0xac,
+ 0x5a, 0xa, 0x17, 0x2d, 0x21, 0x2e, 0x24, 0x0, 0x93, 0x12, 0x61, 0xa1, 0x7c,
+ 0x6b, 0x7e, 0xb3, 0x9b, 0xa8, 0xa, 0xb, 0x12, 0x36, 0xca, 0x12, 0xb7, 0xcb,
+ 0xa, 0x6, 0x7e, 0x14, 0xf, 0x60, 0xad, 0x10, 0x7d, 0xf1, 0x2e, 0xf4, 0x3a,
+ 0x0, 0x6d, 0xee, 0x59, 0xf2, 0x39, 0x5d, 0x59, 0xe2, 0x39, 0x5b, 0x7d, 0xf1,
+ 0x2e, 0xf4, 0x3f, 0x20, 0x59, 0xf2, 0x39, 0x61, 0x59, 0xe2, 0x39, 0x5f,
+ 0x2e, 0x14, 0x44, 0x40, 0x6d, 0x0, 0x59, 0x12, 0x39, 0x65, 0x59, 0x2, 0x39,
+ 0x63, 0xb, 0x70, 0xbe, 0x70, 0x3, 0x50, 0x2, 0xe1, 0x41, 0x22, 0x7e, 0x50,
+ 0x1e, 0xac, 0x57, 0x59, 0x12, 0x39, 0x59, 0x59, 0x2, 0x39, 0x57, 0x22, 0x7c,
+ 0x57, 0x7c, 0x4b, 0xc2, 0x1, 0x7e, 0x37, 0x39, 0xc1, 0x7c, 0xb4, 0x12, 0x75,
+ 0xd8, 0x40, 0x1, 0x22, 0xa5, 0xbd, 0x0, 0x2, 0x80, 0x3, 0x2, 0xb8, 0xa9,
+ 0xd2, 0x1, 0x7e, 0xb3, 0x39, 0x48, 0x60, 0x3, 0x2, 0xb8, 0xa9, 0x7e, 0xb3,
+ 0x39, 0xdd, 0x4, 0x7a, 0xb3, 0x39, 0xdd, 0x7e, 0xb3, 0x39, 0xdc, 0x4, 0x7a,
+ 0xb3, 0x39, 0xdc, 0xbe, 0xb0, 0x14, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0xdc,
+ 0x7e, 0x47, 0x39, 0x43, 0x7d, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0xbd, 0x23,
+ 0x50, 0x4, 0x74, 0x8, 0x80, 0xa, 0x7d, 0x24, 0x3e, 0x24, 0xbd, 0x23, 0x50,
+ 0xe, 0x74, 0x4, 0x7e, 0x53, 0x39, 0xdc, 0xa, 0x25, 0x19, 0xb2, 0x39, 0xa4,
+ 0x80, 0x1d, 0xbd, 0x43, 0x50, 0xe, 0x74, 0x1, 0x7e, 0x73, 0x39, 0xdc, 0xa,
+ 0x47, 0x19, 0xb4, 0x39, 0xa4, 0x80, 0xb, 0xe4, 0x7e, 0xa3, 0x39, 0xdc, 0xa,
+ 0x3a, 0x19, 0xb3, 0x39, 0xa4, 0x6c, 0xaa, 0xe4, 0xa, 0x4b, 0x9, 0x74, 0x39,
+ 0xa4, 0x2c, 0xa7, 0x4, 0xb4, 0x14, 0xf4, 0xbe, 0xa0, 0x8, 0x40, 0x21, 0xe4,
+ 0x7a, 0xb3, 0x39, 0xdd, 0x7e, 0xb3, 0x39, 0xa3, 0x44, 0x1, 0x7a, 0xb3, 0x39,
+ 0xa3, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0x48, 0x7e, 0x8, 0x39, 0xa4, 0x7e, 0x34,
+ 0x0, 0x14, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x73, 0x39, 0xdd, 0xbe, 0x70, 0x20,
+ 0x40, 0xb, 0x74, 0x20, 0x7a, 0xb3, 0x39, 0xdd, 0xe4, 0x7a, 0xb3, 0x39, 0xa3,
+ 0x22, 0x7c, 0xab, 0x6d, 0x33, 0x6c, 0x55, 0x12, 0xb8, 0xf2, 0x49, 0x11,
+ 0x8e, 0x0, 0x59, 0x10, 0x39, 0xc7, 0x12, 0xb8, 0xf2, 0x49, 0x41, 0x8e, 0x0,
+ 0xbd, 0x43, 0x28, 0x2, 0x7d, 0x34, 0x49, 0x11, 0x8e, 0xa, 0x59, 0x10, 0x39,
+ 0xd1, 0x7e, 0x30, 0x2, 0xac, 0x35, 0x7e, 0x10, 0x14, 0xac, 0x1a, 0x2d, 0x1,
+ 0x49, 0x10, 0x8e, 0xa, 0xbd, 0x13, 0x28, 0x2, 0x7d, 0x31, 0xb, 0x50, 0xbe,
+ 0x50, 0x5, 0x40, 0xc3, 0x7a, 0x37, 0x39, 0xc5, 0x22, 0x7e, 0x10, 0x2, 0xac,
+ 0x15, 0x7e, 0x30, 0x14, 0xac, 0x3a, 0x2d, 0x10, 0x22, 0x7c, 0xab, 0x6c,
+ 0x77, 0x7e, 0x50, 0x1e, 0xac, 0x57, 0x9, 0x62, 0x39, 0x49, 0xbc, 0x6a, 0x68,
+ 0x7, 0xb, 0x70, 0xbe, 0x70, 0x3, 0x40, 0xec, 0xa5, 0xbf, 0x3, 0x6, 0x7a,
+ 0xa3, 0x39, 0x49, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0x2b, 0xc2, 0x2, 0x7e, 0x33,
+ 0x39, 0x45, 0x74, 0x1e, 0xac, 0xb3, 0x9, 0x35, 0x39, 0x49, 0x7c, 0xb2, 0x12,
+ 0xac, 0xc4, 0x6c, 0x22, 0x6c, 0xaa, 0x7e, 0x10, 0x1e, 0xac, 0x1a, 0x19,
+ 0x20, 0x39, 0x55, 0xb, 0xa0, 0xbe, 0xa0, 0x3, 0x78, 0xf0, 0x30, 0x2, 0x8,
+ 0x7c, 0xb3, 0x12, 0x1b, 0x53, 0x12, 0x12, 0xa6, 0xd3, 0x22, 0xca, 0xf8,
+ 0x7c, 0xfb, 0xc2, 0x0, 0xd2, 0x1, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x77, 0x7e,
+ 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x7, 0xd2, 0x0, 0x74, 0x4, 0x12, 0x37, 0xa4,
+ 0x7c, 0xbf, 0x12, 0xb9, 0x23, 0x92, 0x1, 0x30, 0x1, 0x5, 0x7c, 0xbf, 0x12,
+ 0x35, 0x29, 0x30, 0x0, 0x3, 0x12, 0x37, 0xa0, 0xa2, 0x1, 0xda, 0xf8, 0x22,
+ 0x7e, 0x8, 0x39, 0xc1, 0x7e, 0x34, 0x0, 0x1a, 0xe4, 0x2, 0x0, 0x2e, 0x7e,
+ 0x37, 0x76, 0x6c, 0x7a, 0x37, 0x39, 0x43, 0x7e, 0x34, 0x3, 0x20, 0x7a, 0x37,
+ 0x39, 0xbb, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x12, 0xba, 0xeb, 0x78, 0x2, 0x41,
+ 0x8c, 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x8c, 0x7e,
+ 0xb3, 0x8d, 0x91, 0x70, 0x2, 0x41, 0x8c, 0x7e, 0xb3, 0x59, 0x60, 0xbe, 0xb0,
+ 0x1, 0x78, 0x2, 0x41, 0x8c, 0xbe, 0xa0, 0x1, 0x78, 0x2, 0x41, 0x8c, 0x12,
+ 0xb9, 0x9b, 0x7c, 0xb5, 0x7c, 0x7a, 0x12, 0xb7, 0xd9, 0x7e, 0xb3, 0x39,
+ 0x48, 0x1b, 0xb1, 0x68, 0x33, 0x4, 0x68, 0x2, 0x41, 0x8c, 0x7e, 0x73, 0x39,
+ 0x45, 0x7a, 0x73, 0x39, 0x46, 0xe4, 0x7a, 0xb3, 0x39, 0x47, 0x6c, 0xaa,
+ 0x6d, 0x33, 0x7e, 0x90, 0x1e, 0xac, 0x9a, 0x59, 0x34, 0x39, 0x4b, 0x59,
+ 0x34, 0x39, 0x4d, 0xe4, 0x19, 0xb4, 0x39, 0x4a, 0xb, 0xa0, 0xbe, 0xa0, 0x3,
+ 0x78, 0xe5, 0x74, 0x2, 0x80, 0x67, 0x7e, 0xa3, 0x39, 0x46, 0x74, 0x1e, 0xa4,
+ 0x49, 0x35, 0x39, 0x4b, 0x2e, 0x37, 0x39, 0xc1, 0xbe, 0x34, 0x7f, 0xff,
+ 0x50, 0xb, 0x7d, 0x45, 0x2e, 0x44, 0x39, 0x4b, 0x1b, 0x48, 0x30, 0x80, 0x8,
+ 0x7e, 0x44, 0x7f, 0xff, 0x59, 0x45, 0x39, 0x4b, 0x49, 0x45, 0x39, 0x4d,
+ 0xbe, 0x47, 0x39, 0xc1, 0x50, 0x8, 0x7e, 0x37, 0x39, 0xc1, 0x59, 0x35, 0x39,
+ 0x4d, 0x7e, 0x73, 0x39, 0x41, 0x7a, 0x73, 0x39, 0x46, 0x7e, 0x73, 0x76,
+ 0x6e, 0xbe, 0x73, 0x39, 0x47, 0x38, 0x1f, 0x12, 0xba, 0x8d, 0xbe, 0xb0,
+ 0xff, 0x68, 0x12, 0x30, 0x17, 0xf, 0x7e, 0x73, 0x39, 0x45, 0x12, 0xb6, 0xaf,
+ 0x12, 0x32, 0xc0, 0xe4, 0x7a, 0xb3, 0x39, 0xa3, 0xe4, 0x7a, 0xb3, 0x39,
+ 0x48, 0x22, 0x6c, 0x77, 0x7e, 0x8, 0xff, 0xff, 0x6c, 0x66, 0x7e, 0x44, 0x0,
+ 0x1, 0x7c, 0xb6, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7e, 0xb3, 0x39,
+ 0x42, 0xa, 0x2b, 0x5d, 0x24, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x3, 0x12, 0xba,
+ 0xdd, 0x7e, 0xb3, 0x39, 0x45, 0xbc, 0xb6, 0x78, 0x3, 0x12, 0xba, 0xdd, 0x7e,
+ 0x50, 0x1e, 0xac, 0x56, 0x49, 0xf2, 0x39, 0x4b, 0x6d, 0xee, 0xbf, 0x70,
+ 0x50, 0x4, 0x7f, 0x7, 0x7c, 0x76, 0xb, 0x60, 0xbe, 0x60, 0x3, 0x40, 0xbd,
+ 0x7c, 0xa7, 0x7c, 0xba, 0x22, 0x7e, 0x24, 0xff, 0xff, 0x7e, 0x90, 0x1e,
+ 0xac, 0x96, 0x59, 0x24, 0x39, 0x4b, 0x22, 0x7e, 0xb3, 0x59, 0x8b, 0xbe,
+ 0xb0, 0x1, 0x22, 0xca, 0x3b, 0x7f, 0x70, 0x7c, 0x17, 0x7c, 0xb, 0x75, 0x2b,
+ 0x1, 0x7e, 0x73, 0x82, 0xe, 0x7c, 0xc7, 0x7e, 0x73, 0x82, 0xf, 0x7c, 0xd7,
+ 0x6d, 0x22, 0x7d, 0xc2, 0x7d, 0xd2, 0x12, 0xae, 0x5f, 0x7d, 0xb3, 0xa, 0x50,
+ 0x1b, 0x55, 0x7c, 0xfb, 0x61, 0xb0, 0x7a, 0xf1, 0x2c, 0xbe, 0xf0, 0x0, 0x58,
+ 0xc, 0x1a, 0x3f, 0x1a, 0x40, 0x9d, 0x43, 0xa, 0x50, 0x2d, 0x54, 0xf5, 0x2c,
+ 0xbc, 0xcf, 0x18, 0xc, 0x1a, 0x30, 0x1a, 0x4f, 0x9d, 0x43, 0xa, 0x50, 0x9d,
+ 0x54, 0xf5, 0x2c, 0xa, 0x51, 0x1b, 0x55, 0x7c, 0xeb, 0x80, 0x60, 0x7a, 0xe1,
+ 0x2d, 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x3e, 0x1a, 0x41, 0x9d, 0x43, 0xa,
+ 0x51, 0x2d, 0x54, 0xf5, 0x2d, 0xbc, 0xde, 0x18, 0xc, 0x1a, 0x31, 0x1a, 0x4e,
+ 0x9d, 0x43, 0xa, 0x51, 0x9d, 0x54, 0xf5, 0x2d, 0xe5, 0x2c, 0x7e, 0x71, 0x2d,
+ 0x12, 0x2e, 0x40, 0x7d, 0xa3, 0x7c, 0xb0, 0x24, 0xfe, 0xbc, 0xbf, 0x68,
+ 0x12, 0x12, 0xbc, 0x24, 0x68, 0xd, 0x7c, 0xb1, 0x24, 0xfe, 0xbc, 0xbe, 0x68,
+ 0x5, 0x12, 0xbc, 0x2d, 0x78, 0x8, 0x7d, 0x3a, 0x2d, 0x3d, 0x7d, 0xd3, 0x80,
+ 0xe, 0xbc, 0xf, 0x78, 0x4, 0xbc, 0x1e, 0x68, 0x6, 0x7d, 0x3a, 0x2d, 0x3c,
+ 0x7d, 0xc3, 0xb, 0xe0, 0x12, 0xbc, 0x2d, 0x8, 0x9b, 0xb, 0xf0, 0x12, 0xbc,
+ 0x24, 0x18, 0x2, 0x61, 0x1d, 0x7d, 0x3c, 0x12, 0x4f, 0x27, 0x7d, 0x23, 0x7d,
+ 0x3d, 0x12, 0x4f, 0x25, 0x7d, 0xa3, 0x7d, 0x12, 0x9d, 0x1a, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x3a, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31,
+ 0xbe, 0x34, 0x0, 0x50, 0x8, 0x2, 0x80, 0x38, 0x7d, 0xb, 0x9d, 0x2, 0xbe,
+ 0x4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x3b, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x30, 0xbe, 0x34, 0x0, 0x46, 0x48, 0x19, 0x30, 0x29, 0x1b, 0xbe, 0x4,
+ 0x0, 0x0, 0x8, 0x6, 0x7d, 0x3b, 0x9d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d,
+ 0x30, 0xbe, 0x34, 0x0, 0x64, 0x58, 0x5, 0x75, 0x2b, 0x0, 0x80, 0x3, 0x75,
+ 0x2b, 0x1, 0x1b, 0x7a, 0x20, 0xe5, 0x2b, 0xda, 0x3b, 0x22, 0xa, 0x20, 0xb,
+ 0x25, 0x1a, 0x3f, 0xbd, 0x32, 0x22, 0xa, 0x21, 0xb, 0x25, 0x1a, 0x3e, 0xbd,
+ 0x32, 0x22, 0x7e, 0x54, 0x2d, 0x32, 0x7a, 0x57, 0x92, 0xfc, 0x7e, 0x54,
+ 0x2d, 0x5a, 0x7a, 0x57, 0x92, 0xfe, 0x7e, 0x54, 0x2d, 0x82, 0x7a, 0x57,
+ 0x93, 0x0, 0x74, 0x1, 0x7a, 0xb3, 0x92, 0xfa, 0x7a, 0xb3, 0x92, 0xfb, 0x7a,
+ 0x37, 0x2d, 0x32, 0x7a, 0x27, 0x2d, 0x34, 0x7a, 0x17, 0x2d, 0x5a, 0x7a, 0x7,
+ 0x2d, 0x5c, 0x7e, 0x8, 0x92, 0xfa, 0x12, 0x2b, 0xe, 0x7e, 0x37, 0x2d, 0x82,
+ 0x22, 0x7c, 0xa6, 0x7c, 0x87, 0x7c, 0x9b, 0xc2, 0x0, 0x7e, 0x50, 0x15, 0xac,
+ 0x58, 0x49, 0x2, 0x37, 0x7, 0x7e, 0x30, 0xd, 0xac, 0x39, 0x49, 0x31, 0x67,
+ 0x93, 0x9d, 0x30, 0x49, 0x22, 0x37, 0x9, 0x49, 0x11, 0x67, 0x95, 0x9d, 0x12,
+ 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x23, 0x80, 0x4, 0x6d, 0x22, 0x9d,
+ 0x23, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x31, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x31, 0x4c, 0xaa, 0x78, 0xe, 0x7d, 0x12, 0x2d, 0x13, 0xbe, 0x14, 0x0,
+ 0x4b, 0x28, 0x13, 0xd2, 0x0, 0x80, 0xf, 0xbe, 0xa0, 0x1, 0x78, 0xa, 0x2d,
+ 0x32, 0xbe, 0x34, 0x0, 0xc8, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0x22, 0x7c,
+ 0xab, 0x7e, 0xb3, 0x69, 0x69, 0xbe, 0xb0, 0x0, 0x28, 0x1b, 0x14, 0x7a, 0xb3,
+ 0x69, 0x69, 0x7e, 0x60, 0xff, 0x74, 0xd, 0xa4, 0x19, 0x65, 0x67, 0x97, 0x12,
+ 0xbd, 0x7c, 0x7e, 0xb3, 0x37, 0xd1, 0x4, 0x7a, 0xb3, 0x37, 0xd1, 0x22, 0xca,
+ 0xf8, 0x7f, 0x70, 0x7e, 0x93, 0x69, 0x69, 0x6c, 0x88, 0x80, 0x30, 0x74, 0xd,
+ 0xac, 0xb8, 0x9, 0xf5, 0x67, 0x97, 0x5e, 0xf0, 0xf, 0xa, 0x58, 0x7f, 0x17,
+ 0x2d, 0x35, 0x7e, 0x1b, 0x50, 0x7c, 0xb5, 0x30, 0xe0, 0x9, 0x7c, 0xb8, 0x7c,
+ 0x7f, 0x12, 0xbc, 0xda, 0x80, 0xc, 0x7c, 0xb5, 0x30, 0xe1, 0x7, 0x7c, 0xb8,
+ 0x7c, 0x7f, 0x12, 0xbd, 0x44, 0xb, 0x80, 0xbc, 0x98, 0x38, 0xcc, 0xda, 0xf8,
+ 0x22, 0x7c, 0x17, 0x7c, 0x3b, 0x12, 0xbd, 0x67, 0x12, 0xbd, 0x71, 0x6c, 0x0,
+ 0x7e, 0x70, 0x8, 0xac, 0x71, 0x19, 0x3, 0x69, 0x1a, 0xe4, 0x19, 0xb3, 0x69,
+ 0x19, 0x74, 0x7, 0xa, 0x31, 0x19, 0xb3, 0x2e, 0x8e, 0x22, 0x7e, 0x70, 0x15,
+ 0xac, 0x71, 0x2e, 0x34, 0x37, 0x7, 0x22, 0x74, 0xd, 0xac, 0x3b, 0x2e, 0x14,
+ 0x67, 0x93, 0x2, 0x1, 0xf3, 0x7e, 0xa0, 0x3, 0x74, 0x8, 0xac, 0x7b, 0x19,
+ 0xa3, 0x69, 0x19, 0x22, 0x7c, 0x7b, 0x6c, 0xaa, 0x7e, 0x90, 0x15, 0xac,
+ 0x97, 0x9, 0xb4, 0x37, 0x1, 0xb4, 0x1, 0x10, 0x9, 0x64, 0x37, 0x0, 0xbe,
+ 0x60, 0x3c, 0x50, 0xa, 0x7e, 0xa0, 0x4, 0x80, 0x8, 0x80, 0x3, 0xb4, 0x2,
+ 0x3, 0x7e, 0xa0, 0x8, 0xe4, 0x19, 0xb4, 0x37, 0x0, 0x19, 0xb4, 0x37, 0x1,
+ 0x7c, 0xba, 0x22, 0x7c, 0x14, 0x7c, 0x46, 0x7c, 0xab, 0x1a, 0x1a, 0x2d,
+ 0x11, 0x1a, 0xf7, 0x7d, 0x41, 0x9d, 0x4f, 0x7c, 0x69, 0xbc, 0x16, 0x58, 0x4,
+ 0x7c, 0xb6, 0x80, 0x2, 0x7c, 0xb4, 0x1a, 0x4, 0x9d, 0x10, 0x7c, 0x63, 0xbc,
+ 0x56, 0x8, 0x4, 0x7c, 0xa6, 0x80, 0x2, 0x7c, 0xa7, 0x9c, 0xba, 0x4, 0x22,
+ 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf6, 0x7d, 0x92, 0x7c, 0xe7, 0x7c, 0xdb,
+ 0x6c, 0xaa, 0x7e, 0x10, 0x15, 0xac, 0x1f, 0x19, 0xa0, 0x37, 0x2, 0xe4, 0x19,
+ 0xb0, 0x37, 0x4, 0x19, 0xb0, 0x37, 0x5, 0x19, 0xb0, 0x37, 0x3, 0x7e, 0x87,
+ 0x76, 0x29, 0x7d, 0x8, 0x1e, 0x4, 0x1e, 0x4, 0xbd, 0x1, 0x40, 0x8, 0x12,
+ 0xbe, 0x81, 0x7e, 0x50, 0x1, 0x80, 0x1d, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x38,
+ 0x7d, 0x3, 0x1e, 0x4, 0x1e, 0x4, 0xbd, 0x1, 0x38, 0x10, 0x7e, 0x87, 0x76,
+ 0x29, 0xbd, 0x81, 0x40, 0x8, 0x12, 0xbe, 0x81, 0x6c, 0x55, 0x12, 0x2f, 0xd,
+ 0x7e, 0x87, 0x76, 0x1b, 0x1e, 0x84, 0x1e, 0x84, 0xbd, 0x89, 0x28, 0x8, 0x12,
+ 0xbe, 0x81, 0x7e, 0x50, 0x1, 0x80, 0x21, 0x7e, 0x27, 0x76, 0x1b, 0x7e, 0x34,
+ 0x0, 0x3, 0xad, 0x32, 0x7d, 0x83, 0x1e, 0x84, 0x1e, 0x84, 0xbd, 0x89, 0x50,
+ 0x10, 0x7e, 0x37, 0x76, 0x1b, 0xbd, 0x39, 0x40, 0x8, 0x12, 0xbe, 0x81, 0x6c,
+ 0x55, 0x12, 0x2e, 0x51, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7c, 0xbd, 0x7c,
+ 0x7e, 0x7c, 0x6f, 0x22, 0x7e, 0x8, 0x39, 0xfe, 0x7e, 0x34, 0x0, 0x1, 0x74,
+ 0xff, 0x2, 0x0, 0x2e, 0x12, 0xbe, 0x88, 0x2, 0xbe, 0x9b, 0xca, 0xf8, 0x74,
+ 0x1, 0x7a, 0xb3, 0x39, 0xfe, 0x7e, 0x73, 0x75, 0x8e, 0x1e, 0x70, 0x7a, 0x73,
+ 0x81, 0xec, 0x7e, 0xb4, 0x0, 0xd2, 0x7a, 0xb7, 0x81, 0xed, 0x7e, 0xa4, 0x0,
+ 0xc8, 0x7a, 0xa7, 0x81, 0xef, 0x7e, 0xf3, 0x39, 0xf8, 0x7a, 0xb3, 0x39,
+ 0xf8, 0x12, 0xcf, 0x12, 0x7a, 0xf3, 0x39, 0xf8, 0x7e, 0xa3, 0x67, 0x62,
+ 0xbe, 0xa0, 0x0, 0x38, 0x2, 0xe1, 0xc3, 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x2,
+ 0xe1, 0xc3, 0xbe, 0xa0, 0x8, 0x28, 0x1c, 0x7e, 0xa7, 0x67, 0x68, 0xbe, 0xa4,
+ 0x2, 0x58, 0x58, 0x12, 0x7e, 0xb3, 0x75, 0x8e, 0x1e, 0xb0, 0xa, 0x3b, 0x7d,
+ 0x2b, 0x7e, 0x4, 0x0, 0xc8, 0x7d, 0x10, 0xe1, 0xbc, 0xbe, 0xa0, 0x5, 0x28,
+ 0x19, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x2, 0xbc, 0x58, 0xf, 0x12, 0xbf,
+ 0xee, 0x7e, 0x4, 0x0, 0xfa, 0x7d, 0x20, 0x7e, 0x14, 0x0, 0xe6, 0xe1, 0xbc,
+ 0xbe, 0xa0, 0x3, 0x28, 0x1b, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x3, 0x84,
+ 0x58, 0x11, 0x12, 0xbf, 0xee, 0x7e, 0x24, 0x1, 0x2c, 0x7e, 0x14, 0x1, 0xe,
+ 0x7e, 0x4, 0x0, 0xfa, 0x80, 0x7e, 0xbe, 0xa0, 0x2, 0x28, 0x1b, 0x7e, 0x37,
+ 0x67, 0x68, 0xbe, 0x34, 0x4, 0x4c, 0x58, 0x11, 0x12, 0xbf, 0xee, 0x7e, 0x24,
+ 0x1, 0x5e, 0x7e, 0x14, 0x1, 0x4a, 0x7e, 0x4, 0x0, 0xfa, 0x80, 0x5e, 0xbe,
+ 0xa0, 0x1, 0x28, 0x60, 0x7e, 0x37, 0x67, 0x68, 0xbe, 0x34, 0x5, 0x14, 0x58,
+ 0x56, 0x7e, 0xb3, 0x69, 0x75, 0xbe, 0xb0, 0x2, 0x68, 0xf, 0xb4, 0x1, 0x34,
+ 0xbe, 0xa0, 0x2, 0x78, 0x2f, 0x7e, 0xb3, 0x69, 0x6a, 0xb4, 0x2, 0x28, 0x7e,
+ 0x73, 0x67, 0x98, 0xbe, 0x70, 0x46, 0x38, 0x9, 0x7e, 0x73, 0x67, 0xa5, 0xbe,
+ 0x70, 0x46, 0x28, 0x16, 0x12, 0xbf, 0xe7, 0x7e, 0x24, 0x1, 0x2c, 0x7e, 0x14,
+ 0x1, 0x18, 0x7e, 0x4, 0x0, 0xfa, 0x12, 0xbf, 0xf5, 0xd2, 0x29, 0x80, 0x1b,
+ 0x12, 0xbf, 0xe7, 0x7e, 0x24, 0x1, 0x90, 0x7e, 0x14, 0x1, 0x7c, 0x7e, 0x4,
+ 0x0, 0xfa, 0x12, 0xbf, 0xf5, 0x80, 0x7, 0x80, 0x0, 0xe4, 0x7a, 0xb3, 0x39,
+ 0xfe, 0x7e, 0xb3, 0x39, 0xfe, 0x70, 0x14, 0x12, 0xbf, 0xe7, 0x7e, 0x27,
+ 0x75, 0x96, 0x7e, 0x17, 0x75, 0x98, 0x7e, 0x7, 0x75, 0xa4, 0x12, 0xbf, 0xf5,
+ 0x80, 0x2, 0xd2, 0x1f, 0xda, 0xf8, 0x22, 0x7e, 0x73, 0x75, 0x8e, 0xa, 0x37,
+ 0x22, 0x7e, 0xb3, 0x75, 0x8e, 0xa, 0x3b, 0x22, 0x7a, 0x73, 0x81, 0xec, 0x7a,
+ 0x27, 0x81, 0xed, 0x7a, 0x17, 0x81, 0xef, 0x7a, 0x7, 0x81, 0xf9, 0x6d, 0x33,
+ 0x9d, 0x30, 0x12, 0x4e, 0x24, 0x12, 0x4f, 0x1b, 0x7a, 0x73, 0x59, 0x3c,
+ 0x22, 0xca, 0x3b, 0x7c, 0xf5, 0x7c, 0xe6, 0xbc, 0xbe, 0x50, 0x5, 0x75, 0x45,
+ 0x1, 0x80, 0xc, 0xbc, 0xbe, 0x28, 0x5, 0x75, 0x45, 0xff, 0x80, 0x3, 0x75,
+ 0x45, 0x0, 0xbc, 0x7f, 0x50, 0x5, 0x75, 0x46, 0x1, 0x80, 0xc, 0xbc, 0x7f,
+ 0x28, 0x5, 0x75, 0x46, 0xff, 0x80, 0x3, 0x75, 0x46, 0x0, 0x7c, 0xdb, 0x7c,
+ 0xc7, 0x7e, 0xe4, 0x7f, 0xff, 0x1, 0xd7, 0x7e, 0x8, 0x91, 0xfe, 0x7e, 0x34,
+ 0x0, 0xc, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7a, 0xc3, 0x91, 0xff, 0x7a, 0xd3,
+ 0x92, 0x2, 0xbc, 0xed, 0x68, 0x10, 0xe5, 0x45, 0x1a, 0x2b, 0xa, 0x3d, 0x2d,
+ 0x32, 0x7a, 0x73, 0x91, 0xfe, 0x7a, 0x73, 0x92, 0x6, 0xbc, 0xfc, 0x68, 0x10,
+ 0xe5, 0x46, 0x1a, 0x2b, 0xa, 0x3c, 0x2d, 0x32, 0x7a, 0x73, 0x92, 0x3, 0x7a,
+ 0x73, 0x92, 0x7, 0x7e, 0xf4, 0xd8, 0xf0, 0x75, 0x47, 0xff, 0x75, 0x44, 0x0,
+ 0x7e, 0x51, 0x44, 0x74, 0x4, 0xac, 0x5b, 0x9, 0xb2, 0x91, 0xfe, 0xbe, 0xb0,
+ 0xff, 0x68, 0x17, 0x9, 0x72, 0x91, 0xff, 0xbe, 0x70, 0xff, 0x68, 0xe, 0x12,
+ 0x2e, 0x40, 0x7d, 0xd3, 0xbd, 0xfd, 0x58, 0x5, 0x7d, 0xfd, 0x85, 0x44, 0x47,
+ 0x5, 0x44, 0xe5, 0x44, 0xb4, 0x3, 0xd2, 0x7e, 0xa1, 0x47, 0x74, 0x4, 0xa4,
+ 0x9, 0xd5, 0x91, 0xfe, 0x9, 0xc5, 0x91, 0xff, 0xbd, 0xfe, 0x58, 0x2, 0x7d,
+ 0xef, 0xbc, 0xed, 0x68, 0x2, 0x1, 0x4e, 0xbc, 0xfc, 0x68, 0x2, 0x1, 0x4e,
+ 0x7d, 0x3e, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7e, 0x80, 0xff, 0x6c, 0xff,
+ 0x7e, 0xc0, 0xff, 0x6c, 0xee, 0x75, 0x29, 0x0, 0x6c, 0x99, 0x7e, 0xf4, 0x7f,
+ 0xff, 0x6c, 0xdd, 0x80, 0x58, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x12, 0x7f, 0x45,
+ 0x7d, 0x3, 0xbd, 0xf, 0x58, 0x2, 0x7d, 0xf0, 0xe5, 0x27, 0xbc, 0xb8, 0x50,
+ 0x3, 0x7e, 0x81, 0x27, 0xe5, 0x27, 0xbc, 0xbf, 0x28, 0x3, 0x7e, 0xf1, 0x27,
+ 0xe5, 0x28, 0xbc, 0xbc, 0x50, 0x3, 0x7e, 0xc1, 0x28, 0xe5, 0x28, 0xbc, 0xbe,
+ 0x28, 0x3, 0x7e, 0xe1, 0x28, 0xa, 0x58, 0xa, 0x1f, 0x9d, 0x15, 0xbe, 0x14,
+ 0x0, 0x7, 0x18, 0xc, 0xa, 0x5c, 0xa, 0x1e, 0x9d, 0x15, 0xbe, 0x14, 0x0, 0x7,
+ 0x8, 0xa, 0x7e, 0x14, 0x1, 0xf4, 0x7a, 0x17, 0x39, 0x3c, 0x41, 0x28, 0xb,
+ 0xd0, 0x12, 0x64, 0x7f, 0x38, 0xa3, 0x7d, 0x3f, 0x3e, 0x34, 0x12, 0x79,
+ 0x68, 0x7d, 0x3, 0xbc, 0xec, 0x78, 0x17, 0xbe, 0xc0, 0x0, 0x28, 0x2, 0x1b,
+ 0xc0, 0x7e, 0x73, 0x82, 0xf, 0xa, 0x57, 0x1b, 0x54, 0xa, 0x1e, 0xbd, 0x15,
+ 0x58, 0x2, 0xb, 0xe0, 0xbc, 0xf8, 0x78, 0x17, 0xbe, 0x80, 0x0, 0x28, 0x2,
+ 0x1b, 0x80, 0x7e, 0x73, 0x82, 0xe, 0xa, 0x57, 0x1b, 0x54, 0xa, 0x1f, 0xbd,
+ 0x15, 0x58, 0x2, 0xb, 0xf0, 0x7c, 0xdc, 0x80, 0x1b, 0x7c, 0xc8, 0x80, 0x11,
+ 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0x2e, 0x40, 0xbd, 0x30, 0x8, 0x2, 0x5, 0x29,
+ 0xb, 0x90, 0xb, 0xc0, 0xbc, 0xfc, 0x50, 0xeb, 0xb, 0xd0, 0xbc, 0xed, 0x50,
+ 0xe1, 0x7e, 0x83, 0x69, 0x6a, 0xbe, 0x80, 0x3, 0x40, 0xd, 0x12, 0xc2, 0x31,
+ 0x50, 0x28, 0xb, 0x14, 0x7a, 0x17, 0x39, 0x3c, 0x80, 0x20, 0xbe, 0x80, 0x1,
+ 0x38, 0x1b, 0x7e, 0x17, 0x39, 0x3c, 0xbe, 0x14, 0x0, 0x2, 0x28, 0x6, 0x1b,
+ 0x15, 0x7a, 0x17, 0x39, 0x3c, 0x12, 0xc2, 0x3a, 0x50, 0x6, 0xb, 0x14, 0x7a,
+ 0x17, 0x38, 0x9e, 0x7e, 0x83, 0x67, 0x62, 0xbe, 0x80, 0x1, 0x40, 0x2f, 0x7e,
+ 0x30, 0x2, 0xac, 0x39, 0x7e, 0xa1, 0x29, 0x74, 0x3, 0xa4, 0xbd, 0x51, 0x8,
+ 0xf, 0x6d, 0x11, 0x7a, 0x17, 0x39, 0x3c, 0x12, 0xc2, 0x3a, 0x50, 0x15, 0xb,
+ 0x14, 0x80, 0xd, 0x12, 0xc2, 0x31, 0x50, 0x6, 0xb, 0x15, 0x7a, 0x17, 0x39,
+ 0x3c, 0x6d, 0x11, 0x7a, 0x17, 0x38, 0x9e, 0xda, 0x3b, 0x22, 0x7e, 0x17,
+ 0x39, 0x3c, 0xbe, 0x14, 0x3, 0xe8, 0x22, 0x7e, 0x17, 0x38, 0x9e, 0xbe, 0x14,
+ 0x1, 0xf4, 0x22, 0xca, 0x79, 0x7e, 0x13, 0x82, 0xe, 0x7e, 0x3, 0x82, 0xf,
+ 0x6c, 0xff, 0x61, 0x1f, 0x7e, 0x30, 0x2, 0xac, 0x3f, 0x9, 0xa1, 0x65, 0x60,
+ 0x7a, 0xa3, 0x91, 0xfe, 0x9, 0xb1, 0x65, 0x61, 0xf5, 0x47, 0x7e, 0x44, 0x80,
+ 0x1, 0x1a, 0x5a, 0x1b, 0x54, 0xf5, 0x44, 0x61, 0x3, 0x85, 0x44, 0x45, 0xe5,
+ 0x44, 0xbe, 0xb0, 0x0, 0x58, 0x12, 0xe5, 0x44, 0x1a, 0x3b, 0x7e, 0x53, 0x91,
+ 0xfe, 0x1a, 0x15, 0x7d, 0x51, 0x9d, 0x53, 0x2d, 0x51, 0xf5, 0x45, 0xbe,
+ 0x11, 0x44, 0x18, 0x12, 0x7e, 0x73, 0x91, 0xfe, 0x1a, 0x37, 0xe5, 0x44,
+ 0x1a, 0x1b, 0x9d, 0x13, 0x7d, 0x53, 0x9d, 0x51, 0xf5, 0x45, 0xe5, 0x47,
+ 0x1a, 0x1b, 0x1b, 0x14, 0x7c, 0xe3, 0x80, 0x48, 0x7a, 0xe1, 0x46, 0xbe,
+ 0xe0, 0x0, 0x58, 0xe, 0x1a, 0x3e, 0xe5, 0x47, 0x1a, 0x1b, 0x7d, 0x51, 0x9d,
+ 0x53, 0x2d, 0x51, 0xf5, 0x46, 0xbc, 0xe, 0x18, 0xc, 0xe5, 0x47, 0x1a, 0x5b,
+ 0x1a, 0x1e, 0x9d, 0x15, 0x9d, 0x51, 0xf5, 0x46, 0x7e, 0x73, 0x91, 0xfe,
+ 0xbe, 0x71, 0x45, 0x78, 0x7, 0xe5, 0x47, 0xbe, 0xb1, 0x46, 0x68, 0x10, 0xe5,
+ 0x45, 0x7e, 0x71, 0x46, 0x12, 0x2e, 0x40, 0x7d, 0xf3, 0xbd, 0xf4, 0x8, 0x2,
+ 0x7d, 0x4f, 0xb, 0xe0, 0xe5, 0x47, 0x1a, 0x5b, 0xb, 0x54, 0x1a, 0x1e, 0xbd,
+ 0x15, 0x8, 0xac, 0x5, 0x44, 0x7e, 0x73, 0x91, 0xfe, 0x1a, 0x37, 0xb, 0x34,
+ 0xe5, 0x44, 0x1a, 0x1b, 0xbd, 0x13, 0x18, 0x2, 0x41, 0x70, 0x74, 0x2, 0xac,
+ 0xbf, 0x59, 0x45, 0x38, 0xfe, 0xb, 0xf0, 0x12, 0x67, 0x3e, 0x28, 0x2, 0x41,
+ 0x51, 0xda, 0x79, 0x22, 0xca, 0x79, 0x6d, 0x22, 0x7d, 0x53, 0x1b, 0x54,
+ 0x7e, 0x7f, 0x39, 0xe4, 0x79, 0x57, 0x0, 0xa, 0x7e, 0x7f, 0x39, 0xe4, 0xb,
+ 0x7a, 0x50, 0x44, 0x20, 0x1b, 0x7a, 0x50, 0x6d, 0x55, 0x7e, 0x7f, 0x39,
+ 0xe4, 0x79, 0x57, 0x0, 0x6, 0x80, 0x1b, 0x7e, 0x2f, 0x39, 0xe4, 0x69, 0xf2,
+ 0x0, 0xc, 0x5e, 0xf4, 0x0, 0xff, 0x68, 0xd, 0x69, 0x72, 0x0, 0x8, 0x7f,
+ 0x20, 0x2d, 0x52, 0x7a, 0x2b, 0xf0, 0xb, 0x24, 0xbd, 0x32, 0x38, 0xe1, 0x7e,
+ 0x34, 0x0, 0x1, 0x7e, 0xf, 0x39, 0xe4, 0x79, 0x30, 0x0, 0x4, 0xda, 0x79,
+ 0x22, 0x7e, 0x70, 0x3, 0xd2, 0xc8, 0xc2, 0xea, 0x7e, 0xf, 0x39, 0xe4, 0xb,
+ 0xa, 0x20, 0x5e, 0x24, 0x0, 0x13, 0x1b, 0xa, 0x20, 0xa, 0x27, 0x3e, 0x24,
+ 0x3e, 0x24, 0x7e, 0xf, 0x39, 0xe4, 0x2, 0x16, 0xaf, 0x75, 0xed, 0x8f, 0x75,
+ 0xad, 0xb0, 0xa9, 0xc7, 0x94, 0xa9, 0xd4, 0x94, 0x22, 0x75, 0xec, 0xff,
+ 0x75, 0xee, 0xff, 0x75, 0xeb, 0x3, 0x75, 0xac, 0xc0, 0xa9, 0xd0, 0xea, 0x12,
+ 0xc3, 0xa1, 0x75, 0xe1, 0x2, 0x22, 0xc2, 0x8c, 0xc2, 0xa9, 0x32, 0xca, 0x7b,
+ 0xca, 0x6b, 0xca, 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0,
+ 0xd0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, 0x8f, 0x12, 0x0, 0x56, 0xd0, 0x82, 0xd0,
+ 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda, 0x5b,
+ 0xda, 0x6b, 0xda, 0x7b, 0x32, 0xca, 0xb8, 0xa9, 0x31, 0xcd, 0x10, 0xa9,
+ 0x31, 0xe5, 0xc, 0x12, 0x55, 0xb6, 0x74, 0x1, 0x7a, 0xb3, 0x9b, 0xab, 0xa9,
+ 0xc1, 0xcd, 0xa9, 0x37, 0xcd, 0x7, 0xa9, 0x37, 0xe5, 0x3, 0xa9, 0xc7, 0xcd,
+ 0x75, 0xcd, 0x0, 0xda, 0xb8, 0x32, 0x12, 0xc4, 0x28, 0x20, 0x2d, 0x3, 0x2,
+ 0xc4, 0x48, 0x22, 0x30, 0x2e, 0x3, 0x12, 0xc4, 0x2f, 0x22, 0xa9, 0xd2, 0xea,
+ 0xa9, 0xc2, 0xea, 0xc2, 0x2e, 0xc2, 0x2d, 0x22, 0x12, 0x1f, 0xd5, 0x68, 0x8,
+ 0xe4, 0x7a, 0xb3, 0x9b, 0x7a, 0x2, 0xc4, 0x1e, 0x22, 0x20, 0xd, 0x3, 0x12,
+ 0x4f, 0x63, 0xe4, 0x7a, 0xb3, 0x9b, 0x82, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x7b,
+ 0x74, 0x2, 0x7a, 0xb3, 0x9a, 0x7c, 0x7a, 0xb3, 0x9a, 0x7d, 0x22, 0xca, 0xb8,
+ 0xca, 0x39, 0x12, 0x51, 0xf2, 0x7e, 0x37, 0x9b, 0x77, 0xb, 0x34, 0x7a, 0x37,
+ 0x9b, 0x77, 0x7e, 0x37, 0x9b, 0xa9, 0xb, 0x34, 0x7a, 0x37, 0x9b, 0xa9, 0x7e,
+ 0x37, 0x3, 0xd8, 0x4d, 0x33, 0x68, 0x6, 0x1b, 0x34, 0x7a, 0x37, 0x3, 0xd8,
+ 0x7e, 0xb3, 0x9b, 0x79, 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x9b, 0x79, 0x7e, 0xb3,
+ 0x9b, 0x79, 0x70, 0x2, 0xd2, 0x12, 0x7e, 0x37, 0x3, 0xd6, 0xb, 0x34, 0x7a,
+ 0x37, 0x3, 0xd6, 0x7e, 0x37, 0x9b, 0x85, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x6,
+ 0x1b, 0x34, 0x7a, 0x37, 0x9b, 0x85, 0x7e, 0xb3, 0x9b, 0xb1, 0xbe, 0xb0,
+ 0xff, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9b, 0xb1, 0xda, 0x39, 0xda, 0xb8, 0x32,
+ 0xc2, 0x88, 0xd2, 0xa8, 0x22, 0xa9, 0xd6, 0xcd, 0xa9, 0xd5, 0xcd, 0x22,
+ 0xa9, 0xd6, 0xef, 0x22, 0x7e, 0xb3, 0x9b, 0xb0, 0x4, 0x7a, 0xb3, 0x9b, 0xb0,
+ 0x7e, 0x73, 0x9b, 0xb0, 0xbe, 0x70, 0xc8, 0x28, 0x6, 0x74, 0xc8, 0x7a, 0xb3,
+ 0x9b, 0xb0, 0x22, 0xa2, 0x13, 0x30, 0x9, 0x1, 0xb3, 0x50, 0x46, 0xa2, 0x9,
+ 0x92, 0x13, 0x30, 0x9, 0x2a, 0xa9, 0xd5, 0xc3, 0xa9, 0xd4, 0xc3, 0xa9, 0xd3,
+ 0xc7, 0x7e, 0x34, 0x0, 0x60, 0x12, 0xc5, 0x49, 0xa9, 0xd4, 0xc7, 0xa9, 0xd5,
+ 0xc7, 0x7e, 0x34, 0x0, 0x80, 0x12, 0xc5, 0x49, 0xa9, 0xd7, 0xc3, 0xa9, 0xd6,
+ 0xc3, 0x7e, 0x34, 0x1, 0xa0, 0x2, 0xc5, 0x49, 0xa9, 0xc7, 0xc3, 0xa9, 0xc6,
+ 0xc3, 0xa9, 0xc4, 0xc7, 0xa9, 0xc5, 0xc7, 0xa9, 0xc5, 0xc3, 0xa9, 0xc4,
+ 0xc3, 0xa9, 0xc3, 0xc7, 0x22, 0x7e, 0x34, 0x0, 0x64, 0x80, 0x10, 0x7e, 0x24,
+ 0x0, 0x2, 0x80, 0x1, 0x0, 0x7d, 0x12, 0x1b, 0x24, 0x4d, 0x11, 0x78, 0xf7,
+ 0x0, 0x7d, 0x13, 0x1b, 0x34, 0x4d, 0x11, 0x78, 0xe8, 0x22, 0x75, 0x9a, 0x2f,
+ 0xa9, 0xd1, 0x99, 0xa9, 0xd6, 0xdf, 0x22, 0xd2, 0xcb, 0xc2, 0x8c, 0x43,
+ 0x89, 0x1, 0x75, 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0xa9, 0x22, 0xd2, 0xcb,
+ 0xc2, 0x8e, 0x43, 0x89, 0x20, 0x75, 0x8d, 0x1, 0x75, 0x8b, 0x0, 0xd2, 0x8e,
+ 0xd2, 0xab, 0x22, 0x75, 0xb7, 0x0, 0x75, 0xb8, 0x0, 0x75, 0xf7, 0x0, 0x75,
+ 0xf8, 0x0, 0xa9, 0xd0, 0xb7, 0xd2, 0xb8, 0xa9, 0xd5, 0xb7, 0xd2, 0xbd, 0xa9,
+ 0xd0, 0xf7, 0xd2, 0xf8, 0xa9, 0xd6, 0xf7, 0xd2, 0xfe, 0xa9, 0xd1, 0xf7,
+ 0xc2, 0xf9, 0xa9, 0xc4, 0xb7, 0xd2, 0xbc, 0xa9, 0xc2, 0xb7, 0xc2, 0xba,
+ 0xa9, 0xc1, 0xb7, 0xc2, 0xb9, 0xa9, 0xc3, 0xb7, 0xc2, 0xbb, 0xa9, 0xc3,
+ 0xf7, 0xc2, 0xfb, 0x22, 0xd2, 0xe9, 0xc2, 0xc1, 0x22, 0xd2, 0xcc, 0x12,
+ 0xc6, 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x7e, 0x34, 0x0, 0x3, 0x1b, 0xa,
+ 0x30, 0x7e, 0x34, 0x0, 0x81, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x2,
+ 0xd2, 0xeb, 0xc2, 0xc3, 0x6d, 0x11, 0x7e, 0x1f, 0x39, 0xe8, 0x1b, 0x1a,
+ 0x10, 0xc2, 0xcc, 0x22, 0x7e, 0xf, 0x39, 0xe8, 0x69, 0x30, 0x0, 0x4, 0x5e,
+ 0x34, 0x0, 0x2, 0x22, 0x12, 0xc6, 0x76, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xe8,
+ 0x79, 0x30, 0x0, 0xa, 0x12, 0xc6, 0x8c, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x80,
+ 0xa, 0x12, 0xc6, 0x64, 0x68, 0x5, 0x12, 0xc6, 0x50, 0x80, 0x5, 0x12, 0xc6,
+ 0x57, 0x68, 0xf1, 0x12, 0xc6, 0x43, 0x12, 0xc6, 0x1, 0x78, 0xfb, 0x69, 0x50,
+ 0x0, 0xa, 0x2, 0x31, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0xf, 0x39, 0xe8,
+ 0x79, 0x30, 0x0, 0x4, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xec, 0x22, 0x7e,
+ 0x1f, 0x39, 0xe8, 0x69, 0x31, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0xe4,
+ 0x7a, 0xb3, 0x39, 0xec, 0x7e, 0x1f, 0x39, 0xf1, 0x69, 0x31, 0x0, 0x4, 0x5e,
+ 0x34, 0x0, 0x1, 0x22, 0xd2, 0xcc, 0x7e, 0x24, 0x0, 0x3, 0x7e, 0xf, 0x39,
+ 0xe8, 0x1b, 0xa, 0x20, 0x7e, 0xf, 0x39, 0xe8, 0x79, 0x30, 0x0, 0x6, 0x22,
+ 0x7e, 0xf, 0x39, 0xf1, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30,
+ 0x7e, 0x34, 0x0, 0x1, 0x7e, 0xf, 0x39, 0xf1, 0x79, 0x30, 0x0, 0x4, 0x7e,
+ 0xf, 0x39, 0xf1, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0xa, 0x30, 0x22,
+ 0x12, 0x1c, 0xb5, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0x12, 0xc6, 0xc2, 0x2,
+ 0xc6, 0xa9, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x14, 0x22, 0xa9, 0xd0,
+ 0x99, 0xa9, 0xc6, 0xdf, 0x22, 0xca, 0x39, 0xca, 0xb, 0x7e, 0xf, 0x39, 0xe8,
+ 0x69, 0x30, 0x0, 0x2, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x22, 0x69, 0x30, 0x0,
+ 0x4, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x18, 0xd2, 0xcc, 0x7e, 0x34, 0x0, 0x1,
+ 0x79, 0x30, 0x0, 0x4, 0xd2, 0xcc, 0x7e, 0xf, 0x39, 0xe8, 0xb, 0xa, 0x30,
+ 0x12, 0xc7, 0xd, 0xc2, 0xcc, 0xc2, 0xc3, 0xda, 0xb, 0xda, 0x39, 0x32, 0x4e,
+ 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x7d, 0x12, 0x2d, 0x13, 0x3e, 0x14, 0x6d,
+ 0x0, 0x7e, 0x18, 0xbb, 0x80, 0x2, 0x1, 0xbf, 0x7e, 0x8, 0x8d, 0xb2, 0x7e,
+ 0x34, 0x0, 0x44, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x34, 0x32, 0x3, 0x7a, 0x37,
+ 0x8d, 0xb2, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xb4, 0x7e, 0xb3, 0x69, 0xec,
+ 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x0, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x2, 0x7a,
+ 0x37, 0x8d, 0xb6, 0x7e, 0x37, 0x82, 0x3d, 0x7a, 0x37, 0x8d, 0xb8, 0x6d,
+ 0x33, 0x7a, 0x37, 0x8d, 0xba, 0x7a, 0x37, 0x8d, 0xbc, 0x7e, 0x34, 0x2, 0x0,
+ 0x7a, 0x37, 0x8d, 0xbe, 0x7e, 0x34, 0x44, 0x60, 0x7a, 0x37, 0x8d, 0xc0,
+ 0x7e, 0x34, 0x29, 0x1, 0x7a, 0x37, 0x8d, 0xc2, 0x7e, 0x34, 0xf, 0x70, 0x7a,
+ 0x37, 0x8d, 0xc4, 0x7e, 0x34, 0x8, 0xa, 0x7a, 0x37, 0x8d, 0xc6, 0x7e, 0x34,
+ 0x70, 0x0, 0x7a, 0x37, 0x8d, 0xc8, 0x7e, 0x34, 0x5, 0x80, 0x7a, 0x37, 0x8d,
+ 0xca, 0x7e, 0x34, 0x80, 0x0, 0x7a, 0x37, 0x8d, 0xcc, 0x6d, 0x33, 0x7a, 0x37,
+ 0x8d, 0xce, 0x7e, 0x34, 0x0, 0xf0, 0x7a, 0x37, 0x8d, 0xd0, 0x7e, 0x34, 0x0,
+ 0x30, 0x7a, 0x37, 0x8d, 0xd2, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xd4, 0x7e,
+ 0x34, 0x0, 0x2a, 0x7a, 0x37, 0x8d, 0xd6, 0x7e, 0x34, 0x2d, 0x2d, 0x7a, 0x37,
+ 0x8d, 0xd8, 0x7e, 0x34, 0x11, 0x11, 0x7a, 0x37, 0x8d, 0xda, 0x7e, 0x34,
+ 0x11, 0x0, 0x7a, 0x37, 0x8d, 0xdc, 0x7e, 0x34, 0x1, 0x23, 0x7a, 0x37, 0x8d,
+ 0xde, 0x7e, 0x34, 0x45, 0x67, 0x7a, 0x37, 0x8d, 0xe0, 0x7e, 0x34, 0x89,
+ 0xab, 0x7a, 0x37, 0x8d, 0xe2, 0x7e, 0x34, 0xcd, 0xef, 0x7a, 0x37, 0x8d,
+ 0xe4, 0x6d, 0x33, 0x7a, 0x37, 0x8d, 0xe6, 0x7e, 0x34, 0x43, 0x21, 0x7a,
+ 0x37, 0x8d, 0xe8, 0x7e, 0x34, 0x23, 0x45, 0x7a, 0x37, 0x8d, 0xea, 0x7e,
+ 0x34, 0x12, 0x5, 0x7a, 0x37, 0x8d, 0xec, 0x7e, 0x34, 0xfe, 0xdc, 0x7a, 0x37,
+ 0x8d, 0xee, 0x7e, 0x34, 0xba, 0x98, 0x7a, 0x37, 0x8d, 0xf0, 0x7e, 0x34,
+ 0x76, 0x54, 0x7a, 0x37, 0x8d, 0xf2, 0x7e, 0x34, 0x32, 0x10, 0x7a, 0x37,
+ 0x8d, 0xf4, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0x7e, 0x34, 0x70,
+ 0x43, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0xe, 0x7e, 0x34, 0x0, 0x4e,
+ 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x10, 0x12, 0xc9, 0x4f, 0x12, 0xc9,
+ 0x70, 0x12, 0xc9, 0x46, 0x7e, 0x34, 0x80, 0x12, 0x7e, 0xf, 0x39, 0xed, 0x79,
+ 0x30, 0x0, 0x26, 0x7e, 0xb3, 0x69, 0xec, 0x60, 0x7, 0x12, 0xc9, 0x23, 0x6d,
+ 0x33, 0x80, 0x8, 0x6d, 0x33, 0x12, 0xc9, 0x2b, 0x12, 0xc9, 0x67, 0x12, 0xc9,
+ 0x3d, 0x7e, 0x34, 0xff, 0xff, 0x12, 0xc9, 0x79, 0x12, 0xc9, 0x34, 0x7e,
+ 0x34, 0x0, 0x14, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x1e, 0x7e, 0xf,
+ 0x39, 0xed, 0x79, 0x30, 0x0, 0x20, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xed, 0x79,
+ 0x30, 0x0, 0x22, 0x7e, 0x34, 0x0, 0x1f, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30,
+ 0x0, 0x28, 0x7e, 0x34, 0x8, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0,
+ 0x48, 0x7e, 0x34, 0x7, 0x3, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x4a,
+ 0x7e, 0x34, 0x7f, 0x33, 0x12, 0xc9, 0x5e, 0x12, 0x4f, 0x63, 0x7e, 0x34,
+ 0xff, 0xff, 0x12, 0x1f, 0xc1, 0x7e, 0x34, 0xf0, 0x7f, 0x7e, 0xf, 0x39, 0xed,
+ 0x79, 0x30, 0x0, 0x4, 0xd2, 0x4, 0x12, 0x30, 0xca, 0x75, 0xc2, 0x0, 0xa9,
+ 0xd6, 0xc2, 0xa9, 0xd5, 0xc2, 0x53, 0xc3, 0xf8, 0x43, 0xc3, 0x3, 0x75, 0xc4,
+ 0x0, 0x75, 0xc5, 0x0, 0x75, 0xc6, 0x90, 0x75, 0xc7, 0x0, 0xa9, 0xd2, 0xc2,
+ 0xd2, 0xac, 0xa9, 0xc7, 0xea, 0x7e, 0x73, 0x75, 0x8b, 0x7a, 0x73, 0x9b,
+ 0x7f, 0x22, 0x7e, 0x37, 0x6a, 0x19, 0x2e, 0x34, 0x0, 0x9, 0x7e, 0xf, 0x39,
+ 0xed, 0x79, 0x30, 0x0, 0x16, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0,
+ 0x1c, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x18, 0x22, 0x7e, 0xf,
+ 0x39, 0xed, 0x79, 0x30, 0x0, 0x14, 0x22, 0x6d, 0x33, 0x7e, 0xf, 0x39, 0xed,
+ 0x79, 0x30, 0x0, 0x12, 0x22, 0x7e, 0x37, 0x38, 0x7e, 0x7e, 0xf, 0x39, 0xed,
+ 0x79, 0x30, 0x0, 0x4c, 0x22, 0x7e, 0x37, 0x6a, 0x17, 0x2e, 0x34, 0x0, 0x9,
+ 0x22, 0x7e, 0xf, 0x39, 0xed, 0x79, 0x30, 0x0, 0x24, 0x22, 0x7e, 0xf, 0x39,
+ 0xed, 0x79, 0x30, 0x0, 0x1a, 0x22, 0xa9, 0xd5, 0xcb, 0xa9, 0xd1, 0xcb, 0xa9,
+ 0xd2, 0xca, 0xa9, 0xd2, 0xcb, 0x22, 0xc2, 0xed, 0xc2, 0xc5, 0x32, 0xe4,
+ 0x7a, 0xb3, 0x9a, 0x78, 0x12, 0xc9, 0xa8, 0x7a, 0xb3, 0x9a, 0x7b, 0x12,
+ 0xc9, 0xb4, 0x7a, 0xb3, 0x9a, 0x85, 0x22, 0x7a, 0xb3, 0x9a, 0x79, 0x74,
+ 0xff, 0x7a, 0xb3, 0x9a, 0x7a, 0xe4, 0x22, 0x7a, 0xb3, 0x9a, 0x7c, 0x7a,
+ 0xb3, 0x9a, 0x7d, 0x7a, 0xb3, 0x9a, 0x7e, 0x7a, 0xb3, 0x9a, 0x82, 0x74,
+ 0xff, 0x7a, 0xb3, 0x9a, 0x83, 0xe4, 0x7a, 0xb3, 0x9a, 0x84, 0x22, 0x6d,
+ 0x33, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x4c, 0x12, 0xca, 0x18, 0xe4, 0x2,
+ 0xc9, 0xe0, 0x7a, 0xb3, 0x9a, 0x7f, 0x7a, 0xb3, 0x9a, 0x80, 0x22, 0x7e,
+ 0x34, 0x0, 0x2, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x62, 0x12, 0xca, 0x18,
+ 0x74, 0x2, 0x2, 0xc9, 0xe0, 0x7e, 0x24, 0xe, 0x40, 0x7e, 0x14, 0x13, 0x60,
+ 0x22, 0x7e, 0x34, 0x0, 0x1, 0x12, 0xc9, 0xfc, 0x7e, 0x57, 0x9a, 0x57, 0x12,
+ 0xca, 0x18, 0x74, 0x1, 0x2, 0xc9, 0xe0, 0x7c, 0x1b, 0x7d, 0x43, 0x7e, 0xa3,
+ 0x9a, 0x78, 0xbe, 0xa0, 0x6, 0x50, 0x2e, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x59,
+ 0x43, 0x9a, 0x86, 0x59, 0x23, 0x9a, 0x88, 0x59, 0x13, 0x9a, 0x8a, 0xbe,
+ 0x44, 0x0, 0x1, 0x78, 0x6, 0x7e, 0x24, 0x18, 0x80, 0x80, 0x0, 0x59, 0x23,
+ 0x9a, 0x8c, 0x19, 0x13, 0x9a, 0x8e, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x9a, 0x78,
+ 0xc3, 0x22, 0xd3, 0x22, 0x7e, 0x34, 0x0, 0x3, 0x12, 0xc9, 0xfc, 0x7e, 0x57,
+ 0x9a, 0x6d, 0x12, 0xca, 0x18, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x81, 0x22, 0x7e,
+ 0x34, 0x0, 0x4, 0x12, 0xc9, 0xfc, 0x12, 0xca, 0x18, 0x7e, 0x73, 0x9b, 0xa8,
+ 0x7a, 0x73, 0x9a, 0x7f, 0x7a, 0x73, 0x9a, 0x80, 0x22, 0xca, 0xf8, 0x7e,
+ 0xb3, 0x9a, 0x7b, 0xb4, 0x1, 0x50, 0x7e, 0xa3, 0x9a, 0x79, 0x7a, 0xa3, 0x9a,
+ 0x7a, 0x7e, 0xb3, 0x9a, 0x83, 0x4, 0x7a, 0xb3, 0x9a, 0x83, 0x6c, 0xff, 0x6c,
+ 0x77, 0x80, 0xd, 0x7e, 0x50, 0x9, 0xac, 0x57, 0x9, 0x62, 0x9a, 0x8e, 0x2c,
+ 0xf6, 0xb, 0x70, 0xbc, 0xa7, 0x50, 0xef, 0x30, 0x2b, 0xe, 0x7e, 0xb3, 0x9a,
+ 0x83, 0xb4, 0x1, 0x7, 0x7e, 0xb3, 0x9b, 0x38, 0x12, 0x34, 0x64, 0xa, 0x2f,
+ 0x1b, 0x24, 0x7e, 0x73, 0x9a, 0x83, 0xa, 0x37, 0xbd, 0x32, 0x48, 0x9, 0x7e,
+ 0xb3, 0x9a, 0x79, 0x4, 0x7a, 0xb3, 0x9a, 0x79, 0xda, 0xf8, 0x22, 0x74, 0x2,
+ 0x7a, 0xb3, 0x9a, 0x61, 0x22, 0x12, 0x1f, 0xd9, 0x78, 0x50, 0x7e, 0x37,
+ 0x9b, 0x85, 0x4d, 0x33, 0x78, 0xf8, 0x12, 0xcb, 0x3a, 0x7e, 0xb3, 0x59,
+ 0x60, 0xb4, 0x1, 0x8, 0x7e, 0x73, 0x59, 0x44, 0xa, 0x37, 0x80, 0xc, 0x7e,
+ 0x73, 0x59, 0x43, 0xa, 0x27, 0x7e, 0x34, 0x0, 0x64, 0x8d, 0x32, 0x1b, 0x34,
+ 0x7a, 0x37, 0x9b, 0x85, 0x7e, 0x73, 0x59, 0x67, 0xa, 0x27, 0x7e, 0x37, 0x9b,
+ 0x85, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x18, 0x8d, 0x32, 0x7a, 0x37, 0x9b, 0x85,
+ 0x7e, 0x37, 0x9b, 0x80, 0xbe, 0x37, 0x9b, 0x85, 0x50, 0x4, 0x7a, 0x37, 0x9b,
+ 0x85, 0x22, 0x7e, 0x73, 0x59, 0x45, 0x7e, 0xb3, 0x59, 0x60, 0x70, 0x35,
+ 0x7e, 0xb3, 0x9b, 0xaf, 0x70, 0x22, 0x7e, 0x63, 0x59, 0x43, 0xbe, 0x60,
+ 0x14, 0x28, 0x5, 0x7e, 0x60, 0x14, 0x80, 0x7, 0xa5, 0xbe, 0x0, 0x3, 0x7e,
+ 0x60, 0x1, 0xa, 0x26, 0x7e, 0x34, 0x0, 0x64, 0x12, 0x1, 0x20, 0x7c, 0x67,
+ 0x80, 0x63, 0x7e, 0xb3, 0x9b, 0x7f, 0xa, 0x27, 0xb4, 0x1, 0x2, 0x80, 0x32,
+ 0x80, 0x3e, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x20, 0x0, 0x6, 0x5e, 0x24, 0x0,
+ 0x1, 0x78, 0xe, 0x7e, 0x63, 0x59, 0x44, 0xbe, 0x60, 0x7f, 0x28, 0x3f, 0x7e,
+ 0x60, 0x7f, 0x80, 0x3a, 0x7e, 0xb3, 0x3, 0xd5, 0xbe, 0xb0, 0x3c, 0x68, 0x2,
+ 0x70, 0x23, 0x7e, 0xb3, 0x9b, 0x7f, 0xa, 0x27, 0xb4, 0x1, 0xe, 0x7e, 0x34,
+ 0x1, 0xf4, 0x8d, 0x32, 0x9e, 0x34, 0x0, 0x5, 0x7c, 0x67, 0x80, 0x18, 0x7e,
+ 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b, 0x35, 0x7c, 0x67, 0x80, 0xc, 0xa, 0x27,
+ 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b, 0x36, 0x7c, 0x67, 0x7e, 0x73, 0x59,
+ 0x67, 0xac, 0x67, 0x7e, 0x24, 0x0, 0x18, 0x12, 0x1, 0x20, 0x7a, 0x73, 0x9b,
+ 0x79, 0xc2, 0x12, 0x6d, 0x33, 0x7a, 0x37, 0x9b, 0x77, 0x22, 0xc2, 0x4, 0x12,
+ 0xcc, 0x7, 0x38, 0x4, 0xc2, 0x4, 0x80, 0x10, 0x7e, 0xa3, 0x9a, 0x79, 0x74,
+ 0x9, 0xa4, 0x49, 0x55, 0x9a, 0x86, 0x12, 0x15, 0x3d, 0x92, 0x4, 0xa2, 0x4,
+ 0x22, 0x7e, 0x73, 0x9a, 0x78, 0xbe, 0x73, 0x9a, 0x79, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x9a, 0x85, 0x6c, 0xaa, 0x80, 0x13, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x9,
+ 0xb3, 0x9a, 0x8e, 0x2e, 0xb3, 0x9a, 0x85, 0x7a, 0xb3, 0x9a, 0x85, 0xb, 0xa0,
+ 0x7e, 0xb3, 0x9a, 0x78, 0xbc, 0xba, 0x38, 0xe5, 0x22, 0x12, 0x37, 0xe2,
+ 0x12, 0x46, 0xf6, 0x12, 0x3b, 0x89, 0x12, 0xcc, 0x7f, 0x68, 0x1a, 0x7f,
+ 0x20, 0x12, 0xcc, 0x6c, 0x4e, 0x60, 0x2, 0x1b, 0x2a, 0x30, 0x7e, 0x2f, 0x39,
+ 0xed, 0x12, 0xcc, 0x6c, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x80, 0x6, 0x12,
+ 0x1c, 0xa8, 0x12, 0x1f, 0xef, 0x12, 0xcc, 0x74, 0x12, 0x37, 0xdb, 0x2, 0x32,
+ 0x20, 0x2e, 0x54, 0x0, 0xe, 0xb, 0x2a, 0x30, 0x22, 0x74, 0x1, 0x7a, 0xb3,
+ 0x59, 0x62, 0x7a, 0xb3, 0x3, 0xfd, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x69, 0x30,
+ 0x0, 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0xc2, 0x18, 0xc2, 0x1b, 0x22, 0xd2,
+ 0x4, 0x12, 0xb, 0xc5, 0x12, 0x0, 0x46, 0x70, 0xfb, 0x22, 0x7c, 0xab, 0xe4,
+ 0x80, 0x3, 0x1e, 0xa0, 0x4, 0xbe, 0xa0, 0x4, 0x38, 0xf8, 0x22, 0xbe, 0xb0,
+ 0x6, 0x40, 0x2, 0xa1, 0x4e, 0xbe, 0xb0, 0x6, 0x40, 0x2, 0xa1, 0x4e, 0x6d,
+ 0x44, 0xa1, 0x44, 0x7d, 0x54, 0x3e, 0x54, 0x49, 0xd5, 0xe, 0x40, 0x7d, 0xed,
+ 0x9d, 0xe3, 0xbe, 0xe4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0xfd, 0x9d, 0xf3, 0x80,
+ 0x4, 0x6d, 0xff, 0x9d, 0xfe, 0x7e, 0x5d, 0x34, 0x2d, 0xb5, 0xb, 0x5a, 0xe0,
+ 0x7d, 0xce, 0x9d, 0xc3, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xe3, 0x80,
+ 0x4, 0x6d, 0xee, 0x9d, 0xec, 0xbd, 0xef, 0x40, 0x2f, 0xbe, 0xd5, 0x3a, 0x28,
+ 0x2a, 0x49, 0x55, 0xe, 0x40, 0xbe, 0x55, 0x3c, 0x50, 0x21, 0x12, 0xcd, 0x58,
+ 0x7d, 0xb4, 0x3e, 0xb4, 0x7e, 0x6d, 0x34, 0x2d, 0xdb, 0x1b, 0x6a, 0x50,
+ 0x12, 0xcd, 0x4f, 0x7d, 0x5d, 0x2d, 0x54, 0x9, 0xb5, 0x5a, 0x0, 0x7f, 0x60,
+ 0x2d, 0xd4, 0x7a, 0x6b, 0xb0, 0x12, 0xcd, 0x58, 0xbd, 0x53, 0x50, 0x16,
+ 0x7c, 0xa5, 0x6e, 0xa0, 0xff, 0x12, 0xcd, 0x4f, 0x2d, 0xd4, 0x2e, 0xd4,
+ 0x5a, 0x0, 0x7e, 0xd9, 0xb0, 0x5c, 0xba, 0x7a, 0xd9, 0xb0, 0xb, 0x44, 0x7e,
+ 0x57, 0x8d, 0x94, 0xbd, 0x54, 0x28, 0x2, 0x81, 0xbc, 0x22, 0xa, 0xc4, 0x7e,
+ 0xd4, 0x2, 0xd8, 0xad, 0xdc, 0x22, 0x7d, 0x54, 0x3e, 0x54, 0x49, 0x55, 0xe,
+ 0x40, 0x22, 0x12, 0x77, 0xb1, 0xe4, 0x7a, 0xb3, 0x92, 0x0, 0x7e, 0x1f, 0x2d,
+ 0x26, 0x7a, 0x37, 0x92, 0x2, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92, 0x6,
+ 0x7e, 0xb3, 0x8d, 0x91, 0x70, 0xb, 0xe4, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0x34,
+ 0x0, 0x20, 0x80, 0x10, 0x74, 0x1, 0x7a, 0xb3, 0x92, 0x1, 0x7e, 0x1f, 0x2d,
+ 0x2a, 0x7a, 0x37, 0x92, 0x4, 0x6d, 0x33, 0x12, 0xaf, 0x99, 0x12, 0x27, 0x50,
+ 0x12, 0xcd, 0xe4, 0x7e, 0xb3, 0x8d, 0x91, 0xa, 0x4a, 0xb4, 0x1, 0x1a, 0x2d,
+ 0x43, 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x14, 0xb, 0xa, 0x10, 0x7e,
+ 0x7f, 0x2d, 0x26, 0x2d, 0xf4, 0xb, 0x7a, 0x20, 0x9d, 0x21, 0x80, 0xd, 0x2d,
+ 0x43, 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x26, 0x2d, 0x14, 0xb, 0xa, 0x20, 0x7e,
+ 0xf, 0x2d, 0x2e, 0x2d, 0x14, 0x1b, 0xa, 0x20, 0xb, 0xa0, 0xbe, 0xa0, 0x4,
+ 0x40, 0xc0, 0x22, 0x7e, 0x37, 0x8d, 0x94, 0x6c, 0xaa, 0x22, 0xca, 0x79,
+ 0x7c, 0x5b, 0x7e, 0x40, 0xff, 0x7e, 0xa0, 0xff, 0x6c, 0x33, 0xc1, 0x7f,
+ 0xbc, 0x63, 0x78, 0x2, 0xc1, 0x7d, 0x7e, 0x90, 0x2, 0xac, 0x93, 0x9, 0x24,
+ 0x65, 0x60, 0xa, 0xf2, 0xa, 0x5, 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0xc,
+ 0xa, 0xe2, 0xa, 0xf5, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c, 0x2f, 0x80, 0x8, 0x6e,
+ 0x4, 0xff, 0xff, 0xb, 0x4, 0x7c, 0x21, 0x7e, 0x10, 0x2, 0xac, 0x13, 0x9,
+ 0xb0, 0x65, 0x61, 0xa, 0xb, 0xa, 0x47, 0x9d, 0x40, 0xbe, 0x44, 0x0, 0x0,
+ 0x8, 0x8, 0xa, 0xfb, 0xa, 0x7, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4,
+ 0xbe, 0x20, 0x1, 0x38, 0xa, 0xbe, 0x10, 0x1, 0x38, 0x5, 0x7e, 0xa0, 0x1,
+ 0x80, 0x31, 0xbe, 0x20, 0x2, 0x38, 0xa, 0xbe, 0x10, 0x2, 0x38, 0x5, 0x7e,
+ 0x40, 0x2, 0x80, 0x10, 0x30, 0x1, 0xd, 0xbe, 0x20, 0x3, 0x38, 0x8, 0xbe,
+ 0x10, 0x3, 0x38, 0x3, 0x7e, 0x40, 0x3, 0xbc, 0x4a, 0x50, 0x2, 0x7c, 0xa4,
+ 0xb, 0x30, 0x7e, 0x3, 0x67, 0x62, 0xbc, 0x3, 0x28, 0x2, 0xa1, 0xf9, 0x7c,
+ 0xba, 0xda, 0x79, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x7a, 0x1d, 0x33, 0x7a, 0xd,
+ 0x2f, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x37, 0x12, 0xb, 0xc0, 0x7e, 0xb3,
+ 0x9b, 0x5, 0xb4, 0x1, 0x3, 0x12, 0x26, 0x94, 0x7e, 0xd, 0x2f, 0x7e, 0x1d,
+ 0x37, 0x12, 0x27, 0x36, 0x20, 0x3, 0xd, 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x11,
+ 0x7e, 0xb3, 0x9b, 0xaf, 0xb4, 0x1, 0xa, 0x7e, 0x18, 0x13, 0x60, 0x7e, 0xd,
+ 0x33, 0x12, 0x27, 0x36, 0x7e, 0xd, 0x2f, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x27,
+ 0x7b, 0x20, 0x3, 0xd, 0x7e, 0xb3, 0x9b, 0x7f, 0x70, 0x11, 0x7e, 0xb3, 0x9b,
+ 0xaf, 0xb4, 0x1, 0xa, 0x7e, 0xd, 0x33, 0x74, 0x8, 0xac, 0xbf, 0x12, 0x27,
+ 0x7b, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x77, 0x12, 0xcf, 0x12,
+ 0xe4, 0x12, 0x0, 0x2a, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x8, 0x7e, 0x73,
+ 0x67, 0x62, 0x7a, 0x73, 0x67, 0x76, 0x22, 0x6c, 0xaa, 0x80, 0x9, 0xe4, 0xa,
+ 0x4a, 0x19, 0xb4, 0x65, 0xd8, 0xb, 0xa0, 0x7e, 0xb3, 0x39, 0xf7, 0xc4, 0x23,
+ 0x54, 0x1f, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3a, 0xbd, 0x32, 0x48, 0xe5, 0x12,
+ 0xaf, 0xa2, 0x6d, 0x33, 0x7a, 0x37, 0x67, 0x64, 0x7a, 0x37, 0x67, 0x66,
+ 0x7a, 0x37, 0x67, 0x68, 0x7a, 0x37, 0x67, 0x6c, 0x7e, 0xd4, 0x92, 0x0, 0x1e,
+ 0xd4, 0x3e, 0xd4, 0x6d, 0xcc, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x92,
+ 0x40, 0x7d, 0x3d, 0x7a, 0x37, 0x92, 0x44, 0x7e, 0x34, 0x2d, 0x82, 0x7a,
+ 0x37, 0x92, 0x42, 0x7e, 0x73, 0x82, 0xc, 0x7a, 0x73, 0x92, 0x3d, 0x7e, 0x73,
+ 0x82, 0xd, 0x7a, 0x73, 0x92, 0x3c, 0x7e, 0x37, 0x81, 0xef, 0x7a, 0x37, 0x92,
+ 0x46, 0x7e, 0x37, 0x81, 0xf1, 0x7a, 0x37, 0x92, 0x48, 0x7e, 0x37, 0x81,
+ 0xf9, 0x7a, 0x37, 0x92, 0x4a, 0x7e, 0x37, 0x81, 0xfb, 0x7a, 0x37, 0x92,
+ 0x4c, 0x7e, 0x73, 0x39, 0xf7, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x92, 0x3e,
+ 0x7e, 0x73, 0x39, 0xf8, 0x7a, 0x73, 0x92, 0x3f, 0x7e, 0x8, 0x92, 0x3c, 0x7e,
+ 0x18, 0x92, 0x4e, 0x12, 0x29, 0x6b, 0x7e, 0x73, 0x92, 0x4e, 0x7a, 0x73,
+ 0x67, 0x62, 0x7e, 0x73, 0x92, 0x4f, 0x7a, 0x73, 0x67, 0x63, 0x7e, 0x37,
+ 0x92, 0x50, 0x7a, 0x37, 0x67, 0x64, 0x7e, 0x37, 0x92, 0x52, 0x7a, 0x37,
+ 0x67, 0x66, 0x7e, 0x37, 0x92, 0x58, 0x7a, 0x37, 0x67, 0x68, 0x7e, 0x37,
+ 0x92, 0x5a, 0x7d, 0x23, 0x7a, 0x53, 0x67, 0x6a, 0xa, 0x36, 0x7a, 0x73, 0x67,
+ 0x6b, 0x7e, 0x37, 0x92, 0x54, 0x7a, 0x37, 0x67, 0x6c, 0x7e, 0x37, 0x92,
+ 0x56, 0x7d, 0x23, 0x7a, 0x53, 0x67, 0x6e, 0xa, 0x36, 0x7a, 0x73, 0x67, 0x6f,
+ 0x6c, 0xaa, 0x80, 0x3c, 0x7c, 0xba, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0x7b,
+ 0x7c, 0xba, 0x54, 0x7, 0x7e, 0x44, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x44, 0x14,
+ 0x78, 0xfb, 0x7c, 0x69, 0xa, 0x27, 0x12, 0x67, 0xd9, 0x4c, 0xb6, 0x7a, 0x29,
+ 0xb0, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x49, 0x12, 0x2d, 0x82, 0xa, 0x2, 0x7c,
+ 0xb1, 0x19, 0xb2, 0x65, 0x60, 0x7c, 0xb3, 0x19, 0xb2, 0x65, 0x61, 0xb, 0xa0,
+ 0x7e, 0xb3, 0x67, 0x62, 0xbc, 0xba, 0x38, 0xbc, 0x6c, 0xaa, 0x80, 0x1c,
+ 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x16, 0x2d, 0x34, 0xb, 0x1a, 0x30, 0xa,
+ 0x26, 0x7c, 0xb5, 0x19, 0xb4, 0x65, 0x9c, 0x7c, 0xb7, 0x19, 0xb4, 0x65,
+ 0x9d, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x63, 0xbc, 0xba, 0x38, 0xdc, 0x22, 0xe4,
+ 0x7a, 0xb3, 0x3, 0xc9, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x69, 0x69, 0xbe, 0xb0,
+ 0x1, 0x38, 0x9, 0x7e, 0xa3, 0x69, 0x6a, 0xbe, 0xa0, 0x1, 0x28, 0x4, 0xd2,
+ 0x36, 0x80, 0x7, 0x30, 0x36, 0x4, 0x70, 0x2, 0xc2, 0x36, 0x7e, 0xb3, 0x59,
+ 0x8b, 0x70, 0xe, 0x6d, 0x33, 0x7a, 0x37, 0x9a, 0x21, 0x12, 0xd1, 0x11, 0x12,
+ 0xd0, 0x76, 0x80, 0x5f, 0x12, 0xd1, 0x2b, 0x12, 0xd5, 0x8e, 0x50, 0xa, 0x12,
+ 0xd3, 0x7d, 0x7c, 0xab, 0x12, 0xd1, 0x11, 0x80, 0x5, 0x12, 0xd4, 0x1e, 0x7c,
+ 0xab, 0xbe, 0xa0, 0x30, 0x68, 0x5, 0xbe, 0xa0, 0x57, 0x78, 0x24, 0x12, 0xd1,
+ 0x21, 0x49, 0x23, 0x96, 0x5c, 0x7e, 0x37, 0x96, 0x60, 0x12, 0xd1, 0x17, 0x8,
+ 0x2, 0x6c, 0xaa, 0x12, 0xd1, 0x21, 0x49, 0x23, 0x96, 0x5e, 0x7e, 0x37, 0x96,
+ 0x62, 0x12, 0xd1, 0x17, 0x8, 0x2, 0x6c, 0xaa, 0x30, 0x36, 0x2, 0x6c, 0xaa,
+ 0x4c, 0xaa, 0x68, 0x11, 0x7e, 0xf0, 0xff, 0x4c, 0xff, 0x68, 0xa, 0x7a, 0xa3,
+ 0x59, 0x8e, 0x74, 0x1, 0x7a, 0xb3, 0x69, 0x6f, 0xda, 0xf8, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x9a, 0x23, 0x22, 0x9d, 0x32, 0x12, 0x0, 0xa3, 0xbe, 0x34, 0x1, 0x90,
+ 0x22, 0x7e, 0x63, 0x9a, 0x4b, 0x7e, 0x70, 0x4, 0xac, 0x67, 0x22, 0xca, 0xf8,
+ 0x7e, 0x53, 0x69, 0x69, 0x7c, 0xa5, 0x7e, 0x63, 0x69, 0x6a, 0x7c, 0x76,
+ 0xbe, 0xa0, 0x1, 0x38, 0xa, 0x7e, 0x17, 0x67, 0x64, 0xbe, 0x14, 0x0, 0x1e,
+ 0x28, 0xa, 0x7e, 0x17, 0x96, 0x58, 0x4d, 0x11, 0x78, 0x2, 0x80, 0x34, 0xa5,
+ 0xbd, 0x1, 0x14, 0xa5, 0xbe, 0x1, 0x10, 0x7e, 0x27, 0x9a, 0x21, 0xbe, 0x24,
+ 0xea, 0x60, 0x50, 0x6, 0xb, 0x24, 0x7a, 0x27, 0x9a, 0x21, 0x7e, 0xb3, 0x67,
+ 0x62, 0x70, 0x6, 0x6d, 0x22, 0x7a, 0x27, 0x9a, 0x21, 0x7e, 0xf3, 0x9a, 0x23,
+ 0x4c, 0xff, 0x68, 0xc, 0x7e, 0x27, 0x96, 0x58, 0x4d, 0x22, 0x78, 0x4, 0xd2,
+ 0x10, 0x80, 0x47, 0x4c, 0xaa, 0x78, 0x34, 0xa5, 0xbf, 0x1, 0x30, 0x7e, 0x37,
+ 0x96, 0x58, 0x7a, 0x37, 0x9a, 0x25, 0x7e, 0xb3, 0x9a, 0x23, 0xb4, 0x3, 0x1f,
+ 0x7e, 0x37, 0x96, 0x58, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x26, 0x74, 0x4, 0x7a,
+ 0xb3, 0x9a, 0x23, 0x7e, 0x37, 0x9a, 0x3b, 0x7e, 0x27, 0x9a, 0x3d, 0x12,
+ 0xd2, 0x54, 0x41, 0x4d, 0x80, 0x11, 0x80, 0xf, 0x7e, 0xc7, 0x68, 0x15, 0x7e,
+ 0xd7, 0x68, 0x17, 0x7e, 0xb3, 0x68, 0x19, 0xb4, 0x1, 0x5, 0x12, 0xd5, 0x99,
+ 0x80, 0x77, 0x4c, 0xff, 0x78, 0x1b, 0xa5, 0xbf, 0x0, 0x43, 0xbe, 0xa0, 0x1,
+ 0x78, 0x3e, 0x7d, 0x3c, 0x7d, 0x2d, 0x12, 0xd3, 0xc1, 0x12, 0xd2, 0x50,
+ 0x74, 0x1, 0x7a, 0xb3, 0x9a, 0x23, 0x80, 0x2c, 0xbe, 0xf0, 0x1, 0x78, 0x1a,
+ 0x12, 0xd3, 0x74, 0xbe, 0x37, 0x76, 0xa3, 0x38, 0x9, 0x12, 0xd2, 0xff, 0xbe,
+ 0x37, 0x76, 0xa5, 0x28, 0x15, 0x74, 0x3, 0x7a, 0xb3, 0x9a, 0x23, 0x80, 0x5,
+ 0xbe, 0xf0, 0x3, 0x78, 0x8, 0x7a, 0xc7, 0x9a, 0x3b, 0x7a, 0xd7, 0x9a, 0x3d,
+ 0x7e, 0xb3, 0x9a, 0x23, 0x60, 0x26, 0x7d, 0x3c, 0x7d, 0x2d, 0x7e, 0x17,
+ 0x96, 0x5c, 0x7e, 0x7, 0x96, 0x5e, 0x12, 0xd3, 0x8d, 0xa, 0x2b, 0x7e, 0x73,
+ 0x9a, 0x20, 0xa, 0x37, 0xbd, 0x32, 0x58, 0xb, 0x12, 0xd2, 0x50, 0x7a, 0xc7,
+ 0x96, 0x5c, 0x7a, 0xd7, 0x96, 0x5e, 0xda, 0xf8, 0x22, 0x7d, 0x3c, 0x7d,
+ 0x2d, 0x7d, 0x42, 0x7d, 0x13, 0x7d, 0x24, 0x12, 0xd5, 0xa5, 0x7d, 0x31,
+ 0x12, 0xd3, 0x8, 0x2, 0xd2, 0x65, 0x7e, 0x3, 0x9a, 0x4b, 0xbe, 0x0, 0xf0,
+ 0x50, 0x2, 0x41, 0xfe, 0x41, 0xf3, 0x6c, 0x99, 0x7e, 0xb3, 0x9a, 0x20, 0xbe,
+ 0xb0, 0x20, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x9a, 0x20, 0x7e, 0x1f, 0x96, 0x60,
+ 0x7a, 0x1f, 0x91, 0xfe, 0x7e, 0x80, 0x1, 0x80, 0x49, 0x74, 0x4, 0xac, 0xb8,
+ 0x49, 0x35, 0x96, 0x60, 0x49, 0x25, 0x96, 0x62, 0x7e, 0x17, 0x91, 0xfe,
+ 0x7e, 0x7, 0x92, 0x0, 0x12, 0xd3, 0x8d, 0x7c, 0x1b, 0x7e, 0x3, 0x9a, 0x20,
+ 0xbc, 0x1, 0x38, 0x26, 0xb, 0x90, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x2e, 0x34,
+ 0x96, 0x60, 0x7e, 0x14, 0x91, 0xfe, 0x74, 0x4, 0x12, 0x1, 0xf3, 0x7e, 0x34,
+ 0x91, 0xfe, 0x7e, 0x30, 0x4, 0xac, 0x39, 0x2e, 0x14, 0x96, 0x60, 0x74, 0x4,
+ 0x12, 0x1, 0xf3, 0xb, 0x80, 0x7e, 0x3, 0x9a, 0x4b, 0xbc, 0x8, 0x38, 0xaf,
+ 0xa, 0x59, 0xb, 0x54, 0x7c, 0xb, 0x7a, 0x3, 0x9a, 0x4b, 0x7e, 0x3, 0x9a,
+ 0x20, 0xbe, 0x0, 0x20, 0x50, 0xb, 0x7e, 0x3, 0x9a, 0x4b, 0xbe, 0x0, 0xec,
+ 0x40, 0x2, 0x41, 0x72, 0x22, 0x7e, 0x37, 0x9a, 0x39, 0x9e, 0x37, 0x9a, 0x31,
+ 0x22, 0x7e, 0x17, 0x9a, 0x33, 0xbd, 0x13, 0x28, 0xa, 0x7a, 0x37, 0x9a, 0x33,
+ 0x7a, 0x27, 0x9a, 0x35, 0x80, 0x10, 0x7e, 0x17, 0x9a, 0x2b, 0xbd, 0x13,
+ 0x50, 0x8, 0x7a, 0x37, 0x9a, 0x2b, 0x7a, 0x27, 0x9a, 0x2d, 0x7e, 0x17, 0x9a,
+ 0x31, 0xbd, 0x12, 0x28, 0xa, 0x7a, 0x27, 0x9a, 0x31, 0x7a, 0x37, 0x9a, 0x2f,
+ 0x80, 0x10, 0x7e, 0x17, 0x9a, 0x39, 0xbd, 0x12, 0x50, 0x8, 0x7a, 0x27, 0x9a,
+ 0x39, 0x7a, 0x37, 0x9a, 0x37, 0x7e, 0xb3, 0x9a, 0x4b, 0xb4, 0xa, 0xf, 0x12,
+ 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x43, 0x12, 0xd2, 0xff, 0x7a, 0x37, 0x9a,
+ 0x45, 0x22, 0xb4, 0x14, 0xe, 0x12, 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x47, 0x12,
+ 0xd2, 0xff, 0x7a, 0x37, 0x9a, 0x49, 0x22, 0x7e, 0x37, 0x9a, 0x2b, 0x9e,
+ 0x37, 0x9a, 0x33, 0x22, 0x12, 0xd3, 0x74, 0x7a, 0x37, 0x9a, 0x3f, 0x12,
+ 0xd2, 0xff, 0x7a, 0x37, 0x9a, 0x41, 0xe4, 0x22, 0x7d, 0x51, 0x7d, 0x12,
+ 0x7d, 0x23, 0x9d, 0x25, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x52, 0x80,
+ 0x4, 0x6d, 0x55, 0x9d, 0x52, 0x7c, 0xab, 0x7d, 0x21, 0x9d, 0x20, 0xbe, 0x24,
+ 0x0, 0x0, 0x8, 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x7c,
+ 0xb7, 0xbc, 0xba, 0x50, 0x3, 0x7c, 0xba, 0x22, 0x22, 0x7d, 0xf2, 0x7d, 0xe3,
+ 0x7e, 0x8, 0x9a, 0x23, 0x12, 0xd5, 0x86, 0x7e, 0x8, 0x96, 0x60, 0x7e, 0x34,
+ 0x3, 0xc0, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x59, 0x8e, 0x7e, 0x37, 0x76, 0xa7,
+ 0x7a, 0x37, 0x96, 0x58, 0x7a, 0xe7, 0x9a, 0x27, 0x7a, 0xf7, 0x9a, 0x29,
+ 0x7a, 0xe7, 0x9a, 0x2b, 0x7a, 0xe7, 0x9a, 0x2f, 0x7a, 0xe7, 0x9a, 0x33,
+ 0x7a, 0xe7, 0x9a, 0x37, 0x7a, 0xf7, 0x9a, 0x2d, 0x7a, 0xf7, 0x9a, 0x31,
+ 0x7a, 0xf7, 0x9a, 0x35, 0x7a, 0xf7, 0x9a, 0x39, 0x7a, 0xe7, 0x96, 0x5c,
+ 0x7a, 0xf7, 0x96, 0x5e, 0x7a, 0xb3, 0x9a, 0x4b, 0x74, 0x2, 0x7a, 0xb3, 0x9a,
+ 0x20, 0x22, 0xca, 0x79, 0x6c, 0xaa, 0x6d, 0xff, 0x7d, 0x4f, 0x7d, 0xf, 0x7e,
+ 0xe3, 0x69, 0x69, 0x7e, 0xf3, 0x69, 0x6a, 0x7e, 0xb3, 0x3, 0xc9, 0x60, 0x18,
+ 0x7e, 0x17, 0x3, 0xd2, 0x4d, 0x11, 0x78, 0x2, 0xa1, 0x7, 0xbe, 0xe0, 0x1,
+ 0x28, 0x2, 0xa1, 0x7, 0x30, 0x35, 0x6, 0xc2, 0x35, 0xa1, 0x7, 0xc2, 0x35,
+ 0xbe, 0xe0, 0x1, 0x78, 0x1d, 0xbe, 0xb0, 0x4, 0x78, 0x2, 0xa1, 0x7, 0x7e,
+ 0x47, 0x68, 0x15, 0x7e, 0x7, 0x68, 0x17, 0x7d, 0x34, 0x7d, 0x20, 0x12, 0xd5,
+ 0xca, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xa1, 0x7, 0x7e, 0x73, 0x3, 0xc9, 0x7c,
+ 0xb7, 0x14, 0x68, 0x2f, 0x14, 0x68, 0x55, 0x14, 0x68, 0x29, 0x14, 0x78, 0x2,
+ 0xa1, 0x4, 0xb, 0xb2, 0x78, 0x7d, 0xbe, 0xe0, 0x1, 0x68, 0x2, 0xa1, 0x16,
+ 0x4c, 0xff, 0x68, 0x2, 0xa1, 0x16, 0x74, 0x1, 0x7a, 0xb3, 0x3, 0xc9, 0x12,
+ 0xd5, 0x24, 0x7e, 0x27, 0x76, 0x7d, 0x7a, 0x27, 0x3, 0xd2, 0x80, 0x6c, 0x4c,
+ 0xee, 0x78, 0x17, 0xa5, 0xbf, 0x1, 0x7, 0x74, 0x2, 0x12, 0xd5, 0x1b, 0x80,
+ 0x45, 0x74, 0x4, 0x7a, 0xb3, 0x3, 0xc9, 0x7e, 0x37, 0x76, 0x81, 0x80, 0x39,
+ 0x12, 0xd5, 0x2d, 0x7e, 0xb3, 0x76, 0x70, 0x12, 0xd5, 0x36, 0x68, 0x36,
+ 0x80, 0x43, 0xbe, 0xe0, 0x1, 0x78, 0x3e, 0x4c, 0xff, 0x78, 0x3a, 0x12, 0xd5,
+ 0x2d, 0x7e, 0x17, 0x76, 0x7d, 0x9e, 0x17, 0x76, 0x79, 0xbe, 0x17, 0x3, 0xd2,
+ 0x40, 0x1a, 0x7e, 0xb3, 0x76, 0x6f, 0x12, 0xd5, 0x36, 0x68, 0x11, 0x12,
+ 0xd5, 0x24, 0x74, 0x3, 0x12, 0xd5, 0x1b, 0x7a, 0x37, 0x3, 0xd2, 0x80, 0x12,
+ 0x7e, 0xa0, 0x24, 0xe4, 0x7a, 0xb3, 0x3, 0xc9, 0x6d, 0x33, 0x7a, 0x37, 0x3,
+ 0xd2, 0x7c, 0xba, 0x80, 0x2, 0x7c, 0xba, 0xda, 0x79, 0x22, 0x7a, 0xb3, 0x3,
+ 0xc9, 0x7e, 0x37, 0x76, 0x7d, 0x22, 0x7a, 0x47, 0x3, 0xca, 0x7a, 0x7, 0x3,
+ 0xcc, 0x22, 0x7a, 0x47, 0x3, 0xce, 0x7a, 0x7, 0x3, 0xd0, 0x22, 0xa, 0x3b,
+ 0x12, 0xd5, 0x40, 0xa, 0xfb, 0x4d, 0xff, 0x22, 0x7d, 0x23, 0x12, 0x16, 0xfa,
+ 0x7e, 0x37, 0x3, 0xce, 0x7d, 0x13, 0x9e, 0x17, 0x3, 0xca, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0x6, 0x9e, 0x37, 0x3, 0xca, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31,
+ 0xbd, 0x32, 0x38, 0x21, 0x7e, 0x37, 0x3, 0xd0, 0x7d, 0x13, 0x9e, 0x17, 0x3,
+ 0xcc, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x9e, 0x37, 0x3, 0xcc, 0x80, 0x4,
+ 0x6d, 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x38, 0x3, 0x74, 0x1, 0x22, 0xe4, 0x22,
+ 0x7e, 0x34, 0x0, 0x28, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0xb3, 0x9a, 0x23, 0xb4,
+ 0x4, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x74, 0xfe, 0x7a, 0xb3, 0x59, 0x8e, 0xe4,
+ 0x7a, 0xb3, 0x9a, 0x23, 0x22, 0x7e, 0xa3, 0x9a, 0x4b, 0xbe, 0xa0, 0xf0,
+ 0x50, 0x1b, 0x74, 0x4, 0xa4, 0x59, 0x35, 0x96, 0x60, 0x7e, 0xa3, 0x9a, 0x4b,
+ 0x74, 0x4, 0xa4, 0x59, 0x25, 0x96, 0x62, 0x7e, 0xb3, 0x9a, 0x4b, 0x4, 0x7a,
+ 0xb3, 0x9a, 0x4b, 0x22, 0x7d, 0x13, 0x7e, 0x37, 0x76, 0x71, 0xbd, 0x31,
+ 0x50, 0x1a, 0x7e, 0x37, 0x76, 0x73, 0xbd, 0x31, 0x28, 0x12, 0x7e, 0x37,
+ 0x76, 0x75, 0xbd, 0x32, 0x50, 0xa, 0x7e, 0x37, 0x76, 0x77, 0xbd, 0x32, 0x28,
+ 0x2, 0xe4, 0x22, 0x74, 0x1, 0x22, 0x7e, 0x8, 0x96, 0x58, 0x2, 0x5f, 0xf0,
+ 0x54, 0x3f, 0x5e, 0x70, 0x3f, 0x12, 0xd6, 0x10, 0x59, 0x31, 0x0, 0x32, 0x7e,
+ 0x37, 0x39, 0xf9, 0x59, 0x23, 0x0, 0x14, 0xa9, 0xc6, 0xcb, 0x22, 0xa9, 0xd6,
+ 0xcb, 0x7e, 0x14, 0x0, 0x21, 0x7e, 0x7, 0x39, 0xf9, 0x59, 0x10, 0x0, 0x2,
+ 0x7c, 0x2b, 0x6c, 0x33, 0xa, 0x37, 0x2d, 0x31, 0x7e, 0x17, 0x39, 0xf9, 0x22,
+ 0x12, 0xd6, 0x10, 0x59, 0x31, 0x0, 0x3e, 0x7e, 0x37, 0x39, 0xf9, 0x59, 0x23,
+ 0x0, 0x3c, 0x12, 0x2c, 0xc, 0x4e, 0x70, 0x10, 0x1b, 0x28, 0x30, 0xa9, 0xc6,
+ 0xcb, 0x22, 0x9, 0xb5, 0x9b, 0x28, 0xb, 0xa, 0x30, 0x6c, 0x77, 0x1b, 0xa,
+ 0x30, 0xa, 0x2b, 0xb, 0x24, 0x2, 0x16, 0xaf, 0xb, 0xa, 0x30, 0x30, 0x2, 0x5,
+ 0x5e, 0x60, 0xf7, 0x80, 0x3, 0x4e, 0x60, 0x8, 0x1b, 0xa, 0x30, 0x22, 0x2d,
+ 0x23, 0x3e, 0x24, 0xa, 0x3b, 0x9d, 0x23, 0xe5, 0x2f, 0xa, 0x3b, 0x9d, 0x23,
+ 0xbe, 0x24, 0x0, 0x0, 0x28, 0x3, 0x12, 0x1a, 0x89, 0x22, 0xb, 0xa, 0x30,
+ 0x5e, 0x70, 0x3, 0xb4, 0x3, 0x5, 0x4e, 0x70, 0xc, 0x80, 0x6, 0xb4, 0x4, 0x3,
+ 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xdf,
+ 0x1b, 0xa, 0x30, 0x30, 0x1, 0x9, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x20, 0x1b,
+ 0xa, 0x30, 0x22, 0x12, 0xd6, 0xc2, 0x1b, 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b,
+ 0xa, 0x30, 0x22, 0x7d, 0x23, 0xb, 0xa, 0x30, 0x5e, 0x34, 0xf8, 0x0, 0x22,
+ 0x12, 0xd6, 0xb3, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x7d, 0x31, 0x2e, 0x34,
+ 0x8e, 0x54, 0x6d, 0x22, 0x7a, 0x1d, 0x2f, 0x7e, 0x4, 0x0, 0x12, 0x7a, 0x5,
+ 0x33, 0x2e, 0x14, 0x8e, 0x58, 0x6d, 0x0, 0x22, 0xb, 0xa, 0x30, 0x12, 0x1f,
+ 0xff, 0xa2, 0x1, 0xe4, 0x33, 0xa, 0x2b, 0x3e, 0x24, 0x2, 0x16, 0xaf, 0x74,
+ 0x3, 0xac, 0xbf, 0x9, 0xb5, 0x9b, 0x57, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf,
+ 0x1b, 0xa, 0x30, 0xa, 0x5b, 0x12, 0x49, 0x61, 0x2, 0x48, 0xbe, 0x12, 0x1c,
+ 0xb5, 0x4e, 0x60, 0x80, 0x12, 0xd7, 0x27, 0x4e, 0x70, 0x10, 0x12, 0xd7,
+ 0x38, 0x2, 0xd7, 0x4e, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14,
+ 0x0, 0x14, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfe, 0x1b, 0xa, 0x30, 0x7e, 0xf,
+ 0x39, 0xed, 0x2e, 0x14, 0x0, 0x26, 0xb, 0xa, 0x30, 0x22, 0x7e, 0xf, 0x39,
+ 0xe4, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xdf, 0x1b, 0xa, 0x30, 0x22, 0xa9, 0xd6,
+ 0xca, 0x22, 0x7e, 0x34, 0x0, 0x1e, 0x7e, 0x8, 0x8d, 0xb2, 0x7e, 0x24, 0x0,
+ 0x22, 0x12, 0x17, 0x8f, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x8d, 0xf6, 0x12,
+ 0x12, 0x79, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x8d, 0xf8, 0x12, 0x12, 0x79,
+ 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x8, 0x8d, 0xfa, 0x7e, 0x24, 0x0, 0x3, 0x22,
+ 0x7a, 0x37, 0x8d, 0xf6, 0x7e, 0x37, 0x82, 0x3f, 0x7a, 0x37, 0x8d, 0xf8,
+ 0x7e, 0x34, 0x43, 0x21, 0x7a, 0x37, 0x8d, 0xfa, 0x7e, 0x34, 0x23, 0x45,
+ 0x7a, 0x37, 0x8d, 0xfc, 0x7e, 0x34, 0x12, 0x5, 0x7a, 0x37, 0x8d, 0xfe, 0xc2,
+ 0x8, 0x12, 0x15, 0x16, 0x7e, 0xb3, 0x9b, 0x7f, 0x22, 0x7e, 0x2f, 0x39, 0xf1,
+ 0xb, 0x2a, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x7e, 0x34, 0x0, 0x1,
+ 0x7e, 0x2f, 0x39, 0xf1, 0x79, 0x32, 0x0, 0x4, 0x7e, 0x2f, 0x39, 0xf1, 0xb,
+ 0x2a, 0x30, 0x22, 0x7d, 0xf3, 0x3e, 0xf4, 0x2d, 0xf1, 0x7d, 0xe0, 0xb, 0x7a,
+ 0xd0, 0x7d, 0xc3, 0x3e, 0xc4, 0x7f, 0x72, 0x2d, 0xfc, 0x1b, 0x7a, 0xd0, 0xb,
+ 0x34, 0x22, 0x12, 0x0, 0x16, 0x7d, 0x3e, 0x2e, 0x34, 0x0, 0x7, 0x74, 0x3c,
+ 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x36, 0x12, 0x12, 0x86, 0xb, 0xf0, 0xbe, 0xf0,
+ 0x4, 0x22, 0x7f, 0x70, 0x7d, 0x12, 0xd2, 0xcc, 0x7e, 0x4, 0x0, 0x3, 0x7e,
+ 0x2f, 0x39, 0xe8, 0x1b, 0x2a, 0x0, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0,
+ 0x6, 0x22, 0x3e, 0x24, 0x7e, 0xf, 0x8f, 0x18, 0x2d, 0x12, 0x69, 0x30, 0x0,
+ 0x1a, 0x59, 0x32, 0x3a, 0x0, 0xa, 0x1f, 0xad, 0x1b, 0x7d, 0x1, 0x22, 0x7e,
+ 0xf, 0x39, 0xed, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x10, 0x1b, 0xa,
+ 0x30, 0x22, 0x7e, 0x2f, 0x39, 0xe8, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0,
+ 0x2, 0x22, 0x12, 0x17, 0x8f, 0x7d, 0x3b, 0x2e, 0x34, 0x0, 0xb, 0x7e, 0x30,
+ 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x8d, 0x9a, 0x6d, 0x0, 0x22, 0x2d, 0xcd, 0x6d,
+ 0xdd, 0x7a, 0xd5, 0x34, 0x7e, 0xd7, 0x76, 0x1b, 0x1b, 0xd4, 0x7a, 0xd5,
+ 0x36, 0x6d, 0xdd, 0xbd, 0xdc, 0x22, 0x74, 0x2, 0xa, 0xdc, 0x19, 0xbd, 0x36,
+ 0x98, 0x22, 0x74, 0x3, 0x12, 0x14, 0xcb, 0x7d, 0x37, 0x2e, 0x34, 0x0, 0x9,
+ 0x22, 0x12, 0xd, 0x20, 0x7a, 0x37, 0x3f, 0x2a, 0x7e, 0x34, 0x0, 0x20, 0x7e,
+ 0x27, 0x3f, 0x2a, 0x22, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0x7e, 0x2f, 0x39,
+ 0xf1, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x74, 0x8, 0xa4,
+ 0x7d, 0xf5, 0xb, 0xf6, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xe5, 0x2e, 0xe4, 0x1,
+ 0x0, 0x22, 0x2e, 0x7, 0x91, 0xfe, 0x3e, 0x4, 0x7e, 0x1f, 0x8f, 0x18, 0x2d,
+ 0x30, 0xb, 0x1a, 0x30, 0x7d, 0x21, 0x22, 0x7e, 0x63, 0x37, 0xe1, 0x7e, 0x70,
+ 0xee, 0xac, 0x67, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x1e, 0x22, 0x2d,
+ 0xbd, 0x7e, 0xd7, 0x76, 0x29, 0x1b, 0xd4, 0x7a, 0xd5, 0x36, 0x7e, 0xd5,
+ 0x34, 0xbd, 0xdb, 0x22, 0xe5, 0xc3, 0x7a, 0xb3, 0x37, 0xe3, 0xe5, 0xc3,
+ 0x54, 0xf8, 0x4e, 0xb3, 0x37, 0xe2, 0xf5, 0xc3, 0x22, 0x12, 0x14, 0xc4,
+ 0x7a, 0x37, 0x3f, 0x2c, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x3f, 0x2c, 0x22,
+ 0x7d, 0x36, 0x12, 0xd, 0x20, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x7e, 0x18, 0x18,
+ 0x80, 0x7a, 0x1d, 0x41, 0x7e, 0xd, 0x33, 0x7e, 0x18, 0x18, 0x80, 0x22, 0x7e,
+ 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x39, 0x7e, 0xd, 0x2f, 0x7e, 0x18, 0xe, 0x40,
+ 0x22, 0xa2, 0x0, 0x92, 0x3, 0x7e, 0xf, 0x2d, 0x2a, 0x7e, 0x18, 0x22, 0xc0,
+ 0x7c, 0xbf, 0x22, 0x7e, 0x50, 0xd, 0xac, 0x5f, 0x2d, 0x2a, 0xb, 0x28, 0x30,
+ 0x49, 0x22, 0x0, 0x2, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x18, 0x74, 0x3c,
+ 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x58, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x16,
+ 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x8e, 0x54, 0x22, 0x7e, 0x34, 0x9a,
+ 0x57, 0x7e, 0x14, 0x0, 0x45, 0x74, 0xb, 0x2, 0x1, 0xf3, 0x7e, 0xb, 0xa0,
+ 0x7c, 0x4a, 0x6c, 0x55, 0x29, 0xa0, 0x0, 0x1, 0xa, 0x3a, 0x22, 0x74, 0xee,
+ 0xac, 0xbf, 0x7d, 0xb5, 0x2e, 0xb4, 0x1, 0x0, 0x22, 0x7e, 0x37, 0x92, 0x9a,
+ 0x7e, 0x27, 0x92, 0x9c, 0x22, 0x74, 0x17, 0xa4, 0x7e, 0x1d, 0x2e, 0x2d,
+ 0x35, 0x22, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x2f, 0x39, 0xe8, 0x79, 0x32, 0x0,
+ 0x4, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1f, 0x2d, 0x26, 0x7e, 0x18, 0x22,
+ 0xc0, 0x22, 0xac, 0x67, 0x2e, 0x34, 0x9b, 0x23, 0x6d, 0x22, 0x7e, 0x8, 0x9a,
+ 0xed, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x8e, 0x54, 0x6d, 0x0,
+ 0x22, 0xc2, 0x1b, 0xc2, 0x1a, 0x7e, 0xb3, 0x9b, 0xa8, 0xbe, 0xb0, 0x1, 0x22,
+ 0xe4, 0xa, 0xde, 0x19, 0xbd, 0x36, 0x8e, 0x19, 0xbd, 0x36, 0x98, 0x22, 0x1e,
+ 0x4, 0xe5, 0x3a, 0xa, 0x1b, 0xad, 0x10, 0x7a, 0x15, 0x2a, 0x22, 0x7e, 0x34,
+ 0x0, 0x32, 0x2, 0x26, 0x98, 0x7c, 0x8b, 0x74, 0x8, 0xac, 0xb8, 0x9, 0x95,
+ 0x9b, 0x27, 0x22, 0x7e, 0xb3, 0x9a, 0xbc, 0x44, 0x80, 0x7a, 0xb3, 0x9a,
+ 0xbc, 0x22, 0xc2, 0xac, 0x7e, 0xf, 0x39, 0xed, 0x22, 0x7e, 0xf, 0x2d, 0x2a,
+ 0x2d, 0x12, 0xb, 0xa, 0x20, 0x22, 0x2e, 0x14, 0x8e, 0x34, 0x6d, 0x0, 0x22,
+ 0x7c, 0xbf, 0x7c, 0x78, 0x12, 0x2e, 0x40, 0xbd, 0x3e, 0x22, 0x6d, 0x33,
+ 0x7a, 0x37, 0x37, 0xda, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x38, 0x98, 0x22,
+ 0x7d, 0x36, 0x12, 0x14, 0xc4, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x74, 0x1, 0x12,
+ 0x48, 0xaf, 0x7e, 0x8, 0x3f, 0x26, 0x22, 0x7e, 0xb3, 0x9b, 0x7f, 0xd2, 0x2e,
+ 0xd2, 0x2d, 0x22, 0x7e, 0xf, 0x39, 0xed, 0x2e, 0x14, 0x0, 0x12, 0x22, 0x3e,
+ 0x34, 0x2e, 0x34, 0xb0, 0x0, 0x6d, 0x22, 0x22, 0x3e, 0x34, 0x2e, 0x34, 0xa0,
+ 0x0, 0x6d, 0x22, 0x22, 0x7d, 0xf3, 0x3e, 0xf4, 0x2d, 0xf5, 0x7d, 0xe4, 0x22,
+ 0xb, 0x16, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xef, 0x22, 0x7e, 0x8, 0x8d, 0xf6,
+ 0x7e, 0x18, 0x8d, 0xc4, 0x22, 0x7e, 0x8, 0x8d, 0xb6, 0x7e, 0x18, 0x8d, 0xc4,
+ 0x22, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xf5, 0x9b, 0x27, 0x22, 0x7e, 0xf, 0x39,
+ 0xe4, 0x79, 0x30, 0x0, 0x6, 0x22, 0x7e, 0xd7, 0x92, 0xc6, 0xbe, 0xd4, 0x0,
+ 0x1e, 0x22, 0x7e, 0x37, 0x92, 0x96, 0xbe, 0x34, 0x0, 0x14, 0x22, 0x7e, 0x34,
+ 0x0, 0x17, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x0, 0x7e, 0x34, 0x0, 0xa,
+ 0x22, 0x74, 0x8, 0xac, 0xbf, 0x9, 0x75, 0x9b, 0x23, 0x22, 0x7e, 0xb3, 0x9a,
+ 0xe8, 0x7e, 0x73, 0x9b, 0xae, 0x22, 0x7e, 0x34, 0x3a, 0x0, 0x7a, 0x37, 0x38,
+ 0x94, 0x22, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x38, 0x92, 0x22, 0x7e,
+ 0x34, 0x0, 0x19, 0x7e, 0x27, 0x3f, 0x5a, 0x22, 0x7e, 0x34, 0x0, 0x18, 0x7e,
+ 0x27, 0x3f, 0x58, 0x22, 0x7e, 0x34, 0x0, 0x16, 0x7e, 0x27, 0x3f, 0x52, 0x22,
+ 0x7e, 0x34, 0x0, 0x14, 0x7e, 0x27, 0x3f, 0x46, 0x22, 0x7e, 0x34, 0x0, 0x21,
+ 0x7e, 0x27, 0x3f, 0x4e, 0x22, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x3f, 0x4c,
+ 0x22, 0x7e, 0x34, 0x0, 0x26, 0x7e, 0x27, 0x3f, 0x30, 0x22, 0x7e, 0x34, 0x0,
+ 0x1b, 0x7e, 0x27, 0x3f, 0x44, 0x22, 0x7e, 0x34, 0x0, 0x28, 0x7e, 0x27, 0x3f,
+ 0x34, 0x22, 0x7e, 0x34, 0x0, 0x2a, 0x7e, 0x27, 0x3f, 0x38, 0x22, 0x7e, 0x34,
+ 0x0, 0x1, 0x7e, 0x27, 0x3f, 0x36, 0x22, 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27,
+ 0x3f, 0x32, 0x22, 0x7e, 0x34, 0x0, 0x25, 0x7e, 0x27, 0x3f, 0x2e, 0x22, 0x7e,
+ 0x34, 0x0, 0x1f, 0x7e, 0x27, 0x3f, 0x76, 0x22, 0x7e, 0x34, 0x1, 0x35, 0x7e,
+ 0x8, 0x91, 0xfe, 0x22, 0x4e, 0x70, 0x1, 0x1b, 0x2a, 0x30, 0xe4, 0x22, 0x7e,
+ 0xb3, 0x9a, 0x7b, 0xbe, 0xb0, 0x1, 0x22, 0x7e, 0x37, 0x75, 0x94, 0x2, 0x32,
+ 0x9d, 0x7e, 0x73, 0x9b, 0xb1, 0xbe, 0x70, 0x64, 0x22, 0x7e, 0xd5, 0x2a,
+ 0xbe, 0xd4, 0x0, 0xc8, 0x22, 0x7e, 0x73, 0x92, 0x8f, 0xbe, 0x70, 0xa, 0x22,
+ 0x49, 0x25, 0x8e, 0x34, 0x2, 0x12, 0x86, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0,
+ 0x1a, 0x22, 0x12, 0xd, 0x10, 0x7e, 0x34, 0x0, 0x2, 0x22, 0x12, 0xd, 0x10,
+ 0x7e, 0x34, 0x0, 0x17, 0x22, 0x5e, 0x24, 0x7d, 0xfd, 0x4e, 0x40, 0x58, 0x22,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x4d,
+ 0x18, 0x75, 0xe7, 0x8a, 0x70, 0x8f, 0x0, 0xff, 0xe0, 0x1f, 0x1, 0xaa, 0x48,
+ 0x63, 0x2, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x42, 0x32, 0x1, 0xd2, 0x54,
+ 0x31, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8,
+ 0x30, 0x30, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1,
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x9, 0x9, 0x12, 0x24,
+ 0x12, 0x24, 0x0, 0x0, 0x1, 0x3, 0x0, 0x0, 0x0, 0x24, 0x0, 0x6d, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x24, 0x0, 0x6d,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x1, 0x44, 0x0,
+ 0x0, 0x0, 0x0, 0x1, 0x48, 0x1, 0x44, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1,
+ 0x23, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1, 0x23, 0x0, 0x49, 0x0, 0x1, 0x0,
+ 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9,
+ 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0,
+ 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0,
+ 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0,
+ 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0,
+ 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0,
+ 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0,
+ 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0,
+ 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0,
+ 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0,
+ 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0,
+ 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0,
+ 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0,
+ 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0,
+ 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x1,
+ 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0,
+ 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0,
+ 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0,
+ 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0,
+ 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0,
+ 0xfe, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1,
+ 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1,
+ 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1,
+ 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1,
+ 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1,
+ 0x6a, 0x1, 0x6b, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1,
+ 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb,
+ 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12,
+ 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19,
+ 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20,
+ 0x1, 0x21, 0x1, 0x22, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba,
+ 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8,
+ 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6,
+ 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0x24, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70,
+ 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77,
+ 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e,
+ 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85,
+ 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c,
+ 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x0, 0x0, 0x25, 0x0, 0x26,
+ 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d,
+ 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34,
+ 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b,
+ 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42,
+ 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x0, 0x0, 0x25,
+ 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c,
+ 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33,
+ 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a,
+ 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41,
+ 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x24,
+ 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74,
+ 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b,
+ 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82,
+ 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89,
+ 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90,
+ 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc,
+ 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3,
+ 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca,
+ 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1,
+ 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8,
+ 0x0, 0xd9, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1,
+ 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc,
+ 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, 0x1, 0x13,
+ 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a,
+ 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21,
+ 0x1, 0x22, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d,
+ 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54,
+ 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b,
+ 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62,
+ 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69,
+ 0x1, 0x6a, 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf,
+ 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6,
+ 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed,
+ 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4,
+ 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb,
+ 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95,
+ 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c,
+ 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3,
+ 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa,
+ 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1,
+ 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b,
+ 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52,
+ 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59,
+ 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60,
+ 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67,
+ 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1,
+ 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0,
+ 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10,
+ 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17,
+ 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e,
+ 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4,
+ 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0,
+ 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0,
+ 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0,
+ 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0,
+ 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0,
+ 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0,
+ 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0,
+ 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0,
+ 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0,
+ 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0,
+ 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0,
+ 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0,
+ 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0,
+ 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0,
+ 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x24, 0x0, 0xdc, 0x0,
+ 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+ 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0,
+ 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0,
+ 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0,
+ 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0x6d, 0x0,
+ 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0,
+ 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0,
+ 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0,
+ 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0,
+ 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0,
+ 0xb6, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0,
+ 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0,
+ 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0,
+ 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0,
+ 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0,
+ 0x90, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0,
+ 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0,
+ 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0,
+ 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0,
+ 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0,
+ 0xd8, 0x0, 0xd9, 0x1, 0x48, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1,
+ 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1, 0xa, 0x1, 0xb,
+ 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12,
+ 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18, 0x1, 0x19,
+ 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f, 0x1, 0x20,
+ 0x1, 0x21, 0x1, 0x22, 0x0, 0x0, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c,
+ 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53,
+ 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a,
+ 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61,
+ 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68,
+ 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2,
+ 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1,
+ 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11,
+ 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18,
+ 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f,
+ 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+ 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0,
+ 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7,
+ 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce,
+ 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5,
+ 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x0, 0x6e, 0x0, 0x6f,
+ 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76,
+ 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d,
+ 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84,
+ 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b,
+ 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d, 0x0, 0x25,
+ 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c,
+ 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33,
+ 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a,
+ 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41,
+ 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47, 0x0, 0x24,
+ 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f,
+ 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56,
+ 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d,
+ 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64,
+ 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b,
+ 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1,
+ 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8,
+ 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef,
+ 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6,
+ 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd,
+ 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97,
+ 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e,
+ 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5,
+ 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac,
+ 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d,
+ 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54,
+ 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b,
+ 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62,
+ 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69,
+ 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3,
+ 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0,
+ 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0,
+ 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0,
+ 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0,
+ 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x0, 0x8, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x1,
+ 0x8, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7, 0x2, 0x6, 0x5, 0x0, 0x1f, 0x5, 0x7, 0x7,
+ 0x3, 0x8, 0x3, 0x1, 0x1, 0xa, 0x1e, 0x20, 0x1a, 0x0, 0x64, 0xd, 0xac, 0x0,
+ 0xc8, 0x1, 0x90, 0x1, 0x7c, 0x1, 0x7c, 0x1, 0x5e, 0x9, 0xc4, 0x7, 0xd0, 0x7,
+ 0xd0, 0x0, 0xfa, 0x0, 0xfa, 0xc, 0x80, 0x1, 0xc2, 0x1, 0x3, 0x6, 0x21, 0x3c,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb, 0x0, 0x1, 0x87, 0x1, 0x0, 0x13, 0x1,
+ 0xe0, 0x0, 0x7, 0x0, 0x18, 0x1, 0x2, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
+ 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
+ 0xe0, 0xa5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
+ 0x40, 0x4, 0x80, 0x4, 0x38, 0x2, 0x1c, 0x40, 0x40, 0x2, 0x58, 0x2, 0x58,
+ 0x1, 0x0, 0x1, 0x0, 0x8, 0xe8, 0x4, 0x74, 0x40, 0x40, 0x2, 0x58, 0x2, 0x58,
+ 0x1, 0x0, 0x1, 0x0, 0x12, 0x0, 0xb4, 0x1, 0x68, 0x2, 0x1c, 0x0, 0x0, 0x7,
+ 0xa8, 0x0, 0x64, 0x0, 0x51, 0x0, 0x5, 0x1, 0x5, 0x0, 0xc8, 0x13, 0x88, 0xf,
+ 0x6, 0x6, 0x0, 0x78, 0x1, 0x5e, 0x1, 0xc2, 0x1f, 0x40, 0x3c, 0x2, 0x58, 0x0,
+ 0xc8, 0x0, 0x14, 0x0, 0x1f, 0x0, 0x18, 0x0, 0x11, 0x3, 0x20, 0x1, 0x90, 0x6,
+ 0x40, 0x5, 0xdc, 0x4, 0x14, 0x32, 0x0, 0x50, 0x3, 0xe8, 0x0, 0x50, 0x8,
+ 0x98, 0x0, 0x32, 0x1, 0xf4, 0x1, 0xf4, 0x3, 0x20, 0x0, 0x14, 0x0, 0x3c, 0x0,
+ 0x1e, 0x0, 0x80, 0x2, 0x1c, 0x0, 0xdc, 0x0, 0x3c, 0x3, 0xe8, 0x4, 0x74, 0x2,
+ 0x1c, 0x0, 0x3c, 0x3, 0xe8, 0x0, 0x20, 0x4, 0x18, 0x0, 0x0, 0x8, 0xe8, 0x0,
+ 0x64, 0x0, 0xa0, 0x0, 0xa0, 0x6, 0x40, 0x1, 0x2c, 0x0, 0x2b, 0x0, 0x1e, 0x0,
+ 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0,
+ 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0,
+ 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0,
+ 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0,
+ 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x74, 0x0,
+ 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0,
+ 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0,
+ 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0,
+ 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0,
+ 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0,
+ 0xb1, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0,
+ 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0,
+ 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0,
+ 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0,
+ 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0,
+ 0x96, 0x0, 0xee, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0,
+ 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0,
+ 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0,
+ 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0,
+ 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0,
+ 0xd2, 0x0, 0xd2, 0x1, 0x2b, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1,
+ 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe,
+ 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1,
+ 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe,
+ 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1,
+ 0xe, 0x1, 0x7a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1,
+ 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1,
+ 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1,
+ 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1,
+ 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1,
+ 0x4a, 0x1, 0x4a, 0x0, 0x0, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1,
+ 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1,
+ 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1,
+ 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1,
+ 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1,
+ 0x86, 0x1, 0x86, 0x1, 0x86, 0x0, 0x0, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1,
+ 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1,
+ 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1,
+ 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1,
+ 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1,
+ 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x0, 0x0, 0x1, 0xfe, 0x1, 0xfe, 0x1,
+ 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1,
+ 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1,
+ 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1,
+ 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1,
+ 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x0, 0x0, 0x2, 0x3a, 0x2,
+ 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2,
+ 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2,
+ 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2,
+ 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2,
+ 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x0, 0x0, 0x2,
+ 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2,
+ 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2,
+ 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2,
+ 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2,
+ 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x0,
+ 0x0, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2,
+ 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2,
+ 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2,
+ 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2,
+ 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2,
+ 0xb2, 0x2, 0xb5, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2,
+ 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2,
+ 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2,
+ 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2,
+ 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2,
+ 0xee, 0x2, 0xee, 0x3, 0xe, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
+ 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
+ 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
+ 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
+ 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
+ 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x4b, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3,
+ 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3,
+ 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3,
+ 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3,
+ 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3,
+ 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x88, 0x3, 0xa2, 0x3, 0xa2, 0x3,
+ 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3,
+ 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3,
+ 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3,
+ 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3,
+ 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xc5, 0x3, 0xde, 0x3,
+ 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3,
+ 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3,
+ 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3,
+ 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3,
+ 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x4, 0xe, 0x4,
+ 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4,
+ 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4,
+ 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4,
+ 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4,
+ 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2,
+ 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d,
+ 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18,
+ 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3,
+ 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d,
+ 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62,
+ 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e,
+ 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9,
+ 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93,
+ 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e,
+ 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21,
+ 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60,
+ 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b,
+ 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6,
+ 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90,
+ 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a,
+ 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21,
+ 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc,
+ 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96,
+ 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51,
+ 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb,
+ 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x4e, 0x0, 0xa2, 0x0, 0xe2,
+ 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c,
+ 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57,
+ 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12,
+ 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc,
+ 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2,
+ 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d,
+ 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18,
+ 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3,
+ 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d,
+ 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42,
+ 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e,
+ 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9,
+ 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93,
+ 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e,
+ 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0,
+ 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x0, 0x0, 0x42, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60,
+ 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b,
+ 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6,
+ 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90,
+ 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a,
+ 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x4e, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21,
+ 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc,
+ 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96,
+ 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51,
+ 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb,
+ 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2,
+ 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c,
+ 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57,
+ 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12,
+ 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc,
+ 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2,
+ 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d,
+ 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18,
+ 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3,
+ 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d,
+ 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62,
+ 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e,
+ 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9,
+ 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93,
+ 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e,
+ 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21,
+ 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xd, 0x64, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x67, 0x3f, 0xff, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i
new file mode 100644
index 000000000000..46a7d44174ee
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_ft8719_d2tA.i
@@ -0,0 +1,4774 @@
+0x2, 0x0, 0x6e, 0x2, 0xde, 0xa5, 0xeb, 0xaa, 0x8, 0xd3, 0x22, 0x2, 0xde, 0xcc,
+ 0x22, 0x2, 0x5f, 0xfa, 0x22, 0x2, 0xdf, 0x17, 0xb2, 0x86, 0x22, 0x22, 0x22,
+ 0x2, 0x88, 0x1f, 0x7c, 0xb7, 0x22, 0xff, 0xff, 0x2, 0x5b, 0x13, 0x7d, 0x23,
+ 0x2, 0x6b, 0x5f, 0x2, 0x88, 0xb2, 0x7d, 0x43, 0x7f, 0x10, 0x80, 0x7, 0x1b,
+ 0x44, 0x7a, 0xb, 0xb0, 0xb, 0x14, 0x4d, 0x44, 0x78, 0xf5, 0x22, 0xc2, 0x18,
+ 0x22, 0x2, 0x88, 0xca, 0xa9, 0xd6, 0xef, 0x22, 0xff, 0x2, 0x2d, 0xbf, 0x0,
+ 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0xa9, 0xd6, 0xca, 0x22, 0xff, 0x2, 0xe0,
+ 0x5f, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0xc2, 0x88, 0xd2, 0xa8,
+ 0x22, 0x2, 0xe1, 0xc5, 0x75, 0x84, 0x1, 0x7e, 0x44, 0x9f, 0xff, 0xe4, 0x7a,
+ 0x49, 0xb0, 0x1b, 0x44, 0x78, 0xf9, 0x7e, 0xf8, 0x74, 0x11, 0x75, 0x10, 0x0,
+ 0x75, 0x11, 0x0, 0xc2, 0x1a, 0xc2, 0x1b, 0xc2, 0x1c, 0x75, 0xd, 0x0, 0x75,
+ 0xe, 0x0, 0xc2, 0x27, 0xc2, 0x1d, 0xc2, 0x1e, 0xc2, 0x28, 0xc2, 0x29, 0xc2,
+ 0x2a, 0xc2, 0x2b, 0xc2, 0x1f, 0xc2, 0x20, 0x75, 0x16, 0x0, 0xc2, 0x21, 0xd2,
+ 0x22, 0xd2, 0x2d, 0x75, 0x12, 0x0, 0x75, 0x13, 0x0, 0xc2, 0x23, 0xc2, 0x24,
+ 0xc2, 0x2e, 0xc2, 0xd, 0xc2, 0xe, 0xc2, 0xf, 0xc2, 0x10, 0xc2, 0x11, 0xc2,
+ 0x12, 0xd2, 0x13, 0xc2, 0x14, 0xc2, 0x15, 0xc2, 0x2f, 0xc2, 0x30, 0xd2,
+ 0x25, 0xc2, 0x26, 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x14, 0x2b, 0x3c, 0xb, 0xa,
+ 0x40, 0x5d, 0x44, 0x68, 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44,
+ 0x80, 0xa, 0x7e, 0xb, 0xb0, 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b,
+ 0x44, 0x78, 0xf2, 0x80, 0xdf, 0x2, 0x2f, 0xfb, 0xf2, 0xa8, 0xd, 0x57, 0xf7,
+ 0xbc, 0x8, 0x43, 0x88, 0x66, 0x77, 0x99, 0xe0, 0x1f, 0xa, 0xf5, 0xff, 0xff,
+ 0xff, 0xff, 0xb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xf0,
+ 0x6, 0x70, 0x8f, 0x0, 0xff, 0xe0, 0x1f, 0x1, 0xaa, 0x48, 0x63, 0x2, 0xa9,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x42, 0x32, 0x1, 0xd2, 0x54, 0x31, 0x0, 0xff,
+ 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x53, 0x4f, 0x54, 0x5f, 0x36,
+ 0x50, 0x32, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
+ 0x1, 0x1, 0x0, 0x0, 0x0, 0x9, 0x9, 0x12, 0x24, 0x12, 0x24, 0x0, 0x0, 0x1,
+ 0x1, 0x44, 0x1, 0x44, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, 0x1, 0x44, 0x0, 0x48,
+ 0x0, 0x91, 0x0, 0xda, 0x1, 0x23, 0x0, 0x48, 0x0, 0x91, 0x0, 0xda, 0x1, 0x23,
+ 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0,
+ 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe,
+ 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15,
+ 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c,
+ 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23,
+ 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f,
+ 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56,
+ 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d,
+ 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64,
+ 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b,
+ 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97,
+ 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e,
+ 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5,
+ 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac,
+ 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf,
+ 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6,
+ 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed,
+ 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4,
+ 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb,
+ 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b,
+ 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52,
+ 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59,
+ 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60,
+ 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67,
+ 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1,
+ 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1,
+ 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10,
+ 0x1, 0x11, 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17,
+ 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e,
+ 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8,
+ 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf,
+ 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6,
+ 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd,
+ 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0x24, 0x0, 0x6e,
+ 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75,
+ 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c,
+ 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83,
+ 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a,
+ 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x0,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b,
+ 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32,
+ 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39,
+ 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40,
+ 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47,
+ 0x0, 0x0, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38,
+ 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f,
+ 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46,
+ 0x0, 0x47, 0x0, 0x24, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72,
+ 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79,
+ 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80,
+ 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87,
+ 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e,
+ 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba,
+ 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8,
+ 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6,
+ 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2,
+ 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1,
+ 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11,
+ 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18,
+ 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f,
+ 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b,
+ 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52,
+ 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59,
+ 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60,
+ 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67,
+ 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd,
+ 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4,
+ 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb,
+ 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2,
+ 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9,
+ 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93,
+ 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a,
+ 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1,
+ 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8,
+ 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92,
+ 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50,
+ 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57,
+ 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e,
+ 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65,
+ 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c,
+ 0x0, 0x49, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0,
+ 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe,
+ 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15,
+ 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c,
+ 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0,
+ 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11,
+ 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18,
+ 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f,
+ 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b,
+ 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52,
+ 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59,
+ 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60,
+ 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67,
+ 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0xdb, 0x0, 0x93,
+ 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a,
+ 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1,
+ 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8,
+ 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x24,
+ 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xe2,
+ 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7, 0x0, 0xe8, 0x0, 0xe9,
+ 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0,
+ 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5, 0x0, 0xf6, 0x0, 0xf7,
+ 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe,
+ 0x0, 0x6d, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38,
+ 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f,
+ 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46,
+ 0x0, 0x47, 0x0, 0xb6, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72,
+ 0x0, 0x73, 0x0, 0x74, 0x0, 0x75, 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79,
+ 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80,
+ 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87,
+ 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a, 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e,
+ 0x0, 0x8f, 0x0, 0x90, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0xba,
+ 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0xc7, 0x0, 0xc8,
+ 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6,
+ 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x1, 0x48, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2,
+ 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1, 0x9, 0x1,
+ 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11,
+ 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17, 0x1, 0x18,
+ 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e, 0x1, 0x1f,
+ 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0x0, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b,
+ 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52,
+ 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59,
+ 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c, 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60,
+ 0x1, 0x61, 0x1, 0x62, 0x1, 0x63, 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67,
+ 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a, 0x1, 0x6b, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,
+ 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x8, 0x1,
+ 0x9, 0x1, 0xa, 0x1, 0xb, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10,
+ 0x1, 0x11, 0x1, 0x12, 0x1, 0x13, 0x1, 0x14, 0x1, 0x15, 0x1, 0x16, 0x1, 0x17,
+ 0x1, 0x18, 0x1, 0x19, 0x1, 0x1a, 0x1, 0x1b, 0x1, 0x1c, 0x1, 0x1d, 0x1, 0x1e,
+ 0x1, 0x1f, 0x1, 0x20, 0x1, 0x21, 0x1, 0x22, 0x0, 0xff, 0x0, 0xb7, 0x0, 0xb8,
+ 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf,
+ 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0xc5, 0x0, 0xc6,
+ 0x0, 0xc7, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0xca, 0x0, 0xcb, 0x0, 0xcc, 0x0, 0xcd,
+ 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd7, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xb6, 0x0, 0x6e,
+ 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0x0, 0x75,
+ 0x0, 0x76, 0x0, 0x77, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7a, 0x0, 0x7b, 0x0, 0x7c,
+ 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83,
+ 0x0, 0x84, 0x0, 0x85, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0x0, 0x8a,
+ 0x0, 0x8b, 0x0, 0x8c, 0x0, 0x8d, 0x0, 0x8e, 0x0, 0x8f, 0x0, 0x90, 0x0, 0x6d,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b,
+ 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32,
+ 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39,
+ 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40,
+ 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x47,
+ 0x0, 0x24, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e,
+ 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55,
+ 0x1, 0x56, 0x1, 0x57, 0x1, 0x58, 0x1, 0x59, 0x1, 0x5a, 0x1, 0x5b, 0x1, 0x5c,
+ 0x1, 0x5d, 0x1, 0x5e, 0x1, 0x5f, 0x1, 0x60, 0x1, 0x61, 0x1, 0x62, 0x1, 0x63,
+ 0x1, 0x64, 0x1, 0x65, 0x1, 0x66, 0x1, 0x67, 0x1, 0x68, 0x1, 0x69, 0x1, 0x6a,
+ 0x1, 0x6b, 0x1, 0x48, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0,
+ 0x0, 0xe1, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0xe4, 0x0, 0xe5, 0x0, 0xe6, 0x0, 0xe7,
+ 0x0, 0xe8, 0x0, 0xe9, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee,
+ 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xf3, 0x0, 0xf4, 0x0, 0xf5,
+ 0x0, 0xf6, 0x0, 0xf7, 0x0, 0xf8, 0x0, 0xf9, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc,
+ 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xdb, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96,
+ 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9b, 0x0, 0x9c, 0x0, 0x9d,
+ 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4,
+ 0x0, 0xa5, 0x0, 0xa6, 0x0, 0xa7, 0x0, 0xa8, 0x0, 0xa9, 0x0, 0xaa, 0x0, 0xab,
+ 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0xb1, 0x0, 0xb2,
+ 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x92, 0x0, 0x4a, 0x0, 0x4b, 0x0, 0x4c,
+ 0x0, 0x4d, 0x0, 0x4e, 0x0, 0x4f, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53,
+ 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+ 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61,
+ 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68,
+ 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0,
+ 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11,
+ 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18,
+ 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f,
+ 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x16, 0x5, 0x7, 0x7, 0x0, 0x8, 0x5, 0x0, 0x16, 0x5, 0x7, 0x7,
+ 0x1, 0x8, 0x5, 0x0, 0x16, 0x5, 0x7, 0x7, 0x2, 0x6, 0x5, 0x0, 0x16, 0x5, 0x7,
+ 0x7, 0x3, 0x8, 0x3, 0x1, 0x1, 0xa, 0x1e, 0x20, 0x14, 0x0, 0x64, 0xd, 0xac,
+ 0x0, 0xc8, 0x1, 0x90, 0x1, 0x2c, 0x0, 0xc8, 0x1, 0x2c, 0x9, 0xc4, 0x7, 0xd0,
+ 0x7, 0xd0, 0x0, 0x96, 0x0, 0x96, 0xa, 0x0, 0x1, 0xf4, 0x1, 0x5, 0x6, 0x21,
+ 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb, 0x0, 0x1, 0x87, 0x1, 0x0, 0xa, 0x1,
+ 0xe0, 0x0, 0x7, 0x0, 0x18, 0x1, 0x2, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
+ 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0,
+ 0xa5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40,
+ 0x4, 0x80, 0x4, 0x38, 0x2, 0x1c, 0x3c, 0x3c, 0x4, 0x0, 0x4, 0x0, 0x1, 0x1,
+ 0x1, 0x3, 0x8, 0xe8, 0x4, 0x74, 0x41, 0x40, 0x4, 0x0, 0x4, 0x0, 0x1, 0x1,
+ 0x1, 0x0, 0x12, 0x0, 0xb4, 0x1, 0x68, 0x2, 0x1c, 0x0, 0x0, 0x7, 0xa8, 0x0,
+ 0x64, 0x0, 0x51, 0x0, 0x2, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80,
+ 0x0, 0xc8, 0x13, 0x88, 0xf, 0x5, 0x6, 0x0, 0x1e, 0x0, 0xc8, 0x1, 0xc2, 0x1f,
+ 0x40, 0x28, 0x2, 0x58, 0x0, 0xc8, 0x0, 0xa, 0x0, 0x16, 0x0, 0x1f, 0x0, 0x11,
+ 0x3, 0x20, 0x1, 0x90, 0x6, 0x40, 0x3, 0x20, 0x4, 0xa, 0x5, 0x0, 0x74, 0x3,
+ 0xc4, 0x0, 0x41, 0x8, 0xa7, 0x0, 0x32, 0x1, 0x90, 0x1, 0x90, 0x3, 0x20, 0x0,
+ 0xc8, 0x0, 0x3c, 0x0, 0x1e, 0x0, 0x80, 0x1, 0xe, 0x1, 0x1d, 0x0, 0x3c, 0x3,
+ 0xe8, 0x2, 0x3a, 0x0, 0x87, 0x0, 0x3c, 0x3, 0xe8, 0x0, 0x22, 0x4, 0x16, 0x0,
+ 0x13, 0x8, 0xd5, 0x0, 0x64, 0x0, 0xa0, 0x0, 0xa0, 0x13, 0x88, 0x1, 0x2c,
+ 0x0, 0x2b, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e,
+ 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e,
+ 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e,
+ 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e,
+ 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1e,
+ 0x0, 0x1e, 0x0, 0x74, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a,
+ 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a,
+ 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a,
+ 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a,
+ 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a, 0x0, 0x5a,
+ 0x0, 0x5a, 0x0, 0x5a, 0x0, 0xb1, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96,
+ 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96,
+ 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96,
+ 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96,
+ 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0x96,
+ 0x0, 0x96, 0x0, 0x96, 0x0, 0x96, 0x0, 0xee, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2,
+ 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2,
+ 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2,
+ 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2,
+ 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2,
+ 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x0, 0xd2, 0x1, 0x2b, 0x1, 0xe, 0x1, 0xe,
+ 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1,
+ 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe,
+ 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1,
+ 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xe,
+ 0x1, 0xe, 0x1, 0xe, 0x1, 0xe, 0x1, 0xa2, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a,
+ 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a,
+ 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a,
+ 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a,
+ 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a,
+ 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x4a, 0x1, 0x93, 0x1, 0x86, 0x1, 0x86,
+ 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86,
+ 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86,
+ 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86,
+ 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86,
+ 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0x86, 0x1, 0xc2, 0x1, 0xc2,
+ 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2,
+ 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2,
+ 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2,
+ 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2,
+ 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xc2, 0x1, 0xfe,
+ 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe,
+ 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe,
+ 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe,
+ 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe,
+ 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe, 0x1, 0xfe,
+ 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a,
+ 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a,
+ 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a,
+ 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a,
+ 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a, 0x2, 0x3a,
+ 0x2, 0x3a, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76,
+ 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76,
+ 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76,
+ 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76,
+ 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76, 0x2, 0x76,
+ 0x2, 0x76, 0x2, 0x76, 0x2, 0xa5, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2,
+ 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2,
+ 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2,
+ 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2,
+ 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2,
+ 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xb2, 0x2, 0xa1, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee,
+ 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee,
+ 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee,
+ 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee,
+ 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee,
+ 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x2, 0xee, 0x3, 0xe, 0x3, 0x2a, 0x3, 0x2a,
+ 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a,
+ 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a,
+ 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a,
+ 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a,
+ 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x4b, 0x3, 0x66,
+ 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66,
+ 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66,
+ 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66,
+ 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66,
+ 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x66, 0x3, 0x88,
+ 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2,
+ 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2,
+ 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2,
+ 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2,
+ 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2, 0x3, 0xa2,
+ 0x3, 0xc5, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde,
+ 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde,
+ 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde,
+ 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde,
+ 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde, 0x3, 0xde,
+ 0x3, 0xde, 0x4, 0xe, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a,
+ 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a,
+ 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a,
+ 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a,
+ 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a, 0x4, 0x1a,
+ 0x4, 0x1a, 0x4, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21,
+ 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60,
+ 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b,
+ 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6,
+ 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90,
+ 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a,
+ 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21,
+ 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc,
+ 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96,
+ 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51,
+ 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb,
+ 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2,
+ 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c,
+ 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57,
+ 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12,
+ 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc,
+ 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0xf, 0x0, 0x62, 0x0, 0xa2,
+ 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d,
+ 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18,
+ 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3,
+ 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d,
+ 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62,
+ 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e,
+ 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9,
+ 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93,
+ 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e,
+ 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x29,
+ 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60,
+ 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b,
+ 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6,
+ 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90,
+ 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a,
+ 0x8, 0x89, 0x8, 0xc8, 0x0, 0x29, 0x0, 0x6a, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21,
+ 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc,
+ 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96,
+ 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51,
+ 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb,
+ 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2,
+ 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c,
+ 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57,
+ 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12,
+ 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc,
+ 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0xf, 0x0, 0x62, 0x0, 0xa2,
+ 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d,
+ 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18,
+ 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3,
+ 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d,
+ 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62,
+ 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e,
+ 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9,
+ 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93,
+ 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e,
+ 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21,
+ 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf,
+ 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99,
+ 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54,
+ 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf,
+ 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8,
+ 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60, 0x1, 0x9f,
+ 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b, 0x3, 0x5a,
+ 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6, 0x5, 0x15,
+ 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90, 0x6, 0xd0,
+ 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a, 0x8, 0x89,
+ 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21, 0x1, 0x60,
+ 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc, 0x3, 0x1b,
+ 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96, 0x4, 0xd6,
+ 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51, 0x6, 0x90,
+ 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb, 0x8, 0x4a,
+ 0x8, 0x89, 0x8, 0xc8, 0x0, 0x21, 0x0, 0x62, 0x0, 0xa2, 0x0, 0xe2, 0x1, 0x21,
+ 0x1, 0x60, 0x1, 0x9f, 0x1, 0xdf, 0x2, 0x1e, 0x2, 0x5d, 0x2, 0x9c, 0x2, 0xdc,
+ 0x3, 0x1b, 0x3, 0x5a, 0x3, 0x99, 0x3, 0xd9, 0x4, 0x18, 0x4, 0x57, 0x4, 0x96,
+ 0x4, 0xd6, 0x5, 0x15, 0x5, 0x54, 0x5, 0x93, 0x5, 0xd3, 0x6, 0x12, 0x6, 0x51,
+ 0x6, 0x90, 0x6, 0xd0, 0x7, 0xf, 0x7, 0x4e, 0x7, 0x8d, 0x7, 0xcc, 0x8, 0xb,
+ 0x8, 0x4a, 0x8, 0x89, 0x8, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x6, 0xe, 0x15, 0x1a, 0x1f, 0x26, 0x2b, 0x2d, 0x2e, 0x2f, 0x2c, 0x2a,
+ 0x24, 0x1f, 0x1a, 0x14, 0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10, 0x15, 0x1c,
+ 0x22, 0x28, 0x2d, 0x34, 0x39, 0x3d, 0x40, 0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8,
+ 0xc, 0x11, 0x16, 0x1c, 0x23, 0x2b, 0x32, 0x37, 0x3c, 0x40, 0x45, 0x4a, 0x4d,
+ 0x4c, 0x4b, 0x4a, 0x48, 0x46, 0x46, 0x45, 0x45, 0x44, 0x44, 0x43, 0x44,
+ 0x45, 0x78, 0x65, 0x55, 0x0, 0x8, 0xe, 0x13, 0x17, 0x1b, 0x20, 0x23, 0x24,
+ 0x24, 0x24, 0x23, 0x21, 0x1e, 0x1d, 0x1b, 0x18, 0x16, 0x12, 0xf, 0x11, 0x14,
+ 0x1a, 0x21, 0x27, 0x2a, 0x2d, 0x32, 0x36, 0x3a, 0x3d, 0x40, 0x1, 0x0, 0x0,
+ 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x11, 0x14, 0x19, 0x1e, 0x23, 0x27, 0x2b,
+ 0x2f, 0x34, 0x38, 0x3e, 0x3d, 0x3b, 0x36, 0x31, 0x2c, 0x2a, 0x27, 0x24,
+ 0x21, 0x1e, 0x1b, 0x1a, 0x5e, 0x9f, 0x65, 0x55, 0x2, 0xd, 0x14, 0x1b, 0x21,
+ 0x25, 0x2b, 0x31, 0x37, 0x36, 0x33, 0x2d, 0x28, 0x20, 0x19, 0x14, 0xd, 0x8,
+ 0x1, 0x2, 0x5, 0xb, 0x10, 0x18, 0x1e, 0x23, 0x2a, 0x30, 0x35, 0x3a, 0x3e,
+ 0x3f, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,
+ 0x1d, 0x24, 0x2a, 0x30, 0x35, 0x3b, 0x3e, 0x3f, 0x40, 0x3f, 0x3e, 0x3d,
+ 0x3d, 0x3c, 0x3c, 0x3b, 0x3b, 0x39, 0x37, 0x1a, 0x2d, 0x65, 0x55, 0x13,
+ 0x1c, 0x23, 0x28, 0x2d, 0x31, 0x36, 0x34, 0x30, 0x2b, 0x27, 0x24, 0x20,
+ 0x1b, 0x16, 0x12, 0xb, 0x6, 0x3, 0x0, 0x4, 0x8, 0xc, 0x13, 0x1b, 0x22, 0x27,
+ 0x2c, 0x32, 0x37, 0x3c, 0x40, 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0x4, 0xa, 0x10,
+ 0x14, 0x19, 0x1d, 0x21, 0x26, 0x2b, 0x2f, 0x36, 0x3a, 0x3e, 0x41, 0x42,
+ 0x40, 0x3f, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x31, 0x2f, 0x2e, 0xb5,
+ 0xca, 0x65, 0x55, 0x1b, 0x29, 0x27, 0x1e, 0x14, 0x11, 0x1a, 0x26, 0x2e,
+ 0x37, 0x3d, 0x3f, 0x3d, 0x37, 0x2e, 0x21, 0x16, 0xc, 0x5, 0x1, 0x0, 0x0,
+ 0x1, 0x3, 0xa, 0x13, 0x1d, 0x26, 0x2e, 0x33, 0x38, 0x3a, 0x16, 0x21, 0x2b,
+ 0x32, 0x30, 0x2a, 0x27, 0x2a, 0x2f, 0x2d, 0x24, 0x1a, 0x10, 0x7, 0x1, 0x0,
+ 0x2, 0x7, 0x10, 0x19, 0x23, 0x2d, 0x36, 0x41, 0x49, 0x4c, 0x4a, 0x45, 0x3c,
+ 0x34, 0x2a, 0x27, 0x51, 0x71, 0x50, 0x55, 0x28, 0x12, 0x11, 0x18, 0x23,
+ 0x29, 0x2b, 0x2a, 0x2e, 0x35, 0x3c, 0x3e, 0x3f, 0x39, 0x31, 0x28, 0x1e,
+ 0x15, 0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16, 0x20, 0x2b, 0x32, 0x37,
+ 0x39, 0x20, 0x29, 0x32, 0x37, 0x31, 0x28, 0x21, 0x2a, 0x31, 0x2d, 0x23,
+ 0x1b, 0x13, 0x8, 0x1, 0x0, 0x1, 0x5, 0xc, 0x18, 0x20, 0x29, 0x34, 0x3e,
+ 0x47, 0x4f, 0x50, 0x4d, 0x45, 0x3c, 0x34, 0x31, 0x26, 0xcb, 0x50, 0x55,
+ 0x1d, 0x2f, 0x2c, 0x25, 0x1a, 0x1b, 0x20, 0x29, 0x31, 0x31, 0x2e, 0x2d,
+ 0x35, 0x3d, 0x3f, 0x3d, 0x38, 0x2c, 0x22, 0x15, 0xd, 0x6, 0x1, 0x0, 0x1,
+ 0x6, 0x10, 0x1b, 0x24, 0x2f, 0x38, 0x3d, 0xd, 0x1b, 0x27, 0x31, 0x32, 0x28,
+ 0x1e, 0x14, 0x15, 0x1d, 0x28, 0x31, 0x34, 0x2a, 0x1f, 0x14, 0x9, 0x1, 0x0,
+ 0x4, 0xd, 0x17, 0x21, 0x2c, 0x35, 0x40, 0x47, 0x47, 0x44, 0x3c, 0x34, 0x30,
+ 0x1b, 0x82, 0x50, 0x55, 0x19, 0x2e, 0x2a, 0x1f, 0x18, 0x1b, 0x22, 0x2d,
+ 0x30, 0x2e, 0x2e, 0x35, 0x3d, 0x3f, 0x3d, 0x3a, 0x2f, 0x24, 0x18, 0xf, 0x7,
+ 0x1, 0x0, 0x0, 0x3, 0xb, 0x16, 0x1e, 0x29, 0x32, 0x3a, 0x3d, 0x11, 0x1f,
+ 0x28, 0x32, 0x30, 0x26, 0x1b, 0x14, 0x1c, 0x25, 0x2e, 0x35, 0x2e, 0x23,
+ 0x19, 0x11, 0x4, 0x0, 0x1, 0x8, 0x10, 0x1c, 0x25, 0x30, 0x38, 0x40, 0x42,
+ 0x3f, 0x39, 0x32, 0x2c, 0x27, 0xc0, 0xd1, 0x50, 0x55, 0x18, 0x2c, 0x29,
+ 0x1e, 0x14, 0x13, 0x16, 0x1e, 0x29, 0x30, 0x2e, 0x2c, 0x2b, 0x37, 0x3d,
+ 0x3f, 0x3e, 0x39, 0x30, 0x25, 0x1b, 0x10, 0x8, 0x1, 0x0, 0x2, 0x9, 0x13,
+ 0x1f, 0x2d, 0x38, 0x3c, 0x11, 0x1a, 0x23, 0x2f, 0x33, 0x29, 0x20, 0x16, 0xe,
+ 0x13, 0x1d, 0x28, 0x32, 0x31, 0x28, 0x1e, 0x16, 0xb, 0x2, 0x0, 0x1, 0x8,
+ 0x12, 0x1e, 0x29, 0x33, 0x3b, 0x3f, 0x3c, 0x32, 0x29, 0x26, 0x30, 0x6e,
+ 0x50, 0x55, 0x16, 0x2b, 0x24, 0x17, 0xd, 0xa, 0xe, 0x15, 0x24, 0x28, 0x25,
+ 0x23, 0x2b, 0x36, 0x3b, 0x3d, 0x3b, 0x37, 0x2b, 0x20, 0x15, 0xb, 0x4, 0x0,
+ 0x0, 0x3, 0xe, 0x19, 0x27, 0x33, 0x3d, 0x3f, 0x13, 0x21, 0x2e, 0x37, 0x3a,
+ 0x31, 0x27, 0x1c, 0x13, 0x1c, 0x28, 0x34, 0x3e, 0x37, 0x2d, 0x22, 0x18, 0xc,
+ 0x1, 0x0, 0x3, 0xd, 0x18, 0x25, 0x31, 0x3c, 0x47, 0x48, 0x42, 0x38, 0x2e,
+ 0x2a, 0x31, 0x62, 0x50, 0x55, 0x35, 0x2e, 0x27, 0x22, 0x1f, 0x1b, 0x16,
+ 0x10, 0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,
+ 0x17, 0x1d, 0x22, 0x26, 0x2a, 0x30, 0x35, 0x39, 0x3d, 0x3f, 0x0, 0x0, 0x1,
+ 0x4, 0x6, 0x8, 0xb, 0x10, 0x16, 0x1b, 0x1f, 0x23, 0x28, 0x2d, 0x32, 0x36,
+ 0x3b, 0x40, 0x44, 0x48, 0x4a, 0x4b, 0x4c, 0x4b, 0x4a, 0x48, 0x46, 0x43,
+ 0x40, 0x3e, 0x3c, 0x3a, 0x3c, 0x9c, 0x34, 0x55, 0x2d, 0x28, 0x24, 0x22,
+ 0x1f, 0x1c, 0x19, 0x16, 0x13, 0x10, 0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa,
+ 0xe, 0x11, 0x16, 0x19, 0x1e, 0x22, 0x27, 0x2c, 0x30, 0x33, 0x36, 0x39, 0x3d,
+ 0x40, 0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11, 0x14, 0x16, 0x18, 0x1b, 0x1f,
+ 0x22, 0x25, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x32, 0x33,
+ 0x35, 0x36, 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x40, 0xac, 0x6a, 0x51, 0x55,
+ 0x25, 0x1e, 0x1a, 0x17, 0x15, 0x11, 0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2,
+ 0x5, 0x9, 0xd, 0x10, 0x13, 0x17, 0x1b, 0x1e, 0x21, 0x25, 0x29, 0x2d, 0x30,
+ 0x33, 0x37, 0x3b, 0x3e, 0x40, 0x0, 0x6, 0xc, 0x10, 0x13, 0x19, 0x1f, 0x23,
+ 0x27, 0x2b, 0x2f, 0x33, 0x36, 0x38, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b,
+ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x40,
+ 0xca, 0xd8, 0x51, 0x55, 0x9, 0x17, 0x1d, 0x26, 0x2e, 0x37, 0x3c, 0x3f, 0x3b,
+ 0x33, 0x2b, 0x22, 0x1a, 0x11, 0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1,
+ 0x6, 0xa, 0x11, 0x19, 0x22, 0x2a, 0x32, 0x39, 0x3d, 0x30, 0x30, 0x2f, 0x2c,
+ 0x26, 0x1e, 0x17, 0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15, 0x1e, 0x26, 0x2c,
+ 0x32, 0x3a, 0x41, 0x48, 0x50, 0x5b, 0x61, 0x64, 0x64, 0x60, 0x5b, 0x56,
+ 0x51, 0x4f, 0xd8, 0x2c, 0x33, 0x55, 0x6, 0x11, 0x18, 0x1e, 0x22, 0x27, 0x2a,
+ 0x2c, 0x29, 0x25, 0x1f, 0x18, 0x11, 0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6,
+ 0xa, 0x11, 0x18, 0x20, 0x26, 0x2c, 0x32, 0x36, 0x3b, 0x3d, 0x3f, 0x48, 0x37,
+ 0x2e, 0x24, 0x1a, 0x11, 0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, 0x1b, 0x21,
+ 0x28, 0x30, 0x37, 0x41, 0x47, 0x4e, 0x54, 0x53, 0x4e, 0x48, 0x41, 0x3b,
+ 0x33, 0x2c, 0x28, 0x25, 0xb, 0x67, 0x33, 0x55, 0x26, 0x1c, 0x19, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x15, 0xf, 0x9, 0x4, 0x1, 0x0,
+ 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12, 0x18, 0x1f, 0x28, 0x31, 0x37, 0x3c,
+ 0x40, 0x1, 0x7, 0xe, 0x14, 0x1c, 0x23, 0x2c, 0x34, 0x3e, 0x44, 0x4c, 0x54,
+ 0x5b, 0x60, 0x5d, 0x55, 0x4f, 0x49, 0x43, 0x3d, 0x38, 0x32, 0x2b, 0x26,
+ 0x22, 0x1f, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x66, 0x54, 0x74, 0x55,
+ 0x3e, 0x2c, 0x21, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
+ 0x1d, 0x1d, 0x1e, 0x1e, 0x1d, 0x1a, 0x11, 0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa,
+ 0x12, 0x1c, 0x23, 0x2c, 0x38, 0x40, 0xc, 0x0, 0x6, 0xf, 0x17, 0x22, 0x29,
+ 0x32, 0x3b, 0x41, 0x47, 0x4f, 0x55, 0x5c, 0x66, 0x71, 0x79, 0x3e, 0x76,
+ 0x6d, 0x64, 0x5a, 0x52, 0x4b, 0x42, 0x39, 0x35, 0x33, 0x32, 0x32, 0x31,
+ 0x31, 0xf3, 0xdb, 0x74, 0x55, 0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4,
+ 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10, 0x14,
+ 0x1b, 0x22, 0x28, 0x2e, 0x34, 0x39, 0x3d, 0x40, 0x0, 0xb, 0x11, 0x16, 0x1b,
+ 0x22, 0x28, 0x2c, 0x33, 0x39, 0x40, 0x46, 0x4d, 0x52, 0x56, 0x5c, 0x61,
+ 0x68, 0x6d, 0x73, 0x73, 0x71, 0x71, 0x71, 0x70, 0x70, 0x6f, 0x6f, 0x6f,
+ 0x6f, 0x6d, 0x6e, 0x79, 0x80, 0x44, 0x55, 0x17, 0x13, 0x12, 0x12, 0x11,
+ 0x10, 0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0,
+ 0x1, 0x4, 0xb, 0x10, 0x16, 0x1d, 0x24, 0x29, 0x31, 0x39, 0x3d, 0x40, 0x0,
+ 0xe, 0x16, 0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3e, 0x43, 0x47, 0x50,
+ 0x55, 0x59, 0x62, 0x69, 0x6e, 0x75, 0x7c, 0xff, 0x7d, 0x7c, 0x79, 0x73,
+ 0x6d, 0x68, 0x60, 0x5a, 0x57, 0x56, 0x5d, 0x8, 0x44, 0x55, 0x0, 0x7, 0xb,
+ 0xd, 0x10, 0x12, 0x16, 0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1c, 0x1e,
+ 0x20, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2b, 0x30, 0x32, 0x33, 0x35, 0x38,
+ 0x39, 0x3b, 0x3d, 0x3f, 0x3e, 0x29, 0x1f, 0x18, 0xf, 0x7, 0x6, 0xc, 0x12,
+ 0x1d, 0x25, 0x2d, 0x36, 0x3e, 0x3b, 0x35, 0x2c, 0x26, 0x20, 0x19, 0x11, 0xa,
+ 0x3, 0x3, 0x9, 0x10, 0x18, 0x24, 0x2c, 0x33, 0x3a, 0x3e, 0x60, 0x9b, 0x32,
+ 0x55, 0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,
+ 0x19, 0x1b, 0x1c, 0x1d, 0x1c, 0x1c, 0x1d, 0x1f, 0x22, 0x25, 0x2a, 0x31,
+ 0x33, 0x35, 0x37, 0x38, 0x39, 0x3c, 0x40, 0x0, 0x12, 0x1c, 0x24, 0x2b, 0x34,
+ 0x3c, 0x39, 0x2f, 0x29, 0x21, 0x16, 0xf, 0xd, 0x14, 0x1e, 0x2a, 0x33, 0x31,
+ 0x27, 0x20, 0x18, 0x10, 0x7, 0xa, 0x10, 0x1a, 0x26, 0x2f, 0x37, 0x3d, 0x3f,
+ 0xfb, 0x8f, 0x32, 0x55, 0x2, 0x2, 0x2, 0x3, 0x3, 0x2, 0x4, 0xd, 0x14, 0x1b,
+ 0x22, 0x2a, 0x31, 0x37, 0x3b, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3d, 0x3e,
+ 0x3e, 0x37, 0x31, 0x2a, 0x23, 0x19, 0x12, 0xa, 0x3, 0x0, 0x8, 0x18, 0x21,
+ 0x2b, 0x32, 0x38, 0x3d, 0x40, 0x41, 0x43, 0x44, 0x45, 0x45, 0x45, 0x42,
+ 0x38, 0x31, 0x28, 0x21, 0x15, 0xc, 0x5, 0x0, 0x0, 0x1, 0x1, 0x2, 0x4, 0x5,
+ 0x6, 0x7, 0x8, 0x27, 0x90, 0xff, 0x55, 0x0, 0x16, 0x22, 0x2c, 0x37, 0x3e,
+ 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3f, 0x3f, 0x3d, 0x33, 0x2a, 0x1e,
+ 0x15, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x62,
+ 0x62, 0x62, 0x62, 0x62, 0x60, 0x58, 0x4c, 0x41, 0x36, 0x2b, 0x1f, 0x13, 0x9,
+ 0x0, 0x1, 0x1, 0x3, 0x4, 0x5, 0x7, 0x10, 0x1b, 0x23, 0x2e, 0x39, 0x41, 0x4d,
+ 0x57, 0x63, 0x6d, 0x71, 0xb0, 0x7d, 0xff, 0x55, 0x3f, 0x3f, 0x3e, 0x3e,
+ 0x3f, 0x3f, 0x3f, 0x39, 0x31, 0x2a, 0x23, 0x1a, 0x13, 0xd, 0x8, 0x7, 0x6,
+ 0x4, 0x3, 0x2, 0x1, 0x0, 0x2, 0x7, 0x11, 0x17, 0x1d, 0x24, 0x2b, 0x33, 0x39,
+ 0x3d, 0x38, 0x26, 0x1e, 0x17, 0x10, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2,
+ 0x2, 0x6, 0xe, 0x15, 0x1c, 0x25, 0x2c, 0x34, 0x3a, 0x3f, 0x3e, 0x3e, 0x3e,
+ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x85, 0xdb, 0xff, 0x55, 0x40, 0x2d,
+ 0x25, 0x1c, 0x15, 0xc, 0x6, 0x5, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x2, 0x8,
+ 0xf, 0x18, 0x21, 0x2c, 0x33, 0x3c, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
+ 0x3c, 0x3d, 0x3e, 0x5, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4, 0xb, 0x13, 0x1e, 0x26,
+ 0x30, 0x38, 0x40, 0x45, 0x45, 0x45, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x49,
+ 0x3f, 0x36, 0x2a, 0x23, 0x19, 0x13, 0xa, 0x3, 0x0, 0xc5, 0x68, 0xff, 0x55,
+ 0x4, 0x17, 0x20, 0x29, 0x31, 0x3a, 0x3e, 0x3c, 0x3c, 0x3d, 0x3d, 0x3e, 0x3e,
+ 0x3e, 0x3d, 0x37, 0x2d, 0x23, 0x1b, 0x10, 0x9, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x3, 0x3, 0x1, 0x1, 0x0, 0x4, 0xc, 0x14, 0x1b,
+ 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x47, 0x3f, 0x36, 0x2e, 0x26, 0x1d, 0x13, 0xb, 0x4, 0x1, 0xcb, 0xef, 0xff,
+ 0x55, 0x3a, 0x3b, 0x3c, 0x3d, 0x3d, 0x3e, 0x3c, 0x37, 0x2e, 0x25, 0x1e,
+ 0x16, 0xe, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0xc, 0x14,
+ 0x1d, 0x27, 0x2e, 0x36, 0x3c, 0x40, 0xb, 0x1d, 0x28, 0x33, 0x3c, 0x45, 0x4f,
+ 0x52, 0x54, 0x55, 0x56, 0x56, 0x56, 0x56, 0x52, 0x48, 0x41, 0x37, 0x2c,
+ 0x23, 0x18, 0xf, 0x7, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d,
+ 0x9, 0xff, 0x55, 0x38, 0x25, 0x1b, 0x15, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x1,
+ 0x1, 0x1, 0x1, 0x1, 0x7, 0xf, 0x1a, 0x21, 0x2a, 0x30, 0x38, 0x3e, 0x3d,
+ 0x3d, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x43, 0x45, 0x46,
+ 0x47, 0x49, 0x46, 0x40, 0x38, 0x30, 0x26, 0x1e, 0x16, 0xf, 0x6, 0x5, 0x4,
+ 0x3, 0x3, 0x2, 0x2, 0x0, 0x1, 0x8, 0x10, 0x19, 0x21, 0x2a, 0x31, 0x3b, 0x41,
+ 0x45, 0x97, 0x8c, 0xff, 0x55, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
+ 0x7, 0xf, 0x18, 0x22, 0x2a, 0x33, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3e, 0x3e,
+ 0x3f, 0x3e, 0x36, 0x2e, 0x25, 0x1f, 0x17, 0xd, 0x5, 0x2, 0x50, 0x3c, 0x34,
+ 0x2b, 0x22, 0x19, 0x12, 0x9, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x0, 0x0, 0x5,
+ 0xd, 0x17, 0x22, 0x2b, 0x33, 0x3c, 0x43, 0x45, 0x47, 0x48, 0x48, 0x49, 0x49,
+ 0x4a, 0x4b, 0xa3, 0x50, 0xff, 0x55, 0x15, 0xf, 0xb, 0x9, 0x7, 0x5, 0x4, 0x2,
+ 0x0, 0x3, 0x8, 0xe, 0x13, 0x19, 0x1f, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3e,
+ 0x3d, 0x38, 0x33, 0x2d, 0x28, 0x24, 0x1f, 0x1c, 0x17, 0x13, 0x11, 0x7, 0x12,
+ 0x1a, 0x1f, 0x24, 0x2b, 0x30, 0x36, 0x3c, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c,
+ 0x3a, 0x3a, 0x39, 0x39, 0x38, 0x37, 0x35, 0x30, 0x29, 0x22, 0x1b, 0x16,
+ 0x11, 0xd, 0x9, 0x4, 0x1, 0x0, 0x62, 0x83, 0xff, 0x55, 0x1, 0xd, 0x13, 0x1a,
+ 0x21, 0x28, 0x2e, 0x35, 0x3b, 0x3f, 0x3c, 0x39, 0x35, 0x30, 0x2c, 0x27,
+ 0x22, 0x1e, 0x1c, 0x18, 0x13, 0x10, 0xd, 0xa, 0x8, 0x6, 0x5, 0x3, 0x2, 0x1,
+ 0x0, 0x0, 0x46, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41, 0x40, 0x40, 0x3d, 0x39,
+ 0x32, 0x2b, 0x24, 0x1f, 0x19, 0x12, 0xc, 0x7, 0x1, 0x4, 0xb, 0x12, 0x17,
+ 0x1f, 0x25, 0x2b, 0x31, 0x38, 0x3f, 0x44, 0x47, 0x95, 0x9c, 0xff, 0x55, 0x4,
+ 0x9, 0xc, 0x10, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x2e,
+ 0x30, 0x33, 0x35, 0x38, 0x3a, 0x3d, 0x3e, 0x3f, 0x3e, 0x37, 0x31, 0x29,
+ 0x20, 0x18, 0x10, 0x9, 0x3, 0x0, 0x54, 0x45, 0x3e, 0x35, 0x2d, 0x25, 0x1d,
+ 0x13, 0xb, 0x5, 0x3, 0xa, 0x12, 0x19, 0x1f, 0x27, 0x2e, 0x35, 0x3c, 0x44,
+ 0x4c, 0x52, 0x58, 0x5b, 0x5c, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x57, 0x57,
+ 0x2b, 0xc6, 0xff, 0x55, 0x19, 0x1d, 0x21, 0x26, 0x28, 0x2d, 0x32, 0x36,
+ 0x3a, 0x3d, 0x3e, 0x3e, 0x36, 0x31, 0x29, 0x21, 0x1b, 0x14, 0xe, 0x9, 0x3,
+ 0x1, 0x4, 0x7, 0xb, 0xe, 0x12, 0x16, 0x19, 0x1c, 0x1f, 0x20, 0x0, 0xb, 0x13,
+ 0x1b, 0x21, 0x28, 0x31, 0x38, 0x40, 0x46, 0x4b, 0x4f, 0x50, 0x50, 0x4f,
+ 0x4d, 0x4c, 0x4c, 0x4b, 0x4a, 0x4a, 0x46, 0x40, 0x39, 0x31, 0x2a, 0x23,
+ 0x1b, 0x15, 0xf, 0xa, 0x7, 0xb3, 0x46, 0xff, 0x55, 0x40, 0x2c, 0x23, 0x1b,
+ 0x12, 0xc, 0x5, 0x0, 0x3, 0x6, 0xa, 0xc, 0x10, 0x15, 0x19, 0x1c, 0x1f, 0x21,
+ 0x23, 0x28, 0x2a, 0x2c, 0x2f, 0x31, 0x33, 0x35, 0x37, 0x38, 0x39, 0x3b,
+ 0x3c, 0x3e, 0x5f, 0x5f, 0x60, 0x60, 0x5f, 0x5f, 0x5f, 0x5c, 0x54, 0x4e,
+ 0x44, 0x3e, 0x37, 0x2b, 0x22, 0x1b, 0x12, 0xb, 0x3, 0x4, 0xb, 0x12, 0x1e,
+ 0x27, 0x30, 0x3a, 0x43, 0x4b, 0x53, 0x59, 0x60, 0x64, 0x1f, 0xdb, 0xff,
+ 0x55, 0x1b, 0x14, 0x11, 0xf, 0xc, 0xa, 0x7, 0x5, 0x3, 0x0, 0x2, 0x7, 0xc,
+ 0x12, 0x17, 0x1e, 0x25, 0x2a, 0x30, 0x36, 0x3c, 0x40, 0x3e, 0x3b, 0x3a,
+ 0x37, 0x35, 0x30, 0x2c, 0x27, 0x23, 0x20, 0x0, 0xc, 0x14, 0x19, 0x1f, 0x24,
+ 0x2b, 0x31, 0x36, 0x3c, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3b, 0x3b,
+ 0x3a, 0x3a, 0x3a, 0x35, 0x2d, 0x25, 0x21, 0x1b, 0x15, 0xd, 0x8, 0x4, 0x1,
+ 0x0, 0x72, 0x5e, 0xff, 0x55, 0x19, 0x13, 0x11, 0xf, 0xc, 0xa, 0x7, 0x5, 0x3,
+ 0x0, 0x3, 0x8, 0x10, 0x15, 0x1a, 0x21, 0x26, 0x2c, 0x31, 0x37, 0x3d, 0x3c,
+ 0x38, 0x34, 0x31, 0x2c, 0x28, 0x23, 0x20, 0x1d, 0x19, 0x17, 0x0, 0xb, 0x12,
+ 0x18, 0x1e, 0x23, 0x28, 0x2d, 0x33, 0x3a, 0x3e, 0x3e, 0x3f, 0x3f, 0x40,
+ 0x40, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3b, 0x36, 0x2f, 0x2a, 0x23, 0x1d,
+ 0x16, 0x12, 0xc, 0x7, 0x4, 0x99, 0x97, 0xff, 0x55, 0x1b, 0x14, 0x12, 0xf,
+ 0xd, 0x9, 0x6, 0x3, 0x0, 0x6, 0xc, 0x12, 0x17, 0x1e, 0x24, 0x29, 0x2e, 0x34,
+ 0x3c, 0x3f, 0x3d, 0x3b, 0x38, 0x35, 0x31, 0x2e, 0x29, 0x25, 0x21, 0x1d,
+ 0x19, 0x15, 0x0, 0xd, 0x14, 0x1c, 0x23, 0x2c, 0x32, 0x3a, 0x3f, 0x3e, 0x3e,
+ 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x3a, 0x34, 0x30, 0x29,
+ 0x25, 0x1e, 0x18, 0x12, 0xe, 0x8, 0x4, 0x1, 0x1, 0x11, 0x7d, 0xff, 0x55,
+ 0x1e, 0x15, 0x12, 0x10, 0xc, 0x9, 0x7, 0x4, 0x2, 0x0, 0x3, 0x8, 0xe, 0x15,
+ 0x1b, 0x22, 0x28, 0x2e, 0x33, 0x39, 0x3f, 0x3f, 0x3d, 0x39, 0x36, 0x2f,
+ 0x2b, 0x28, 0x23, 0x1f, 0x1b, 0x18, 0x0, 0xb, 0x13, 0x18, 0x20, 0x26, 0x2c,
+ 0x33, 0x39, 0x3f, 0x41, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41,
+ 0x40, 0x3c, 0x37, 0x33, 0x2a, 0x24, 0x1c, 0x15, 0x10, 0xa, 0x6, 0x1, 0x0,
+ 0x33, 0xd1, 0xff, 0x55, 0x1d, 0x15, 0x12, 0xe, 0xc, 0x9, 0x7, 0x4, 0x2, 0x0,
+ 0x3, 0x8, 0xe, 0x14, 0x19, 0x1e, 0x23, 0x29, 0x2e, 0x34, 0x3b, 0x3e, 0x3f,
+ 0x3e, 0x3b, 0x38, 0x35, 0x31, 0x2c, 0x27, 0x22, 0x1f, 0x6, 0x12, 0x17, 0x1e,
+ 0x24, 0x29, 0x2e, 0x34, 0x39, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d,
+ 0x3c, 0x3c, 0x3b, 0x3a, 0x37, 0x33, 0x2d, 0x28, 0x20, 0x1b, 0x15, 0x10, 0x9,
+ 0x3, 0x0, 0x0, 0xa4, 0xaf, 0xff, 0x55, 0x2c, 0x23, 0x1f, 0x19, 0x13, 0xc,
+ 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16, 0x1d, 0x23, 0x2a, 0x30,
+ 0x36, 0x3b, 0x3e, 0x40, 0x3f, 0x3e, 0x3b, 0x38, 0x33, 0x2f, 0x2b, 0x28, 0x9,
+ 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14, 0x1b, 0x21, 0x27, 0x2e, 0x36, 0x3b,
+ 0x3e, 0x41, 0x41, 0x40, 0x3d, 0x3a, 0x36, 0x2f, 0x2b, 0x26, 0x20, 0x1c,
+ 0x16, 0x10, 0xc, 0xa, 0x9, 0xb, 0x36, 0xdc, 0x30, 0x55, 0x1a, 0x9, 0x5, 0x1,
+ 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, 0xf, 0x16, 0x1c, 0x22, 0x2a, 0x31, 0x36, 0x39,
+ 0x3c, 0x3e, 0x3f, 0x3f, 0x3d, 0x38, 0x30, 0x27, 0x1f, 0x18, 0x12, 0xb, 0x6,
+ 0x5, 0x7, 0x12, 0x19, 0x22, 0x2c, 0x36, 0x3f, 0x49, 0x53, 0x5c, 0x63, 0x66,
+ 0x64, 0x5f, 0x58, 0x4c, 0x43, 0x3d, 0x34, 0x2b, 0x22, 0x1b, 0x15, 0xb, 0x4,
+ 0x0, 0x0, 0x1, 0x4, 0xb, 0x13, 0x18, 0xf1, 0xc, 0x30, 0x55, 0x18, 0x2c,
+ 0x34, 0x39, 0x3c, 0x3d, 0x3f, 0x3f, 0x3f, 0x3d, 0x3b, 0x36, 0x30, 0x2a,
+ 0x24, 0x1c, 0x16, 0xd, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9,
+ 0xf, 0x17, 0x1e, 0x24, 0x1, 0x2, 0x8, 0xe, 0x14, 0x1a, 0x21, 0x28, 0x30,
+ 0x37, 0x40, 0x49, 0x50, 0x55, 0x59, 0x5c, 0x5c, 0x58, 0x51, 0x48, 0x3f,
+ 0x38, 0x31, 0x2b, 0x25, 0x1d, 0x17, 0x11, 0xa, 0x4, 0x1, 0x1, 0x9d, 0xbf,
+ 0x30, 0x55, 0x16, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,
+ 0x1f, 0x28, 0x30, 0x38, 0x3c, 0x3e, 0x3f, 0x40, 0x3f, 0x3f, 0x3d, 0x3b,
+ 0x37, 0x32, 0x2c, 0x25, 0x1d, 0x16, 0xf, 0xc, 0x53, 0x46, 0x3e, 0x35, 0x2e,
+ 0x27, 0x20, 0x1a, 0x14, 0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13, 0x1a, 0x20,
+ 0x27, 0x2d, 0x33, 0x3a, 0x40, 0x48, 0x4f, 0x54, 0x58, 0x5a, 0x5a, 0x58,
+ 0x57, 0xc6, 0x55, 0x30, 0x55, 0x7, 0x1, 0x4, 0xa, 0x10, 0x18, 0x20, 0x2a,
+ 0x32, 0x38, 0x3c, 0x3e, 0x3f, 0x3e, 0x3d, 0x3b, 0x39, 0x35, 0x30, 0x27,
+ 0x21, 0x19, 0x12, 0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x1d,
+ 0x12, 0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, 0x20, 0x2a, 0x32, 0x3b,
+ 0x45, 0x4e, 0x58, 0x63, 0x69, 0x6b, 0x6a, 0x64, 0x5d, 0x57, 0x4f, 0x47,
+ 0x40, 0x38, 0x32, 0x2f, 0x1a, 0xb5, 0x30, 0x55, 0x21, 0x13, 0xc, 0x8, 0x5,
+ 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17, 0x1e, 0x24, 0x2b, 0x32, 0x39,
+ 0x3d, 0x3e, 0x3f, 0x3f, 0x3d, 0x3a, 0x36, 0x30, 0x29, 0x21, 0x1a, 0x16,
+ 0x13, 0x5, 0x9, 0xe, 0x14, 0x1a, 0x22, 0x29, 0x30, 0x38, 0x3f, 0x47, 0x4d,
+ 0x51, 0x51, 0x4f, 0x4d, 0x49, 0x42, 0x39, 0x31, 0x2b, 0x25, 0x1e, 0x17,
+ 0x10, 0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf, 0x13, 0x30, 0x55, 0x38, 0x3f,
+ 0x3d, 0x3a, 0x36, 0x2e, 0x26, 0x1f, 0x14, 0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1,
+ 0x2, 0x5, 0x9, 0xe, 0x14, 0x1c, 0x23, 0x2a, 0x34, 0x38, 0x3a, 0x3b, 0x3d,
+ 0x3d, 0x3d, 0x3d, 0x29, 0x1a, 0x10, 0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,
+ 0x1c, 0x22, 0x28, 0x2f, 0x37, 0x3f, 0x47, 0x4f, 0x56, 0x5a, 0x5b, 0x59,
+ 0x56, 0x4e, 0x47, 0x40, 0x37, 0x30, 0x28, 0x22, 0x1f, 0x2a, 0xa9, 0x30,
+ 0x55, 0x3e, 0x3b, 0x38, 0x33, 0x2b, 0x24, 0x1d, 0x16, 0x10, 0x7, 0x3, 0x1,
+ 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15, 0x1c, 0x23, 0x29, 0x2f, 0x35,
+ 0x38, 0x3b, 0x3c, 0x3e, 0x3f, 0x3f, 0x1f, 0x10, 0xa, 0x6, 0x0, 0x0, 0x0,
+ 0x2, 0x4, 0xc, 0x12, 0x18, 0x1e, 0x25, 0x2c, 0x35, 0x3c, 0x42, 0x4a, 0x51,
+ 0x56, 0x56, 0x53, 0x4e, 0x49, 0x40, 0x3a, 0x33, 0x2c, 0x25, 0x1f, 0x1c,
+ 0xf9, 0xa2, 0x30, 0x55, 0x1f, 0x2b, 0x31, 0x35, 0x38, 0x3b, 0x3e, 0x3f,
+ 0x3f, 0x3d, 0x3a, 0x34, 0x2d, 0x27, 0x23, 0x1d, 0x17, 0x10, 0x9, 0x4, 0x1,
+ 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15, 0x1b, 0x20, 0x23, 0x45, 0x42, 0x3e,
+ 0x38, 0x34, 0x2d, 0x24, 0x1c, 0x15, 0x11, 0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1,
+ 0x3, 0x7, 0xd, 0x12, 0x18, 0x20, 0x28, 0x30, 0x36, 0x3c, 0x42, 0x47, 0x48,
+ 0x49, 0x4a, 0x65, 0x9d, 0x30, 0x55, 0x1c, 0x2a, 0x33, 0x39, 0x3c, 0x3e,
+ 0x3f, 0x3f, 0x3e, 0x3d, 0x3a, 0x35, 0x2e, 0x28, 0x23, 0x1c, 0x15, 0xf, 0x9,
+ 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13, 0x19, 0x1e, 0x22, 0x40,
+ 0x3e, 0x3a, 0x33, 0x2f, 0x29, 0x22, 0x1b, 0x15, 0x10, 0xa, 0x5, 0x1, 0x0,
+ 0x0, 0x1, 0x2, 0x5, 0xa, 0x11, 0x17, 0x1c, 0x24, 0x2a, 0x30, 0x35, 0x3b,
+ 0x40, 0x43, 0x44, 0x45, 0x45, 0xcb, 0xc6, 0x30, 0x55, 0x5, 0x3, 0x4, 0x7,
+ 0xa, 0x10, 0x17, 0x21, 0x28, 0x2e, 0x33, 0x38, 0x3c, 0x3e, 0x3f, 0x3f, 0x3e,
+ 0x3b, 0x38, 0x31, 0x29, 0x21, 0x18, 0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x26, 0x35, 0x3d, 0x45, 0x4b, 0x51, 0x53, 0x52, 0x4f, 0x4c, 0x46, 0x41,
+ 0x3b, 0x34, 0x2e, 0x25, 0x1e, 0x17, 0x11, 0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc,
+ 0x12, 0x18, 0x1e, 0x24, 0x2c, 0x31, 0xf4, 0xb6, 0x30, 0x55, 0xa, 0x5, 0x5,
+ 0x5, 0x8, 0xf, 0x16, 0x20, 0x29, 0x31, 0x36, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f,
+ 0x3e, 0x3c, 0x3a, 0x33, 0x2d, 0x24, 0x1c, 0x14, 0xf, 0x8, 0x4, 0x0, 0x0,
+ 0x0, 0x1, 0x2, 0x35, 0x46, 0x4e, 0x56, 0x5d, 0x65, 0x68, 0x66, 0x60, 0x57,
+ 0x4f, 0x47, 0x3f, 0x37, 0x2e, 0x25, 0x1e, 0x16, 0x10, 0x6, 0x2, 0x0, 0x1,
+ 0x5, 0xb, 0x15, 0x1d, 0x28, 0x2f, 0x39, 0x41, 0x45, 0xf0, 0xbc, 0x30, 0x55,
+ 0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17, 0x20, 0x28, 0x30, 0x36, 0x3b, 0x3d,
+ 0x3f, 0x3f, 0x3d, 0x39, 0x36, 0x2d, 0x25, 0x1d, 0x16, 0xd, 0x8, 0x2, 0x0,
+ 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e, 0x3f, 0x48, 0x50, 0x59, 0x5f, 0x67, 0x68,
+ 0x63, 0x5d, 0x52, 0x4a, 0x3e, 0x35, 0x2b, 0x20, 0x18, 0x10, 0xa, 0x3, 0x0,
+ 0x0, 0x1, 0x7, 0xe, 0x19, 0x22, 0x2b, 0x31, 0x3a, 0x42, 0x47, 0xef, 0xc9,
+ 0x30, 0x55, 0x3b, 0x3c, 0x3c, 0x3b, 0x39, 0x36, 0x2f, 0x27, 0x21, 0x19,
+ 0x11, 0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, 0x16, 0x1f,
+ 0x26, 0x2d, 0x33, 0x39, 0x3c, 0x3e, 0x3f, 0x3f, 0x22, 0x31, 0x3b, 0x41,
+ 0x47, 0x4d, 0x56, 0x59, 0x5a, 0x58, 0x55, 0x51, 0x4b, 0x43, 0x3d, 0x35,
+ 0x29, 0x20, 0x18, 0x11, 0x9, 0x3, 0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15, 0x1b,
+ 0x21, 0x26, 0x2b, 0xa0, 0x30, 0x55, 0x37, 0x38, 0x37, 0x34, 0x2d, 0x26,
+ 0x1c, 0x16, 0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,
+ 0x17, 0x20, 0x26, 0x2e, 0x35, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e,
+ 0x30, 0x40, 0x49, 0x50, 0x59, 0x5e, 0x60, 0x5d, 0x56, 0x50, 0x47, 0x41,
+ 0x39, 0x33, 0x2a, 0x20, 0x1a, 0x10, 0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,
+ 0x17, 0x1f, 0x25, 0x2f, 0x38, 0x3c, 0x37, 0xc3, 0x30, 0x55, 0x3b, 0x3d,
+ 0x3d, 0x3b, 0x38, 0x32, 0x27, 0x1c, 0x13, 0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1,
+ 0x3, 0x7, 0xb, 0x12, 0x18, 0x20, 0x28, 0x31, 0x39, 0x3d, 0x3f, 0x40, 0x3f,
+ 0x3f, 0x3e, 0x3e, 0x33, 0x45, 0x4e, 0x57, 0x5d, 0x65, 0x6c, 0x6a, 0x66,
+ 0x63, 0x5c, 0x53, 0x4a, 0x40, 0x38, 0x2e, 0x25, 0x1a, 0x11, 0x8, 0x4, 0x0,
+ 0x0, 0x2, 0x9, 0x10, 0x19, 0x21, 0x2a, 0x32, 0x39, 0x3e, 0x7, 0x90, 0x30,
+ 0x55, 0x39, 0x2b, 0x24, 0x1c, 0x15, 0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10,
+ 0x19, 0x22, 0x27, 0x2e, 0x35, 0x3b, 0x3e, 0x3f, 0x3d, 0x38, 0x32, 0x2c,
+ 0x26, 0x1f, 0x19, 0x13, 0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb,
+ 0x11, 0x17, 0x1d, 0x24, 0x2a, 0x2f, 0x32, 0x34, 0x35, 0x36, 0x37, 0x3b,
+ 0x41, 0x47, 0x4e, 0x56, 0x5d, 0x61, 0x64, 0x65, 0x65, 0x63, 0x60, 0x5c,
+ 0x57, 0x54, 0xd1, 0x4a, 0x46, 0x55, 0x0, 0x1, 0x3, 0x5, 0x7, 0x8, 0xa, 0xb,
+ 0xc, 0xe, 0xf, 0x11, 0x12, 0x14, 0x16, 0x1a, 0x1e, 0x22, 0x24, 0x27, 0x2a,
+ 0x2c, 0x2e, 0x31, 0x33, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x1, 0xe,
+ 0x14, 0x1b, 0x23, 0x28, 0x2e, 0x35, 0x3a, 0x40, 0x48, 0x4f, 0x56, 0x5d,
+ 0x62, 0x61, 0x5a, 0x53, 0x4e, 0x47, 0x40, 0x3b, 0x35, 0x2d, 0x29, 0x22,
+ 0x1b, 0x17, 0x10, 0x9, 0x5, 0x1, 0x6d, 0x7d, 0x54, 0x55, 0x40, 0x39, 0x38,
+ 0x36, 0x35, 0x33, 0x31, 0x2e, 0x2c, 0x2b, 0x29, 0x27, 0x25, 0x24, 0x22,
+ 0x1f, 0x1d, 0x1a, 0x18, 0x15, 0x14, 0x12, 0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1,
+ 0x0, 0x0, 0x0, 0x0, 0xd, 0x15, 0x1d, 0x23, 0x2a, 0x32, 0x3b, 0x43, 0x48,
+ 0x50, 0x57, 0x5d, 0x63, 0x68, 0x65, 0x5e, 0x58, 0x51, 0x4a, 0x45, 0x3f,
+ 0x38, 0x32, 0x2b, 0x26, 0x1f, 0x16, 0x10, 0x8, 0x4, 0x1, 0x6a, 0xec, 0x54,
+ 0x55, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4, 0x5,
+ 0x7, 0x9, 0xd, 0x10, 0x13, 0x18, 0x1f, 0x24, 0x27, 0x2b, 0x2e, 0x31, 0x34,
+ 0x36, 0x39, 0x3c, 0x3e, 0x40, 0x0, 0x7, 0xf, 0x13, 0x16, 0x1a, 0x1e, 0x22,
+ 0x25, 0x28, 0x2f, 0x36, 0x3b, 0x3f, 0x43, 0x47, 0x4b, 0x4c, 0x4c, 0x4c,
+ 0x49, 0x46, 0x43, 0x3f, 0x3a, 0x35, 0x32, 0x2d, 0x27, 0x21, 0x1d, 0x1a,
+ 0xb5, 0xd0, 0x54, 0x55, 0x0, 0x1, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x9,
+ 0xf, 0x16, 0x1d, 0x22, 0x28, 0x2d, 0x30, 0x32, 0x34, 0x37, 0x39, 0x3a, 0x3c,
+ 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x3e, 0x3e, 0x3c, 0x3a, 0x22, 0x2e, 0x36,
+ 0x3f, 0x46, 0x4c, 0x51, 0x56, 0x5b, 0x5e, 0x60, 0x5e, 0x5c, 0x58, 0x53,
+ 0x4d, 0x49, 0x45, 0x41, 0x3a, 0x35, 0x31, 0x2d, 0x27, 0x23, 0x1f, 0x19,
+ 0x11, 0xd, 0x8, 0x3, 0x0, 0x3b, 0x38, 0x54, 0x55, 0x0, 0x2, 0x3, 0x5, 0x6,
+ 0x8, 0xb, 0x10, 0x13, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1f, 0x21, 0x22, 0x22,
+ 0x22, 0x22, 0x23, 0x25, 0x28, 0x2e, 0x31, 0x34, 0x36, 0x38, 0x3a, 0x3c,
+ 0x3e, 0x3f, 0x6, 0x17, 0x20, 0x27, 0x30, 0x38, 0x3e, 0x39, 0x32, 0x2b, 0x25,
+ 0x1e, 0x18, 0x10, 0x9, 0x9, 0x10, 0x18, 0x1f, 0x26, 0x2f, 0x36, 0x3c, 0x38,
+ 0x2f, 0x27, 0x1f, 0x18, 0xf, 0x8, 0x1, 0x2, 0xc7, 0x75, 0x31, 0x55, 0x0,
+ 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12, 0x15, 0x17, 0x18, 0x1a, 0x1b,
+ 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x22, 0x27, 0x2e, 0x35, 0x38, 0x3b, 0x3d,
+ 0x3e, 0x3f, 0x40, 0x3f, 0x3e, 0x6, 0x15, 0x1b, 0x23, 0x29, 0x2f, 0x37, 0x3c,
+ 0x37, 0x2e, 0x27, 0x20, 0x1a, 0x13, 0xe, 0x14, 0x1a, 0x21, 0x27, 0x2f, 0x38,
+ 0x3f, 0x3d, 0x35, 0x2e, 0x26, 0x20, 0x18, 0x11, 0xb, 0x3, 0x0, 0x67, 0x3f,
+ 0x31, 0x55, 0x10, 0x78, 0xc2, 0xd5, 0x7c, 0xb4, 0x30, 0xe7, 0x8, 0xb2, 0xd5,
+ 0x6e, 0x24, 0xff, 0xff, 0xb, 0x24, 0x7c, 0xb6, 0x30, 0xe7, 0x12, 0xb2, 0xd5,
+ 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x8d, 0x32, 0x6e, 0x24, 0xff, 0xff, 0xb,
+ 0x24, 0x80, 0x2, 0x8d, 0x32, 0x30, 0xd5, 0x6, 0x6e, 0x34, 0xff, 0xff, 0xb,
+ 0x34, 0x22, 0x7d, 0x51, 0xad, 0x3, 0x7d, 0x2, 0x7d, 0x21, 0xad, 0x5, 0x2d,
+ 0x12, 0xad, 0x35, 0x2d, 0x21, 0x22, 0x7d, 0x2, 0xad, 0x31, 0xad, 0x10, 0x2d,
+ 0x21, 0x22, 0x6d, 0x0, 0x74, 0x10, 0x4d, 0x0, 0x78, 0xb, 0x4d, 0x22, 0x78,
+ 0x27, 0x8d, 0x31, 0x7d, 0x12, 0x6d, 0x22, 0x22, 0x7d, 0x43, 0x7d, 0x32,
+ 0x6d, 0x22, 0x2f, 0x11, 0x2d, 0x44, 0x50, 0x2, 0xa5, 0xf, 0xbf, 0x10, 0x40,
+ 0x4, 0x9f, 0x10, 0xb, 0x90, 0x14, 0x78, 0xed, 0x7f, 0x1, 0x6d, 0x22, 0x7d,
+ 0x34, 0x22, 0x7d, 0x41, 0x7d, 0x13, 0x8d, 0x24, 0x7d, 0x2, 0x2f, 0x0, 0x40,
+ 0x4, 0xbd, 0x4, 0x40, 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14, 0x78, 0xf1, 0x7d,
+ 0x23, 0x7d, 0x31, 0x7d, 0x10, 0x6d, 0x0, 0x22, 0xc2, 0xd5, 0x7c, 0xb0, 0x30,
+ 0xe7, 0x8, 0xb2, 0xd5, 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x7c, 0xb4, 0x30,
+ 0xe7, 0x13, 0xb2, 0xd5, 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x12, 0x2a,
+ 0x3c, 0x9f, 0x22, 0x9f, 0x20, 0x7f, 0x2, 0x80, 0x3, 0x12, 0x2a, 0x3c, 0x30,
+ 0xd5, 0x6, 0x9f, 0x22, 0x9f, 0x21, 0x7f, 0x12, 0x22, 0x6c, 0xaa, 0x4d, 0x11,
+ 0x68, 0x1a, 0x1e, 0x54, 0x68, 0xe, 0xb, 0x38, 0x20, 0x1b, 0x18, 0x20, 0xb,
+ 0x35, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2, 0x50, 0x6, 0x7e, 0x39, 0x40, 0x7a,
+ 0x19, 0x40, 0x22, 0x6c, 0xaa, 0x4d, 0x11, 0x68, 0x1e, 0x1e, 0x54, 0x50, 0xc,
+ 0x7e, 0x1b, 0x0, 0x7a, 0x19, 0x0, 0x68, 0x12, 0xb, 0x1c, 0xb, 0x14, 0xb,
+ 0x1a, 0x0, 0x1b, 0x18, 0x0, 0xb, 0x1d, 0xb, 0x15, 0x1b, 0x54, 0x78, 0xf2,
+ 0x22, 0xca, 0xf8, 0x7f, 0x20, 0x80, 0xa, 0x7e, 0x1b, 0xf0, 0x7a, 0x2b, 0xf0,
+ 0xb, 0x34, 0xb, 0x54, 0x69, 0xff, 0xff, 0xfc, 0x7d, 0xef, 0x1b, 0xe4, 0x79,
+ 0xef, 0xff, 0xfc, 0x4d, 0xff, 0x78, 0xe6, 0x7f, 0x10, 0xda, 0xf8, 0x22,
+ 0x7d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x48, 0x3, 0x7d, 0x32, 0x22, 0x6d, 0x33,
+ 0x9d, 0x32, 0x22, 0x0, 0x1, 0x39, 0xa4, 0x3, 0x0, 0x1, 0x39, 0xa6, 0x0, 0x0,
+ 0x1, 0x39, 0xb0, 0xc, 0x0, 0x1, 0x39, 0xb4, 0x3, 0x0, 0x1, 0x39, 0xb8, 0x0,
+ 0x0, 0x2, 0x39, 0xc4, 0x44, 0x40, 0x0, 0x1, 0x39, 0xcd, 0x0, 0x0, 0x1, 0x39,
+ 0xd4, 0x0, 0x0, 0x1, 0x39, 0xd5, 0x0, 0x0, 0x1, 0x39, 0xec, 0x0, 0x0, 0x2,
+ 0x39, 0xed, 0x0, 0x0, 0x0, 0x1, 0x39, 0xef, 0x1, 0x0, 0x1, 0x39, 0xf0, 0x0,
+ 0x0, 0x1, 0x56, 0xbc, 0x1, 0x0, 0x1, 0x54, 0xc3, 0x0, 0x0, 0x2, 0x54, 0xc4,
+ 0x0, 0x0, 0x0, 0x1, 0x53, 0xec, 0xff, 0x0, 0x2, 0x54, 0x5e, 0x0, 0x0, 0x0,
+ 0x14, 0x3, 0xcc, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
+ 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x14, 0x3, 0xec, 0x3, 0x3, 0x0,
+ 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x1,
+ 0x1, 0x1, 0x0, 0x1, 0x56, 0xbe, 0x0, 0x0, 0x3c, 0x55, 0xb3, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55,
+ 0xef, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x1, 0x1, 0x8d, 0xff, 0x0, 0x1,
+ 0x1, 0xa3, 0x0, 0x0, 0x1, 0x1, 0xa4, 0x0, 0x0, 0xa, 0x2, 0x6f, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x2, 0x79, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x83, 0x0, 0x0, 0x1, 0x56,
+ 0xac, 0x1, 0x0, 0x6, 0x56, 0x9c, 0x3f, 0x1f, 0x50, 0x11, 0x20, 0x10, 0x0,
+ 0x1, 0x56, 0xa2, 0x3e, 0x0, 0x1, 0x55, 0xaf, 0xff, 0x0, 0x1, 0x55, 0xb0,
+ 0xff, 0x0, 0x2, 0x55, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x39, 0xa3, 0x0, 0x0, 0x1,
+ 0x52, 0xf0, 0xff, 0x0, 0x1, 0x52, 0xf1, 0xff, 0x0, 0x1, 0x52, 0xf5, 0x64,
+ 0x0, 0x1, 0x52, 0xf6, 0x0, 0x0, 0x1, 0x55, 0xf6, 0x0, 0x0, 0x2, 0x55, 0xf9,
+ 0x0, 0x21, 0x0, 0x1, 0x55, 0xfd, 0x1, 0x0, 0x1, 0x56, 0x0, 0x4, 0x0, 0x1,
+ 0x56, 0x21, 0x1, 0x0, 0x1, 0x56, 0x24, 0x0, 0x0, 0x2, 0x56, 0x25, 0x0, 0x20,
+ 0x0, 0x1, 0x56, 0x27, 0x0, 0x0, 0x1, 0x56, 0x28, 0x0, 0x0, 0x1, 0x56, 0x2a,
+ 0x0, 0x0, 0x1, 0x56, 0x8d, 0xff, 0x0, 0x2, 0x56, 0x91, 0x0, 0x0, 0x0, 0x1,
+ 0x56, 0x94, 0x0, 0x0, 0x1, 0x56, 0xc1, 0x1, 0x0, 0x1, 0x39, 0xf1, 0x0, 0x0,
+ 0x2, 0x4e, 0x82, 0x4e, 0x88, 0x0, 0x1, 0x52, 0x48, 0x2, 0x0, 0x1, 0x55,
+ 0x2e, 0xff, 0x0, 0x1, 0x55, 0x2f, 0x0, 0x0, 0x1, 0x55, 0x30, 0x0, 0x0, 0x1,
+ 0x55, 0x31, 0x40, 0x0, 0x1, 0x55, 0x32, 0x40, 0x0, 0x2, 0x56, 0xba, 0xc3,
+ 0x0, 0x0, 0x4, 0x56, 0xad, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x4, 0x35, 0xa5, 0x0,
+ 0x0, 0xd0, 0x0, 0x0, 0x4, 0x35, 0xa9, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x4, 0x38,
+ 0x87, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x4, 0x39, 0xfc, 0x0, 0x0, 0xc4, 0x0, 0x0,
+ 0x4, 0x56, 0xb2, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe8, 0x0, 0x51, 0x0,
+ 0x3, 0x3, 0x20, 0x0, 0x50, 0x0, 0x3, 0x2, 0x58, 0x0, 0x4e, 0x0, 0x4, 0x1,
+ 0xc2, 0x0, 0x4b, 0x0, 0x4, 0x1, 0x40, 0x0, 0x47, 0x0, 0x4, 0x0, 0xc8, 0x0,
+ 0x44, 0x0, 0x4, 0x0, 0x78, 0x0, 0x3e, 0x0, 0x5, 0x0, 0x64, 0x0, 0x3c, 0x0,
+ 0x5, 0x1b, 0xb, 0x17, 0xa, 0x10, 0x9, 0x12, 0xf1, 0x11, 0xe4, 0x7a, 0xb3,
+ 0x54, 0x60, 0x7a, 0xb3, 0x54, 0xc3, 0x2, 0x2d, 0xb4, 0x12, 0x5a, 0xa8, 0x74,
+ 0xf, 0x7a, 0xb3, 0x74, 0xa, 0x7a, 0xb3, 0x74, 0xb, 0x22, 0xca, 0x7b, 0xca,
+ 0x6b, 0xca, 0x5b, 0xca, 0x4b, 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0, 0xd0,
+ 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x40, 0x68, 0x5b,
+ 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x40, 0x68, 0x52, 0x7e, 0x34, 0x0, 0x40,
+ 0x79, 0x30, 0x0, 0x2, 0x30, 0x1b, 0x5, 0x12, 0x2f, 0xa5, 0xc2, 0x1b, 0x7e,
+ 0xb3, 0x55, 0xfb, 0xbe, 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x4, 0x13, 0x12, 0x2f,
+ 0xa5, 0x30, 0xf, 0x8, 0x7e, 0x73, 0x55, 0xf4, 0x7a, 0x73, 0x55, 0xf2, 0xe4,
+ 0x7a, 0xb3, 0x55, 0xfb, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x31, 0x0, 0xa, 0x5e,
+ 0x34, 0xf, 0xc0, 0x12, 0x4b, 0x99, 0x1e, 0x34, 0x7a, 0x73, 0x55, 0xf7, 0xe4,
+ 0x7a, 0xb3, 0x56, 0x8d, 0x7e, 0xb3, 0x56, 0xc0, 0x4, 0x7a, 0xb3, 0x56, 0xc0,
+ 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x8, 0x68, 0x11, 0xb, 0xa, 0x30, 0x5e,
+ 0x34, 0x0, 0x8, 0x68, 0x8, 0x7e, 0x34, 0x0, 0x8, 0x79, 0x30, 0x0, 0x2, 0x12,
+ 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x10, 0x68, 0x26, 0xb, 0xa, 0x30, 0x5e, 0x34,
+ 0x0, 0x10, 0x68, 0x1d, 0x7e, 0x34, 0x0, 0x10, 0x79, 0x30, 0x0, 0x2, 0x7e,
+ 0xb3, 0x55, 0xfb, 0xb4, 0x3, 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xfb, 0x12, 0x2f,
+ 0xa5, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x8d, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0,
+ 0x20, 0x68, 0x17, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x20, 0x68, 0xe, 0x7e,
+ 0x34, 0x0, 0x20, 0x79, 0x30, 0x0, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x8d,
+ 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x40, 0x0, 0x68, 0x2e, 0xb, 0xa, 0x30, 0x5e,
+ 0x34, 0x40, 0x0, 0x68, 0x25, 0x7e, 0x34, 0x40, 0x0, 0x79, 0x30, 0x0, 0x2,
+ 0xd2, 0xe, 0x7e, 0xb3, 0x55, 0xf3, 0xbe, 0xb0, 0xc8, 0x50, 0x5, 0x4, 0x7a,
+ 0xb3, 0x55, 0xf3, 0x7e, 0xb3, 0x55, 0xf3, 0xb4, 0x1, 0x3, 0x12, 0x2d, 0xb4,
+ 0x12, 0x7f, 0xc4, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x20, 0x0, 0x68, 0x16, 0xb,
+ 0xa, 0x30, 0x5e, 0x34, 0x20, 0x0, 0x68, 0xd, 0x7e, 0x34, 0x20, 0x0, 0x79,
+ 0x30, 0x0, 0x2, 0xd2, 0xe, 0x12, 0x7f, 0xc4, 0x12, 0x2f, 0x9c, 0x5e, 0x34,
+ 0x10, 0x0, 0x68, 0x66, 0xb, 0xa, 0x30, 0x7d, 0x23, 0x5e, 0x24, 0x10, 0x0,
+ 0x68, 0x5b, 0x5e, 0x34, 0x8, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x92, 0x11, 0x69,
+ 0x30, 0x0, 0x6, 0x7d, 0x23, 0x5e, 0x24, 0x0, 0x1, 0x68, 0xc, 0x5e, 0x34,
+ 0x4, 0x0, 0x2e, 0x34, 0xff, 0xff, 0x72, 0x11, 0x92, 0x11, 0x7e, 0x34, 0x8,
+ 0x0, 0x79, 0x30, 0x0, 0x2, 0x7e, 0xb3, 0x39, 0xd5, 0xb4, 0x1, 0xf, 0x74,
+ 0x2, 0x7a, 0xb3, 0x39, 0xd5, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x5b, 0x91, 0x80,
+ 0x3d, 0xc2, 0x26, 0x12, 0xe1, 0xca, 0x12, 0x6e, 0x12, 0x7e, 0xb3, 0x56,
+ 0xa7, 0xbe, 0xb0, 0x3, 0x68, 0xa, 0x12, 0x5f, 0x78, 0x78, 0x5, 0xc2, 0xa,
+ 0x12, 0x5e, 0x72, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x19, 0xb,
+ 0xa, 0x30, 0x5e, 0x34, 0x0, 0x4, 0x68, 0x10, 0x7e, 0x34, 0x0, 0x4, 0x79,
+ 0x30, 0x0, 0x2, 0x7e, 0xb3, 0x54, 0x13, 0x70, 0x2, 0xd2, 0x14, 0xd0, 0x82,
+ 0xd0, 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda,
+ 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0,
+ 0x4, 0x22, 0x12, 0x5f, 0x18, 0x2, 0x2f, 0xab, 0x4e, 0x70, 0x2, 0x1b, 0xa,
+ 0x30, 0x22, 0x12, 0x47, 0x90, 0xc2, 0x2, 0x12, 0x2f, 0xd7, 0xc2, 0xe, 0x30,
+ 0xd, 0x13, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xc2, 0xd, 0x12, 0x5b, 0x9a, 0x12,
+ 0x45, 0x56, 0x12, 0x7b, 0x30, 0x12, 0x2d, 0xb4, 0xd2, 0x2, 0x2, 0x2f, 0xd7,
+ 0xa2, 0xac, 0x92, 0x3, 0x12, 0x77, 0xb3, 0x30, 0x2, 0xa, 0xb, 0x16, 0xb,
+ 0xa, 0x30, 0x4e, 0x70, 0x3, 0x80, 0x8, 0xb, 0x16, 0xb, 0xa, 0x30, 0x5e,
+ 0x70, 0xfc, 0x1b, 0xa, 0x30, 0xa2, 0x3, 0x92, 0xac, 0x22, 0x12, 0x71, 0x23,
+ 0x12, 0x33, 0x7d, 0x12, 0x87, 0xc3, 0x12, 0x97, 0xf5, 0x12, 0x2d, 0xa2,
+ 0x12, 0x30, 0x23, 0x7e, 0xb3, 0x54, 0x15, 0x24, 0xfd, 0x68, 0x9, 0xb, 0xb1,
+ 0x78, 0xf4, 0x12, 0x32, 0xc, 0x80, 0xef, 0x12, 0x50, 0x77, 0x80, 0xea, 0xca,
+ 0x79, 0x7e, 0xb3, 0x39, 0xcd, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x21, 0x83, 0x7e,
+ 0x1f, 0x39, 0xfc, 0x69, 0xa1, 0x0, 0x6, 0x5e, 0xa4, 0x8, 0x0, 0x68, 0x2,
+ 0x21, 0x48, 0x6c, 0xee, 0x12, 0x31, 0xe4, 0x7e, 0x34, 0xf4, 0xb1, 0x7e, 0x8,
+ 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x6, 0x12, 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4,
+ 0x0, 0x6, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40,
+ 0xde, 0xbe, 0xb4, 0x0, 0x6, 0x78, 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19,
+ 0x7a, 0x39, 0xd6, 0xb, 0xf0, 0xbe, 0xf0, 0x6, 0x78, 0xf2, 0x12, 0x31, 0xe4,
+ 0x7e, 0x34, 0xf3, 0x12, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x9, 0x12,
+ 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x9, 0x78, 0x4, 0xb, 0xe0, 0x80,
+ 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xde, 0xbe, 0xb4, 0x0, 0x9, 0x78,
+ 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19, 0x7a, 0x39, 0xb9, 0xb, 0xf0, 0xbe,
+ 0xf0, 0x9, 0x78, 0xf2, 0x12, 0x31, 0xe4, 0x7e, 0x34, 0xd2, 0x2, 0x7e, 0x8,
+ 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x2, 0x12, 0x31, 0x86, 0x7d, 0xb3, 0xbe, 0xb4,
+ 0x0, 0x2, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40,
+ 0xde, 0xbe, 0xb4, 0x0, 0x2, 0x78, 0x10, 0x6c, 0xff, 0x12, 0x31, 0xf3, 0x19,
+ 0x7a, 0x39, 0xde, 0xb, 0xf0, 0xbe, 0xf0, 0x2, 0x78, 0xf2, 0x12, 0x31, 0xe4,
+ 0x7e, 0x34, 0xf3, 0x90, 0x12, 0x31, 0xfa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7,
+ 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8,
+ 0x7e, 0x73, 0x2e, 0x77, 0x7a, 0x73, 0x39, 0xb8, 0x12, 0x31, 0xe4, 0x7e,
+ 0x34, 0xf3, 0xb3, 0x12, 0x31, 0xfa, 0x78, 0x4, 0xb, 0xe0, 0x80, 0x7, 0xb,
+ 0xf0, 0xbe, 0xf0, 0x3, 0x40, 0xec, 0xbe, 0xb4, 0x0, 0x1, 0x78, 0x8, 0x7e,
+ 0x73, 0x2e, 0x77, 0x7a, 0x73, 0x39, 0xa6, 0xbe, 0xe0, 0x5, 0x78, 0x6, 0x74,
+ 0x1, 0x7a, 0xb3, 0x39, 0xcd, 0x7e, 0xb3, 0x39, 0xcd, 0xb4, 0x1, 0x34, 0x7e,
+ 0x73, 0x39, 0xde, 0x7a, 0x73, 0x54, 0x11, 0x7e, 0x73, 0x39, 0xdf, 0x7a,
+ 0x73, 0x54, 0xd, 0x7e, 0xb3, 0x54, 0x11, 0xb4, 0x86, 0x9, 0x7e, 0xb3, 0x54,
+ 0xd, 0xbe, 0xb0, 0x15, 0x68, 0xc, 0x74, 0x87, 0x7a, 0xb3, 0x54, 0x11, 0x74,
+ 0x19, 0x7a, 0xb3, 0x54, 0xd, 0x7e, 0x73, 0x39, 0xb8, 0x7a, 0x73, 0x54, 0x1f,
+ 0xda, 0x79, 0x22, 0x12, 0xef, 0x1f, 0x80, 0x42, 0x6d, 0x33, 0x7e, 0x2f,
+ 0x56, 0xad, 0x79, 0x32, 0x0, 0xa, 0x12, 0xee, 0x73, 0x80, 0xa, 0x12, 0xef,
+ 0xe0, 0x68, 0x5, 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xef, 0x5e, 0x68, 0xf1,
+ 0x12, 0xf0, 0x7c, 0x7e, 0x6f, 0x56, 0xad, 0x69, 0x36, 0x0, 0x4, 0x5e, 0x34,
+ 0x0, 0x2, 0x78, 0xf2, 0x7e, 0xb3, 0x56, 0xb1, 0x70, 0x11, 0x69, 0x36, 0x0,
+ 0xa, 0x6c, 0x66, 0x7a, 0x7b, 0x70, 0xb, 0xf4, 0x1b, 0x14, 0x4d, 0x11, 0x78,
+ 0xba, 0x2, 0x31, 0xd4, 0x6d, 0x33, 0x7e, 0x2f, 0x56, 0xad, 0x1b, 0x2a, 0x30,
+ 0xc2, 0xcc, 0x7d, 0x32, 0x9d, 0x31, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x34,
+ 0x0, 0x9, 0xe4, 0x12, 0x0, 0x2e, 0x6c, 0xff, 0x22, 0xa, 0xaf, 0x9, 0x7a,
+ 0x2e, 0x77, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x24, 0x0, 0x1, 0x12, 0x31,
+ 0x86, 0x7d, 0xb3, 0xbe, 0xb4, 0x0, 0x1, 0x22, 0x30, 0x29, 0xc, 0x7e, 0xb3,
+ 0x54, 0x5c, 0xb4, 0x1, 0x5, 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0x80, 0xbe,
+ 0xc2, 0x29, 0xd2, 0x86, 0x12, 0x30, 0x23, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x1,
+ 0x2, 0x80, 0x2, 0x41, 0xc3, 0xe4, 0x12, 0x89, 0x32, 0x12, 0x7f, 0xfd, 0x12,
+ 0x5d, 0x78, 0x12, 0x5a, 0x7a, 0x7e, 0x34, 0xd, 0x16, 0x12, 0x32, 0xdf, 0x12,
+ 0x5a, 0xa8, 0x12, 0x93, 0xf9, 0x12, 0x58, 0xb0, 0x7e, 0xb3, 0x2e, 0x74,
+ 0x70, 0x9, 0x12, 0x34, 0x0, 0x12, 0x37, 0xf6, 0xb4, 0x3, 0xc9, 0x12, 0x97,
+ 0xaa, 0x7e, 0xb3, 0x54, 0x12, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x12, 0xaf, 0x1c,
+ 0x7e, 0xb3, 0x68, 0x9e, 0x70, 0x6, 0x12, 0xca, 0xf9, 0x12, 0xaf, 0xbf, 0x12,
+ 0x9b, 0x18, 0x7e, 0xb3, 0x2e, 0x74, 0x60, 0x3, 0x30, 0x2a, 0x9, 0x12, 0x34,
+ 0x0, 0x12, 0x37, 0xf6, 0xb4, 0x3, 0x99, 0x74, 0x1, 0x12, 0x33, 0xdc, 0x12,
+ 0x34, 0xc, 0x12, 0xa7, 0x74, 0x12, 0xa7, 0x77, 0x74, 0x2, 0x12, 0x33, 0xdc,
+ 0x12, 0xaf, 0xd6, 0x74, 0x3, 0x12, 0x33, 0xdc, 0x12, 0xb3, 0xa2, 0x74, 0x4,
+ 0x12, 0x33, 0xdc, 0x12, 0xaf, 0x4d, 0x12, 0x8c, 0xe1, 0x12, 0x7e, 0xd1,
+ 0x12, 0x7c, 0xa8, 0x12, 0x7f, 0xce, 0x12, 0x80, 0xac, 0x41, 0x25, 0xd2, 0x2,
+ 0x12, 0x46, 0xb8, 0x12, 0x78, 0x78, 0x2, 0x34, 0x3, 0x7a, 0x37, 0x68, 0x87,
+ 0x90, 0xd, 0x10, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x86, 0x7e, 0x34, 0xd, 0x1a,
+ 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x30, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93,
+ 0x7a, 0xb3, 0x68, 0x85, 0x12, 0xca, 0xd5, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32,
+ 0xdf, 0x7a, 0x37, 0x68, 0x87, 0x12, 0x32, 0xdb, 0x7a, 0x37, 0x68, 0x89,
+ 0x7e, 0x34, 0xd, 0x1c, 0x12, 0x32, 0xdf, 0x12, 0x37, 0xa6, 0x7a, 0x37, 0x68,
+ 0x8b, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xcb, 0x4e, 0x12, 0x32,
+ 0xdf, 0x7a, 0x37, 0x68, 0x8f, 0x7e, 0x34, 0xd, 0x24, 0x12, 0x32, 0xdf, 0x12,
+ 0x37, 0xa6, 0x7a, 0x37, 0x68, 0x91, 0x7e, 0x34, 0xd, 0x26, 0x12, 0x32, 0xdf,
+ 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xd, 0x28, 0x12, 0x32, 0xdf, 0x12, 0x37,
+ 0xa6, 0x7a, 0x37, 0x68, 0x95, 0x90, 0xd, 0x5a, 0xe4, 0x93, 0x7a, 0xb3, 0x68,
+ 0x99, 0x90, 0xd, 0x11, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x9a, 0x7e, 0x34, 0xd,
+ 0x12, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x9b, 0x7e, 0x34, 0xd, 0x2a, 0x12,
+ 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x97, 0xe4, 0x7a, 0xb3, 0x68, 0x9d, 0x7a,
+ 0xb3, 0x68, 0x9e, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x12, 0x4b,
+ 0x99, 0x7a, 0x73, 0x53, 0xee, 0x12, 0x32, 0xdb, 0x12, 0x4f, 0xbe, 0x7a,
+ 0x73, 0x53, 0xef, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0x4b, 0x99,
+ 0x7a, 0x73, 0x53, 0xf0, 0x7e, 0x34, 0xd, 0x22, 0x12, 0x32, 0xdf, 0x12, 0x4f,
+ 0xbe, 0x7a, 0x73, 0x53, 0xf1, 0xe4, 0x7a, 0xb3, 0x53, 0xf2, 0x7e, 0x34, 0xd,
+ 0x2a, 0x12, 0x32, 0xdf, 0x12, 0x4b, 0x99, 0x7a, 0x73, 0x53, 0xf3, 0x7e,
+ 0x34, 0x0, 0x6a, 0xca, 0x39, 0x7e, 0x34, 0xd, 0x2e, 0x7e, 0x24, 0x0, 0xff,
+ 0x7e, 0x8, 0x53, 0xf4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x22, 0x1b, 0xb1, 0x68,
+ 0xd, 0x14, 0x68, 0x10, 0xb, 0xb1, 0x78, 0x18, 0xe4, 0x7a, 0xb3, 0x68, 0x83,
+ 0x22, 0x12, 0xb8, 0x31, 0x2, 0xb7, 0xf7, 0x12, 0x8c, 0xf8, 0x12, 0x67, 0x13,
+ 0x12, 0x81, 0x5, 0x2, 0x86, 0x6d, 0x22, 0x12, 0x37, 0xe0, 0x7e, 0x73, 0x54,
+ 0x15, 0x7a, 0x73, 0x56, 0xa7, 0x22, 0x12, 0x36, 0x10, 0x12, 0xa2, 0x30,
+ 0x12, 0x36, 0x10, 0x12, 0xc9, 0x7e, 0x12, 0x36, 0x10, 0x12, 0x36, 0x10,
+ 0x12, 0xa7, 0xdf, 0x12, 0x36, 0x10, 0x12, 0x9c, 0x8a, 0x12, 0x36, 0x10,
+ 0x12, 0xc5, 0x23, 0x12, 0x36, 0x10, 0x12, 0x36, 0x10, 0x2, 0x34, 0x36, 0xca,
+ 0x3b, 0x7e, 0xd3, 0x66, 0xea, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18,
+ 0x65, 0x60, 0x7e, 0x8, 0x2e, 0x77, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x11,
+ 0x75, 0x27, 0x0, 0x6c, 0xcc, 0xa1, 0xb, 0x7e, 0x44, 0x3, 0xff, 0x7e, 0xe0,
+ 0xff, 0x6c, 0xff, 0x80, 0x5a, 0x7c, 0xbf, 0x12, 0xa0, 0x72, 0x60, 0x51,
+ 0x12, 0xf1, 0xb7, 0xbe, 0x0, 0xff, 0x68, 0x49, 0x9, 0x5, 0x2e, 0x78, 0xa,
+ 0x10, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x9, 0x3, 0x55, 0xb4, 0xa, 0x30, 0x12,
+ 0xf1, 0xae, 0x8, 0x4, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x12,
+ 0xf1, 0xb7, 0xa, 0xf0, 0x74, 0x2, 0xac, 0xbc, 0x9, 0x5, 0x55, 0xb3, 0xa,
+ 0x10, 0x7d, 0x21, 0x9d, 0x2f, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f,
+ 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x12, 0x2d, 0x13, 0xbd, 0x41, 0x28, 0x4, 0x7d,
+ 0x41, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xa2, 0xbe, 0xe0, 0xff, 0x68,
+ 0x43, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9, 0xb3, 0x2e, 0x77, 0x9, 0x73, 0x2e,
+ 0x78, 0x12, 0x36, 0x62, 0x7d, 0x13, 0x74, 0x2, 0xac, 0xbe, 0x9, 0xb5, 0x2e,
+ 0x77, 0x12, 0xa8, 0x14, 0xbd, 0x13, 0x48, 0x22, 0x7e, 0x70, 0x2, 0xac, 0x7e,
+ 0x9, 0x3, 0x2e, 0x77, 0x12, 0x8f, 0xd0, 0x19, 0x5, 0x2e, 0xb3, 0x9, 0x3,
+ 0x2e, 0x78, 0x19, 0x5, 0x2e, 0xb4, 0x74, 0xff, 0x19, 0xb3, 0x2e, 0x77, 0xb,
+ 0x10, 0x5, 0x27, 0xb, 0xc0, 0x7e, 0x3, 0x55, 0xef, 0xbc, 0xc, 0x28, 0x2,
+ 0x81, 0x58, 0x7c, 0xc1, 0x80, 0x6b, 0x6d, 0x0, 0x7e, 0xe0, 0xff, 0x6c, 0xff,
+ 0x80, 0x39, 0x7c, 0xbf, 0x12, 0xa0, 0x72, 0x60, 0x30, 0x7e, 0x30, 0x2, 0xac,
+ 0x3f, 0x9, 0xb1, 0x2e, 0x77, 0xbe, 0xb0, 0xff, 0x68, 0x22, 0x9, 0x71, 0x2e,
+ 0x78, 0x12, 0x36, 0x62, 0x7d, 0x43, 0xbd, 0x4, 0x58, 0x15, 0x7e, 0x70, 0x2,
+ 0xac, 0x7f, 0x9, 0xb3, 0x2e, 0x77, 0xf5, 0x28, 0x9, 0xb3, 0x2e, 0x78, 0xf5,
+ 0x29, 0x7d, 0x4, 0x7c, 0xef, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xc3, 0xbe, 0xe0,
+ 0xff, 0x68, 0x1e, 0x7e, 0xa1, 0x28, 0x12, 0xc7, 0x19, 0x19, 0xa1, 0x2e,
+ 0xb3, 0xe5, 0x29, 0x19, 0xb1, 0x2e, 0xb4, 0x7e, 0xa0, 0xff, 0x7e, 0x30, 0x2,
+ 0xac, 0x3e, 0x19, 0xa1, 0x2e, 0x77, 0x5, 0x27, 0xb, 0xc0, 0x90, 0xd, 0xe,
+ 0xe4, 0x93, 0xbc, 0xbc, 0x38, 0x8c, 0x90, 0xd, 0xf, 0xe4, 0x93, 0x7c, 0xab,
+ 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x2e, 0xb3, 0x7e, 0x8, 0x2e, 0x77,
+ 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0xd1, 0x27, 0x12, 0x87, 0x82, 0x74, 0x2,
+ 0xac, 0x7b, 0x7e, 0x8, 0x55, 0xb3, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xbe, 0xd0,
+ 0x0, 0x28, 0x38, 0xa, 0x3d, 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77,
+ 0x7e, 0x8, 0x65, 0x60, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0xa, 0x3d, 0x3e, 0x34,
+ 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x55, 0xb3, 0x12, 0x2b, 0x7,
+ 0x1b, 0xfd, 0x6c, 0xcc, 0x80, 0xa, 0x7c, 0xbc, 0x7e, 0x70, 0x1, 0x12, 0x9d,
+ 0x1b, 0xb, 0xc0, 0xbc, 0xdc, 0x38, 0xf2, 0x7a, 0xd3, 0x55, 0xef, 0x7a, 0xd3,
+ 0x66, 0xea, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbe, 0xb3, 0x66, 0xea, 0x50, 0x4,
+ 0x7a, 0xb3, 0x66, 0xea, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x6c, 0xff, 0x6c,
+ 0xee, 0x80, 0x31, 0x7c, 0xbe, 0x12, 0xa0, 0x72, 0x60, 0x28, 0x7e, 0x34, 0x0,
+ 0x2, 0xca, 0x39, 0xac, 0x7e, 0x2e, 0x34, 0x65, 0x60, 0x6d, 0x22, 0x7e, 0x30,
+ 0x2, 0xac, 0x3f, 0x2e, 0x14, 0x65, 0x60, 0x6d, 0x0, 0x12, 0x2b, 0x7, 0x1b,
+ 0xfd, 0x7c, 0xbf, 0x7e, 0x70, 0x1, 0x12, 0x9d, 0x1b, 0xb, 0xf0, 0xb, 0xe0,
+ 0x12, 0xa7, 0x7a, 0x38, 0xca, 0x7a, 0xf3, 0x66, 0xea, 0xda, 0x79, 0x22,
+ 0x7e, 0x70, 0x9, 0xac, 0x78, 0x9, 0xb3, 0x67, 0x22, 0x9, 0x73, 0x67, 0x23,
+ 0x12, 0x54, 0x34, 0x7d, 0x13, 0x3e, 0x14, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d,
+ 0x31, 0xb, 0x1a, 0x30, 0x22, 0xca, 0xf8, 0x7c, 0x8b, 0xc2, 0x0, 0x6d, 0xee,
+ 0x7d, 0xfe, 0x74, 0x9, 0xac, 0xb8, 0x9, 0xf5, 0x67, 0x22, 0x9, 0x85, 0x67,
+ 0x23, 0xbe, 0x80, 0x2, 0x50, 0x7, 0x6c, 0x99, 0x7e, 0x0, 0x5, 0x80, 0x2f,
+ 0x90, 0x1, 0x8b, 0xe4, 0x93, 0xa, 0x3b, 0x7d, 0x13, 0x9e, 0x14, 0x0, 0x3,
+ 0xa, 0x28, 0xbd, 0x21, 0x8, 0x10, 0x9e, 0x34, 0x0, 0x5, 0x1b, 0x34, 0x7c,
+ 0x97, 0xa, 0x5b, 0x1b, 0x54, 0x7c, 0xb, 0x80, 0xc, 0xa, 0x38, 0x1b, 0x35,
+ 0x7c, 0x97, 0xa, 0x58, 0xb, 0x55, 0x7c, 0xb, 0xbe, 0xf0, 0x4, 0x38, 0x4a,
+ 0x7c, 0x19, 0x80, 0x40, 0xe4, 0x12, 0x37, 0x7f, 0x8, 0x18, 0xe4, 0x12, 0x37,
+ 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60,
+ 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d, 0xf1, 0x74, 0x1, 0x12, 0x37, 0x7f,
+ 0x8, 0x19, 0x74, 0x1, 0x12, 0x37, 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80,
+ 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d,
+ 0xe1, 0xb, 0x10, 0xbc, 0x1, 0x50, 0xbc, 0x80, 0x5d, 0x90, 0x1, 0x8a, 0xe4,
+ 0x93, 0xa, 0x5b, 0x1b, 0x56, 0xa, 0x1f, 0xbd, 0x15, 0x48, 0x4e, 0x7c, 0x19,
+ 0x80, 0x46, 0x12, 0x37, 0xef, 0x12, 0x37, 0x7f, 0x8, 0x1a, 0x12, 0x37, 0xef,
+ 0x12, 0x37, 0x89, 0x8, 0x5, 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d,
+ 0x53, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x2d, 0xf1, 0x12, 0xf2, 0x72,
+ 0x12, 0x37, 0x7f, 0x8, 0x1a, 0x12, 0xf2, 0x72, 0x12, 0x37, 0x89, 0x8, 0x5,
+ 0x12, 0x37, 0x9f, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0x60, 0x5, 0x3e, 0x14,
+ 0x14, 0x78, 0xfb, 0x2d, 0xe1, 0xb, 0x10, 0xbc, 0x1, 0x50, 0xb6, 0x7d, 0x1e,
+ 0x3e, 0x14, 0xbd, 0x1f, 0x50, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0xda, 0xf8, 0x22,
+ 0x7c, 0x71, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x0, 0x2d, 0x22, 0x7c, 0x71, 0x12,
+ 0x36, 0x62, 0x7d, 0x13, 0x9e, 0x14, 0x0, 0x2d, 0xa, 0x28, 0xa, 0x31, 0x9d,
+ 0x32, 0xbe, 0x34, 0x0, 0x0, 0x22, 0xa, 0x28, 0xa, 0x51, 0x9d, 0x52, 0x22,
+ 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x22, 0x7e, 0x34, 0xd, 0xc4, 0x12, 0x32,
+ 0xdf, 0x7a, 0x37, 0x67, 0x3, 0x7e, 0x34, 0xd, 0xc6, 0x12, 0x32, 0xdf, 0x7a,
+ 0x37, 0x67, 0x5, 0x7e, 0x34, 0xd, 0xc8, 0x12, 0x32, 0xdf, 0x12, 0x9f, 0xb7,
+ 0x90, 0xd, 0xcb, 0xe4, 0x93, 0x7a, 0xb3, 0x67, 0xa, 0xe4, 0x7a, 0xb3, 0x67,
+ 0xe, 0x7a, 0xb3, 0x67, 0xf, 0x22, 0x7e, 0xb3, 0x1, 0x8e, 0xbe, 0xb0, 0xfa,
+ 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x1, 0x8e, 0x22, 0x90, 0x1, 0x8a, 0xe4, 0x93,
+ 0x14, 0x22, 0x12, 0x46, 0x49, 0x7e, 0xb3, 0x54, 0x13, 0x22, 0xca, 0x3b,
+ 0x7e, 0xf3, 0x56, 0x21, 0x7e, 0x30, 0x8, 0xac, 0x3f, 0x9, 0xc1, 0x3, 0xac,
+ 0x9, 0xd1, 0x3, 0xad, 0x7e, 0x4, 0x0, 0x8, 0xca, 0x9, 0x2e, 0x14, 0x3, 0xac,
+ 0x6d, 0x0, 0x7e, 0x18, 0x54, 0x91, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x74, 0x8,
+ 0xac, 0xbf, 0x9, 0xe5, 0x3, 0xb0, 0x74, 0xee, 0xac, 0xbe, 0x7d, 0xa5, 0x2e,
+ 0xa4, 0x1, 0x0, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x12, 0x39, 0xa0, 0x5e, 0x34,
+ 0x1, 0x0, 0x68, 0xd, 0x5e, 0xb4, 0xfe, 0xff, 0x7a, 0xb7, 0x39, 0xcb, 0x7c,
+ 0xbf, 0x12, 0x40, 0x7, 0x12, 0x39, 0xa0, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x2c,
+ 0x5e, 0xb4, 0xff, 0xfe, 0x7a, 0xb7, 0x39, 0xcb, 0x7e, 0xb3, 0x54, 0x91,
+ 0x12, 0x0, 0x9, 0x50, 0xf, 0x7e, 0xb3, 0x54, 0x91, 0x12, 0x6c, 0x91, 0x12,
+ 0x77, 0xfd, 0x12, 0x3f, 0x30, 0x80, 0xc, 0x74, 0x8, 0xac, 0xbf, 0x19, 0xc5,
+ 0x3, 0xac, 0x7a, 0xc3, 0x54, 0x91, 0x12, 0x39, 0xa0, 0x5e, 0x34, 0x0, 0x2,
+ 0x68, 0x2c, 0x5e, 0xb4, 0xff, 0xfd, 0x7a, 0xb7, 0x39, 0xcb, 0x7e, 0xb3,
+ 0x54, 0x92, 0x12, 0x48, 0x5, 0x50, 0xf, 0x7e, 0xb3, 0x54, 0x92, 0x12, 0x6c,
+ 0xd3, 0x12, 0x77, 0xfd, 0x12, 0x3f, 0x30, 0x80, 0xc, 0x74, 0x8, 0xac, 0xbf,
+ 0x19, 0xd5, 0x3, 0xad, 0x7a, 0xd3, 0x54, 0x92, 0x12, 0x39, 0xa0, 0x5e, 0x34,
+ 0x0, 0x4, 0x68, 0x56, 0x5e, 0xb4, 0xff, 0xfb, 0x7a, 0xb7, 0x39, 0xcb, 0x4e,
+ 0xb4, 0x2, 0x0, 0x7a, 0xb7, 0x39, 0xcb, 0x4e, 0xb4, 0x10, 0x0, 0x7a, 0xb7,
+ 0x39, 0xcb, 0x7c, 0xbf, 0x12, 0x67, 0xa7, 0x7e, 0x30, 0x3c, 0xac, 0x3e,
+ 0x12, 0x6b, 0x89, 0x74, 0x3, 0xac, 0xbf, 0x12, 0x6b, 0xdb, 0x7e, 0x30, 0x3c,
+ 0xac, 0x3e, 0x12, 0xf1, 0x42, 0x12, 0x93, 0xd7, 0x12, 0xed, 0x8d, 0x7d,
+ 0x3a, 0x2e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbe, 0x12, 0xf2, 0x7a, 0x7d,
+ 0x3a, 0xb, 0x35, 0x74, 0x3c, 0xac, 0xbe, 0x49, 0x25, 0x34, 0xb9, 0x12, 0x39,
+ 0xab, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x10, 0x68, 0x12, 0x5e, 0x70, 0xef,
+ 0x7a, 0x37, 0x39, 0xcb, 0x7e, 0xb3, 0x54, 0x93, 0x7e, 0x73, 0x54, 0x94,
+ 0x12, 0x98, 0x31, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x40, 0x68, 0xe, 0x5e,
+ 0x70, 0xbf, 0x7a, 0x37, 0x39, 0xcb, 0x7c, 0xbf, 0xa, 0xf, 0x12, 0x41, 0x29,
+ 0x12, 0x39, 0x99, 0x5e, 0x24, 0x0, 0x80, 0x68, 0xa, 0x5e, 0x70, 0x7f, 0x7a,
+ 0x37, 0x39, 0xcb, 0x12, 0x40, 0x6d, 0x12, 0x39, 0x99, 0x5e, 0x24, 0x4, 0x0,
+ 0x68, 0x7, 0x5e, 0x60, 0xfb, 0x7a, 0x37, 0x39, 0xcb, 0x12, 0x39, 0x99, 0x5e,
+ 0x24, 0x10, 0x0, 0x68, 0x7, 0x5e, 0x60, 0xef, 0x7a, 0x37, 0x39, 0xcb, 0x12,
+ 0x39, 0x99, 0x5e, 0x24, 0x20, 0x0, 0x68, 0xc, 0x5e, 0x60, 0xdf, 0x7a, 0x37,
+ 0x39, 0xcb, 0x7c, 0xbf, 0x12, 0x68, 0x1, 0xda, 0x3b, 0x22, 0x7e, 0x37, 0x39,
+ 0xcb, 0x7d, 0x23, 0x22, 0x7e, 0xb7, 0x39, 0xcb, 0x7d, 0x3b, 0x22, 0x49,
+ 0x25, 0x34, 0xe7, 0x7d, 0x12, 0x12, 0xf1, 0x66, 0x1b, 0x1a, 0x10, 0x22,
+ 0xca, 0x3b, 0x30, 0x0, 0x2, 0xa1, 0xbe, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x7e,
+ 0x34, 0x2e, 0x77, 0x7e, 0x24, 0x15, 0x15, 0x7e, 0x74, 0x0, 0xb9, 0x1b, 0x38,
+ 0x20, 0xb, 0x35, 0x1b, 0x74, 0x78, 0xf7, 0x12, 0xf2, 0x59, 0x7e, 0x24, 0x0,
+ 0xb9, 0x12, 0x40, 0xbe, 0x12, 0xf2, 0x59, 0x12, 0x40, 0x57, 0x7e, 0xb3,
+ 0x56, 0x28, 0xb4, 0x1, 0x3f, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, 0x1c,
+ 0x7a, 0x37, 0x39, 0xaa, 0x69, 0x30, 0x0, 0x1a, 0x7a, 0x37, 0x39, 0xae, 0x69,
+ 0x30, 0x0, 0x12, 0x7a, 0x37, 0x39, 0xc8, 0x69, 0x30, 0x0, 0x14, 0x7a, 0x37,
+ 0x39, 0xd2, 0x7e, 0x34, 0x0, 0x3f, 0x79, 0x30, 0x0, 0x1a, 0x6d, 0x33, 0x12,
+ 0x77, 0xd9, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xef, 0xa0, 0x7e, 0x34, 0x0, 0x1,
+ 0x12, 0x77, 0xeb, 0xe4, 0x7a, 0xb3, 0x39, 0xb3, 0x74, 0x3, 0x7a, 0xb3, 0x39,
+ 0xb4, 0x7a, 0xb3, 0x39, 0xa4, 0x7e, 0x93, 0x56, 0x28, 0x4c, 0x99, 0x78,
+ 0x29, 0xe5, 0xc2, 0x7a, 0xb3, 0x39, 0xb2, 0x12, 0xf0, 0x16, 0x43, 0xc3,
+ 0x20, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x43, 0xc3, 0xc0, 0x7e, 0x34,
+ 0x0, 0x1, 0x12, 0x58, 0x3d, 0x43, 0xc2, 0x40, 0x7e, 0x34, 0x0, 0x1, 0x12,
+ 0x58, 0x3d, 0x80, 0x8, 0xbe, 0x90, 0x1, 0x78, 0x3, 0x12, 0xf0, 0x16, 0x7e,
+ 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x6, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4, 0x9e, 0x90,
+ 0x1, 0x90, 0xe4, 0x93, 0x60, 0x13, 0x6d, 0x33, 0x12, 0x76, 0x89, 0x7e, 0x34,
+ 0x1, 0x99, 0x12, 0x32, 0xdf, 0x2e, 0x34, 0x0, 0x9, 0x12, 0x77, 0xe2, 0x12,
+ 0x40, 0xd4, 0x74, 0x3, 0x12, 0x3f, 0xc8, 0x7e, 0x34, 0x0, 0x1f, 0x12, 0x3f,
+ 0x29, 0x7a, 0x37, 0x3f, 0x76, 0x12, 0xf2, 0x50, 0x4e, 0x50, 0x1, 0x12, 0x3f,
+ 0x10, 0x7e, 0x34, 0x0, 0x25, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x2e, 0x12,
+ 0xf2, 0x47, 0x5e, 0x24, 0x0, 0x9f, 0x4e, 0x40, 0x76, 0x12, 0x3f, 0x10, 0x7e,
+ 0x34, 0x0, 0x27, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x32, 0x12, 0xf2, 0x3e,
+ 0x5e, 0x24, 0xf6, 0x4f, 0x4e, 0x24, 0x60, 0xf, 0x12, 0x3f, 0x10, 0x7e, 0x34,
+ 0x0, 0x1, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x36, 0x12, 0xf2, 0x35, 0x5e,
+ 0x24, 0xc0, 0x0, 0x4e, 0x50, 0xc2, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x2a,
+ 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x38, 0x12, 0xf2, 0x2c, 0x5e, 0x50, 0xf,
+ 0x4e, 0x50, 0x20, 0x12, 0x3f, 0x10, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0,
+ 0x4c, 0x7a, 0x37, 0x39, 0xd0, 0x7e, 0x53, 0x39, 0xa4, 0xa, 0x55, 0x7d, 0x25,
+ 0x12, 0x5d, 0x6f, 0x2d, 0x25, 0x6c, 0x77, 0x4d, 0x32, 0x79, 0x30, 0x0, 0x4c,
+ 0x90, 0x1, 0x90, 0xe4, 0x93, 0x7e, 0x34, 0x0, 0x20, 0x60, 0x33, 0x12, 0x3f,
+ 0x29, 0x7d, 0x3, 0x5e, 0x4, 0x0, 0x2, 0x7e, 0x34, 0x0, 0x20, 0x12, 0x3f,
+ 0xaa, 0x7d, 0x13, 0x5e, 0x14, 0x0, 0x2, 0x7e, 0x34, 0x0, 0x20, 0x12, 0xef,
+ 0xa9, 0x12, 0xf2, 0xa0, 0x4d, 0x21, 0x12, 0x3f, 0xec, 0x12, 0xf0, 0xb7,
+ 0x7e, 0x27, 0x3f, 0x2c, 0x12, 0xf2, 0xa0, 0x4d, 0x20, 0x80, 0x19, 0x12,
+ 0xef, 0xa9, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58, 0x12, 0x3f, 0xec, 0x12,
+ 0xf0, 0xb7, 0x7e, 0x27, 0x3f, 0x2c, 0x5e, 0x40, 0x7d, 0x4e, 0x40, 0x58,
+ 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x28, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f,
+ 0x34, 0x12, 0xf2, 0x23, 0x5e, 0x24, 0xf7, 0xef, 0x4e, 0x40, 0x8, 0x12, 0x3f,
+ 0x10, 0x7e, 0x34, 0x0, 0x1b, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x44, 0x12,
+ 0xf2, 0x1a, 0x5e, 0x40, 0xdf, 0x12, 0xf2, 0x91, 0x12, 0x3f, 0x29, 0x7a,
+ 0x37, 0x3f, 0x48, 0x7e, 0x34, 0x0, 0x17, 0x7e, 0xb3, 0x39, 0xa5, 0x54, 0x3f,
+ 0xa, 0x2b, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x26, 0x12, 0x3f, 0x29, 0x7a,
+ 0x37, 0x3f, 0x30, 0x12, 0xf2, 0x11, 0x5e, 0x24, 0xf1, 0xdf, 0x12, 0x3f,
+ 0x10, 0x6d, 0x33, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x4a, 0x6d, 0x33,
+ 0x7e, 0x27, 0x3f, 0x4a, 0x5e, 0x24, 0x7f, 0xfd, 0x12, 0x3f, 0x10, 0x7e,
+ 0x34, 0x0, 0x21, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x4c, 0x12, 0xf2, 0x8,
+ 0x5e, 0x40, 0xef, 0x12, 0x39, 0xab, 0x7e, 0x34, 0x0, 0x21, 0x12, 0x3f, 0xaa,
+ 0x7a, 0x37, 0x3f, 0x4e, 0x12, 0xf1, 0xff, 0x5e, 0x40, 0xef, 0x12, 0x3f,
+ 0x20, 0x7e, 0x34, 0x0, 0x14, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x46, 0x12,
+ 0xf1, 0xf6, 0x5e, 0x24, 0xfc, 0x0, 0x12, 0xf2, 0x89, 0x12, 0x3f, 0x29, 0x7a,
+ 0x37, 0x3f, 0x5c, 0x7e, 0x34, 0x0, 0x2, 0x7e, 0x53, 0x39, 0xa7, 0xa, 0x55,
+ 0x12, 0x6c, 0x33, 0x7e, 0x27, 0x3f, 0x5c, 0x5e, 0x24, 0x8, 0x0, 0x4d, 0x25,
+ 0x4e, 0x50, 0x2e, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x16, 0x12, 0x3f, 0x29,
+ 0x7a, 0x37, 0x3f, 0x52, 0x12, 0xf1, 0xed, 0x5e, 0x24, 0xf8, 0x0, 0x4e, 0x50,
+ 0xc4, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x18, 0x12, 0x3f, 0x29, 0x7a, 0x37,
+ 0x3f, 0x58, 0x12, 0xf1, 0xe4, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x50, 0xda, 0x12,
+ 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x19, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f, 0x5a,
+ 0x12, 0xf1, 0xdb, 0x5e, 0x24, 0xfc, 0x0, 0x4e, 0x24, 0x1, 0x90, 0x12, 0x3f,
+ 0x10, 0x6d, 0x77, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x6, 0x12, 0x3f, 0xf4, 0x59,
+ 0x32, 0x3f, 0x3a, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x3f, 0x3a, 0x59,
+ 0x32, 0x3f, 0x20, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xdf, 0x7e, 0xb3,
+ 0x56, 0x28, 0x7e, 0x8, 0x3f, 0x26, 0x70, 0x7, 0x12, 0xf1, 0x53, 0x74, 0x1,
+ 0x80, 0x5, 0x12, 0xf1, 0x53, 0x74, 0x2, 0x7e, 0x70, 0x1, 0x12, 0x6b, 0x3f,
+ 0x7e, 0x8, 0x3f, 0x28, 0x74, 0x1, 0x12, 0x6b, 0x2c, 0x7e, 0x8, 0x3f, 0x28,
+ 0x74, 0x1, 0x12, 0x6b, 0x8, 0x7e, 0x73, 0x39, 0xca, 0xa, 0x37, 0x7a, 0x37,
+ 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x6, 0x7e, 0x27, 0x3f, 0x20, 0x12, 0x3f, 0x10,
+ 0x7e, 0x34, 0x0, 0x9, 0x7e, 0x27, 0x3f, 0x26, 0x12, 0x3f, 0x10, 0x7e, 0x34,
+ 0x0, 0xa, 0x7e, 0x27, 0x3f, 0x28, 0x12, 0x3f, 0x10, 0x6d, 0x77, 0x7d, 0x67,
+ 0x2e, 0x64, 0x0, 0xb, 0x12, 0x3f, 0xf4, 0x59, 0x32, 0x3f, 0x5e, 0x12, 0xf1,
+ 0x49, 0x59, 0x32, 0x3f, 0x64, 0x12, 0x3f, 0xb4, 0x78, 0xe7, 0x7e, 0x34, 0x0,
+ 0xb, 0x7e, 0x24, 0x11, 0x11, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0xc, 0x7e,
+ 0x24, 0x0, 0x1, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x1, 0xfb, 0x12, 0x3f, 0x29,
+ 0x7d, 0x73, 0x7e, 0x34, 0x0, 0xd, 0x7d, 0x27, 0x12, 0x3f, 0x10, 0x6d, 0x77,
+ 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39, 0x12, 0x3f, 0xf4, 0x59, 0x32, 0x3f, 0x6a,
+ 0x12, 0xf1, 0x49, 0x59, 0x32, 0x3f, 0x70, 0x12, 0x3f, 0xb4, 0x78, 0xe7,
+ 0x7e, 0x34, 0x0, 0x39, 0x12, 0xf2, 0x99, 0x7e, 0x34, 0x0, 0x3a, 0x12, 0xf2,
+ 0x99, 0x7e, 0x34, 0x0, 0x3b, 0x7e, 0x24, 0x50, 0x5, 0x12, 0x39, 0xab, 0x7e,
+ 0x34, 0x0, 0x39, 0x7e, 0x24, 0x12, 0x34, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0,
+ 0x3a, 0x7e, 0x24, 0x23, 0x45, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x3b, 0x7e,
+ 0x24, 0x10, 0x5, 0x12, 0x3f, 0x20, 0xe1, 0xd, 0x7e, 0xa3, 0x56, 0x28, 0x4c,
+ 0xaa, 0x78, 0x24, 0x7e, 0xb3, 0x39, 0xb2, 0xf5, 0xc2, 0x7e, 0x73, 0x39,
+ 0xb5, 0x7c, 0xb7, 0x54, 0xc0, 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54,
+ 0x20, 0x4c, 0xb7, 0xf5, 0xc3, 0x7c, 0xb7, 0x54, 0x7, 0x4c, 0xb7, 0xf5, 0xc3,
+ 0x80, 0xb, 0xbe, 0xa0, 0x1, 0x78, 0x6, 0x7e, 0xb3, 0x39, 0xb5, 0xf5, 0xc3,
+ 0x12, 0x63, 0xfe, 0x12, 0xf2, 0x50, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x47,
+ 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x3e, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x35,
+ 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x2c, 0x12, 0x3f, 0x10, 0x12, 0x63, 0xfe,
+ 0x12, 0xef, 0xb0, 0x12, 0x3f, 0xec, 0x7e, 0x27, 0x3f, 0x2c, 0x12, 0x3f,
+ 0x20, 0x12, 0xf2, 0x23, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x1a, 0x12, 0xf2,
+ 0x91, 0x7e, 0x27, 0x3f, 0x48, 0x12, 0x3f, 0x10, 0x12, 0xf2, 0x11, 0x12,
+ 0x3f, 0x10, 0x6d, 0x33, 0x7e, 0x27, 0x3f, 0x4a, 0x12, 0x3f, 0x10, 0x12,
+ 0xf2, 0x8, 0x12, 0x39, 0xab, 0x12, 0xf1, 0xff, 0x12, 0x3f, 0x20, 0x12, 0xf1,
+ 0xf6, 0x12, 0xf2, 0x89, 0x7e, 0x27, 0x3f, 0x5c, 0x12, 0x3f, 0x10, 0x7e,
+ 0x34, 0x0, 0x10, 0x7e, 0x27, 0x3f, 0x50, 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xed,
+ 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xe4, 0x12, 0x3f, 0x10, 0x12, 0xf1, 0xdb,
+ 0x12, 0x3f, 0x10, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0xf, 0x7e, 0x34, 0x1,
+ 0x9b, 0x12, 0x32, 0xdf, 0x12, 0x76, 0x85, 0x6d, 0x33, 0x12, 0x77, 0xe2,
+ 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x1c, 0x7e, 0x37, 0x39, 0xaa, 0x12, 0x77,
+ 0xd9, 0x7e, 0x37, 0x39, 0xae, 0x12, 0xf1, 0xa5, 0x7e, 0x37, 0x39, 0xc8,
+ 0x12, 0xef, 0xa0, 0x7e, 0x37, 0x39, 0xd2, 0x12, 0x77, 0xeb, 0x6d, 0x77,
+ 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x6, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x3a,
+ 0x12, 0x3f, 0x10, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x5, 0x78, 0xe8, 0x6d, 0x77,
+ 0x12, 0x3f, 0xbb, 0x49, 0x22, 0x3f, 0x5e, 0x12, 0x39, 0xab, 0x12, 0x3f,
+ 0xbb, 0x49, 0x22, 0x3f, 0x64, 0x12, 0x3f, 0xb1, 0x78, 0xea, 0x6d, 0x77,
+ 0x7d, 0x67, 0x2e, 0x64, 0x0, 0x39, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x6a,
+ 0x12, 0x39, 0xab, 0x12, 0x3f, 0xc1, 0x49, 0x22, 0x3f, 0x70, 0x12, 0x3f,
+ 0xb1, 0x78, 0xe4, 0x12, 0x4d, 0x95, 0x12, 0x40, 0x6d, 0xda, 0x3b, 0x22,
+ 0x7d, 0x2, 0x7d, 0x53, 0x7d, 0x20, 0x12, 0x39, 0xab, 0x7d, 0x35, 0x7d, 0x20,
+ 0x2, 0x3f, 0x20, 0x7d, 0x12, 0x12, 0x3f, 0xfe, 0x1b, 0x1a, 0x10, 0x22, 0x12,
+ 0xf1, 0x66, 0xb, 0x1a, 0x30, 0x22, 0xca, 0xf8, 0x6c, 0xff, 0x74, 0xee, 0xac,
+ 0xbf, 0x12, 0x98, 0x9b, 0x12, 0x96, 0xeb, 0xa, 0xe7, 0x3e, 0xe4, 0x3e, 0xe4,
+ 0x3e, 0xe4, 0xb, 0xe6, 0x9, 0x75, 0x3, 0xad, 0xa, 0xd7, 0x3e, 0xd4, 0x3e,
+ 0xd4, 0x3e, 0xd4, 0xb, 0xd6, 0x7e, 0xc4, 0x0, 0x2c, 0x7a, 0xc5, 0x29, 0x12,
+ 0xf0, 0xe1, 0x7d, 0x3e, 0x7d, 0x2d, 0x12, 0xee, 0xcb, 0x7d, 0x3e, 0x7d,
+ 0x2d, 0x12, 0x6b, 0xc9, 0x7d, 0x3e, 0x7d, 0x2d, 0x74, 0x2a, 0x12, 0xed,
+ 0xae, 0x12, 0xf0, 0x51, 0x12, 0x39, 0xab, 0x12, 0xf0, 0x42, 0x12, 0x98,
+ 0x8f, 0xac, 0xbf, 0x12, 0x39, 0xa7, 0x12, 0xf0, 0x51, 0x12, 0x3f, 0x20,
+ 0x12, 0xf0, 0x42, 0x12, 0x3f, 0x20, 0x12, 0x98, 0x92, 0xac, 0xbf, 0x49,
+ 0x25, 0x34, 0xe7, 0x12, 0x3f, 0x20, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0x8d,
+ 0xda, 0xf8, 0x22, 0x12, 0x3f, 0xfe, 0xb, 0x1a, 0x30, 0x22, 0x12, 0x3f, 0x20,
+ 0xb, 0x74, 0xbe, 0x74, 0x0, 0x3, 0x22, 0x7d, 0x67, 0x2e, 0x64, 0x0, 0xb,
+ 0x7d, 0x36, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x7c, 0xab, 0x7e, 0x8, 0x34, 0x43,
+ 0x7c, 0xba, 0x12, 0xed, 0xc6, 0x7e, 0x8, 0x34, 0x83, 0x12, 0xed, 0xc6, 0x12,
+ 0x3f, 0xe4, 0x7e, 0x27, 0x34, 0x83, 0x2, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x20,
+ 0x7e, 0x27, 0x34, 0x43, 0x12, 0x39, 0xab, 0x7e, 0x34, 0x0, 0x20, 0x22, 0x7d,
+ 0x36, 0x12, 0x3f, 0x29, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x3e, 0x34, 0x2e,
+ 0x34, 0xb0, 0x0, 0x6d, 0x22, 0x22, 0xca, 0x79, 0x7c, 0xeb, 0x12, 0xf1, 0x8a,
+ 0x7e, 0x73, 0x54, 0x97, 0x19, 0x75, 0x3, 0xb2, 0x7e, 0x34, 0x0, 0x5, 0xca,
+ 0x39, 0x7e, 0x30, 0x5, 0xac, 0x3e, 0x2e, 0x14, 0x3, 0xcc, 0x6d, 0x0, 0x7e,
+ 0x18, 0x54, 0xa0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x12, 0xee, 0x15, 0x12, 0xee,
+ 0x5, 0x12, 0xf0, 0x9d, 0x2e, 0x34, 0x0, 0xb, 0x7e, 0x30, 0x3c, 0xac, 0x3f,
+ 0x2e, 0x14, 0x34, 0xcb, 0x6d, 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0xef, 0xcd,
+ 0x6d, 0x0, 0x12, 0x40, 0x57, 0xda, 0x79, 0x22, 0x7d, 0x53, 0x3e, 0x54, 0x2e,
+ 0x54, 0xb0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12, 0xee, 0xec, 0xbd,
+ 0x32, 0x40, 0xf9, 0x22, 0x12, 0xf1, 0x9c, 0xe4, 0x12, 0xf0, 0x39, 0x12,
+ 0xf1, 0x93, 0x60, 0x29, 0x6d, 0x22, 0x12, 0x41, 0x1d, 0x7e, 0x8, 0x68, 0xc9,
+ 0x7d, 0x2b, 0x12, 0x41, 0x1d, 0x7d, 0x1b, 0x3e, 0x14, 0x2e, 0x14, 0x68,
+ 0xc9, 0x6d, 0x0, 0x7d, 0x2a, 0x12, 0x40, 0xbe, 0x7d, 0x3a, 0x12, 0x41, 0x14,
+ 0x7e, 0x24, 0x0, 0x4, 0x2, 0x40, 0xbe, 0x12, 0xf0, 0xed, 0x7e, 0x8, 0x68,
+ 0xc9, 0x12, 0xf0, 0x6e, 0x2e, 0x14, 0x68, 0xc9, 0x6d, 0x0, 0x12, 0x41, 0xd,
+ 0x6d, 0x22, 0x2, 0x40, 0x57, 0x7e, 0x24, 0x0, 0x17, 0x7d, 0x53, 0x3e, 0x54,
+ 0x2e, 0x54, 0xa0, 0x0, 0x6d, 0x44, 0x6d, 0x33, 0x80, 0x3, 0x12, 0xee, 0xec,
+ 0xbd, 0x32, 0x40, 0xf9, 0x22, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0xa, 0x7e,
+ 0xa7, 0x68, 0xaf, 0x7e, 0xb7, 0x68, 0xad, 0x80, 0x3, 0x12, 0xf1, 0x9c, 0xe4,
+ 0x12, 0x3f, 0xc8, 0x12, 0xf1, 0x93, 0x12, 0xf0, 0xed, 0x7e, 0x14, 0x7, 0x4d,
+ 0x7e, 0x4, 0x0, 0xff, 0x12, 0xf0, 0x6e, 0x2e, 0x14, 0x7, 0x4d, 0x7e, 0x4,
+ 0x0, 0xff, 0x12, 0x41, 0xd, 0x6d, 0x22, 0x2, 0x40, 0x57, 0x7d, 0x2b, 0x12,
+ 0x40, 0x57, 0x7d, 0x3b, 0x2e, 0x34, 0x1, 0x0, 0x7e, 0x8, 0x68, 0xb9, 0x22,
+ 0x12, 0x40, 0x57, 0x7e, 0x34, 0x1, 0x0, 0x22, 0x7c, 0xbd, 0xa, 0xd, 0x7e,
+ 0x14, 0x2, 0xd8, 0xad, 0x10, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0xca, 0x3b,
+ 0x7f, 0x70, 0x7c, 0xab, 0xbe, 0xa0, 0x4, 0x40, 0x2, 0x41, 0x3f, 0x74, 0x8,
+ 0xa4, 0x9, 0xb5, 0x3, 0xb0, 0xf5, 0x3c, 0x12, 0xf0, 0x37, 0x60, 0xd, 0x7e,
+ 0x37, 0x68, 0xaf, 0x7a, 0x35, 0x34, 0x7e, 0x37, 0x68, 0xad, 0x80, 0xb, 0x7e,
+ 0x37, 0x68, 0xad, 0x7a, 0x35, 0x34, 0x7e, 0x37, 0x68, 0xaf, 0x7a, 0x35,
+ 0x36, 0x2e, 0x35, 0x34, 0x7f, 0x7, 0x2d, 0x13, 0x7a, 0xd, 0x38, 0x6d, 0x77,
+ 0x80, 0xf, 0x12, 0xf0, 0x27, 0x60, 0x5, 0x12, 0x46, 0x2a, 0x80, 0x3, 0x12,
+ 0x46, 0x34, 0xb, 0x74, 0x7e, 0x25, 0x34, 0xbd, 0x27, 0x38, 0xea, 0x7d, 0x72,
+ 0x80, 0xf, 0x12, 0xf0, 0x27, 0x60, 0x5, 0x12, 0x46, 0x34, 0x80, 0x3, 0x12,
+ 0x46, 0x2a, 0xb, 0x74, 0xbd, 0x37, 0x38, 0xed, 0x6d, 0x77, 0x7c, 0xbf, 0x7e,
+ 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x68,
+ 0xaa, 0x12, 0x46, 0x42, 0x68, 0x14, 0x7d, 0x37, 0x3e, 0x34, 0x49, 0x63,
+ 0x68, 0xb9, 0x7e, 0x1d, 0x38, 0x2d, 0x37, 0x7e, 0x1b, 0x70, 0x19, 0x76,
+ 0x35, 0xad, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x4, 0x78, 0xce, 0x6d, 0x77, 0x80,
+ 0x2d, 0x7c, 0xbf, 0x7e, 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78,
+ 0xfb, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x46, 0x42, 0x68, 0x15, 0x7d, 0x37,
+ 0x3e, 0x34, 0x49, 0x63, 0x68, 0xc1, 0x7e, 0x1d, 0x38, 0x2d, 0x37, 0x29,
+ 0x71, 0x0, 0x4, 0x19, 0x76, 0x37, 0x1a, 0xb, 0x74, 0xbe, 0x74, 0x0, 0x0,
+ 0x40, 0xcd, 0x7e, 0x71, 0x3c, 0x74, 0xee, 0xac, 0x7b, 0x2e, 0x34, 0x1, 0x0,
+ 0x2e, 0x34, 0x0, 0x35, 0x7a, 0x35, 0x3d, 0x7e, 0x8, 0x31, 0x54, 0x7e, 0x18,
+ 0x35, 0xad, 0x12, 0x45, 0x47, 0x12, 0x40, 0xbe, 0x7e, 0x8, 0x31, 0x54, 0x7e,
+ 0x18, 0x37, 0x1a, 0x12, 0x45, 0x47, 0x12, 0x40, 0x57, 0xda, 0x3b, 0x22,
+ 0xca, 0x79, 0x7f, 0x71, 0x7e, 0xa0, 0x25, 0x6c, 0x77, 0x6c, 0x66, 0x6c,
+ 0x55, 0x6c, 0x44, 0x41, 0xe9, 0x7c, 0x97, 0xac, 0x9a, 0xa, 0xd4, 0x2d, 0x4d,
+ 0x7e, 0xf0, 0x49, 0xac, 0xf7, 0x7d, 0xd7, 0xa5, 0xbc, 0x0, 0x11, 0x7e, 0xc4,
+ 0x1, 0x24, 0x9d, 0xcd, 0x7f, 0x57, 0x2d, 0xbc, 0x7e, 0x5b, 0xb0, 0xa, 0xcb,
+ 0x80, 0x2e, 0xa5, 0xbc, 0x12, 0x14, 0x7e, 0xc4, 0x1, 0x47, 0x9d, 0xcd, 0x12,
+ 0x43, 0xb, 0x7e, 0xc4, 0x1, 0x48, 0x9d, 0xcd, 0x12, 0x42, 0xfd, 0x80, 0x16,
+ 0xa5, 0xbc, 0x24, 0x17, 0x7e, 0xc4, 0x1, 0x6b, 0x9d, 0xcd, 0x12, 0x43, 0xb,
+ 0x7e, 0xc4, 0x1, 0x6c, 0x9d, 0xcd, 0x12, 0x42, 0xfd, 0x12, 0x45, 0x3a, 0x80,
+ 0x3d, 0xbe, 0x40, 0x12, 0x50, 0x1d, 0x7e, 0xb4, 0x1, 0x25, 0x9d, 0xbd, 0xa,
+ 0xc6, 0x12, 0x43, 0x9, 0x7e, 0xa4, 0x1, 0x26, 0x9d, 0xad, 0xa, 0xc6, 0x12,
+ 0x42, 0xfb, 0x12, 0x45, 0x3a, 0xb, 0x61, 0x80, 0x1b, 0x7e, 0xb4, 0x1, 0x49,
+ 0x9d, 0xbd, 0xa, 0xc5, 0x12, 0x43, 0x9, 0x7e, 0xa4, 0x1, 0x4a, 0x9d, 0xad,
+ 0xa, 0xc5, 0x12, 0x42, 0xfb, 0x12, 0x45, 0x3a, 0xb, 0x51, 0xb, 0x40, 0xbc,
+ 0xa4, 0x28, 0x2, 0x41, 0x53, 0xb, 0x70, 0xbe, 0x70, 0x5, 0x50, 0x2, 0x41,
+ 0x4b, 0xda, 0x79, 0x22, 0x2d, 0xca, 0x7f, 0x47, 0x2d, 0x9c, 0x7e, 0x4b,
+ 0xb0, 0xa, 0xcb, 0x2d, 0xcb, 0x22, 0x2d, 0xcb, 0x7f, 0x57, 0x2d, 0xbc, 0x7e,
+ 0x5b, 0xb0, 0xa, 0xbb, 0x7d, 0x7b, 0x7c, 0xef, 0x6c, 0xff, 0x7d, 0xb7, 0x22,
+ 0xca, 0x3b, 0x7c, 0xdb, 0x7e, 0x34, 0x3, 0xe8, 0x7a, 0x37, 0x31, 0x4f, 0x7e,
+ 0x34, 0x3e, 0x80, 0x7a, 0x37, 0x31, 0x51, 0x74, 0x1, 0x7a, 0xb3, 0x31, 0x53,
+ 0x7e, 0x37, 0x74, 0xc, 0xb, 0x36, 0x7a, 0x35, 0x2c, 0x7e, 0x90, 0x3, 0xac,
+ 0x9d, 0x9, 0xa4, 0x3, 0xe2, 0xa, 0xfa, 0x6d, 0xee, 0x7e, 0x14, 0x5, 0xdc,
+ 0x7f, 0x17, 0x12, 0x2a, 0x31, 0x9, 0xb4, 0x3, 0xe0, 0x60, 0xc, 0x1e, 0x34,
+ 0x1e, 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x35, 0x2e,
+ 0xbe, 0xa0, 0x8, 0x68, 0x2e, 0x7e, 0x37, 0x31, 0x51, 0x12, 0x46, 0x20, 0x1e,
+ 0x34, 0x1e, 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x37,
+ 0x31, 0x51, 0x7e, 0x37, 0x31, 0x4f, 0x12, 0x46, 0x20, 0x1e, 0x34, 0x1e,
+ 0x24, 0x50, 0x3, 0x4e, 0x60, 0x80, 0x14, 0x78, 0xf4, 0x7a, 0x37, 0x31, 0x4f,
+ 0x12, 0x45, 0x31, 0x2e, 0x14, 0x5a, 0x0, 0x6d, 0x0, 0x7e, 0x35, 0x2c, 0xe4,
+ 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x34, 0x2, 0xd8, 0x74, 0xff,
+ 0x12, 0x0, 0x2e, 0x6d, 0x77, 0x80, 0xe, 0x7e, 0x34, 0x7f, 0xff, 0x7d, 0x27,
+ 0x3e, 0x24, 0x59, 0x32, 0x13, 0x60, 0xb, 0x74, 0x7e, 0x35, 0x2c, 0xbd, 0x37,
+ 0x38, 0xeb, 0x7e, 0xc0, 0x5, 0x12, 0x5a, 0xa4, 0xbe, 0xc0, 0x7, 0x58, 0x13,
+ 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbc, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb,
+ 0x7c, 0xb7, 0xf5, 0x2b, 0x80, 0x3, 0x75, 0x2b, 0xc0, 0xbe, 0xc0, 0x6, 0x58,
+ 0x22, 0x7e, 0xb3, 0x31, 0x53, 0x60, 0x1c, 0x6d, 0x77, 0x80, 0x13, 0x12,
+ 0x46, 0x17, 0x2d, 0x37, 0x2e, 0x34, 0x5a, 0x0, 0x7e, 0x39, 0xb0, 0x45, 0x2b,
+ 0x7a, 0x39, 0xb0, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0xe8, 0x12, 0x41, 0x25,
+ 0x12, 0x46, 0xb3, 0xbe, 0xc0, 0x6, 0x48, 0x2, 0x81, 0xb3, 0xbe, 0xc0, 0x6,
+ 0x48, 0x2, 0x81, 0xb3, 0x6d, 0x77, 0x80, 0x7a, 0x7d, 0x47, 0x3e, 0x44, 0x49,
+ 0x34, 0xe, 0x40, 0x7d, 0x53, 0x12, 0x46, 0xf, 0x8, 0x7, 0x7d, 0x23, 0x9e,
+ 0x25, 0x2e, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x25, 0x7a, 0x25, 0x30, 0x49, 0x24,
+ 0x13, 0x60, 0x7d, 0x52, 0x12, 0x46, 0xf, 0x8, 0x5, 0x9e, 0x25, 0x2e, 0x80,
+ 0x4, 0x6d, 0x22, 0x9d, 0x25, 0x7a, 0x25, 0x32, 0xbe, 0x25, 0x30, 0x40, 0x22,
+ 0x7e, 0x25, 0x2e, 0x1e, 0x24, 0xbd, 0x32, 0x28, 0x19, 0xbe, 0x34, 0x3e,
+ 0x80, 0x50, 0x13, 0x59, 0x34, 0x13, 0x60, 0x12, 0x45, 0x31, 0x7d, 0x21,
+ 0x2d, 0x27, 0x9, 0x52, 0x5a, 0x0, 0x19, 0x57, 0x2e, 0x77, 0x74, 0x1, 0x7a,
+ 0xb3, 0x31, 0x53, 0xbe, 0x35, 0x2e, 0x50, 0x12, 0xe5, 0x2b, 0x64, 0xff,
+ 0x12, 0x46, 0x17, 0x7d, 0x23, 0x2d, 0x27, 0x2e, 0x24, 0x5a, 0x0, 0x12, 0x9d,
+ 0x50, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0x81, 0x20, 0xd, 0x71, 0x20, 0xe,
+ 0x6e, 0x1b, 0xc0, 0xbe, 0xc0, 0x0, 0x48, 0x2, 0x61, 0xd7, 0x7e, 0xb3, 0x54,
+ 0x80, 0xb4, 0x2, 0x9, 0x7e, 0xb3, 0x54, 0x81, 0xbe, 0xb0, 0x2, 0x68, 0x33,
+ 0x6d, 0x77, 0x80, 0x2a, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x32, 0x13, 0x60,
+ 0xbe, 0x37, 0x31, 0x4f, 0x28, 0x1a, 0xbe, 0x37, 0x31, 0x51, 0x50, 0x14, 0x9,
+ 0x77, 0x2e, 0x77, 0xbe, 0x70, 0xff, 0x68, 0xb, 0x12, 0x45, 0x31, 0x7d, 0x21,
+ 0x2d, 0x27, 0x19, 0x72, 0x5a, 0x0, 0xb, 0x74, 0x12, 0x45, 0x2a, 0x38, 0xd1,
+ 0x12, 0x41, 0x25, 0x7c, 0xbd, 0x12, 0x98, 0xe2, 0x50, 0x15, 0x7e, 0x8, 0x62,
+ 0x88, 0x7e, 0x35, 0x2c, 0x74, 0xc, 0x12, 0x0, 0x2e, 0x74, 0x3, 0x7e, 0x8,
+ 0x62, 0x88, 0x12, 0x41, 0x35, 0x12, 0x7b, 0x30, 0xda, 0x3b, 0x22, 0x7e,
+ 0x37, 0x74, 0xc, 0xbd, 0x37, 0x22, 0xa, 0xd, 0x7e, 0x14, 0x2, 0xd8, 0xad,
+ 0x10, 0x22, 0x7e, 0xf0, 0x2, 0xac, 0xf9, 0x7f, 0x50, 0x2d, 0xb7, 0x1b, 0x5a,
+ 0xc0, 0x22, 0x12, 0x42, 0x42, 0x7e, 0x35, 0x3d, 0x7e, 0x8, 0x31, 0x54, 0x7e,
+ 0x24, 0x0, 0xb9, 0x22, 0x12, 0xf1, 0xc9, 0x7e, 0x63, 0x56, 0x21, 0xa, 0x6,
+ 0x12, 0x45, 0x33, 0x7d, 0x21, 0x2e, 0x24, 0x5a, 0x0, 0x7a, 0x27, 0x39, 0xdc,
+ 0x6d, 0x22, 0x7a, 0x27, 0x39, 0xa8, 0x7e, 0x24, 0x68, 0xc9, 0x7a, 0x27,
+ 0x39, 0xc6, 0x7e, 0x24, 0x0, 0x8, 0xca, 0x29, 0x7e, 0x70, 0x8, 0xac, 0x67,
+ 0x2e, 0x34, 0x3, 0xac, 0x6d, 0x22, 0x7e, 0x8, 0x54, 0x91, 0x12, 0x2b, 0x7,
+ 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x63, 0x56, 0x21, 0xac,
+ 0x67, 0x2e, 0x34, 0x3, 0xcc, 0x6d, 0x22, 0x7e, 0x8, 0x54, 0xa0, 0x12, 0x2b,
+ 0x7, 0x1b, 0xfd, 0x7e, 0xb3, 0x56, 0x21, 0x12, 0x6b, 0x17, 0x12, 0x46, 0x7,
+ 0x9, 0x75, 0x3, 0xec, 0x7a, 0x73, 0x54, 0x80, 0x12, 0x46, 0x7, 0x9, 0x75,
+ 0x3, 0xed, 0x7a, 0x73, 0x54, 0x81, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xee,
+ 0x7a, 0x73, 0x54, 0x82, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xef, 0x7a, 0x73,
+ 0x54, 0x83, 0x12, 0x46, 0x7, 0x9, 0x75, 0x3, 0xf0, 0x7a, 0x73, 0x54, 0x84,
+ 0x7e, 0x73, 0x56, 0x21, 0x7a, 0x73, 0x54, 0x90, 0x12, 0x77, 0xf4, 0xe4, 0x2,
+ 0x45, 0xfc, 0x7a, 0xb3, 0x54, 0xab, 0x74, 0x3f, 0x7a, 0xb3, 0x54, 0xac,
+ 0x22, 0x7e, 0xa3, 0x56, 0x21, 0x74, 0x5, 0xa4, 0x22, 0x9e, 0x55, 0x2e, 0xbe,
+ 0x54, 0x0, 0x0, 0x22, 0xa, 0x2d, 0x7e, 0x34, 0x2, 0xd8, 0xad, 0x32, 0x22,
+ 0x6d, 0x22, 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x74, 0x3, 0x22, 0x2d, 0x17, 0x7e,
+ 0xb, 0x50, 0x19, 0x56, 0x37, 0x1a, 0x22, 0x2d, 0x17, 0x7e, 0xb, 0x50, 0x19,
+ 0x56, 0x35, 0xad, 0x22, 0x7e, 0x73, 0x74, 0xb, 0x6c, 0x66, 0x5c, 0x75, 0x4d,
+ 0x33, 0x22, 0x30, 0x18, 0x42, 0x30, 0x19, 0x11, 0x12, 0xf0, 0xf9, 0x68, 0x9,
+ 0x12, 0x78, 0x8d, 0x7e, 0xb3, 0x56, 0x8d, 0x70, 0xfa, 0x12, 0x46, 0x8f,
+ 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x2, 0x27, 0x7e, 0xb3, 0x56, 0x21, 0x7e, 0x24,
+ 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73, 0x74, 0xa,
+ 0x12, 0x46, 0x42, 0x78, 0x5, 0x12, 0x46, 0x3e, 0x68, 0x7, 0x74, 0x1, 0x7a,
+ 0xb3, 0x54, 0xf7, 0x22, 0x2, 0x46, 0x8f, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0xf6,
+ 0x12, 0xf1, 0x5, 0x12, 0xef, 0x39, 0x7a, 0xb3, 0x54, 0xff, 0xc2, 0x2, 0x12,
+ 0x2f, 0xd7, 0x12, 0xe2, 0x23, 0x40, 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6,
+ 0xd2, 0x2, 0x2, 0x2f, 0xd7, 0x12, 0x46, 0x8f, 0xd2, 0x2, 0x12, 0x7f, 0x99,
+ 0x80, 0x11, 0x12, 0xf2, 0x6a, 0x40, 0x3, 0x12, 0x7f, 0xc4, 0x30, 0xd, 0x3,
+ 0x12, 0x7f, 0xc4, 0x12, 0x47, 0x90, 0x7e, 0xb3, 0x54, 0xf6, 0xbe, 0xb0, 0x1,
+ 0x68, 0xe6, 0x30, 0x2, 0x3, 0x2, 0x76, 0x9c, 0x22, 0x20, 0x1c, 0x2, 0xe1,
+ 0x61, 0xc2, 0x1c, 0x12, 0x57, 0xf9, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x7e, 0x73,
+ 0x54, 0x90, 0xbe, 0x73, 0x56, 0x21, 0x68, 0x9, 0x7a, 0x73, 0x56, 0x21, 0xd2,
+ 0x0, 0x12, 0x47, 0x7f, 0x7e, 0xb3, 0x54, 0x7e, 0xbe, 0xb3, 0x68, 0xaa, 0x68,
+ 0x14, 0x54, 0x7, 0x7a, 0xb3, 0x54, 0x7e, 0x7e, 0x73, 0x54, 0x7e, 0x7a, 0x73,
+ 0x68, 0xaa, 0x12, 0x91, 0x95, 0x12, 0x0, 0x1a, 0x7e, 0xb3, 0x54, 0x7f, 0xbe,
+ 0xb3, 0x68, 0xab, 0x68, 0x14, 0x54, 0x7, 0x7a, 0xb3, 0x54, 0x7f, 0x7e, 0x73,
+ 0x54, 0x7f, 0x7a, 0x73, 0x68, 0xab, 0x12, 0x91, 0x95, 0x12, 0x0, 0x1a, 0x7e,
+ 0xb3, 0x54, 0x6e, 0x54, 0xfe, 0x7a, 0xb3, 0x54, 0x6e, 0x7e, 0xb3, 0x54,
+ 0xa9, 0xb4, 0x1, 0x3, 0x12, 0x59, 0x4e, 0x7e, 0xb3, 0x54, 0x6f, 0x60, 0x8,
+ 0x12, 0x70, 0x34, 0xe4, 0x7a, 0xb3, 0x39, 0xd5, 0x12, 0x46, 0x8f, 0x7e,
+ 0x37, 0x39, 0xcb, 0x4d, 0x33, 0x68, 0x15, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12,
+ 0x37, 0xfe, 0x7e, 0xb3, 0x54, 0x6e, 0x54, 0xfd, 0x7a, 0xb3, 0x54, 0x6e, 0x2,
+ 0x46, 0x8f, 0x22, 0x12, 0x64, 0xa4, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x6d,
+ 0xbd, 0x12, 0x78, 0xfc, 0x2, 0x45, 0x56, 0x30, 0x27, 0x3d, 0x12, 0x77, 0x54,
+ 0x5e, 0x34, 0x8, 0x0, 0x78, 0x34, 0xc2, 0x27, 0x7e, 0x34, 0x28, 0x0, 0x12,
+ 0x58, 0x35, 0x7e, 0x34, 0x10, 0x0, 0x12, 0x58, 0x35, 0x7e, 0x34, 0xf7, 0x0,
+ 0x74, 0x5a, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0xf7, 0x1, 0x74, 0xa5, 0x12, 0x47,
+ 0xd1, 0x7e, 0x34, 0xf7, 0x2, 0x74, 0x95, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0xf7,
+ 0x3, 0x74, 0x27, 0x2, 0x47, 0xd1, 0x22, 0x12, 0xef, 0x78, 0xa, 0x3b, 0x7e,
+ 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x8, 0x12, 0xee, 0x9f, 0x80, 0xa, 0x12,
+ 0xef, 0xf2, 0x68, 0x5, 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xf0, 0x90, 0x68,
+ 0xf1, 0x12, 0xef, 0x6b, 0x12, 0xef, 0x51, 0x78, 0xfb, 0x2, 0x47, 0xfd, 0x6d,
+ 0x33, 0x1b, 0xa, 0x30, 0xc2, 0xcc, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0x7b,
+ 0xb, 0x36, 0xbe, 0x34, 0x0, 0x6, 0x50, 0x2, 0xc3, 0x22, 0xd3, 0x22, 0x7c,
+ 0x2b, 0xa5, 0xba, 0x0, 0x3, 0x2, 0x88, 0x9a, 0xa5, 0xba, 0x5f, 0x5, 0x7e,
+ 0xb3, 0x54, 0xbf, 0x22, 0xbe, 0x20, 0x5c, 0x38, 0x7, 0xa, 0x32, 0x9, 0xb3,
+ 0x54, 0x60, 0x22, 0xbe, 0x20, 0x6a, 0x68, 0x4, 0xa5, 0xba, 0x6b, 0x1d, 0x7e,
+ 0x37, 0x39, 0xac, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xac, 0x2e, 0x37,
+ 0x39, 0xe4, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x6b, 0x3, 0x75, 0xf, 0x6a, 0x7c,
+ 0xb3, 0x22, 0xbe, 0x20, 0x6e, 0x68, 0x4, 0xa5, 0xba, 0x6f, 0x2d, 0x7e, 0x7,
+ 0x74, 0xc, 0xbe, 0x7, 0x39, 0xa8, 0x7e, 0x37, 0x39, 0xa8, 0x28, 0x8, 0x12,
+ 0x49, 0xda, 0x5e, 0x30, 0x3f, 0x80, 0x3, 0x12, 0x49, 0xda, 0x7e, 0x7, 0x39,
+ 0xa8, 0xb, 0x4, 0x7a, 0x7, 0x39, 0xa8, 0xa5, 0xba, 0x6f, 0x3, 0x75, 0xf,
+ 0x6e, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x6c, 0x68, 0x4, 0xa5, 0xba, 0x6d, 0x1d,
+ 0x7e, 0x37, 0x39, 0xe0, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xe0, 0x2e,
+ 0x37, 0x39, 0xc6, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x6d, 0x3, 0x75, 0xf, 0x6c,
+ 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x89, 0x68, 0x4, 0xa5, 0xba, 0x8a, 0x1d, 0x7e,
+ 0x37, 0x39, 0xea, 0x7d, 0x23, 0xb, 0x24, 0x7a, 0x27, 0x39, 0xea, 0x2e, 0x37,
+ 0x39, 0xe6, 0x7e, 0x39, 0x30, 0xa5, 0xba, 0x8a, 0x3, 0x75, 0xf, 0x89, 0x7c,
+ 0xb3, 0x22, 0xa5, 0xba, 0x10, 0x7, 0x7e, 0x33, 0x54, 0x70, 0x7c, 0xb3, 0x22,
+ 0xbe, 0x20, 0x8b, 0x68, 0x4, 0xa5, 0xba, 0x8c, 0xd, 0x12, 0x4b, 0x35, 0xa5,
+ 0xba, 0x8c, 0x3, 0x75, 0xf, 0x8b, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x8d, 0x68,
+ 0x4, 0xa5, 0xba, 0x8e, 0xd, 0x12, 0x4b, 0x35, 0xa5, 0xba, 0x8e, 0x3, 0x75,
+ 0xf, 0x8d, 0x7c, 0xb3, 0x22, 0xbe, 0x20, 0x70, 0x40, 0xa, 0xbe, 0x20, 0x7f,
+ 0x38, 0x5, 0x7c, 0xb2, 0x2, 0x76, 0xc3, 0xbe, 0x20, 0x81, 0x68, 0x4, 0xa5,
+ 0xba, 0x82, 0x20, 0x7e, 0xa3, 0x54, 0x77, 0xa, 0x3a, 0x2e, 0x34, 0x1, 0x20,
+ 0x12, 0x49, 0xe4, 0x7c, 0x3b, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x54, 0x77, 0xa5,
+ 0xba, 0x82, 0x3, 0x75, 0xf, 0x81, 0x7c, 0xb3, 0x22, 0xa5, 0xba, 0x83, 0x5,
+ 0x7e, 0xb3, 0x39, 0xb0, 0x22, 0xa5, 0xba, 0x86, 0x5, 0x7e, 0xb3, 0x39, 0xb4,
+ 0x22, 0xa5, 0xba, 0x87, 0x5, 0x7e, 0xb3, 0x39, 0xa4, 0x22, 0xa5, 0xba, 0x88,
+ 0x3, 0xe5, 0xc4, 0x22, 0xbe, 0x20, 0x92, 0x68, 0x4, 0xa5, 0xba, 0x93, 0x13,
+ 0x7e, 0xb3, 0x39, 0xb1, 0xa, 0x3b, 0x9, 0x33, 0x39, 0xd6, 0xa5, 0xba, 0x93,
+ 0x3, 0x75, 0xf, 0x92, 0x80, 0x1a, 0xbe, 0x20, 0x94, 0x68, 0x4, 0xa5, 0xba,
+ 0x95, 0x19, 0x7e, 0xb3, 0x39, 0xb1, 0xa, 0x3b, 0x9, 0x33, 0x39, 0xb9, 0xa5,
+ 0xba, 0x95, 0x3, 0x75, 0xf, 0x94, 0x4, 0x7a, 0xb3, 0x39, 0xb1, 0x7c, 0xb3,
+ 0x22, 0xa5, 0xba, 0xed, 0x5, 0x7e, 0xb3, 0x39, 0xd4, 0x22, 0xa5, 0xba, 0xee,
+ 0x5, 0x7e, 0xb3, 0x39, 0xce, 0x22, 0xa5, 0xba, 0xef, 0x5, 0x7e, 0xb3, 0x39,
+ 0xcf, 0x22, 0xa5, 0xba, 0xfe, 0xd, 0x7e, 0x23, 0x56, 0x21, 0x74, 0x8, 0xac,
+ 0xb2, 0x9, 0xb5, 0x3, 0xac, 0x22, 0xe4, 0x22, 0x2e, 0x37, 0x39, 0xdc, 0x7e,
+ 0x39, 0x30, 0x22, 0x7d, 0x3b, 0x7a, 0x71, 0x82, 0x7a, 0x61, 0x83, 0xe4,
+ 0x93, 0x22, 0xca, 0xf8, 0x6c, 0xff, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xbf, 0x7e,
+ 0xb4, 0xd, 0x10, 0x12, 0x49, 0xe2, 0x7c, 0x7b, 0x1e, 0x70, 0x7a, 0x73, 0x68,
+ 0x86, 0x7e, 0xa4, 0x0, 0x96, 0x7a, 0xa7, 0x68, 0x87, 0x7e, 0x34, 0x0, 0x78,
+ 0x7a, 0x37, 0x68, 0x89, 0x12, 0xc0, 0xc1, 0x6c, 0xaa, 0x80, 0x31, 0x12,
+ 0xdc, 0x9f, 0xbe, 0xb0, 0x0, 0x28, 0x27, 0xa, 0x2b, 0x7e, 0xb3, 0x68, 0xa8,
+ 0xa, 0x3b, 0x1b, 0x34, 0xbd, 0x23, 0x58, 0x19, 0x9, 0xb4, 0x65, 0x61, 0xbe,
+ 0xb0, 0x0, 0x28, 0x10, 0xa, 0x2b, 0x7e, 0xb3, 0x68, 0xa9, 0xa, 0x3b, 0x1b,
+ 0x34, 0xbd, 0x23, 0x58, 0x2, 0xb, 0xf0, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xea,
+ 0xbc, 0xba, 0x38, 0xc7, 0x7a, 0xf3, 0x66, 0xea, 0xbe, 0xf0, 0x0, 0x38, 0x2,
+ 0x61, 0x4, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x2, 0x61, 0x4, 0x7e, 0x73, 0x66,
+ 0xea, 0xbe, 0x70, 0x8, 0x28, 0x1a, 0x12, 0xaf, 0xab, 0x58, 0x15, 0x12, 0x49,
+ 0xe2, 0x7c, 0x7b, 0x1e, 0x70, 0xa, 0x37, 0x7d, 0x2a, 0x7e, 0x14, 0x0, 0x78,
+ 0x7e, 0x4, 0x0, 0x82, 0x80, 0x71, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x5,
+ 0x28, 0x24, 0x7e, 0x37, 0x66, 0xf0, 0xbe, 0x34, 0x2, 0x26, 0x58, 0x1a, 0x7e,
+ 0x73, 0x56, 0xb7, 0xbe, 0x70, 0xf, 0x50, 0x11, 0x12, 0x49, 0xe2, 0xa, 0x3b,
+ 0x7e, 0x24, 0x0, 0xa0, 0x7e, 0x14, 0x0, 0x82, 0x7d, 0xa, 0x80, 0x44, 0x12,
+ 0xdc, 0x97, 0x28, 0x1b, 0x7e, 0x37, 0x66, 0xf0, 0xbe, 0x34, 0x3, 0x20, 0x58,
+ 0x11, 0x12, 0x49, 0xe2, 0xa, 0x3b, 0x7e, 0x24, 0x0, 0xb4, 0x7d, 0x1a, 0x7e,
+ 0x4, 0x0, 0xc8, 0x80, 0x24, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x2, 0x28,
+ 0x22, 0x7e, 0xa7, 0x66, 0xf0, 0xbe, 0xa4, 0x3, 0x84, 0x58, 0x18, 0x12, 0x49,
+ 0xe2, 0xa, 0x3b, 0x7e, 0x24, 0x0, 0xc8, 0x7e, 0x14, 0x0, 0xa0, 0x7e, 0x4,
+ 0x0, 0xe6, 0x12, 0x4b, 0x49, 0x80, 0x7, 0x80, 0x0, 0xe4, 0x7a, 0xb3, 0x56,
+ 0xbf, 0x7e, 0xb3, 0x56, 0xbf, 0x70, 0x21, 0x90, 0xd, 0x10, 0xe4, 0x93, 0xa,
+ 0x3b, 0x12, 0xa7, 0x95, 0x7e, 0x14, 0xd, 0x1a, 0x12, 0x4f, 0x69, 0x7e, 0x54,
+ 0xd, 0x26, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x0, 0x12, 0x4b, 0x49, 0x80,
+ 0x2, 0xd2, 0x1d, 0xda, 0xf8, 0x22, 0x7e, 0x37, 0x39, 0xe2, 0x7d, 0x23, 0xb,
+ 0x24, 0x7a, 0x27, 0x39, 0xe2, 0x2e, 0x37, 0x39, 0xc4, 0x7e, 0x39, 0x30,
+ 0x22, 0x7a, 0x73, 0x68, 0x86, 0x7a, 0x27, 0x68, 0x87, 0x7a, 0x17, 0x68,
+ 0x89, 0x7a, 0x7, 0x68, 0x93, 0x6d, 0x33, 0x9d, 0x30, 0x12, 0x4b, 0x91, 0x12,
+ 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, 0x22, 0x7a, 0x37, 0x68, 0x89, 0xe4,
+ 0x7a, 0xb3, 0x56, 0xbf, 0x7e, 0x34, 0xd, 0x26, 0x7e, 0x24, 0x0, 0xff, 0xb,
+ 0x1a, 0x30, 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xd, 0x28, 0x7e, 0x24, 0x0,
+ 0xff, 0xb, 0x1a, 0x30, 0x6e, 0x34, 0xff, 0xff, 0xb, 0x34, 0x7a, 0x37, 0x68,
+ 0x95, 0x7e, 0x37, 0x68, 0x87, 0x1e, 0x34, 0x1e, 0x34, 0x1e, 0x34, 0x1e,
+ 0x34, 0x1e, 0x34, 0x22, 0xca, 0x79, 0x7e, 0x97, 0x68, 0xad, 0x7a, 0x97,
+ 0x2e, 0x79, 0x7e, 0xf3, 0x68, 0xa7, 0x6d, 0xaa, 0x74, 0x4, 0xac, 0xbf, 0x7a,
+ 0x57, 0x2e, 0x7b, 0x7d, 0x85, 0x2e, 0x87, 0x2e, 0x79, 0x7a, 0x87, 0x2e,
+ 0x7d, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x81, 0x0, 0x18, 0x7a, 0x87, 0x2e, 0x77,
+ 0x7e, 0xe3, 0x68, 0xa4, 0x12, 0x4f, 0xf5, 0x6d, 0x88, 0xa1, 0x4, 0x7e, 0x8,
+ 0x2e, 0x7f, 0x12, 0x4f, 0x71, 0x12, 0x88, 0x14, 0x6d, 0xbb, 0xa, 0x3f, 0xad,
+ 0x3b, 0x2d, 0x3a, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb,
+ 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x12, 0x4d, 0x6c, 0xbe, 0xb4, 0x0, 0x4, 0x78,
+ 0xe2, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x2e, 0x37, 0x2e, 0x7b, 0x12, 0x4d,
+ 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b,
+ 0x12, 0x4d, 0x6c, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xe0, 0x6d, 0xbb, 0xa, 0x3f,
+ 0xad, 0x3b, 0x2d, 0x39, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78,
+ 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, 0x34, 0x2e, 0xad,
+ 0x12, 0x4d, 0x72, 0xbe, 0xb4, 0x0, 0x4, 0x78, 0xdc, 0x6d, 0xbb, 0xa, 0x3f,
+ 0xad, 0x3b, 0x2e, 0x37, 0x2e, 0x7d, 0x12, 0x4d, 0x7d, 0x60, 0x5, 0x3e, 0x24,
+ 0x14, 0x78, 0xfb, 0x7d, 0x3f, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e, 0x34,
+ 0x2e, 0xad, 0x12, 0x4d, 0x72, 0xbe, 0xb4, 0x0, 0x5, 0x78, 0xda, 0x12, 0x4f,
+ 0xa4, 0x7e, 0x8, 0x2e, 0x7f, 0x12, 0x40, 0xba, 0x12, 0x4f, 0xa4, 0x7e, 0x8,
+ 0x2e, 0xad, 0x12, 0x40, 0x57, 0x12, 0x78, 0x51, 0x30, 0x11, 0xf, 0x7e, 0x8,
+ 0x3a, 0x0, 0x7e, 0x34, 0x5, 0x20, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x80, 0x6c,
+ 0xa9, 0xd7, 0xea, 0x6d, 0xbb, 0xa, 0x3f, 0xad, 0x3b, 0x7d, 0x23, 0x2d, 0x2a,
+ 0x12, 0x4f, 0xde, 0x2d, 0xa, 0x12, 0x4f, 0x92, 0x2d, 0x29, 0x3e, 0x24, 0x59,
+ 0x32, 0x3a, 0x0, 0x12, 0x4f, 0x41, 0x78, 0xe3, 0x6d, 0xbb, 0xa, 0x3f, 0xad,
+ 0x3b, 0x7d, 0x23, 0x2e, 0x27, 0x2e, 0x7b, 0x12, 0x4f, 0xde, 0x2e, 0x7, 0x2e,
+ 0x7b, 0x12, 0x4f, 0x92, 0x2e, 0x27, 0x2e, 0x7d, 0x3e, 0x24, 0x59, 0x32,
+ 0x3a, 0x0, 0x12, 0x4f, 0x48, 0x78, 0xdd, 0xa9, 0xc7, 0xea, 0xb, 0xa4, 0x7e,
+ 0x37, 0x2e, 0x7b, 0xb, 0x34, 0x7a, 0x37, 0x2e, 0x7b, 0xb, 0x94, 0x7e, 0x37,
+ 0x2e, 0x7d, 0xb, 0x34, 0x7a, 0x37, 0x2e, 0x7d, 0xb, 0x84, 0xa, 0x3f, 0xbd,
+ 0x38, 0x28, 0x2, 0x61, 0xdd, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60, 0x56, 0x6d,
+ 0x88, 0x7d, 0xa8, 0xa, 0x2e, 0x1b, 0x24, 0xa, 0x3f, 0xad, 0x32, 0x7d, 0x93,
+ 0x2e, 0x97, 0x2e, 0x79, 0x80, 0x3c, 0x6d, 0xbb, 0x80, 0x2c, 0xa, 0x5f, 0xad,
+ 0x5b, 0x7d, 0x15, 0x2d, 0x1a, 0x3e, 0x14, 0x49, 0x31, 0x3a, 0x0, 0x7d, 0x29,
+ 0x9d, 0x25, 0x3e, 0x24, 0x49, 0x22, 0x3a, 0x0, 0x59, 0x21, 0x3a, 0x0, 0xa,
+ 0x5f, 0xad, 0x5b, 0x7d, 0x19, 0x9d, 0x15, 0x3e, 0x14, 0x59, 0x31, 0x3a, 0x0,
+ 0xb, 0xb4, 0xa, 0x1e, 0xbd, 0x1b, 0x38, 0xce, 0xb, 0xa4, 0xb, 0x94, 0xb,
+ 0x84, 0xa, 0x3f, 0xbd, 0x38, 0x38, 0xbe, 0xda, 0x79, 0x22, 0x3e, 0x34, 0x2e,
+ 0x34, 0x2e, 0x7f, 0xb, 0x38, 0xe0, 0x4d, 0xe2, 0x1b, 0x38, 0xe0, 0xb, 0xb4,
+ 0x22, 0x3e, 0x34, 0x2e, 0x34, 0x7, 0x4d, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a,
+ 0xf0, 0x7d, 0x5f, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x22, 0xca,
+ 0x3b, 0x12, 0xf0, 0x37, 0x60, 0xa, 0x7e, 0x97, 0x68, 0xaf, 0x7e, 0x87, 0x68,
+ 0xad, 0x80, 0x8, 0x7e, 0x97, 0x68, 0xad, 0x7e, 0x87, 0x68, 0xaf, 0x7d, 0xf8,
+ 0x2d, 0xf9, 0x7e, 0x8, 0x2f, 0xe9, 0x12, 0x4f, 0x71, 0x6d, 0xbb, 0x80, 0x38,
+ 0x12, 0x4f, 0x84, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, 0x60, 0x5, 0x3e,
+ 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e,
+ 0x34, 0x30, 0x17, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4d, 0x8c, 0x60, 0x5, 0x3e,
+ 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e, 0x34, 0x2e,
+ 0x34, 0x2f, 0xe9, 0x12, 0x4d, 0x72, 0xbd, 0x9b, 0x38, 0xc4, 0x7d, 0xb9,
+ 0x80, 0x38, 0x12, 0x4f, 0x84, 0x60, 0x19, 0x7d, 0x5a, 0x12, 0x4d, 0x8c,
+ 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e,
+ 0x34, 0x2e, 0x34, 0x2f, 0xe9, 0x80, 0x17, 0x7d, 0x5a, 0x12, 0x4d, 0x8c,
+ 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7d, 0x3a, 0x12, 0x4b, 0x9b, 0x3e,
+ 0x34, 0x2e, 0x34, 0x30, 0x17, 0x12, 0x4d, 0x72, 0xbd, 0xfb, 0x38, 0xc4,
+ 0x6d, 0xbb, 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x14, 0x0, 0x1, 0x7d, 0x31, 0x60,
+ 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68, 0xaa, 0xa, 0x5, 0x5d,
+ 0x3, 0x68, 0x21, 0x7d, 0xb, 0x3e, 0x4, 0x49, 0xa0, 0x68, 0xb9, 0x7d, 0x5a,
+ 0x5e, 0x54, 0x0, 0xf, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f,
+ 0x58, 0x3e, 0x24, 0x2e, 0x24, 0x2f, 0xe9, 0x12, 0x4f, 0x4f, 0x12, 0x4f,
+ 0x41, 0x78, 0xbf, 0x7e, 0x37, 0x30, 0x23, 0x5e, 0x60, 0xdf, 0x7a, 0x37,
+ 0x30, 0x23, 0x7e, 0x37, 0x30, 0x1b, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x30,
+ 0x1b, 0x7e, 0x37, 0x30, 0x17, 0x5e, 0x70, 0xfe, 0x7a, 0x37, 0x30, 0x17,
+ 0x7e, 0x37, 0x2f, 0xe9, 0x5e, 0x70, 0xfe, 0x7a, 0x37, 0x2f, 0xe9, 0x7e,
+ 0x37, 0x2f, 0xed, 0x5e, 0x70, 0xef, 0x7a, 0x37, 0x2f, 0xed, 0x7e, 0x37,
+ 0x2f, 0xf5, 0x5e, 0x60, 0xdf, 0x7a, 0x37, 0x2f, 0xf5, 0x6d, 0x33, 0x7d,
+ 0xa3, 0x7d, 0xb3, 0x7e, 0x53, 0x3, 0xba, 0xa, 0x15, 0xbd, 0x1a, 0x28, 0x6,
+ 0xa, 0x25, 0x7d, 0xa2, 0x80, 0x0, 0x12, 0x4f, 0x41, 0x78, 0xeb, 0xbe, 0xa4,
+ 0x0, 0x5, 0x78, 0x3c, 0x7d, 0xb3, 0x7d, 0xab, 0x2e, 0xa4, 0x1, 0x24, 0x12,
+ 0x4f, 0x79, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f, 0x58, 0x3e,
+ 0x24, 0x2e, 0x24, 0x2f, 0xe9, 0x12, 0x4f, 0x4f, 0x12, 0x4f, 0x79, 0x60, 0x5,
+ 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x12, 0x4f, 0x58, 0x3e, 0x24, 0x2e, 0x24,
+ 0x30, 0x17, 0x12, 0x4f, 0x4f, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x24, 0x78, 0xc6,
+ 0x6d, 0xbb, 0x7e, 0x74, 0x0, 0xee, 0xad, 0x7b, 0x2e, 0x74, 0x1, 0x1e, 0x7d,
+ 0x37, 0x7e, 0x8, 0x2f, 0xe9, 0x12, 0x40, 0xba, 0x7d, 0x37, 0x7e, 0x8, 0x30,
+ 0x17, 0x12, 0x40, 0x57, 0x12, 0x4f, 0x41, 0x40, 0xdf, 0xda, 0x3b, 0x22, 0xb,
+ 0xb4, 0xbe, 0xb4, 0x0, 0x4, 0x22, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x5, 0x22,
+ 0xb, 0x28, 0x30, 0x4d, 0x31, 0x1b, 0x28, 0x30, 0x22, 0x7d, 0x2a, 0x1e, 0x24,
+ 0x1e, 0x24, 0x1e, 0x24, 0x1e, 0x24, 0x22, 0x12, 0xd7, 0xb0, 0x2, 0x49, 0xed,
+ 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x10, 0x22, 0x7e, 0x34, 0x0, 0x5c, 0xe4,
+ 0x2, 0x0, 0x2e, 0x7d, 0x5a, 0x5e, 0x54, 0x0, 0xf, 0x7e, 0x14, 0x0, 0x1,
+ 0x22, 0x7d, 0xeb, 0x3e, 0xe4, 0x49, 0xae, 0x68, 0xc9, 0x90, 0x1, 0x90, 0xe4,
+ 0x93, 0x22, 0x2e, 0x7, 0x2e, 0x77, 0x3e, 0x4, 0x7e, 0x1f, 0x35, 0xa5, 0x2d,
+ 0x30, 0xb, 0x1a, 0x30, 0x7d, 0x21, 0x22, 0x7e, 0x63, 0x39, 0xb3, 0x7e, 0x70,
+ 0xee, 0xac, 0x67, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0, 0x1e, 0x22, 0x7a,
+ 0x73, 0x53, 0xee, 0x7e, 0x37, 0x68, 0x89, 0xe, 0x34, 0xe, 0x34, 0xe, 0x34,
+ 0xe, 0x34, 0xe, 0x34, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x12,
+ 0x32, 0xce, 0x12, 0x4b, 0x68, 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef,
+ 0x22, 0x3e, 0x24, 0x7e, 0xf, 0x35, 0xa5, 0x2d, 0x12, 0x69, 0x30, 0x0, 0x1a,
+ 0x59, 0x32, 0x3a, 0x0, 0xa, 0x1f, 0xad, 0x1b, 0x7d, 0x1, 0x22, 0x7e, 0x34,
+ 0x0, 0x32, 0x2, 0x58, 0x3d, 0x7e, 0xb3, 0x39, 0xd4, 0xb4, 0x1, 0xe, 0x12,
+ 0x50, 0x70, 0x7e, 0x37, 0x39, 0xe4, 0x12, 0x50, 0x12, 0x7a, 0x73, 0x39,
+ 0xcf, 0x22, 0xe4, 0x12, 0x50, 0x1d, 0xa, 0x26, 0x7a, 0x53, 0x39, 0xce, 0x22,
+ 0xa9, 0xd6, 0xcb, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0, 0x4, 0x7e, 0x37,
+ 0x56, 0xba, 0x59, 0x23, 0x0, 0xc, 0x12, 0x55, 0x23, 0x7e, 0x34, 0x0, 0x90,
+ 0x12, 0x54, 0x57, 0x49, 0x33, 0x0, 0x2c, 0xa9, 0xc6, 0xcb, 0x22, 0x7e, 0xb3,
+ 0x39, 0xd4, 0xb4, 0x4, 0xe, 0x12, 0x50, 0x70, 0x7e, 0x34, 0x3a, 0x0, 0x12,
+ 0x50, 0x12, 0x7a, 0x73, 0x39, 0xcf, 0x22, 0x7e, 0xb3, 0x39, 0xd4, 0xb4, 0x2,
+ 0x10, 0x12, 0x50, 0x70, 0x7e, 0x37, 0x39, 0xdc, 0x1e, 0x24, 0x12, 0x50,
+ 0x12, 0x7a, 0x73, 0x39, 0xcf, 0x22, 0x7e, 0x27, 0x74, 0xc, 0xb, 0x26, 0x22,
+ 0x12, 0x67, 0xc3, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x3, 0x2, 0x80, 0x2, 0x21,
+ 0x20, 0x74, 0x4, 0x12, 0x89, 0x32, 0x12, 0x46, 0xde, 0x12, 0x5a, 0x7a, 0x12,
+ 0x5a, 0xa4, 0x7e, 0xb3, 0x54, 0x60, 0x20, 0xe7, 0x7, 0x7e, 0xb3, 0x54, 0x71,
+ 0xb4, 0x1, 0x77, 0x12, 0x51, 0x2d, 0x68, 0x5, 0xc2, 0x2, 0x12, 0x46, 0xb8,
+ 0x12, 0x2f, 0xb2, 0x30, 0x10, 0xa, 0xc2, 0x10, 0xd2, 0x0, 0x12, 0x47, 0x7f,
+ 0x12, 0x46, 0x8f, 0x12, 0x51, 0x2d, 0x68, 0x5, 0x12, 0x97, 0x12, 0x80, 0xe,
+ 0x12, 0x93, 0xf9, 0x7e, 0xb3, 0x54, 0x8c, 0x7e, 0x73, 0x56, 0x27, 0x12,
+ 0x97, 0x32, 0x7e, 0xb3, 0x74, 0x9, 0xb4, 0x1, 0x29, 0x12, 0x97, 0xaa, 0x12,
+ 0xaf, 0xbf, 0x12, 0x9b, 0x18, 0x12, 0x34, 0xc, 0x7e, 0xb3, 0x54, 0x66, 0x70,
+ 0x17, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x11, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a,
+ 0x1d, 0x27, 0x7e, 0x1f, 0x2d, 0x2e, 0x7f, 0x1, 0xe4, 0x12, 0x9b, 0xce, 0x12,
+ 0x51, 0x35, 0x12, 0x51, 0x2d, 0x68, 0xd, 0x12, 0x4f, 0xfc, 0x7e, 0xb3, 0x54,
+ 0x60, 0x54, 0x7f, 0x7a, 0xb3, 0x54, 0x60, 0x12, 0x50, 0x58, 0x12, 0x77,
+ 0x7b, 0x1, 0x7a, 0xd2, 0x29, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x0, 0xe,
+ 0x2, 0x34, 0x3, 0x7e, 0xb3, 0x54, 0x71, 0xbe, 0xb0, 0x1, 0x22, 0xca, 0x3b,
+ 0x7e, 0xd4, 0x3a, 0x0, 0x7e, 0xb3, 0x54, 0x71, 0xb4, 0x1, 0x2, 0x80, 0x2,
+ 0x61, 0xe2, 0x12, 0xf1, 0x1c, 0x7e, 0xb3, 0x39, 0xef, 0x60, 0x11, 0x7e,
+ 0xb3, 0x39, 0xf0, 0xbe, 0xb0, 0x2, 0x50, 0x3, 0x4, 0x61, 0xdc, 0xe4, 0x7a,
+ 0xb3, 0x39, 0xef, 0x7e, 0xc7, 0x39, 0xed, 0x4d, 0xcc, 0x78, 0x2f, 0x7d,
+ 0x1d, 0x6d, 0x0, 0x12, 0x91, 0x3, 0x7d, 0x1d, 0x2e, 0x14, 0x5, 0x20, 0x12,
+ 0x53, 0xfa, 0x12, 0x0, 0x2e, 0x7d, 0x1d, 0x2e, 0x14, 0xa, 0x40, 0x12, 0x53,
+ 0xfa, 0x74, 0x88, 0x12, 0x0, 0x2e, 0x7d, 0x1d, 0x2e, 0x14, 0xf, 0x60, 0x12,
+ 0x53, 0xfa, 0x74, 0x77, 0x12, 0x0, 0x2e, 0x7e, 0xf7, 0x39, 0xed, 0xb, 0xf4,
+ 0x7a, 0xf7, 0x39, 0xed, 0x7e, 0xb3, 0x54, 0x73, 0x4, 0x7a, 0xb3, 0x54, 0x73,
+ 0x7e, 0xd3, 0x68, 0xa7, 0x7e, 0xc3, 0x68, 0xa6, 0x7a, 0xd3, 0x2e, 0x78,
+ 0x7a, 0xc3, 0x2e, 0x77, 0xe4, 0x7a, 0xb3, 0x2e, 0x79, 0x12, 0x54, 0x1, 0x7e,
+ 0xf4, 0x0, 0xe0, 0x7a, 0xf7, 0x2e, 0x81, 0x7e, 0x1f, 0x2d, 0x2e, 0x7d, 0xf3,
+ 0x7a, 0xf7, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2e, 0x7d, 0xf3, 0x7a, 0xf7,
+ 0x2e, 0x7d, 0x7d, 0xfd, 0x12, 0x54, 0x1a, 0x12, 0x55, 0x2, 0x6d, 0xff, 0x7e,
+ 0xc7, 0x74, 0xc, 0x2d, 0xcf, 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c,
+ 0xb, 0x1a, 0x30, 0xad, 0x33, 0x2d, 0xcd, 0x1b, 0xc8, 0x30, 0x12, 0x53, 0xf3,
+ 0x78, 0xe3, 0x6d, 0xff, 0x7d, 0xcf, 0x3e, 0xc4, 0x2d, 0xcd, 0x49, 0xcc, 0x5,
+ 0x20, 0xbe, 0xc4, 0x27, 0x10, 0x28, 0x14, 0x7e, 0x73, 0x54, 0x73, 0xa, 0xc7,
+ 0x5e, 0xc4, 0x0, 0x1, 0x78, 0x8, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xec, 0x80,
+ 0xd, 0xe4, 0x7a, 0xb3, 0x39, 0xec, 0xb, 0xf4, 0xbe, 0xf4, 0x2, 0x90, 0x40,
+ 0xcf, 0x7e, 0x73, 0x39, 0xec, 0x7a, 0x73, 0x2e, 0x79, 0x12, 0x54, 0x1, 0x7e,
+ 0xf4, 0x0, 0x10, 0x7a, 0xf7, 0x2e, 0x81, 0x7d, 0xfd, 0x2e, 0xf4, 0x5, 0x20,
+ 0x7a, 0xf7, 0x2e, 0x7b, 0x7d, 0xfd, 0x7a, 0xf7, 0x2e, 0x7d, 0x2e, 0xf4, 0x5,
+ 0x20, 0x12, 0x54, 0x1a, 0x12, 0x54, 0xe0, 0x6d, 0xff, 0x7e, 0x37, 0x74, 0xc,
+ 0x2d, 0x3f, 0x3e, 0x34, 0x7d, 0xc3, 0x2d, 0xcd, 0xb, 0xc8, 0x10, 0x2e, 0xc4,
+ 0x5, 0x20, 0xb, 0xc8, 0x20, 0x2d, 0x21, 0x1b, 0xc8, 0x20, 0x7e, 0xb3, 0x39,
+ 0xec, 0xb4, 0x1, 0xe, 0x2d, 0x3d, 0x2e, 0x34, 0x5, 0x20, 0xb, 0x38, 0xc0,
+ 0x1e, 0xc4, 0x1b, 0x38, 0xc0, 0x12, 0x53, 0xf3, 0x78, 0xcb, 0xb4, 0x1, 0xa,
+ 0x7e, 0x73, 0x54, 0x73, 0x1e, 0x70, 0x7a, 0x73, 0x54, 0x73, 0x6c, 0xee,
+ 0x80, 0x25, 0x6c, 0xff, 0x80, 0x1b, 0x12, 0x54, 0x30, 0x7d, 0xf3, 0x7d,
+ 0xcf, 0x12, 0x54, 0x41, 0x58, 0x4, 0x59, 0xe3, 0xa, 0x40, 0x12, 0x54, 0x11,
+ 0x8, 0x4, 0x59, 0xec, 0xf, 0x60, 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xe1, 0xb,
+ 0xe0, 0xbc, 0xce, 0x38, 0xd7, 0x6d, 0xff, 0x7e, 0xc7, 0x74, 0xc, 0x2d, 0xcf,
+ 0x12, 0x54, 0x41, 0x58, 0x4, 0x59, 0xe3, 0xa, 0x40, 0x12, 0x54, 0x11, 0x8,
+ 0x4, 0x59, 0xec, 0xf, 0x60, 0x12, 0x53, 0xf3, 0x78, 0xe3, 0x7e, 0xc7, 0x39,
+ 0xe8, 0xbe, 0xc7, 0x39, 0xed, 0x68, 0x2, 0x61, 0xf0, 0x6c, 0xee, 0x80, 0x57,
+ 0x6c, 0xff, 0x80, 0x4d, 0x12, 0x54, 0x30, 0x12, 0x54, 0x23, 0x8, 0x6, 0x49,
+ 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x54, 0x8, 0x8,
+ 0x6, 0x49, 0x3, 0xa, 0x40, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8,
+ 0x12, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16,
+ 0x6d, 0xcc, 0x9d, 0xc1, 0x80, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49,
+ 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40,
+ 0xb, 0xf0, 0xbc, 0xdf, 0x38, 0xaf, 0xb, 0xe0, 0xbc, 0xce, 0x38, 0xa5, 0x6d,
+ 0xff, 0x7e, 0x37, 0x74, 0xc, 0x2d, 0x3f, 0x12, 0x54, 0x23, 0x8, 0x6, 0x49,
+ 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x12, 0x54, 0x8, 0x8,
+ 0x6, 0x49, 0x3, 0xa, 0x40, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x1, 0xbd, 0xc, 0x8,
+ 0x12, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x49, 0xc3, 0xa, 0x40, 0x80, 0x16,
+ 0x6d, 0xcc, 0x9d, 0xc1, 0x80, 0x10, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6, 0x49,
+ 0xc3, 0xf, 0x60, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x59, 0xc3, 0xa, 0x40,
+ 0x12, 0x53, 0xf3, 0x78, 0xad, 0x7d, 0xcd, 0x2e, 0xc4, 0x5, 0x20, 0x7a, 0xc7,
+ 0x39, 0xc4, 0x7d, 0x3d, 0x2e, 0x34, 0xa, 0x40, 0x7a, 0x37, 0x39, 0xe4, 0x74,
+ 0xaa, 0x7a, 0xb3, 0x54, 0x71, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xed, 0x74, 0x1,
+ 0x7a, 0xb3, 0x39, 0xef, 0xe4, 0x7a, 0xb3, 0x39, 0xf0, 0x80, 0xe, 0x7e, 0x37,
+ 0x39, 0xed, 0x4d, 0x33, 0x68, 0x6, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xed, 0xda,
+ 0x3b, 0x22, 0xb, 0xf4, 0xbe, 0xf4, 0x0, 0x4, 0x22, 0x6d, 0x0, 0x7e, 0x34,
+ 0x5, 0x20, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0x7a, 0x22, 0x49, 0x13, 0xa,
+ 0x40, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x2d, 0xcd, 0x49, 0x3c, 0xf, 0x60, 0xbd,
+ 0x3e, 0x22, 0x7a, 0xf7, 0x2e, 0x7f, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0x3e, 0x34,
+ 0x2d, 0x3d, 0x49, 0x23, 0xf, 0x60, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7c, 0xbe,
+ 0x7c, 0x7f, 0x7c, 0xa7, 0x7e, 0x73, 0x68, 0xa7, 0xac, 0x7b, 0xa, 0x2a, 0x2d,
+ 0x32, 0x22, 0x3e, 0xc4, 0x7e, 0x1f, 0x2d, 0x2e, 0x2d, 0x3c, 0xb, 0x1a, 0xe0,
+ 0x7d, 0x3c, 0x2d, 0x3d, 0x49, 0x23, 0xa, 0x40, 0xbd, 0x2e, 0x22, 0x12, 0x54,
+ 0x5f, 0x7e, 0x37, 0x56, 0xba, 0x22, 0x7e, 0xa1, 0xcd, 0x75, 0xcd, 0x0, 0xc2,
+ 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54, 0xc2, 0x20, 0xe2, 0xf7, 0x7d,
+ 0x13, 0x4e, 0x30, 0x1, 0x7e, 0x27, 0x56, 0xba, 0x12, 0x4f, 0x4f, 0x6c, 0x77,
+ 0x0, 0xb, 0x70, 0xa5, 0xbf, 0x8, 0xf9, 0xd2, 0xaf, 0x80, 0x35, 0x7e, 0x27,
+ 0x56, 0xba, 0xb, 0x28, 0x40, 0x7d, 0x14, 0x5e, 0x14, 0x0, 0x8, 0xbe, 0x14,
+ 0x0, 0x8, 0x78, 0x22, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54,
+ 0xc2, 0x20, 0xe2, 0xf7, 0x7d, 0x34, 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0xd2,
+ 0x31, 0x6c, 0x77, 0x0, 0xb, 0x70, 0xa5, 0xbf, 0x8, 0xf9, 0xd2, 0xaf, 0x7e,
+ 0x27, 0x56, 0xba, 0x49, 0x12, 0x0, 0x38, 0x5e, 0x14, 0x80, 0x0, 0x68, 0xbd,
+ 0xb, 0x28, 0x30, 0x4e, 0x60, 0x40, 0x1b, 0x28, 0x30, 0x6d, 0x22, 0x12, 0x55,
+ 0x27, 0x7a, 0xa1, 0xcd, 0x22, 0xa9, 0xd6, 0xcb, 0xc2, 0x31, 0x12, 0x56,
+ 0x43, 0x12, 0x57, 0x77, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x12, 0x55, 0x23,
+ 0x2, 0x54, 0xf7, 0x69, 0x30, 0x0, 0xa, 0x12, 0x54, 0x5f, 0xa9, 0xc6, 0xcb,
+ 0x22, 0x12, 0x56, 0x40, 0x12, 0x57, 0x77, 0x29, 0xb0, 0x0, 0x3, 0x12, 0xf0,
+ 0xc3, 0x7e, 0x37, 0x56, 0xba, 0x1b, 0x38, 0x50, 0x7e, 0x34, 0x0, 0xe0, 0x2,
+ 0x54, 0xfb, 0x29, 0xb0, 0x0, 0x3, 0x54, 0x7, 0x7c, 0x4b, 0x6c, 0x55, 0x7e,
+ 0x37, 0x56, 0xba, 0x1b, 0x38, 0x20, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0,
+ 0x2, 0x12, 0x57, 0xd1, 0x69, 0x30, 0x0, 0x4, 0x12, 0x57, 0xec, 0x12, 0x56,
+ 0x5f, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34, 0x0, 0x60, 0x2, 0x54, 0xfb,
+ 0xca, 0xf8, 0x7f, 0x70, 0x7e, 0x7b, 0xf0, 0x29, 0x77, 0x0, 0x1, 0xbc, 0x7f,
+ 0x28, 0x2, 0x7c, 0xf7, 0x69, 0x17, 0x0, 0x6, 0x6d, 0x0, 0x7e, 0x34, 0x0,
+ 0xf2, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7f, 0x7, 0x12, 0x55, 0x2f, 0xa9, 0xd6,
+ 0xcb, 0x6c, 0xaa, 0x80, 0x2d, 0x6c, 0x77, 0x80, 0x1f, 0x7e, 0x10, 0xb, 0xac,
+ 0x1a, 0xa, 0x17, 0x2d, 0x1, 0x3e, 0x4, 0x69, 0x17, 0x0, 0x6, 0x2d, 0x10,
+ 0x6d, 0x0, 0xb, 0xa, 0x20, 0x6e, 0x24, 0xff, 0xff, 0x1b, 0xa, 0x20, 0xb,
+ 0x70, 0x29, 0x67, 0x0, 0x1, 0xbc, 0x67, 0x38, 0xd9, 0xb, 0xa0, 0x7e, 0x7b,
+ 0x60, 0xbc, 0x6a, 0x38, 0xcc, 0x69, 0x37, 0x0, 0x6, 0x12, 0x57, 0xd1, 0x7c,
+ 0x4f, 0x6c, 0x55, 0xa, 0x3f, 0x12, 0x56, 0x74, 0x6d, 0x22, 0x12, 0x55, 0x27,
+ 0x7e, 0x34, 0x0, 0xd0, 0x12, 0x54, 0x5f, 0x6c, 0xaa, 0xbe, 0xa0, 0x4, 0x50,
+ 0x15, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0x12, 0x56, 0x39, 0x49, 0x44, 0x0, 0x26,
+ 0x60, 0x34, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x2d, 0xbe, 0xa0, 0x8, 0x50,
+ 0x14, 0xa, 0x3a, 0x1b, 0x36, 0x12, 0x56, 0x35, 0x49, 0x44, 0x0, 0x28, 0x60,
+ 0x1b, 0x1e, 0x44, 0x14, 0x78, 0xfb, 0x80, 0x14, 0xa, 0x3a, 0x9e, 0x34, 0x0,
+ 0x8, 0x12, 0x56, 0x35, 0x49, 0x44, 0x0, 0x2a, 0x60, 0x5, 0x1e, 0x44, 0x14,
+ 0x78, 0xfb, 0x5e, 0x44, 0x0, 0xf, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x69, 0x37,
+ 0x0, 0x6, 0x2d, 0x32, 0x6d, 0x22, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0xbe, 0xa0,
+ 0xb, 0x40, 0x9e, 0xa9, 0xc6, 0xcb, 0xda, 0xf8, 0x22, 0x3e, 0x34, 0x3e, 0x34,
+ 0x7c, 0xb7, 0x7e, 0x47, 0x56, 0xba, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0,
+ 0x4, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6,
+ 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e,
+ 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x8, 0x7e, 0xb, 0x70, 0x7c, 0x47, 0x6c,
+ 0x55, 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e, 0x27, 0x56, 0xba,
+ 0x59, 0x32, 0x0, 0xc, 0x22, 0x7f, 0x71, 0x12, 0xee, 0x4b, 0x12, 0xf0, 0x60,
+ 0x12, 0x56, 0x74, 0x7c, 0x4b, 0x6c, 0x55, 0xe5, 0x27, 0xa, 0x3b, 0x4d, 0x32,
+ 0x12, 0x57, 0xe3, 0x29, 0x77, 0x0, 0x2, 0xa, 0x37, 0x12, 0xf0, 0xd8, 0x7e,
+ 0x7b, 0x40, 0x6c, 0x55, 0x4d, 0x23, 0x29, 0x77, 0x0, 0x4, 0x7c, 0x64, 0x4c,
+ 0x75, 0x12, 0x57, 0x7d, 0x29, 0x77, 0x0, 0x1, 0x7c, 0x47, 0x29, 0x77, 0x0,
+ 0x3, 0x7c, 0x64, 0x12, 0x57, 0xda, 0x12, 0x72, 0x28, 0x12, 0xf1, 0x27, 0x6d,
+ 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34, 0x0, 0x30, 0x2, 0x54, 0xfb, 0x7f, 0x71,
+ 0x12, 0x77, 0xc8, 0x12, 0x57, 0xd1, 0x69, 0x30, 0x0, 0x8, 0x12, 0x57, 0xec,
+ 0x12, 0xee, 0x6a, 0x29, 0x70, 0x0, 0x1, 0x7c, 0x47, 0x6c, 0x55, 0x7e, 0xb,
+ 0x70, 0x12, 0x56, 0x72, 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x1b, 0x34, 0x12,
+ 0x57, 0xda, 0x69, 0x30, 0x0, 0xa, 0x12, 0x57, 0x7d, 0x69, 0x30, 0x0, 0xc,
+ 0x12, 0x57, 0xe3, 0x69, 0x30, 0x0, 0xe, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32,
+ 0x0, 0x12, 0x69, 0x30, 0x0, 0x10, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0,
+ 0x30, 0x29, 0x70, 0x0, 0x3, 0x7c, 0x47, 0x12, 0x55, 0x25, 0x7e, 0x34, 0x0,
+ 0xa0, 0x12, 0x54, 0x57, 0x49, 0x23, 0x0, 0x1a, 0x7a, 0x7b, 0x50, 0x49, 0x23,
+ 0x0, 0x1c, 0x39, 0x57, 0x0, 0x1, 0x49, 0x23, 0x0, 0x16, 0x79, 0x27, 0x0,
+ 0x2, 0x49, 0x23, 0x0, 0x18, 0x79, 0x27, 0x0, 0x4, 0x49, 0x23, 0x0, 0x22,
+ 0x79, 0x27, 0x0, 0x6, 0x49, 0x23, 0x0, 0x24, 0x79, 0x27, 0x0, 0x8, 0x49,
+ 0x23, 0x0, 0x1e, 0x79, 0x27, 0x0, 0xa, 0x49, 0x33, 0x0, 0x20, 0x79, 0x37,
+ 0x0, 0xc, 0xa9, 0xc6, 0xcb, 0x22, 0x29, 0x70, 0x0, 0x2, 0xa, 0x37, 0x7e,
+ 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0xe, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x20,
+ 0x0, 0x4, 0x7e, 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0x4, 0x69, 0x20, 0x0,
+ 0x8, 0x7e, 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0x8, 0x7e, 0xb, 0x50, 0xa,
+ 0x55, 0x7c, 0xab, 0xe4, 0x29, 0x50, 0x0, 0x1, 0xa, 0x25, 0x2d, 0x25, 0x7e,
+ 0x57, 0x56, 0xba, 0x59, 0x25, 0x0, 0xc, 0x29, 0x50, 0x0, 0x2, 0xa, 0x25,
+ 0x12, 0xc0, 0xaf, 0x12, 0x57, 0xda, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e,
+ 0x34, 0x0, 0x40, 0x2, 0x54, 0xfb, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0,
+ 0x4, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0xa, 0x22, 0x7e, 0x27,
+ 0x56, 0xba, 0x59, 0x32, 0x0, 0x10, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32,
+ 0x0, 0x6, 0x69, 0x30, 0x0, 0x6, 0x22, 0x7e, 0xa3, 0x54, 0x64, 0xbe, 0xa0,
+ 0x5, 0x78, 0xd, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x64, 0x74, 0x2, 0x7a, 0xb3,
+ 0x54, 0x64, 0x22, 0xbe, 0xa0, 0x4, 0x78, 0x20, 0x74, 0x1, 0x7a, 0xb3, 0x54,
+ 0x64, 0x7e, 0x34, 0xd, 0x14, 0x12, 0x32, 0xdf, 0x12, 0x2d, 0xb1, 0x12, 0x5a,
+ 0x7a, 0x74, 0x2, 0x7a, 0xb3, 0x54, 0x64, 0x7e, 0x34, 0x0, 0xc8, 0x2, 0x58,
+ 0x3d, 0x22, 0xe4, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0x0, 0x46, 0x7d, 0x3, 0x80,
+ 0x14, 0x7e, 0xa0, 0x4, 0x80, 0x7, 0x7e, 0x34, 0x0, 0xfa, 0x12, 0x5e, 0x1b,
+ 0x7c, 0x7a, 0x1b, 0xa0, 0xa5, 0xbf, 0x0, 0xf1, 0x7d, 0x10, 0x1b, 0x4, 0x4d,
+ 0x11, 0x78, 0xe4, 0x22, 0x24, 0xab, 0x68, 0x10, 0x24, 0xef, 0x68, 0x20,
+ 0x24, 0xde, 0x68, 0x2e, 0x24, 0xde, 0x78, 0x3b, 0x74, 0x5, 0x80, 0x39, 0x7e,
+ 0xb3, 0x56, 0xbc, 0xb4, 0x5, 0x36, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d,
+ 0x12, 0xdf, 0x80, 0x2, 0xe1, 0xc2, 0x7e, 0xb3, 0x56, 0xbc, 0xb4, 0x5, 0x22,
+ 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x75, 0xe9, 0xff, 0x22, 0x7e, 0xb3,
+ 0x56, 0xbc, 0xb4, 0x5, 0x10, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d, 0x2,
+ 0x0, 0xf, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xbc, 0x22, 0xc2, 0x0, 0x12, 0x5f,
+ 0x78, 0x68, 0x66, 0x7e, 0x73, 0x56, 0xc0, 0xbe, 0x70, 0xa0, 0x40, 0x5d,
+ 0xe4, 0x7a, 0xb3, 0x56, 0xc0, 0xc2, 0x0, 0x7e, 0x34, 0xa, 0x0, 0x12, 0x59,
+ 0x1e, 0x7a, 0xb3, 0x2e, 0x77, 0x7e, 0x34, 0xb, 0x0, 0x12, 0x59, 0x1e, 0x7a,
+ 0xb3, 0x2e, 0x78, 0x7e, 0x34, 0xd, 0x0, 0x12, 0x59, 0x1e, 0x7a, 0xb3, 0x2e,
+ 0x79, 0x7e, 0xb3, 0x2e, 0x77, 0xb4, 0x9c, 0xc, 0x7e, 0xb3, 0x2e, 0x78, 0x70,
+ 0x6, 0x7e, 0xb3, 0x2e, 0x79, 0x60, 0x2, 0xd2, 0x0, 0x30, 0x0, 0x1d, 0x7e,
+ 0x34, 0x20, 0x0, 0xe4, 0x12, 0x47, 0xd1, 0x7e, 0x34, 0x38, 0x0, 0xe4, 0x12,
+ 0x47, 0xd1, 0xa9, 0xc5, 0x94, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x58, 0x3d, 0xa9,
+ 0xd5, 0x94, 0x22, 0x12, 0xef, 0x78, 0x6d, 0x33, 0x7e, 0xf, 0x56, 0xad, 0x79,
+ 0x30, 0x0, 0xa, 0x12, 0xee, 0x9f, 0x80, 0xa, 0x12, 0xef, 0xf2, 0x68, 0x5,
+ 0x12, 0xf0, 0x89, 0x80, 0x5, 0x12, 0xf0, 0x90, 0x68, 0xf1, 0x12, 0xef, 0x6b,
+ 0x12, 0xef, 0x51, 0x78, 0xfb, 0x69, 0x50, 0x0, 0xa, 0x2, 0x47, 0xfd, 0xca,
+ 0x3b, 0x12, 0x77, 0xc1, 0x12, 0xf1, 0xc0, 0x12, 0x90, 0xff, 0x7e, 0x34,
+ 0xf3, 0xb3, 0x12, 0x59, 0x1e, 0xf5, 0x10, 0xbe, 0xb0, 0x1, 0x50, 0xf, 0x7e,
+ 0x34, 0xc5, 0xac, 0x12, 0x59, 0x1e, 0xf5, 0x11, 0x7e, 0x34, 0xc5, 0xac,
+ 0x80, 0xd, 0x7e, 0x34, 0xf4, 0xa2, 0x12, 0x59, 0x1e, 0xf5, 0x11, 0x7e, 0x34,
+ 0xf4, 0xa2, 0x7e, 0xb3, 0x54, 0xab, 0x12, 0x47, 0xd1, 0xe5, 0x11, 0x7a,
+ 0xb3, 0x54, 0xaa, 0x12, 0xf2, 0x81, 0x9, 0x75, 0x3, 0xb0, 0x7e, 0xf0, 0xee,
+ 0xac, 0xf7, 0x2e, 0x74, 0x1, 0x0, 0x12, 0x5a, 0x6e, 0x12, 0x3f, 0x29, 0x7d,
+ 0x63, 0x7a, 0x65, 0x27, 0x7e, 0x8, 0x0, 0x27, 0x74, 0x3, 0x6c, 0x77, 0x12,
+ 0x6b, 0x3f, 0x12, 0x5a, 0x73, 0x7e, 0x25, 0x27, 0x12, 0x3f, 0x10, 0x12,
+ 0x5a, 0x73, 0x12, 0x3f, 0x29, 0x7a, 0x35, 0x27, 0x12, 0x4f, 0xf5, 0x12,
+ 0x2d, 0xb4, 0x12, 0x5a, 0x7a, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xe5, 0x10, 0xbe,
+ 0xb0, 0x1, 0x50, 0x6, 0x7e, 0x34, 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4,
+ 0xa2, 0x7e, 0xb3, 0x54, 0xac, 0x12, 0x47, 0xd1, 0x12, 0x4f, 0xf5, 0x12,
+ 0x46, 0xb3, 0x12, 0x97, 0xd8, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d, 0x26,
+ 0x7e, 0xa3, 0x56, 0x28, 0x74, 0x3, 0xa4, 0x9, 0xb5, 0x3, 0xe2, 0x12, 0x93,
+ 0x11, 0x12, 0xe3, 0x43, 0x6d, 0x33, 0x80, 0x22, 0x7d, 0x13, 0x3e, 0x14,
+ 0x7e, 0x2f, 0x2d, 0x2e, 0x2d, 0x51, 0xb, 0x2a, 0x0, 0xbe, 0x4, 0x0, 0x0,
+ 0x8, 0x5, 0xb, 0x2a, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x20, 0x59, 0x21,
+ 0x3a, 0x0, 0xb, 0x34, 0x7e, 0x27, 0x74, 0xc, 0xbd, 0x23, 0x38, 0xd6, 0x12,
+ 0x5a, 0x6e, 0x7d, 0x26, 0x12, 0x3f, 0x10, 0x12, 0x5a, 0x73, 0x12, 0x3f,
+ 0x29, 0x7a, 0x35, 0x27, 0xe5, 0x10, 0xbe, 0xb0, 0x1, 0x50, 0x6, 0x7e, 0x34,
+ 0xc5, 0xac, 0x80, 0x4, 0x7e, 0x34, 0xf4, 0xa2, 0xe5, 0x11, 0x12, 0x47, 0xd1,
+ 0x74, 0xaa, 0x7a, 0xb3, 0x54, 0xa9, 0xda, 0x3b, 0x22, 0x74, 0x3, 0x12, 0x3f,
+ 0xc8, 0x7d, 0x37, 0x2e, 0x34, 0x0, 0x9, 0x22, 0x12, 0x2f, 0xb2, 0x7e, 0xb3,
+ 0x74, 0xa, 0x60, 0xd, 0x80, 0x6, 0x12, 0x5a, 0xa4, 0x12, 0x2f, 0xb2, 0x12,
+ 0x7a, 0x4a, 0x50, 0xf5, 0x7e, 0xb3, 0x74, 0xb, 0x60, 0xd, 0x80, 0x6, 0x12,
+ 0x5a, 0xa4, 0x12, 0x2f, 0xb2, 0x12, 0x7a, 0xba, 0x50, 0xf5, 0x22, 0x7e,
+ 0x34, 0x9, 0xc4, 0x6d, 0x22, 0x7a, 0x27, 0x56, 0xa3, 0x7a, 0x37, 0x56, 0xa5,
+ 0x22, 0x7e, 0x34, 0xd, 0x14, 0x12, 0x32, 0xdf, 0x12, 0x5a, 0xa8, 0x12, 0x71,
+ 0x23, 0x12, 0x87, 0xc3, 0x12, 0x5f, 0xe6, 0x68, 0x1a, 0x7f, 0x20, 0x12,
+ 0x5a, 0xf2, 0x4e, 0x60, 0x2, 0x1b, 0x2a, 0x30, 0x7e, 0x2f, 0x39, 0xfc, 0x12,
+ 0x5a, 0xf2, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x80, 0x6, 0x12, 0x5a, 0xfa,
+ 0x12, 0x2f, 0xab, 0x12, 0xf1, 0x11, 0x7e, 0x34, 0xd, 0xac, 0x2, 0x2d, 0xb1,
+ 0x2e, 0x54, 0x0, 0xe, 0xb, 0x2a, 0x30, 0x22, 0x2e, 0x14, 0x0, 0xe, 0xb, 0xa,
+ 0x30, 0x5e, 0x60, 0xfd, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14,
+ 0x0, 0xe, 0xb, 0xa, 0x30, 0x22, 0xca, 0xb8, 0xca, 0x1b, 0xca, 0xb, 0x12,
+ 0x2f, 0x9c, 0x5e, 0x34, 0x80, 0x0, 0x68, 0x1c, 0xb, 0xa, 0x30, 0x5e, 0x34,
+ 0x80, 0x0, 0x68, 0x13, 0x12, 0x5b, 0xb, 0x6e, 0x70, 0x40, 0x1b, 0xa, 0x30,
+ 0x7e, 0x34, 0x80, 0x0, 0x12, 0x5b, 0x91, 0x12, 0x5f, 0x85, 0x12, 0x2f, 0x9c,
+ 0x5e, 0x34, 0x0, 0x2, 0x68, 0x19, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x2,
+ 0x68, 0x10, 0x12, 0x5a, 0xfa, 0x12, 0x2f, 0xab, 0x7e, 0x34, 0x0, 0x2, 0x12,
+ 0x5b, 0x91, 0x12, 0x5f, 0x85, 0x12, 0x2f, 0x9c, 0x5e, 0x34, 0x0, 0x1, 0x68,
+ 0x1f, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x16, 0x12, 0x5b, 0xb,
+ 0x4e, 0x60, 0x2, 0x12, 0x5b, 0x4, 0x12, 0x5f, 0xf3, 0x7e, 0x34, 0x0, 0x1,
+ 0x12, 0x5b, 0x91, 0x12, 0xde, 0xed, 0xc2, 0xc1, 0xda, 0xb, 0xda, 0x1b, 0xda,
+ 0xb8, 0x32, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x2, 0x22, 0x12, 0x5f,
+ 0x78, 0x68, 0x25, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x5, 0x12, 0x5d, 0xfa,
+ 0x80, 0x3, 0x12, 0x5d, 0xe0, 0x12, 0x5b, 0x7, 0x4e, 0x60, 0x2, 0x12, 0x5b,
+ 0x4, 0x12, 0x5f, 0xf3, 0x12, 0x5f, 0x69, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x80,
+ 0x2e, 0x12, 0x0, 0x40, 0xe4, 0x12, 0x5f, 0x6b, 0x7e, 0xf, 0x39, 0xfc, 0x2e,
+ 0x14, 0x0, 0xa, 0x12, 0xf0, 0xd1, 0x1b, 0xa, 0x30, 0x7a, 0xb3, 0x55, 0xf7,
+ 0x7a, 0xb3, 0x54, 0x13, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0xf, 0x39, 0xfc, 0x12,
+ 0x5a, 0xfa, 0x12, 0x2f, 0xab, 0x12, 0x5e, 0x56, 0x12, 0x92, 0x35, 0x7e,
+ 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x7c, 0xab, 0xd2, 0x9, 0x12, 0xe2, 0x4a,
+ 0x1b, 0xa0, 0x68, 0x45, 0x1b, 0xa0, 0x68, 0x5d, 0x1b, 0xa0, 0x78, 0x2, 0x81,
+ 0xc2, 0x1b, 0xa0, 0x68, 0x70, 0xb, 0xa2, 0x68, 0x2, 0x81, 0xe0, 0xd2, 0xa,
+ 0x12, 0x5e, 0x72, 0x7e, 0x34, 0x54, 0xc7, 0x12, 0x5d, 0x42, 0x12, 0xf1,
+ 0x5d, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x10, 0xb, 0xa, 0x30, 0x4e,
+ 0x70, 0x10, 0x1b, 0xa, 0x30, 0x12, 0x6d, 0x9f, 0x12, 0x5b, 0x7, 0x4e, 0x70,
+ 0x10, 0x1b, 0xa, 0x30, 0x12, 0x5e, 0x17, 0x80, 0x71, 0xd2, 0xa, 0x12, 0x5d,
+ 0xc8, 0x7e, 0x34, 0x54, 0xd2, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xd2,
+ 0x26, 0xd2, 0x25, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80, 0x6f, 0x80, 0x55, 0x12,
+ 0x5f, 0x78, 0x78, 0x7, 0xd2, 0xa, 0x12, 0x5e, 0x72, 0x80, 0x5, 0xd2, 0xa,
+ 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x54, 0xdd, 0x12, 0x5d, 0x42, 0x12, 0xf1,
+ 0x5d, 0x80, 0x38, 0x7e, 0x34, 0x0, 0xb, 0xca, 0x39, 0x7e, 0x63, 0x56, 0x28,
+ 0xac, 0x67, 0x2e, 0x34, 0x54, 0xc7, 0x6d, 0x22, 0x7e, 0x8, 0x34, 0x17, 0x12,
+ 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x34, 0x17, 0x7e,
+ 0x34, 0x34, 0x17, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xd2, 0x26, 0xd2,
+ 0x25, 0xb4, 0x1, 0x4, 0x74, 0x4, 0x80, 0x18, 0x12, 0x2f, 0xa5, 0x80, 0x20,
+ 0x7e, 0x34, 0x54, 0xe8, 0x12, 0x5d, 0x42, 0x12, 0x5d, 0x62, 0xb4, 0x1, 0xc,
+ 0xd2, 0x26, 0xd2, 0x25, 0x74, 0x3, 0x7a, 0xb3, 0x55, 0xfb, 0x80, 0x7, 0x12,
+ 0xde, 0xfb, 0x80, 0x2, 0xc2, 0x9, 0xa2, 0x9, 0x22, 0x12, 0xef, 0x9e, 0x12,
+ 0x5f, 0x18, 0x5e, 0x60, 0x7f, 0x1b, 0xa, 0x30, 0xe5, 0x5b, 0x54, 0x1f, 0xa,
+ 0x2b, 0x12, 0x5d, 0x51, 0xe5, 0x5c, 0x54, 0x1, 0xa, 0x2b, 0x12, 0x5d, 0x6d,
+ 0x12, 0x5d, 0x51, 0xe5, 0x5d, 0x54, 0x3, 0xa, 0x2b, 0x12, 0x5d, 0x6d, 0x3e,
+ 0x24, 0x12, 0x5d, 0x51, 0x7e, 0x35, 0x59, 0xbe, 0x34, 0x0, 0x2, 0x78, 0x24,
+ 0x12, 0x5f, 0x18, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0xe5, 0x5e, 0x54, 0x1f,
+ 0x7c, 0x4b, 0x6c, 0x55, 0x12, 0x5d, 0x51, 0xe5, 0x5f, 0x12, 0xf0, 0xc3,
+ 0x12, 0x6b, 0xb8, 0xe5, 0x60, 0x12, 0x6f, 0xe2, 0x12, 0x6b, 0xb8, 0x22,
+ 0x7e, 0x14, 0x0, 0x59, 0x74, 0xb, 0x12, 0x2a, 0xc1, 0x12, 0x5c, 0xe5, 0x74,
+ 0x1, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30,
+ 0x4d, 0x32, 0x1b, 0xa, 0x30, 0x22, 0x7a, 0xb3, 0x54, 0xf6, 0x7e, 0xb3, 0x55,
+ 0xf8, 0x22, 0xa, 0x25, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e, 0x24, 0x3e,
+ 0x24, 0x22, 0x7e, 0x34, 0x53, 0xee, 0x30, 0x1d, 0x40, 0xc2, 0x1d, 0x7e,
+ 0x39, 0x50, 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68, 0x87, 0x9, 0x53, 0x0, 0x1,
+ 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68, 0x89, 0x9, 0x53, 0x0, 0x2, 0x12, 0x5d,
+ 0x6b, 0x7a, 0x27, 0x68, 0x8d, 0x9, 0x53, 0x0, 0x3, 0x12, 0x5d, 0x6b, 0x7a,
+ 0x27, 0x68, 0x8f, 0x9, 0x53, 0x0, 0x5, 0x12, 0x5d, 0x6b, 0x7a, 0x27, 0x68,
+ 0x97, 0x9, 0x73, 0x0, 0x40, 0x7a, 0x73, 0x68, 0x9d, 0x7e, 0x37, 0x68, 0x87,
+ 0x7a, 0x37, 0x54, 0x5e, 0x22, 0x12, 0x5e, 0xbf, 0x12, 0xf1, 0x81, 0x12,
+ 0x5f, 0xc8, 0x12, 0xf1, 0x78, 0x12, 0x5f, 0xc8, 0x12, 0x3f, 0xe4, 0x12,
+ 0xef, 0x8e, 0x2, 0x39, 0xab, 0x12, 0x5f, 0xe6, 0x78, 0x6, 0xe4, 0x7a, 0xb3,
+ 0x56, 0x28, 0x22, 0x12, 0x5b, 0xb, 0x12, 0x97, 0x67, 0x12, 0x5f, 0x24, 0x12,
+ 0x5e, 0x36, 0x2, 0x5e, 0x1b, 0x12, 0x5f, 0xe6, 0x78, 0x6, 0xe4, 0x7a, 0xb3,
+ 0x56, 0x28, 0x22, 0x12, 0x5b, 0xb, 0x5e, 0x70, 0xfb, 0x1b, 0xa, 0x30, 0x12,
+ 0x5f, 0xd9, 0x12, 0x5e, 0x36, 0x2, 0x5e, 0x1b, 0x7e, 0x34, 0x0, 0x64, 0x80,
+ 0x10, 0x7e, 0x24, 0x0, 0x2, 0x80, 0x1, 0x0, 0x7d, 0x12, 0x1b, 0x24, 0x4d,
+ 0x11, 0x78, 0xf7, 0x0, 0x7d, 0x13, 0x1b, 0x34, 0x4d, 0x11, 0x78, 0xe8, 0x22,
+ 0xd2, 0x1, 0x12, 0x5e, 0x45, 0xd2, 0xa, 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x0,
+ 0xa, 0x22, 0xa2, 0x1, 0x92, 0x2, 0x7e, 0x8, 0x34, 0x51, 0x12, 0xed, 0x9c,
+ 0x12, 0xef, 0x95, 0x2, 0x39, 0xab, 0x12, 0x5b, 0x7, 0x5e, 0x60, 0x7f, 0x12,
+ 0x5f, 0x15, 0x12, 0x5f, 0x3a, 0x5e, 0x70, 0xf, 0x1b, 0xa, 0x30, 0xc2, 0x1,
+ 0x12, 0x5e, 0x45, 0xd2, 0xa, 0x2, 0x5e, 0x72, 0x12, 0x5e, 0xbf, 0xa2, 0xa,
+ 0x92, 0xb, 0x12, 0xf1, 0x81, 0x12, 0x5f, 0x8e, 0xa2, 0xa, 0x92, 0xb, 0x12,
+ 0xf1, 0x78, 0x12, 0x5f, 0x8e, 0x12, 0x3f, 0xe4, 0x12, 0xef, 0x8e, 0x2, 0x39,
+ 0xab, 0x12, 0x7f, 0x9f, 0x12, 0xde, 0x9a, 0x12, 0x5d, 0xe0, 0xc2, 0x1, 0x12,
+ 0x5e, 0x45, 0x12, 0xf2, 0x62, 0x12, 0x71, 0x15, 0xa9, 0xd7, 0xeb, 0x12,
+ 0xde, 0x93, 0x74, 0x1, 0x7e, 0x70, 0x82, 0x12, 0xde, 0x3f, 0xa9, 0xc7, 0xeb,
+ 0xd2, 0x0, 0x12, 0x71, 0x15, 0x2, 0x5b, 0x9a, 0xa2, 0xa, 0x92, 0xb, 0xa2,
+ 0x15, 0x30, 0xb, 0x1, 0xb3, 0x50, 0x46, 0xa2, 0xb, 0x92, 0x15, 0x30, 0xb,
+ 0x2a, 0xa9, 0xd5, 0xc3, 0xa9, 0xd4, 0xc3, 0xa9, 0xd3, 0xc7, 0x7e, 0x34, 0x0,
+ 0x60, 0x12, 0x5e, 0x1b, 0xa9, 0xd4, 0xc7, 0xa9, 0xd5, 0xc7, 0x7e, 0x34, 0x0,
+ 0x80, 0x12, 0x5e, 0x1b, 0xa9, 0xd7, 0xc3, 0xa9, 0xd6, 0xc3, 0x7e, 0x34, 0x1,
+ 0xa0, 0x2, 0x5e, 0x1b, 0xa9, 0xc7, 0xc3, 0xa9, 0xc6, 0xc3, 0xa9, 0xc4, 0xc7,
+ 0xa9, 0xc5, 0xc7, 0xa9, 0xc5, 0xc3, 0xa9, 0xc4, 0xc3, 0xa9, 0xc3, 0xc7,
+ 0x22, 0x4e, 0x60, 0x80, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e, 0x14,
+ 0x0, 0x14, 0xb, 0xa, 0x30, 0x22, 0x12, 0x5b, 0x7, 0x12, 0x5f, 0x12, 0x12,
+ 0x5f, 0x3a, 0x4e, 0x70, 0x10, 0x12, 0x5f, 0x3d, 0x5e, 0x70, 0xdf, 0x1b, 0xa,
+ 0x30, 0x22, 0x5e, 0x70, 0xfe, 0x1b, 0xa, 0x30, 0x7e, 0xf, 0x39, 0xfc, 0x2e,
+ 0x14, 0x0, 0x26, 0xb, 0xa, 0x30, 0x22, 0x12, 0x5f, 0x78, 0x68, 0x11, 0x7e,
+ 0xb3, 0x55, 0xf8, 0x70, 0x5, 0x12, 0x5d, 0xe0, 0x80, 0x3, 0x12, 0x5d, 0xfa,
+ 0x2, 0x5f, 0x69, 0xe4, 0x12, 0x5f, 0x6b, 0x2, 0x5e, 0x56, 0x74, 0x1, 0x7a,
+ 0xb3, 0x56, 0x28, 0x7a, 0xb3, 0x56, 0x21, 0x22, 0xd2, 0xd, 0xd2, 0x10, 0x7e,
+ 0x1f, 0x39, 0xfc, 0x69, 0x31, 0x0, 0x6, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x12,
+ 0x5f, 0x74, 0x78, 0x3, 0x2, 0xde, 0xd1, 0x22, 0xb, 0xa, 0x50, 0x4e, 0xa0,
+ 0x10, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x50, 0x4e, 0x54, 0x40, 0xa, 0x1b, 0x1a,
+ 0x50, 0xb, 0xa, 0x50, 0x30, 0xb, 0xc, 0x4e, 0xa0, 0x8, 0x12, 0x5f, 0xc1,
+ 0x4e, 0x14, 0x20, 0x5, 0x80, 0xa, 0x5e, 0xa0, 0xf7, 0x12, 0x5f, 0xc1, 0x5e,
+ 0x14, 0xdf, 0xfa, 0x1b, 0x1a, 0x10, 0x22, 0x1b, 0xa, 0x50, 0xb, 0x1a, 0x10,
+ 0x22, 0xb, 0xa, 0x50, 0x5e, 0xa0, 0xef, 0x12, 0x5f, 0xc1, 0x5e, 0x14, 0xbf,
+ 0xf5, 0x1b, 0x1a, 0x10, 0x22, 0x12, 0x5b, 0x7, 0x12, 0x5f, 0x12, 0x4e, 0x70,
+ 0x1, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x69, 0x30, 0x0, 0x6,
+ 0x5e, 0x34, 0x0, 0x1, 0x22, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x22, 0x75,
+ 0xe7, 0x6b, 0xe4, 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24, 0x0, 0xfe, 0x7a, 0x1b,
+ 0xb0, 0x7e, 0x34, 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x75, 0xe9, 0xff, 0x22, 0x7c,
+ 0x6b, 0xa5, 0xbe, 0x0, 0x7, 0x7c, 0xb7, 0x12, 0x64, 0xfb, 0x61, 0xd5, 0xa5,
+ 0xbe, 0xf, 0xd, 0x7a, 0x73, 0x54, 0x6f, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x70,
+ 0xd2, 0x1c, 0x22, 0xa5, 0xbe, 0x49, 0x19, 0xa5, 0xbf, 0x1, 0x7, 0x7a, 0x73,
+ 0x54, 0xa9, 0xd2, 0x1c, 0x22, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0x61, 0xd5,
+ 0x7a, 0x73, 0x54, 0xa9, 0x61, 0xd5, 0xa5, 0xbe, 0x4a, 0x6, 0x7a, 0x73, 0x54,
+ 0xaa, 0x61, 0xd5, 0xa5, 0xbe, 0x4b, 0x6, 0x7a, 0x73, 0x54, 0xab, 0x61, 0xd5,
+ 0xa5, 0xbe, 0x4c, 0x6, 0x7a, 0x73, 0x54, 0xac, 0x61, 0xd5, 0xa5, 0xbe, 0x11,
+ 0x29, 0xa5, 0xbf, 0x1, 0x15, 0x12, 0x51, 0x2d, 0x78, 0x2, 0x61, 0xf4, 0x74,
+ 0x1, 0x7a, 0xb3, 0x54, 0x71, 0xe4, 0x7a, 0xb3, 0x54, 0x73, 0x2, 0xf1, 0x1c,
+ 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0x61, 0xf4, 0xe4, 0x7a, 0xb3, 0x54, 0x71,
+ 0x2, 0xf1, 0xc9, 0xa5, 0xbe, 0x12, 0xf, 0xa, 0x27, 0x3e, 0x24, 0x3e, 0x24,
+ 0x7a, 0x27, 0x39, 0xe8, 0x7a, 0x73, 0x54, 0x72, 0x22, 0xa5, 0xbe, 0x13, 0xd,
+ 0x7c, 0x67, 0x6c, 0x77, 0x2e, 0x37, 0x39, 0xe8, 0x7a, 0x37, 0x39, 0xe8,
+ 0x22, 0xa5, 0xbe, 0x2d, 0x7, 0x7a, 0x73, 0x54, 0x8d, 0xd2, 0x1c, 0x22, 0xa5,
+ 0xbe, 0x1, 0x1b, 0x7e, 0xf, 0x2d, 0x2e, 0x7d, 0x21, 0x7a, 0x27, 0x39, 0xe4,
+ 0x6d, 0x22, 0x7a, 0x27, 0x39, 0xac, 0x7a, 0x73, 0x54, 0x61, 0x7c, 0xb7,
+ 0x12, 0x64, 0x72, 0x61, 0xd5, 0xbe, 0x60, 0x5c, 0x28, 0x2, 0x41, 0xc9, 0xa5,
+ 0xbe, 0x30, 0x11, 0x7e, 0x53, 0x54, 0x90, 0xbc, 0x57, 0x78, 0x2, 0x61, 0xf4,
+ 0xbe, 0x70, 0x4, 0x40, 0x2, 0x61, 0xf4, 0xbe, 0x60, 0x20, 0x40, 0xc, 0xbe,
+ 0x60, 0x24, 0x38, 0x7, 0xbe, 0x70, 0x3, 0x28, 0x2, 0x61, 0xf4, 0x7c, 0xb6,
+ 0x24, 0xf9, 0x78, 0x2, 0x61, 0xf4, 0x24, 0xfb, 0x78, 0x2, 0x61, 0xf4, 0x14,
+ 0x78, 0x2, 0x61, 0xf4, 0x14, 0x78, 0x2, 0x61, 0xf4, 0x24, 0xe3, 0x78, 0x2,
+ 0x61, 0xf4, 0x14, 0x78, 0x2, 0x61, 0xf4, 0x80, 0x0, 0xa, 0x26, 0x19, 0x72,
+ 0x54, 0x60, 0x7c, 0xb6, 0x1b, 0xb2, 0xbe, 0xb0, 0x45, 0x40, 0x2, 0x41, 0x9f,
+ 0x7e, 0xa0, 0x3, 0xa4, 0x90, 0x61, 0x53, 0x73, 0x2, 0x62, 0x22, 0x2, 0x62,
+ 0x9f, 0x2, 0x62, 0x22, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x26, 0x2, 0x62, 0x22,
+ 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2,
+ 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62,
+ 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f,
+ 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x65, 0x2, 0x62, 0x9f, 0x2,
+ 0x62, 0x72, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x85, 0x2, 0x62, 0x22, 0x2, 0x62,
+ 0x22, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b, 0x2, 0x62, 0x2b,
+ 0x2, 0x62, 0x2b, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x94, 0x2, 0x62, 0x9f, 0x2,
+ 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62,
+ 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x22,
+ 0x2, 0x62, 0x3d, 0x2, 0x62, 0x46, 0x2, 0x62, 0x58, 0x2, 0x62, 0x58, 0x2,
+ 0x62, 0x9f, 0x2, 0x62, 0x4f, 0x2, 0x62, 0x34, 0x2, 0x62, 0x9f, 0x2, 0x62,
+ 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f,
+ 0x2, 0x62, 0x9f, 0x2, 0x62, 0x9f, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2,
+ 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0x2, 0x62,
+ 0x34, 0x2, 0x62, 0x34, 0x2, 0x62, 0x34, 0xd2, 0x1c, 0x80, 0x79, 0x12, 0x0,
+ 0x16, 0x80, 0x74, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x20, 0x80, 0x2b,
+ 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x1, 0x80, 0x22, 0x7e, 0x27, 0x39, 0xcb,
+ 0x4e, 0x50, 0x1, 0x80, 0x19, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50, 0x2, 0x80,
+ 0x10, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50, 0x4, 0x80, 0x7, 0x7e, 0x27, 0x39,
+ 0xcb, 0x4e, 0x50, 0x10, 0x7a, 0x27, 0x39, 0xcb, 0x80, 0x3a, 0x7e, 0x53,
+ 0x54, 0x78, 0x12, 0x63, 0xf5, 0x7a, 0x27, 0x39, 0xa8, 0x80, 0x2d, 0x7e,
+ 0x53, 0x54, 0x7a, 0x12, 0x63, 0xf5, 0x3e, 0x24, 0x7a, 0x27, 0x39, 0xe0,
+ 0x7a, 0x27, 0x39, 0xc2, 0x80, 0x1a, 0x7e, 0x53, 0x54, 0x7c, 0x12, 0x63,
+ 0xf5, 0x3e, 0x24, 0x7a, 0x27, 0x39, 0xac, 0x80, 0xb, 0x7e, 0x53, 0x54, 0x85,
+ 0x12, 0x63, 0xf5, 0x7a, 0x53, 0x55, 0xf5, 0xbe, 0x60, 0x3b, 0x40, 0x10,
+ 0xbe, 0x60, 0x3e, 0x38, 0xb, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x40, 0x2, 0x7a,
+ 0x27, 0x39, 0xcb, 0xa5, 0xbe, 0xa, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x7e, 0x37,
+ 0x39, 0xcb, 0x4e, 0x60, 0x4, 0x7a, 0x37, 0x39, 0xcb, 0x61, 0xd5, 0xbe, 0x60,
+ 0x6c, 0x68, 0x4, 0xa5, 0xbe, 0x6d, 0x2b, 0x7e, 0x27, 0x39, 0xcb, 0x4e, 0x50,
+ 0x80, 0x7a, 0x27, 0x39, 0xcb, 0x7e, 0x27, 0x39, 0xc2, 0x7d, 0x12, 0xb, 0x14,
+ 0x7a, 0x17, 0x39, 0xc2, 0x2e, 0x27, 0x39, 0xc6, 0x7a, 0x29, 0x70, 0xa5,
+ 0xbe, 0x6d, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x75, 0xf, 0x6c, 0x61, 0xd5, 0xbe,
+ 0x60, 0x6e, 0x68, 0x4, 0xa5, 0xbe, 0x6f, 0x56, 0x7e, 0x27, 0x39, 0xcb, 0x4e,
+ 0x50, 0x40, 0x7a, 0x27, 0x39, 0xcb, 0x7e, 0x43, 0x54, 0x78, 0x6c, 0x55,
+ 0x7e, 0xb3, 0x54, 0x79, 0xa, 0x1b, 0x2d, 0x12, 0x4, 0x7a, 0xb3, 0x54, 0x79,
+ 0x70, 0x9, 0x7e, 0xb3, 0x54, 0x78, 0x4, 0x7a, 0xb3, 0x54, 0x78, 0x7e, 0x27,
+ 0x74, 0xc, 0xbd, 0x21, 0x28, 0xf, 0x7c, 0xb7, 0x54, 0x3f, 0x7e, 0x27, 0x39,
+ 0xdc, 0x2d, 0x21, 0x7a, 0x29, 0xb0, 0x80, 0x9, 0x7e, 0x27, 0x39, 0xdc, 0x2d,
+ 0x21, 0x7a, 0x29, 0x70, 0xa5, 0xbe, 0x6f, 0x2, 0x80, 0x2, 0x61, 0xd5, 0x75,
+ 0xf, 0x6e, 0x80, 0x79, 0xbe, 0x60, 0x70, 0x40, 0xc, 0xbe, 0x60, 0x7f, 0x38,
+ 0x7, 0x7c, 0xb6, 0x12, 0x77, 0x5d, 0x80, 0x68, 0xa5, 0xbe, 0x83, 0x6, 0x7a,
+ 0x73, 0x39, 0xb0, 0x80, 0x5e, 0xa5, 0xbe, 0x86, 0xf, 0x7c, 0xb7, 0x54, 0x7,
+ 0x7a, 0xb3, 0x39, 0xb4, 0x53, 0xc3, 0xf8, 0x42, 0xc3, 0x80, 0x4b, 0xa5,
+ 0xbe, 0x87, 0x1a, 0x7c, 0xb7, 0x54, 0x7, 0x7a, 0xb3, 0x39, 0xa4, 0xa, 0x2b,
+ 0x7d, 0x32, 0x12, 0xf0, 0xd8, 0x2e, 0x34, 0x7f, 0x0, 0x2d, 0x32, 0x12, 0x64,
+ 0x2, 0x80, 0x2d, 0xa5, 0xbe, 0x88, 0x5, 0x7a, 0x71, 0xc4, 0x80, 0x24, 0xa5,
+ 0xbe, 0xed, 0x20, 0x7a, 0x73, 0x39, 0xd4, 0xa5, 0xbf, 0x4, 0x5, 0x12, 0x77,
+ 0xc1, 0x80, 0x13, 0xa5, 0xbf, 0x2, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xa8,
+ 0x80, 0x7, 0xa5, 0xbf, 0x3, 0x3, 0x12, 0x64, 0xa4, 0x30, 0x1c, 0xa, 0x7e,
+ 0xb3, 0x54, 0x6e, 0x44, 0x1, 0x7a, 0xb3, 0x54, 0x6e, 0x7e, 0x37, 0x39, 0xcb,
+ 0x4d, 0x33, 0x68, 0xa, 0x7e, 0xb3, 0x54, 0x6e, 0x44, 0x2, 0x7a, 0xb3, 0x54,
+ 0x6e, 0x22, 0x7c, 0x25, 0x6c, 0x33, 0xa, 0x27, 0x2d, 0x21, 0x22, 0x7e, 0x37,
+ 0x39, 0xd0, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4c, 0x22, 0x7c, 0x6b,
+ 0x12, 0x64, 0x6a, 0x78, 0x5, 0x7c, 0xb6, 0x2, 0x64, 0xab, 0xb4, 0x4, 0x5,
+ 0x7c, 0xb6, 0x2, 0x60, 0x14, 0x22, 0x30, 0x90, 0x19, 0xc2, 0x90, 0xe5, 0x8,
+ 0x70, 0x9, 0x75, 0x8, 0x1, 0xe5, 0x91, 0xf5, 0xf, 0x80, 0x11, 0x7e, 0x71,
+ 0x91, 0xe5, 0xf, 0x12, 0x64, 0xb, 0x5, 0xf, 0x30, 0x91, 0xb, 0xc2, 0x91,
+ 0x5, 0xf, 0xe5, 0xf, 0x12, 0x64, 0x4b, 0xf5, 0x91, 0x22, 0x7c, 0x7b, 0x6c,
+ 0xaa, 0x12, 0x64, 0x6a, 0x78, 0x9, 0x7c, 0xb7, 0x12, 0x65, 0x26, 0x7c, 0xab,
+ 0x80, 0xa, 0xb4, 0x4, 0x7, 0x7c, 0xb7, 0x12, 0x48, 0x17, 0x7c, 0xab, 0x7c,
+ 0xba, 0x22, 0x7e, 0xb3, 0x54, 0x60, 0xc4, 0x54, 0x7, 0x22, 0x24, 0x52, 0x68,
+ 0xb, 0x4, 0x78, 0x2a, 0x12, 0x64, 0xa4, 0x7a, 0x37, 0x39, 0xe2, 0x22, 0x7e,
+ 0x63, 0x68, 0xa6, 0x7e, 0x73, 0x68, 0xa7, 0xac, 0x76, 0x3e, 0x34, 0x7a,
+ 0x37, 0x39, 0xac, 0x1e, 0x34, 0xa, 0x36, 0x7a, 0x73, 0x54, 0x7c, 0x7e, 0x37,
+ 0x39, 0xac, 0x1e, 0x34, 0x7a, 0x73, 0x54, 0x7d, 0x22, 0x6d, 0x33, 0x7a,
+ 0x37, 0x39, 0xac, 0x22, 0x7c, 0xa7, 0x7c, 0x3b, 0xa5, 0xbb, 0x0, 0x7, 0x7c,
+ 0xba, 0x12, 0x64, 0xfb, 0x80, 0x25, 0xbe, 0x30, 0xeb, 0x68, 0x4, 0xa5, 0xbb,
+ 0xec, 0x9, 0x7c, 0xb3, 0x7c, 0x7a, 0x12, 0x88, 0xf6, 0x80, 0x13, 0xbe, 0x30,
+ 0x80, 0x40, 0xe, 0xbe, 0x30, 0xef, 0x38, 0x9, 0x7c, 0xb3, 0x24, 0x80, 0x7c,
+ 0x7a, 0x12, 0x89, 0x3a, 0xa5, 0xbb, 0xfc, 0x5, 0x7c, 0xba, 0x2, 0x58, 0x5e,
+ 0xa5, 0xbb, 0xfd, 0x8, 0xbe, 0xa0, 0x5a, 0x78, 0x9, 0xd2, 0x27, 0x22, 0x74,
+ 0x1, 0x7a, 0xb3, 0x56, 0xbc, 0x22, 0x7a, 0xb3, 0x54, 0x60, 0xc4, 0x54, 0x7,
+ 0xbe, 0xb0, 0x4, 0x68, 0x3, 0xb4, 0x2, 0x4, 0x74, 0x3, 0x80, 0x7, 0x60, 0x3,
+ 0xb4, 0x1, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x15, 0x22, 0x74, 0x1, 0x7a,
+ 0xb3, 0x54, 0x15, 0xe4, 0x7a, 0xb3, 0x54, 0x60, 0x22, 0x70, 0x3, 0x2, 0x88,
+ 0x9a, 0xbe, 0xb0, 0x3, 0x38, 0x13, 0x30, 0x28, 0x6, 0x7e, 0x18, 0x2, 0xf3,
+ 0x80, 0x4, 0x7e, 0x18, 0x3, 0x4d, 0x7a, 0x1f, 0x3, 0xa7, 0x80, 0x5, 0xbe,
+ 0xb0, 0x6e, 0x38, 0xe, 0xa, 0x1b, 0x7e, 0x1f, 0x3, 0xa7, 0x2d, 0x31, 0x1b,
+ 0x34, 0x7e, 0x1b, 0xb0, 0x22, 0xbe, 0xb0, 0xd3, 0x68, 0x3, 0xb4, 0xd4, 0x10,
+ 0xb4, 0xd3, 0x8, 0x6d, 0x33, 0x7a, 0x37, 0x54, 0xc0, 0x80, 0x2, 0x15, 0xf,
+ 0x2, 0x88, 0x4d, 0xb4, 0xf6, 0x7, 0x7e, 0x34, 0x29, 0xec, 0x2, 0x66, 0x11,
+ 0xb4, 0xf7, 0xa, 0x7e, 0x34, 0x29, 0xec, 0x12, 0x32, 0xdf, 0xa, 0x56, 0x22,
+ 0xbe, 0xb0, 0xf8, 0x68, 0x3, 0xb4, 0xf9, 0x1c, 0xb4, 0xf8, 0x8, 0x6d, 0x33,
+ 0x7a, 0x37, 0x54, 0xc0, 0x80, 0x2, 0x15, 0xf, 0x7e, 0x37, 0x54, 0xc0, 0x7d,
+ 0x23, 0xb, 0x24, 0x7a, 0x27, 0x54, 0xc0, 0x2, 0x0, 0x1e, 0xbe, 0xb0, 0xeb,
+ 0x68, 0x3, 0xb4, 0xec, 0x3, 0x2, 0x66, 0x19, 0xb4, 0x80, 0x3, 0x2, 0x65,
+ 0xe9, 0xbe, 0xb0, 0x80, 0x28, 0xc, 0xbe, 0xb0, 0xef, 0x38, 0x7, 0xa, 0x3b,
+ 0x9, 0xb3, 0x53, 0x6e, 0x22, 0xb4, 0xfc, 0x5, 0x7e, 0xb3, 0x54, 0x15, 0x22,
+ 0xb4, 0xfd, 0x5, 0xa2, 0x27, 0xe4, 0x33, 0x22, 0xb4, 0xfe, 0x8, 0x12, 0xf2,
+ 0x81, 0x9, 0xb5, 0x3, 0xac, 0x22, 0x74, 0xff, 0x22, 0x12, 0x66, 0xd, 0xbe,
+ 0x54, 0x0, 0xc0, 0x50, 0x6, 0x7e, 0x54, 0x0, 0xc0, 0x80, 0xa, 0xbe, 0x54,
+ 0x1, 0x20, 0x28, 0x4, 0x7e, 0x54, 0x1, 0x20, 0x1e, 0x54, 0x1e, 0x54, 0x1e,
+ 0x54, 0x1e, 0x54, 0x1e, 0x54, 0x22, 0x7e, 0x34, 0xd, 0x18, 0x7e, 0x24, 0x0,
+ 0xff, 0xb, 0x1a, 0x50, 0x22, 0xb4, 0xeb, 0x5, 0xe4, 0x7a, 0xb3, 0x54, 0xc6,
+ 0x7e, 0x73, 0x54, 0xc6, 0xa, 0x27, 0x2e, 0x24, 0x0, 0x6, 0x12, 0x9f, 0x3a,
+ 0x7c, 0xab, 0x7c, 0xb7, 0x4, 0x7a, 0xb3, 0x54, 0xc6, 0xb4, 0x3, 0xb, 0xe4,
+ 0x7a, 0xb3, 0x54, 0xc6, 0x6d, 0x33, 0x7a, 0x37, 0x54, 0xc4, 0x75, 0xf, 0xeb,
+ 0x7c, 0xba, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0x8b, 0x6c, 0x99, 0xa, 0xf8,
+ 0x9, 0xdf, 0x38, 0x8b, 0x7c, 0xbd, 0x20, 0xe7, 0x68, 0x7c, 0xbd, 0x30, 0xe3,
+ 0x17, 0x7e, 0x70, 0x2, 0xac, 0x78, 0x49, 0x53, 0x38, 0x9f, 0xbe, 0x54, 0x0,
+ 0x0, 0x28, 0x54, 0xbe, 0x54, 0x0, 0xc, 0x50, 0x4e, 0x80, 0x49, 0x7c, 0xbd,
+ 0x30, 0xe2, 0x47, 0x7e, 0xf0, 0x2, 0xac, 0xf8, 0x49, 0xe7, 0x38, 0xc7, 0x12,
+ 0x66, 0xd, 0x3e, 0x54, 0xbd, 0xe5, 0x40, 0x35, 0x7c, 0xbd, 0x30, 0xe4, 0x17,
+ 0x7c, 0xbd, 0x30, 0xe1, 0x2b, 0x9, 0x7f, 0x38, 0x95, 0xbe, 0x70, 0x14, 0x50,
+ 0x22, 0x7c, 0xb8, 0x12, 0x66, 0xf3, 0x40, 0x1b, 0x80, 0x16, 0x7c, 0xbd,
+ 0x20, 0xe0, 0x14, 0x49, 0x57, 0x38, 0x9f, 0xbe, 0x54, 0x0, 0x2, 0x50, 0xa,
+ 0x7c, 0xb8, 0x12, 0x66, 0xf3, 0x40, 0x3, 0x4e, 0x90, 0x4, 0x4c, 0x99, 0x78,
+ 0x11, 0x74, 0x2, 0xac, 0xb8, 0x49, 0x55, 0x38, 0x9f, 0xbe, 0x54, 0x0, 0x0,
+ 0x28, 0x3, 0x4e, 0x90, 0x8, 0x6d, 0x33, 0x74, 0x2, 0xac, 0xb8, 0x59, 0x35,
+ 0x38, 0x9f, 0xe4, 0xa, 0x38, 0x19, 0xb3, 0x38, 0x8b, 0x7c, 0xb9, 0xda, 0x79,
+ 0xda, 0xd8, 0x22, 0x7c, 0xab, 0xc2, 0x0, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x9,
+ 0xb3, 0x38, 0xf6, 0x9, 0x73, 0x38, 0xf7, 0x12, 0x36, 0x62, 0x12, 0xa7, 0x95,
+ 0xbd, 0x32, 0x28, 0x2, 0xd2, 0x0, 0xa2, 0x0, 0x22, 0xca, 0xd8, 0xca, 0x79,
+ 0xe4, 0x7a, 0xb3, 0x39, 0xa3, 0x7e, 0xb3, 0x54, 0x3e, 0xbe, 0xb0, 0x1, 0x68,
+ 0x7d, 0x6c, 0xdd, 0x80, 0x3b, 0x6c, 0xaa, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x12,
+ 0xd1, 0xbc, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x9, 0xe3, 0x68, 0x29, 0x4c, 0xee,
+ 0x78, 0xb, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0xce, 0x16, 0x7c, 0xab, 0x80, 0xe,
+ 0xbe, 0xe0, 0x2, 0x78, 0x9, 0x7c, 0xbd, 0x7c, 0x7f, 0x12, 0xcd, 0x43, 0x7c,
+ 0xab, 0x7c, 0x1d, 0x2e, 0x10, 0x27, 0x7c, 0xba, 0xa5, 0xf7, 0xb, 0xd0, 0x7e,
+ 0xb3, 0x68, 0x79, 0xbc, 0xbd, 0x38, 0xbd, 0x7e, 0x8, 0x0, 0x27, 0x12, 0xd1,
+ 0x4c, 0x6c, 0xff, 0xe4, 0xa, 0x3f, 0x19, 0xb3, 0x2e, 0x77, 0x74, 0x8, 0xac,
+ 0xbf, 0x9, 0xe5, 0x68, 0x29, 0xbe, 0xe0, 0x1, 0x78, 0xb, 0x7c, 0xbf, 0x12,
+ 0x66, 0x4b, 0xa, 0x3f, 0x19, 0xb3, 0x2e, 0x77, 0xb, 0xf0, 0xbe, 0xf0, 0xa,
+ 0x78, 0xda, 0x7e, 0x8, 0x2e, 0x77, 0x12, 0xd0, 0xdb, 0xda, 0x79, 0xda, 0xd8,
+ 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0x77, 0xfd, 0x7e, 0xa3, 0x54, 0x96,
+ 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xb1, 0x7c, 0xbf, 0x12, 0x92,
+ 0xc7, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x6d, 0x33, 0x7a,
+ 0x37, 0x39, 0xe0, 0x7a, 0xb3, 0x39, 0xb1, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x5,
+ 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0xf1, 0xd2, 0xc2, 0x0, 0x12, 0x47, 0x7f,
+ 0x7e, 0x34, 0x5, 0x20, 0xca, 0x39, 0x7e, 0x1f, 0x2d, 0x2a, 0x7e, 0xf, 0x2d,
+ 0x2e, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x12, 0x46, 0x8f, 0x12, 0x80, 0xe0, 0x2,
+ 0x30, 0x23, 0x12, 0x6f, 0xd7, 0x7e, 0x70, 0x5, 0xac, 0x78, 0x9, 0x53, 0x3,
+ 0xec, 0xbe, 0x53, 0x54, 0x80, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x80, 0x19, 0x53,
+ 0x3, 0xec, 0x9, 0x53, 0x3, 0xed, 0xbe, 0x53, 0x54, 0x81, 0x68, 0x8, 0x7e,
+ 0x53, 0x54, 0x81, 0x19, 0x53, 0x3, 0xed, 0x9, 0x53, 0x3, 0xee, 0xbe, 0x53,
+ 0x54, 0x82, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x82, 0x19, 0x53, 0x3, 0xee, 0x9,
+ 0x53, 0x3, 0xef, 0xbe, 0x53, 0x54, 0x83, 0x68, 0x8, 0x7e, 0x53, 0x54, 0x83,
+ 0x19, 0x53, 0x3, 0xef, 0x9, 0x53, 0x3, 0xf0, 0xbe, 0x53, 0x54, 0x84, 0x68,
+ 0x8, 0x7e, 0x53, 0x54, 0x84, 0x19, 0x53, 0x3, 0xf0, 0x12, 0x68, 0xcf, 0x12,
+ 0x68, 0x70, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x40, 0xbe, 0x9, 0xb3, 0x3, 0xec,
+ 0x9, 0x73, 0x3, 0xed, 0x12, 0x6b, 0x3f, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e,
+ 0x14, 0x34, 0xc7, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xee,
+ 0x12, 0x6a, 0xf9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc9,
+ 0x6d, 0x0, 0x74, 0x5, 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xef, 0x12, 0x6b, 0x2c,
+ 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc9, 0x6d, 0x0, 0x74, 0x5,
+ 0xac, 0xb8, 0x9, 0xb5, 0x3, 0xf0, 0x12, 0x6b, 0x8, 0x74, 0x3, 0x12, 0x3f,
+ 0xc8, 0x7e, 0x70, 0xee, 0xac, 0x79, 0x2e, 0x34, 0x1, 0x0, 0x2e, 0x34, 0x0,
+ 0x9, 0x7e, 0x30, 0x3c, 0xac, 0x39, 0x2e, 0x14, 0x34, 0xc7, 0x6d, 0x0, 0x22,
+ 0xca, 0x3b, 0x7c, 0xeb, 0xbe, 0xe0, 0x4, 0x40, 0x2, 0x41, 0xf6, 0x12, 0xf1,
+ 0x8a, 0xbe, 0xf0, 0x4, 0x40, 0x2, 0x41, 0xf6, 0x9, 0x75, 0x3, 0xac, 0xa,
+ 0x47, 0x3e, 0x44, 0x3e, 0x44, 0x3e, 0x44, 0xb, 0x46, 0x7a, 0x45, 0x27, 0x9,
+ 0x75, 0x3, 0xad, 0xa, 0x67, 0x3e, 0x64, 0x3e, 0x64, 0x3e, 0x64, 0xb, 0x66,
+ 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xb5, 0xb, 0x28, 0x30, 0x4e,
+ 0x70, 0x1, 0x1b, 0x28, 0x30, 0x74, 0x8, 0xac, 0xbe, 0x9, 0x75, 0x3, 0xb3,
+ 0x2e, 0x70, 0xff, 0x92, 0x1, 0x12, 0x6b, 0x9c, 0x12, 0xed, 0xf4, 0x7e, 0x90,
+ 0x8, 0xac, 0x9e, 0x9, 0xb4, 0x3, 0xaf, 0xf5, 0x29, 0x7e, 0x70, 0x3c, 0xac,
+ 0x7f, 0x7d, 0x13, 0x12, 0x6b, 0x95, 0x2e, 0x34, 0x34, 0xe7, 0x6d, 0x22, 0x9,
+ 0xb4, 0x3, 0xae, 0x12, 0x98, 0xa2, 0x12, 0x6b, 0x90, 0x7e, 0x35, 0x27, 0x12,
+ 0x6b, 0x6f, 0x12, 0x6b, 0x84, 0x7d, 0x36, 0x12, 0x6b, 0x75, 0x7e, 0x30,
+ 0x3c, 0xac, 0x3f, 0x12, 0xf1, 0x42, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3,
+ 0xb1, 0x12, 0xed, 0x8d, 0x12, 0x6b, 0x84, 0x74, 0x3, 0xac, 0xbe, 0x12, 0x6b,
+ 0xdb, 0x12, 0x6c, 0x85, 0x6d, 0x33, 0x12, 0x0, 0x26, 0x7e, 0x30, 0x3c, 0xac,
+ 0x3f, 0x12, 0x68, 0xd4, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x9, 0xb3, 0x3, 0xec,
+ 0x9, 0x73, 0x3, 0xed, 0x12, 0x6b, 0x3f, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x12,
+ 0x68, 0xd4, 0x74, 0x5, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xee, 0x12, 0x6a, 0xf9,
+ 0x12, 0x6b, 0xa8, 0x9, 0xb5, 0x3, 0xef, 0x12, 0x6b, 0x2c, 0x12, 0x6b, 0xa8,
+ 0x9, 0xb5, 0x3, 0xf0, 0x12, 0x6b, 0x8, 0x12, 0x6c, 0x64, 0x12, 0x0, 0x26,
+ 0xc2, 0x1, 0x12, 0x6b, 0xcf, 0x12, 0xed, 0xde, 0x12, 0xee, 0x15, 0x12, 0xee,
+ 0x5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xc9, 0xb, 0x28, 0x30,
+ 0x7e, 0x34, 0x0, 0x2, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xd1, 0x74,
+ 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xd3, 0x6d, 0x33, 0x74, 0x3c, 0xac,
+ 0xbf, 0x59, 0x35, 0x34, 0xd5, 0x7e, 0x34, 0x22, 0x5, 0x74, 0x3c, 0xac, 0xbf,
+ 0x59, 0x35, 0x34, 0xd7, 0x7e, 0x34, 0x0, 0x6, 0x74, 0x3c, 0xac, 0xbf, 0x59,
+ 0x35, 0x34, 0xd9, 0x7e, 0x34, 0x0, 0x12, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35,
+ 0x34, 0xdb, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xdd, 0x74, 0x3c,
+ 0xac, 0xbf, 0x59, 0x35, 0x34, 0xdf, 0x7e, 0x34, 0x8, 0x8, 0x74, 0x3c, 0xac,
+ 0xbf, 0x59, 0x35, 0x34, 0xe1, 0x6d, 0x33, 0x74, 0x3c, 0xac, 0xbf, 0x59,
+ 0x35, 0x34, 0xe9, 0x7e, 0x34, 0x0, 0x1, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35,
+ 0x34, 0xe3, 0x7e, 0x34, 0xc, 0x1c, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34,
+ 0xe5, 0x7e, 0x50, 0x3c, 0xac, 0x5f, 0x2e, 0x24, 0x34, 0xe7, 0xb, 0x28, 0x30,
+ 0x4e, 0x34, 0x41, 0x96, 0x1b, 0x28, 0x30, 0x7e, 0x34, 0x1f, 0x0, 0x74, 0x3c,
+ 0xac, 0xbf, 0x59, 0x35, 0x34, 0xeb, 0xbe, 0xe0, 0x3, 0x78, 0x19, 0x7e, 0x34,
+ 0x3, 0x51, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xc5, 0x7e, 0x34, 0x4,
+ 0x4, 0x12, 0x6b, 0x7b, 0x7e, 0x34, 0x4, 0x29, 0x80, 0x7, 0x7e, 0x34, 0xa,
+ 0x19, 0x12, 0x6b, 0x7b, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xef,
+ 0x7e, 0x34, 0x0, 0x2c, 0x7a, 0x35, 0x29, 0x12, 0xf0, 0xe1, 0x7e, 0x35, 0x27,
+ 0x7d, 0x26, 0x12, 0xee, 0xcb, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x12, 0x6b,
+ 0xc9, 0x7e, 0x35, 0x27, 0x7d, 0x26, 0x74, 0x2a, 0x12, 0xed, 0xae, 0x74, 0x3,
+ 0x12, 0x3f, 0xc8, 0x12, 0xf0, 0x9d, 0x12, 0x6b, 0x9c, 0x7e, 0x24, 0x0, 0x1e,
+ 0x12, 0xef, 0xcd, 0x6d, 0x0, 0x7e, 0x24, 0x0, 0x3, 0x12, 0x40, 0x57, 0xda,
+ 0x3b, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0x3f, 0x1b, 0xa, 0x30, 0x12, 0x6f,
+ 0xe2, 0x2, 0x6b, 0xc0, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xf3, 0x1b, 0xa, 0x30,
+ 0x12, 0x6f, 0xfb, 0x2, 0x5d, 0x59, 0x12, 0x6f, 0xd7, 0x12, 0x68, 0xcf, 0x7e,
+ 0x70, 0x5, 0xac, 0x78, 0x12, 0x68, 0x70, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x40,
+ 0xbe, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xcf, 0x1b, 0xa, 0x30, 0x54, 0x3, 0xa,
+ 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6b, 0xc0, 0xb, 0xa, 0x20, 0x5e, 0x40, 0xc3,
+ 0x1b, 0xa, 0x20, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0xb, 0xa, 0x20,
+ 0x4d, 0x25, 0x1b, 0xa, 0x20, 0x7c, 0xb7, 0x12, 0x6f, 0xfb, 0x2, 0x5d, 0x59,
+ 0xb, 0xa, 0x30, 0x5e, 0x34, 0xfc, 0x0, 0x1b, 0xa, 0x30, 0x4d, 0x32, 0x1b,
+ 0xa, 0x30, 0x22, 0x12, 0x6f, 0xc3, 0x2, 0x6b, 0x66, 0x12, 0x6f, 0xc3, 0x2,
+ 0x6b, 0x66, 0x74, 0x3c, 0xac, 0xbf, 0x59, 0x35, 0x34, 0xed, 0x22, 0x7e,
+ 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb9, 0x6d, 0x0, 0x22, 0x7e, 0x30,
+ 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb7, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c,
+ 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xb5, 0x6d, 0x0, 0x22, 0x7e, 0x30, 0x3c, 0xac,
+ 0x3f, 0x2e, 0x14, 0x34, 0xc9, 0x6d, 0x0, 0x74, 0x5, 0xac, 0xbe, 0x22, 0x7e,
+ 0xf, 0x39, 0xfc, 0x2e, 0x14, 0x0, 0x12, 0xb, 0xa, 0x30, 0x4d, 0x35, 0x1b,
+ 0xa, 0x30, 0x22, 0x12, 0x6c, 0x3a, 0x75, 0x29, 0x2c, 0x7e, 0x30, 0x3c, 0xac,
+ 0x3f, 0x2e, 0x14, 0x34, 0xe7, 0x6d, 0x0, 0x22, 0x9, 0xb5, 0x3, 0xe0, 0xb,
+ 0xa, 0x30, 0x5e, 0x60, 0xf, 0x1b, 0xa, 0x30, 0xa, 0x5b, 0x12, 0x6c, 0x33,
+ 0x2, 0x6b, 0xc0, 0x7c, 0x9b, 0x29, 0x81, 0x0, 0x2, 0xa, 0xe8, 0x7d, 0x5e,
+ 0x7c, 0xab, 0xe4, 0x7d, 0xe5, 0x29, 0x81, 0x0, 0x3, 0xa, 0x58, 0xc4, 0x54,
+ 0xf0, 0x7c, 0xab, 0xe4, 0x2d, 0xe5, 0x29, 0x81, 0x0, 0x1, 0xa, 0xf8, 0x3e,
+ 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x2d, 0xfe, 0x7e, 0x1b, 0x80, 0xa,
+ 0x58, 0x2d, 0x5f, 0x1b, 0xa, 0x50, 0x29, 0x81, 0x0, 0x4, 0xa, 0x38, 0x79,
+ 0x30, 0x0, 0x2, 0xa, 0x59, 0xc4, 0x54, 0xf0, 0x7c, 0xab, 0xe4, 0x22, 0x7d,
+ 0x52, 0x7d, 0x43, 0x7e, 0x1d, 0x29, 0xb, 0x1a, 0x30, 0x5e, 0x60, 0x7, 0x7e,
+ 0x25, 0x2d, 0x2d, 0x23, 0x7d, 0x35, 0x2d, 0x34, 0xbe, 0x34, 0x0, 0xe0, 0x28,
+ 0x8, 0x9e, 0x34, 0x0, 0xe0, 0x3e, 0x34, 0x2d, 0x23, 0x2, 0x6b, 0x5f, 0x12,
+ 0x39, 0xab, 0x7e, 0x70, 0x3c, 0xac, 0x7f, 0x7d, 0x13, 0x2e, 0x14, 0x34,
+ 0xc3, 0x6d, 0x0, 0x7a, 0xd, 0x29, 0x7d, 0x13, 0x2e, 0x14, 0x34, 0xb7, 0x6d,
+ 0x0, 0x2e, 0x34, 0x34, 0xb9, 0x6d, 0x22, 0x12, 0x6d, 0x15, 0x7e, 0x30, 0x3c,
+ 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xc3, 0x6d, 0x0, 0x22, 0xca, 0xf8, 0x7c, 0xab,
+ 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xac, 0xb, 0xf0,
+ 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8, 0xac, 0xbf, 0x9, 0xa5,
+ 0x3, 0xac, 0x12, 0xf0, 0x4, 0x12, 0x6b, 0x90, 0x7d, 0x3f, 0x12, 0x6b, 0x6f,
+ 0x7d, 0x3e, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xb7, 0x12,
+ 0x6c, 0x61, 0x12, 0xef, 0x5, 0x40, 0xd9, 0xda, 0xf8, 0x22, 0xca, 0xf8, 0x7c,
+ 0xab, 0x6c, 0xff, 0x7e, 0x70, 0x8, 0xac, 0x7f, 0x19, 0xa3, 0x3, 0xad, 0xb,
+ 0xf0, 0xbe, 0xf0, 0x4, 0x78, 0xf0, 0x6c, 0xff, 0x74, 0x8, 0xac, 0xbf, 0x9,
+ 0xa5, 0x3, 0xad, 0x12, 0xf0, 0x4, 0x12, 0x6b, 0x84, 0x7d, 0x3f, 0x12, 0x6b,
+ 0x75, 0x7d, 0x3e, 0xb, 0x35, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xb9,
+ 0x12, 0x6c, 0x61, 0x12, 0xef, 0x5, 0x40, 0xd9, 0xda, 0xf8, 0x22, 0x7f, 0x21,
+ 0xb, 0xa, 0x20, 0x5e, 0x40, 0x7, 0xb, 0x2a, 0x10, 0x5e, 0x20, 0x7, 0x7e,
+ 0x2d, 0x29, 0xb, 0x2a, 0x30, 0x5e, 0x60, 0x3, 0x2d, 0x12, 0x2d, 0x13, 0x7e,
+ 0x24, 0x0, 0xc9, 0xbe, 0x14, 0x0, 0xb8, 0x68, 0x4, 0xbd, 0x21, 0x78, 0x2,
+ 0xb, 0x34, 0x22, 0x7c, 0x34, 0x7c, 0x25, 0x7c, 0xa6, 0x7c, 0x17, 0x7c, 0xb,
+ 0x12, 0x6f, 0xcd, 0x5e, 0x80, 0x3, 0x7c, 0xba, 0x12, 0x6f, 0xe2, 0x4d, 0x45,
+ 0x7c, 0xb0, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x4d, 0x45, 0x7c, 0xb1,
+ 0x54, 0x3, 0x7c, 0xb, 0x6c, 0x11, 0x3e, 0x4, 0x3e, 0x4, 0x4d, 0x40, 0x1b,
+ 0x1a, 0x40, 0x7e, 0x34, 0xa0, 0x14, 0xb, 0x1a, 0x40, 0x5e, 0x80, 0xc3, 0x7c,
+ 0xb2, 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6d, 0x8a, 0x4d, 0x45,
+ 0x7c, 0xb3, 0x54, 0x3, 0xa, 0x5b, 0x7c, 0xab, 0xe4, 0x3e, 0x54, 0x3e, 0x54,
+ 0x4d, 0x45, 0x1b, 0x1a, 0x40, 0x22, 0x7e, 0xb3, 0x56, 0x21, 0x7e, 0x70, 0x2,
+ 0x7e, 0x60, 0x2, 0x7c, 0x36, 0x7c, 0xb7, 0x12, 0x6f, 0xcd, 0x5e, 0x80, 0xc3,
+ 0x54, 0x3, 0xa, 0x5b, 0x12, 0x6c, 0x33, 0x2, 0x6d, 0x8a, 0x12, 0x5f, 0x78,
+ 0x78, 0x7, 0xe4, 0x7a, 0xb3, 0x56, 0x21, 0x80, 0x12, 0x7e, 0xb3, 0x56, 0x21,
+ 0xb4, 0x2, 0x8, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x21, 0x80, 0x3, 0x12, 0x6e,
+ 0xb, 0x7a, 0xb3, 0x56, 0x28, 0x74, 0x2, 0x12, 0x68, 0xdb, 0x7e, 0xb3, 0x56,
+ 0x21, 0x24, 0x0, 0x68, 0x16, 0x24, 0xfd, 0x68, 0xf, 0xb, 0xb1, 0x78, 0x14,
+ 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x2, 0x80, 0xc, 0x2, 0x5d, 0xfa, 0x2, 0x6e,
+ 0xb, 0xe4, 0x12, 0x68, 0xdb, 0x80, 0x0, 0x2, 0x5d, 0xe0, 0x74, 0x1, 0x7a,
+ 0xb3, 0x56, 0x21, 0x22, 0x7e, 0xb3, 0x54, 0xf6, 0xb4, 0x1, 0x2, 0x80, 0x2,
+ 0xc1, 0xad, 0x7e, 0x73, 0x54, 0xf3, 0xbe, 0x73, 0x54, 0xf5, 0x28, 0x69,
+ 0x7e, 0x63, 0x54, 0xf5, 0x7e, 0x70, 0x9, 0xac, 0x67, 0x49, 0x53, 0x55, 0x1,
+ 0x7c, 0xab, 0x7e, 0x43, 0x54, 0xfe, 0x7e, 0x50, 0x2, 0xac, 0x45, 0x2d, 0x32,
+ 0x49, 0x33, 0x55, 0x3, 0x7a, 0x35, 0x14, 0x4d, 0x33, 0x68, 0x44, 0xd2, 0x2f,
+ 0x1b, 0xa0, 0x68, 0x10, 0x1b, 0xa0, 0x68, 0xc, 0x1b, 0xa0, 0x68, 0x19, 0x1b,
+ 0xa0, 0x68, 0x4, 0xb, 0xa2, 0x78, 0x2e, 0x12, 0x73, 0xe2, 0x30, 0x11, 0x4,
+ 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x76, 0x92, 0x80, 0x1d, 0x12, 0x6e,
+ 0xae, 0x30, 0x11, 0x4, 0x74, 0x2, 0x80, 0x2, 0x74, 0x1, 0x12, 0x76, 0x92,
+ 0x74, 0x3, 0x7e, 0x70, 0x3, 0x6c, 0x66, 0x6c, 0x55, 0x6c, 0x44, 0x12, 0x6d,
+ 0x41, 0x12, 0xe2, 0x41, 0x38, 0x18, 0x74, 0x2, 0x7a, 0xb3, 0x54, 0xf6, 0x7e,
+ 0xb3, 0x56, 0x28, 0x70, 0xc, 0x12, 0x6d, 0x9f, 0x12, 0x5b, 0x7, 0x5e, 0x70,
+ 0xef, 0x1b, 0xa, 0x30, 0x22, 0xca, 0x3b, 0x7e, 0x38, 0x18, 0x80, 0x20, 0x2f,
+ 0x2, 0xe1, 0x80, 0xa9, 0xd7, 0xea, 0x7e, 0x97, 0x74, 0xc, 0x12, 0xf1, 0x38,
+ 0x60, 0x29, 0x6d, 0xbb, 0x80, 0x1d, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34,
+ 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xb1, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7,
+ 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0,
+ 0x40, 0xdd, 0x80, 0x22, 0x6d, 0xbb, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34,
+ 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xba, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7,
+ 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xe0, 0x7f,
+ 0x3, 0x2e, 0x14, 0x0, 0x0, 0x7d, 0x8a, 0x3e, 0x84, 0x7e, 0x1f, 0x35, 0xa5,
+ 0x2d, 0x38, 0x12, 0x73, 0xb0, 0x7e, 0x87, 0x74, 0xc, 0x2d, 0xa8, 0x90, 0x1,
+ 0x90, 0xe4, 0x93, 0x60, 0x24, 0x6d, 0xbb, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e,
+ 0x34, 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xba, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80,
+ 0x7, 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xe0,
+ 0x80, 0x27, 0x6d, 0xbb, 0x80, 0x1d, 0x12, 0x6f, 0xa0, 0x60, 0x5, 0x3e, 0x34,
+ 0x14, 0x78, 0xfb, 0x12, 0x6f, 0xb1, 0x68, 0x5, 0x12, 0x6f, 0x83, 0x80, 0x7,
+ 0x6d, 0x88, 0x12, 0x6f, 0x92, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0, 0x0,
+ 0x40, 0xdd, 0xa9, 0xc7, 0xea, 0xc2, 0x2f, 0xda, 0x3b, 0x22, 0x7d, 0x8a, 0xb,
+ 0xa4, 0x3e, 0x84, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x38, 0xb, 0x1a, 0x80, 0x7d,
+ 0x39, 0xb, 0x94, 0x3e, 0x34, 0x2d, 0x37, 0x7d, 0x26, 0x1b, 0x1a, 0x80, 0x22,
+ 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x34, 0x0, 0x1, 0x22, 0x12, 0x6b, 0xf0, 0x79,
+ 0x50, 0x0, 0x4, 0x22, 0x7e, 0x53, 0x68, 0xab, 0xa, 0x85, 0x5d, 0x83, 0x22,
+ 0x7e, 0x53, 0x68, 0xaa, 0xa, 0x85, 0x5d, 0x83, 0x22, 0x7d, 0x23, 0xb, 0xa,
+ 0x30, 0x5e, 0x34, 0xf8, 0x0, 0x22, 0x7e, 0x34, 0xa0, 0x12, 0x6d, 0x22, 0xb,
+ 0x1a, 0x40, 0x22, 0x7c, 0x8b, 0x74, 0x8, 0xac, 0xb8, 0x9, 0x95, 0x3, 0xb0,
+ 0x22, 0x54, 0x3, 0xa, 0x5b, 0x3, 0x3, 0x54, 0xc0, 0x7c, 0xab, 0xe4, 0x22,
+ 0x12, 0x6f, 0xc5, 0x1b, 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b, 0xa, 0x30, 0x22,
+ 0x54, 0x3, 0xa, 0x3b, 0x7d, 0x23, 0x7c, 0x45, 0x6c, 0x55, 0x3e, 0x24, 0x3e,
+ 0x24, 0x22, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0xe, 0x74, 0x14, 0x7a, 0xb3, 0x39,
+ 0xca, 0x74, 0x13, 0x7a, 0xb3, 0x39, 0xa5, 0x80, 0x10, 0x7e, 0x73, 0x39,
+ 0xb0, 0x7a, 0x73, 0x39, 0xca, 0xa, 0x37, 0x1b, 0x34, 0x7a, 0x73, 0x39, 0xa5,
+ 0xe4, 0x7a, 0xb3, 0x39, 0xa7, 0x22, 0xca, 0x79, 0x7e, 0x73, 0x68, 0xa7,
+ 0x7e, 0xf3, 0x68, 0xa6, 0xac, 0xf7, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x90,
+ 0xff, 0x12, 0x70, 0xa, 0xc2, 0x0, 0x12, 0x39, 0xb4, 0xd2, 0xac, 0xc2, 0xa8,
+ 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xd5, 0x12, 0x77, 0xc1, 0x12, 0x4b, 0xa4, 0xd2,
+ 0x0, 0x12, 0x39, 0xb4, 0x7e, 0xb3, 0x54, 0x6f, 0xb4, 0x1, 0x45, 0x20, 0x11,
+ 0x42, 0x6d, 0xff, 0x80, 0x3a, 0x7d, 0xbf, 0x3e, 0xb4, 0x49, 0xeb, 0x3a, 0x0,
+ 0x7d, 0x3e, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14, 0x0, 0x46, 0x12, 0x2a, 0x31,
+ 0x7e, 0x8, 0x0, 0x44, 0x12, 0x2a, 0x8d, 0x7f, 0x61, 0x9e, 0x68, 0x0, 0x78,
+ 0xbe, 0xe4, 0x0, 0x1e, 0x8, 0xa, 0xbe, 0x68, 0x0, 0x32, 0x18, 0x4, 0x7e,
+ 0x68, 0x0, 0x32, 0x7d, 0xed, 0x59, 0xeb, 0x3a, 0x0, 0xb, 0xf4, 0xbd, 0x7f,
+ 0x38, 0xc2, 0x12, 0x70, 0xc1, 0x12, 0x50, 0x42, 0x7e, 0x34, 0x0, 0xc8, 0x12,
+ 0x58, 0x3d, 0xda, 0x79, 0x22, 0x12, 0xf1, 0xc0, 0x74, 0xaa, 0x7a, 0xb3,
+ 0x54, 0x70, 0xe4, 0x7a, 0xb3, 0x54, 0x6f, 0x7a, 0xb3, 0x39, 0xd5, 0xc2,
+ 0x1b, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x3, 0x12, 0x70, 0xe4, 0xd2, 0xac,
+ 0xd2, 0xa8, 0x22, 0xa9, 0xd0, 0x9e, 0xa9, 0xd7, 0x9e, 0x22, 0xd2, 0x0, 0x12,
+ 0x71, 0x15, 0xa9, 0xd0, 0xcb, 0x75, 0x9f, 0x0, 0xa9, 0xd0, 0x9e, 0xa9, 0xd4,
+ 0x9e, 0x7e, 0x37, 0x56, 0x25, 0xa, 0x56, 0xf5, 0x9d, 0x7d, 0x53, 0xf5, 0x9c,
+ 0xa9, 0xd3, 0x9e, 0xc2, 0x8a, 0xd2, 0xaa, 0xa9, 0xc1, 0x9e, 0x2, 0x70, 0xe4,
+ 0xa9, 0xd0, 0xce, 0x30, 0x0, 0x4, 0xa9, 0xd5, 0xc9, 0x22, 0xa9, 0xc5, 0xc9,
+ 0x22, 0xe4, 0x12, 0x71, 0xcc, 0x12, 0xe1, 0xb5, 0x12, 0xdf, 0xe1, 0x12,
+ 0x71, 0xc1, 0x12, 0x72, 0x4c, 0x12, 0x5a, 0xa4, 0x12, 0x77, 0xac, 0x12,
+ 0x77, 0xd0, 0x12, 0x0, 0x66, 0x12, 0x77, 0xa0, 0x12, 0x77, 0xa5, 0x12, 0x0,
+ 0x46, 0x12, 0xdf, 0xf4, 0x12, 0xdf, 0xfe, 0x12, 0xe0, 0xe, 0x12, 0x71, 0xa6,
+ 0x12, 0x72, 0x79, 0x12, 0xe0, 0x20, 0x12, 0x70, 0xeb, 0x12, 0x75, 0x8a,
+ 0xd2, 0xaf, 0x90, 0x1, 0x8a, 0xe4, 0x93, 0xca, 0xb8, 0x12, 0x71, 0x9e, 0x7e,
+ 0x24, 0x43, 0x31, 0xda, 0xb8, 0x12, 0x71, 0xec, 0x90, 0x1, 0x8a, 0xe4, 0x93,
+ 0xca, 0xb8, 0x12, 0x71, 0x9e, 0x7e, 0x24, 0x41, 0x21, 0xda, 0xb8, 0x12,
+ 0x72, 0x8, 0x2, 0x71, 0x8b, 0xa9, 0x27, 0xc1, 0xe, 0x7e, 0x34, 0xf3, 0x1e,
+ 0x12, 0x59, 0x1e, 0x7e, 0x34, 0xf4, 0xc1, 0x2, 0x47, 0xd1, 0x22, 0x90, 0x1,
+ 0x8b, 0xe4, 0x93, 0x7c, 0x7b, 0x22, 0x12, 0x0, 0x56, 0xe4, 0x7e, 0x34, 0x1,
+ 0xf4, 0x2, 0x71, 0xb1, 0x7c, 0xab, 0x74, 0x2, 0xa4, 0x7e, 0xf, 0x56, 0xb2,
+ 0x2d, 0x15, 0x79, 0x30, 0x0, 0x10, 0x22, 0xc2, 0x8d, 0xc2, 0x8f, 0x12, 0x72,
+ 0xcb, 0xa9, 0xc0, 0x93, 0x22, 0xd2, 0xcf, 0xa9, 0xc7, 0xcb, 0xbe, 0xb0, 0x8,
+ 0x50, 0x2, 0xf5, 0xcc, 0x75, 0xe6, 0x0, 0xc2, 0x0, 0x2, 0x71, 0xe0, 0xa9,
+ 0xd5, 0xc3, 0x12, 0x5e, 0x17, 0xa2, 0x0, 0xa9, 0x97, 0xc1, 0x22, 0x54, 0x3f,
+ 0x5e, 0x70, 0x3f, 0x12, 0x72, 0x34, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0,
+ 0x32, 0x7e, 0x37, 0x56, 0xba, 0x59, 0x23, 0x0, 0x14, 0xa9, 0xc6, 0xcb, 0x22,
+ 0x12, 0x72, 0x34, 0x7e, 0x17, 0x56, 0xba, 0x59, 0x31, 0x0, 0x3e, 0x7e, 0x37,
+ 0x56, 0xba, 0x59, 0x23, 0x0, 0x3c, 0x12, 0x72, 0x28, 0x4e, 0x70, 0x10, 0x1b,
+ 0x28, 0x30, 0xa9, 0xc6, 0xcb, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x2e, 0x24, 0x0,
+ 0x38, 0xb, 0x28, 0x30, 0x22, 0xa9, 0xd6, 0xcb, 0x7e, 0x14, 0x0, 0x21, 0x7e,
+ 0x7, 0x56, 0xba, 0x59, 0x10, 0x0, 0x2, 0x7c, 0x2b, 0x6c, 0x33, 0xa, 0x37,
+ 0x2d, 0x31, 0x22, 0xd2, 0xcc, 0x12, 0xef, 0x6b, 0x12, 0xef, 0x51, 0x78,
+ 0xfb, 0x7e, 0x34, 0x0, 0x3, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x0, 0x81, 0x7e,
+ 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x2, 0xd2, 0xeb, 0xc2, 0xc3, 0x6d, 0x11,
+ 0x7e, 0x1f, 0x56, 0xad, 0x1b, 0x1a, 0x10, 0xc2, 0xcc, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x54, 0x60, 0x7e, 0xb3, 0x54, 0xc2, 0x54, 0xfb, 0x7a, 0xb3, 0x54,
+ 0xc2, 0x7e, 0x8, 0x2, 0xf3, 0x12, 0x8c, 0xe6, 0x7e, 0x8, 0x3, 0x4d, 0x7e,
+ 0x34, 0x0, 0x3e, 0x12, 0x0, 0x2e, 0x7e, 0x18, 0x2, 0xf3, 0x7a, 0x1f, 0x3,
+ 0xa7, 0x75, 0x8, 0x0, 0x75, 0xf, 0x0, 0x7e, 0xb3, 0x54, 0x60, 0xf5, 0x91,
+ 0x2, 0x72, 0xb1, 0x12, 0x72, 0xcb, 0x90, 0x1, 0x20, 0xe4, 0x93, 0x54, 0xfe,
+ 0xf5, 0x92, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd4, 0x95, 0xd2, 0xad, 0xd2,
+ 0x97, 0xd2, 0x94, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2, 0x91, 0x22, 0x7e,
+ 0xa1, 0xcd, 0x12, 0x73, 0x60, 0x7d, 0x43, 0x5e, 0x44, 0x80, 0x0, 0x75, 0xcd,
+ 0x0, 0x5e, 0x60, 0x7f, 0x1b, 0x28, 0x30, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf,
+ 0x7e, 0xb3, 0x54, 0xc2, 0x20, 0xe2, 0xf7, 0x12, 0x72, 0x28, 0x4e, 0x70, 0x1,
+ 0x1b, 0x28, 0x30, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2,
+ 0xaf, 0x80, 0x31, 0x12, 0x73, 0x68, 0x5e, 0x4, 0x0, 0x20, 0xbe, 0x4, 0x0,
+ 0x20, 0x78, 0x24, 0xc2, 0xaf, 0x80, 0x2, 0xd2, 0xaf, 0x7e, 0xb3, 0x54, 0xc2,
+ 0x20, 0xe2, 0xf7, 0x2e, 0x24, 0x0, 0x38, 0x4e, 0x70, 0x2, 0x1b, 0x28, 0x30,
+ 0xd2, 0x31, 0x6c, 0x33, 0x0, 0xb, 0x30, 0xa5, 0xbb, 0x8, 0xf9, 0xd2, 0xaf,
+ 0x12, 0x73, 0x68, 0x5e, 0x4, 0x0, 0x80, 0x68, 0xc6, 0x2e, 0x24, 0x0, 0x38,
+ 0x4e, 0x70, 0x4, 0x1b, 0x28, 0x30, 0x4d, 0x44, 0x68, 0x9, 0x12, 0x73, 0x60,
+ 0x4e, 0x60, 0x80, 0x1b, 0x28, 0x30, 0x7a, 0xa1, 0xcd, 0x22, 0x7e, 0x27,
+ 0x56, 0xba, 0xb, 0x28, 0x30, 0x22, 0x7e, 0x27, 0x56, 0xba, 0x49, 0x32, 0x0,
+ 0x38, 0x7d, 0x3, 0x22, 0xa9, 0xa6, 0xcb, 0x92, 0x8, 0x12, 0x77, 0xc8, 0x7e,
+ 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x46, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27,
+ 0x56, 0xba, 0x59, 0x32, 0x0, 0x4a, 0x12, 0xef, 0xb9, 0x59, 0x32, 0x0, 0x42,
+ 0x29, 0xb0, 0x0, 0x3, 0x54, 0x1, 0x12, 0x6f, 0xe4, 0x7e, 0x47, 0x56, 0xba,
+ 0x59, 0x54, 0x0, 0x4c, 0x12, 0x72, 0xd3, 0xa2, 0x8, 0xa9, 0x96, 0xcb, 0x22,
+ 0x7f, 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x34, 0x17, 0x12, 0x97, 0xed, 0x7e, 0x73,
+ 0x68, 0xa7, 0x7a, 0x73, 0x34, 0x18, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73,
+ 0x34, 0x17, 0x7a, 0xb3, 0x34, 0x1a, 0x7d, 0x3d, 0x7a, 0x37, 0x34, 0x1b,
+ 0x7d, 0x3f, 0x7a, 0x37, 0x34, 0x1f, 0x7e, 0x8, 0x34, 0x17, 0x2, 0x73, 0x73,
+ 0xca, 0xd8, 0xca, 0x79, 0x7e, 0x35, 0x14, 0x6d, 0x22, 0x7f, 0x41, 0x7e,
+ 0xd3, 0x54, 0xfe, 0x20, 0x2f, 0x2, 0xa1, 0x23, 0xa9, 0xd7, 0xea, 0x7e, 0x77,
+ 0x74, 0xc, 0x12, 0xf1, 0x38, 0x60, 0x3f, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x75,
+ 0x2c, 0x2d, 0x21, 0x59, 0x32, 0x34, 0x97, 0x12, 0x4f, 0x48, 0x78, 0xf0,
+ 0x6d, 0xbb, 0x80, 0x21, 0x12, 0x75, 0x81, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78,
+ 0xfb, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x46, 0x42, 0x68, 0x5, 0x12, 0x75, 0x5b,
+ 0x80, 0x7, 0x6d, 0x11, 0x12, 0x75, 0x6a, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4,
+ 0x0, 0x0, 0x40, 0xd9, 0x80, 0x38, 0x6d, 0xbb, 0x7d, 0x1b, 0x12, 0x75, 0x2c,
+ 0x2d, 0x21, 0x59, 0x32, 0x34, 0x8d, 0x12, 0x4f, 0x48, 0x78, 0xf0, 0x6d,
+ 0xbb, 0x12, 0x75, 0x81, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78, 0xfb, 0x7e, 0x73,
+ 0x68, 0xaa, 0x12, 0x46, 0x42, 0x68, 0x5, 0x12, 0x75, 0x5b, 0x80, 0x7, 0x6d,
+ 0x11, 0x12, 0x75, 0x6a, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xdc, 0x7f, 0x4,
+ 0x2e, 0x14, 0x0, 0x0, 0x7d, 0x5a, 0x3e, 0x54, 0x7e, 0x1f, 0x35, 0xa5, 0x2d,
+ 0x35, 0x12, 0x73, 0xb0, 0x7e, 0x37, 0x74, 0xc, 0x2d, 0xa3, 0x90, 0x1, 0x90,
+ 0xe4, 0x93, 0x60, 0x41, 0x6d, 0x33, 0x7d, 0xb3, 0x12, 0x75, 0x78, 0x60, 0x5,
+ 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68, 0xaa, 0x6c, 0x44, 0x5c,
+ 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x75, 0x3e, 0x80, 0x7, 0x6d, 0x22, 0x12,
+ 0x75, 0x4d, 0xb, 0xa4, 0x12, 0x4f, 0x41, 0x78, 0xd9, 0x7d, 0xb3, 0x12, 0x75,
+ 0x28, 0x7d, 0x1b, 0x3e, 0x14, 0x2d, 0x21, 0x59, 0x32, 0x34, 0x8d, 0x12,
+ 0x4f, 0x48, 0x78, 0xee, 0x80, 0x44, 0x6d, 0x33, 0x7d, 0xb3, 0x80, 0x24,
+ 0x12, 0x75, 0x78, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x68,
+ 0xab, 0x6c, 0x44, 0x5c, 0x53, 0x4d, 0x22, 0x68, 0x5, 0x12, 0x75, 0x3e, 0x80,
+ 0x7, 0x6d, 0x22, 0x12, 0x75, 0x4d, 0xb, 0xa4, 0xb, 0xb4, 0xbe, 0xb4, 0x0,
+ 0x0, 0x40, 0xd6, 0x7d, 0xb3, 0x12, 0x75, 0x28, 0x7d, 0x1b, 0x3e, 0x14, 0x2d,
+ 0x21, 0x59, 0x32, 0x34, 0x97, 0x12, 0x4f, 0x48, 0x78, 0xee, 0xa9, 0xc7,
+ 0xea, 0xc2, 0x2f, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7d, 0x1b, 0x2d, 0x1a,
+ 0x3e, 0x14, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x31, 0x69, 0x31, 0x0, 0x6, 0x7e,
+ 0x50, 0x14, 0xac, 0x5d, 0x22, 0x7d, 0x2a, 0xb, 0xa4, 0x3e, 0x24, 0x7e, 0xf,
+ 0x35, 0xa5, 0x2d, 0x12, 0xb, 0xa, 0x20, 0x7d, 0x17, 0xb, 0x74, 0x3e, 0x14,
+ 0x2d, 0x19, 0x7d, 0x8, 0x1b, 0xa, 0x20, 0x22, 0x7d, 0x1a, 0xb, 0xa4, 0x3e,
+ 0x14, 0x7e, 0x1f, 0x35, 0xa5, 0x2d, 0x31, 0xb, 0x1a, 0x10, 0x7d, 0x7, 0xb,
+ 0x74, 0x3e, 0x4, 0x7f, 0x14, 0x2d, 0x30, 0x1b, 0x1a, 0x10, 0x22, 0x7d, 0x2b,
+ 0x7c, 0xb5, 0x7e, 0x14, 0x0, 0x1, 0x22, 0x7d, 0x3b, 0x7c, 0xb7, 0x7e, 0x24,
+ 0x0, 0x1, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0x7e, 0x34, 0x70, 0x43,
+ 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0xe, 0x7e, 0x34, 0x0, 0x4e, 0x7e,
+ 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x10, 0x12, 0xef, 0x9e, 0x7e, 0xf, 0x39,
+ 0xfc, 0x79, 0x30, 0x0, 0x24, 0x12, 0x77, 0xeb, 0x7e, 0x34, 0x80, 0x12, 0x7e,
+ 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x26, 0x90, 0x1, 0x90, 0xe4, 0x93, 0x60,
+ 0xe, 0x7e, 0x34, 0x1, 0x9b, 0x12, 0x32, 0xdf, 0x12, 0x76, 0x85, 0x6d, 0x33,
+ 0x80, 0x10, 0x6d, 0x33, 0x12, 0x76, 0x89, 0x7e, 0x34, 0x1, 0x99, 0x12, 0x32,
+ 0xdf, 0x2e, 0x34, 0x0, 0x9, 0x12, 0x77, 0xe2, 0x7e, 0x34, 0xff, 0xff, 0x12,
+ 0xf1, 0xa5, 0x12, 0x77, 0xd9, 0x7e, 0x34, 0x0, 0x14, 0x7e, 0xf, 0x39, 0xfc,
+ 0x79, 0x30, 0x0, 0x1e, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x20, 0x6d,
+ 0x33, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x22, 0x7e, 0x34, 0x0, 0x1f,
+ 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x28, 0x7e, 0x34, 0x8, 0x30, 0x7e,
+ 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x48, 0x7e, 0x34, 0x7, 0x3, 0x7e, 0xf,
+ 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4a, 0x7e, 0x34, 0x7f, 0x33, 0x12, 0x64, 0x2,
+ 0x12, 0x76, 0x9c, 0x7e, 0x34, 0xff, 0xff, 0x12, 0x5b, 0x91, 0x7e, 0x34,
+ 0xf0, 0x7f, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x4, 0xd2, 0x2, 0x12,
+ 0x2f, 0xd7, 0x75, 0xc2, 0x0, 0xa9, 0xd6, 0xc2, 0xa9, 0xd5, 0xc2, 0x53, 0xc3,
+ 0xf8, 0x43, 0xc3, 0x3, 0x75, 0xc4, 0x0, 0x75, 0xc5, 0x0, 0x75, 0xc6, 0x90,
+ 0x75, 0xc7, 0x0, 0xa9, 0xd2, 0xc2, 0xd2, 0xac, 0xa9, 0xc7, 0xea, 0x90, 0xd,
+ 0xd, 0xe4, 0x93, 0x7a, 0xb3, 0x55, 0xf8, 0x22, 0x2e, 0x34, 0x0, 0x9, 0x7e,
+ 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x16, 0x22, 0x7e, 0xa3, 0x54, 0xfe, 0xa,
+ 0x3a, 0x19, 0xb3, 0x54, 0xf7, 0xa2, 0xac, 0x92, 0xc, 0x7e, 0xf, 0x39, 0xfc,
+ 0xb, 0xa, 0x30, 0x5e, 0x34, 0x10, 0x0, 0x68, 0x8, 0x7e, 0x34, 0x10, 0x0,
+ 0x79, 0x30, 0x0, 0x2, 0x12, 0x77, 0xb3, 0x12, 0xf0, 0xcf, 0x1b, 0xa, 0x30,
+ 0xa2, 0xc, 0x92, 0xac, 0x22, 0x7c, 0x7b, 0x7e, 0xa0, 0xff, 0x7c, 0xb7, 0x24,
+ 0x8c, 0x68, 0x24, 0x24, 0xfb, 0x68, 0x30, 0x14, 0x68, 0x4b, 0x14, 0x68,
+ 0x35, 0x14, 0x68, 0x4a, 0x14, 0x68, 0x47, 0x24, 0x7, 0x78, 0x6f, 0x7e, 0x1f,
+ 0x39, 0xfc, 0x69, 0x51, 0x0, 0xe, 0x5e, 0x54, 0x0, 0x4, 0x7c, 0xab, 0x80,
+ 0x5f, 0x7e, 0x1f, 0x39, 0xfc, 0x69, 0x51, 0x0, 0x6, 0x5e, 0x54, 0x0, 0x1,
+ 0x7c, 0xab, 0x80, 0x4f, 0x12, 0x77, 0x54, 0x5e, 0x34, 0x4, 0x0, 0xa, 0x56,
+ 0x80, 0xb, 0x12, 0x77, 0x54, 0x5e, 0x34, 0x8, 0x0, 0xa, 0x56, 0x1e, 0x54,
+ 0x1e, 0x54, 0x1e, 0x54, 0x7c, 0xab, 0x80, 0x31, 0x7e, 0xa1, 0xef, 0x80,
+ 0x2c, 0x7e, 0x63, 0x55, 0xf5, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x55, 0xf5, 0xa,
+ 0x26, 0x9, 0xa2, 0x56, 0x1, 0x7e, 0xb3, 0x54, 0x86, 0x4, 0x7a, 0xb3, 0x54,
+ 0x86, 0x70, 0x9, 0x7e, 0xb3, 0x54, 0x85, 0x4, 0x7a, 0xb3, 0x54, 0x85, 0xa5,
+ 0xbf, 0x7d, 0x3, 0x75, 0xf, 0x7c, 0x7c, 0xba, 0x22, 0x7e, 0x1f, 0x39, 0xfc,
+ 0x69, 0x31, 0x0, 0x6, 0x22, 0x24, 0x8a, 0x78, 0x19, 0x7e, 0xf, 0x39, 0xfc,
+ 0xa5, 0xbf, 0x0, 0x8, 0x12, 0x5b, 0xb, 0x5e, 0x70, 0xfb, 0x80, 0x6, 0x12,
+ 0x5b, 0xb, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x12, 0x77, 0xf4, 0x7e,
+ 0x73, 0x55, 0xf7, 0x7a, 0x73, 0x54, 0x67, 0x7e, 0xb3, 0x54, 0xbc, 0x70, 0x5,
+ 0x12, 0x77, 0xba, 0x80, 0x3, 0x12, 0xf1, 0xd2, 0xe4, 0x7a, 0xb3, 0x68, 0x7a,
+ 0x7a, 0xb3, 0x68, 0x79, 0x2, 0x34, 0x3, 0xd2, 0xe9, 0xc2, 0xc1, 0x22, 0xa9,
+ 0xd6, 0xcd, 0xa9, 0xd5, 0xcd, 0x22, 0xa9, 0xd0, 0x99, 0xa9, 0xc6, 0xdf,
+ 0x22, 0xc2, 0xac, 0x7e, 0xf, 0x39, 0xfc, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x74,
+ 0x9, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xea, 0x22, 0xa9, 0xd6, 0xcb, 0x69,
+ 0x30, 0x0, 0x4, 0x22, 0x7e, 0x34, 0xb4, 0x80, 0x74, 0xa, 0x2, 0x47, 0xd1,
+ 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x1c, 0x22, 0x7e, 0xf, 0x39, 0xfc,
+ 0x79, 0x30, 0x0, 0x18, 0x22, 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x14,
+ 0x22, 0x7e, 0x73, 0x56, 0x28, 0x7a, 0x73, 0x54, 0x6c, 0x22, 0x7e, 0x63,
+ 0x54, 0x91, 0x7e, 0x70, 0x8, 0xac, 0x67, 0xb, 0x36, 0x7e, 0x43, 0x54, 0x92,
+ 0x7e, 0x50, 0x8, 0xac, 0x45, 0xb, 0x26, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x28,
+ 0x12, 0x78, 0x42, 0x7d, 0x53, 0x3e, 0x54, 0x7e, 0x44, 0x0, 0xa, 0x8d, 0x54,
+ 0x1b, 0x54, 0x7c, 0xab, 0x7e, 0xb3, 0x54, 0x96, 0xbc, 0xba, 0x28, 0xf, 0x7a,
+ 0xa3, 0x54, 0x96, 0x7e, 0x37, 0x39, 0xcb, 0x4e, 0x70, 0x4, 0x7a, 0x37, 0x39,
+ 0xcb, 0x22, 0x7d, 0x12, 0x2d, 0x13, 0x3e, 0x14, 0x6d, 0x0, 0x7e, 0x18, 0xbb,
+ 0x80, 0x2, 0x2a, 0x8d, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x2, 0x80, 0xe, 0xb4,
+ 0x1, 0xb, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x4, 0xd2, 0x1b, 0x80, 0x3,
+ 0x12, 0x2f, 0xa5, 0x7e, 0xb3, 0x39, 0xd5, 0xb4, 0x2, 0xf9, 0x74, 0x1, 0x7a,
+ 0xb3, 0x39, 0xd5, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x12, 0x0, 0x40, 0x12,
+ 0x78, 0x8d, 0x7e, 0xb3, 0x54, 0x12, 0xb4, 0x1, 0x2, 0xd2, 0x86, 0x22, 0x12,
+ 0x6e, 0xb, 0x7a, 0xb3, 0x56, 0x28, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0x5,
+ 0x12, 0x5d, 0xfa, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x79, 0x52, 0x7e,
+ 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x30, 0x16, 0x7, 0xd2, 0x18, 0xc2, 0x16,
+ 0x2, 0x78, 0xd8, 0x30, 0x19, 0x10, 0x12, 0xf0, 0xf9, 0x68, 0x14, 0x12, 0x78,
+ 0x8d, 0x7e, 0xb3, 0x56, 0x8d, 0x70, 0xfa, 0x80, 0x9, 0x30, 0x18, 0x6, 0x7e,
+ 0xb3, 0x56, 0x28, 0x70, 0x3, 0x2, 0x46, 0x8f, 0x22, 0x7e, 0xb3, 0x55, 0xf8,
+ 0xb4, 0x1, 0xf, 0x74, 0x2, 0x7a, 0xb3, 0x56, 0x21, 0x7a, 0xb3, 0x56, 0x28,
+ 0x12, 0x5d, 0xe0, 0x80, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x79, 0x52, 0x7e,
+ 0xb3, 0x56, 0x28, 0x2, 0x79, 0x0, 0x7e, 0xb3, 0x56, 0x28, 0x7c, 0xab, 0x12,
+ 0x7a, 0x5, 0x1b, 0xa0, 0x68, 0x11, 0x1b, 0xa0, 0x68, 0x15, 0x1b, 0xa1, 0x68,
+ 0x16, 0xb, 0xa2, 0x78, 0x15, 0x12, 0x79, 0x5e, 0x80, 0x10, 0x12, 0x79, 0x8a,
+ 0x12, 0x79, 0xa6, 0x80, 0x8, 0x12, 0x79, 0x77, 0x80, 0x3, 0x12, 0x79, 0xec,
+ 0x2, 0x79, 0x2d, 0xe4, 0x7a, 0xb3, 0x55, 0x0, 0x6c, 0xaa, 0x80, 0x13, 0x7e,
+ 0x70, 0x9, 0xac, 0x7a, 0x9, 0xb3, 0x55, 0x9, 0x2e, 0xb3, 0x55, 0x0, 0x7a,
+ 0xb3, 0x55, 0x0, 0xb, 0xa0, 0x7e, 0xb3, 0x54, 0xf3, 0xbc, 0xba, 0x38, 0xe5,
+ 0x22, 0x7e, 0xa3, 0x56, 0x28, 0x74, 0xb, 0xa4, 0x59, 0x35, 0x54, 0xc7, 0x22,
+ 0x6d, 0x33, 0x12, 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xc7, 0x12, 0x79, 0xbb,
+ 0xe4, 0x2, 0x79, 0x6e, 0x7a, 0xb3, 0x54, 0xfa, 0x7a, 0xb3, 0x54, 0xfb, 0x22,
+ 0x7e, 0x34, 0x0, 0x2, 0x12, 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xdd, 0x12, 0x79,
+ 0xbb, 0x74, 0x2, 0x2, 0x79, 0x6e, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x79, 0x9d,
+ 0x7e, 0x57, 0x54, 0xd2, 0x12, 0x79, 0xbb, 0x74, 0x1, 0x2, 0x79, 0x6e, 0x7e,
+ 0x24, 0xe, 0x40, 0x7e, 0x14, 0x13, 0x60, 0x22, 0x7e, 0x34, 0x0, 0x3, 0x12,
+ 0x79, 0x9d, 0x7e, 0x57, 0x54, 0xe8, 0x12, 0x79, 0xbb, 0x74, 0x3, 0x7a, 0xb3,
+ 0x54, 0xfc, 0x22, 0x7c, 0x1b, 0x7d, 0x43, 0x7e, 0xa3, 0x54, 0xf3, 0xbe,
+ 0xa0, 0x5, 0x50, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x59, 0x43, 0x55, 0x1,
+ 0x59, 0x23, 0x55, 0x3, 0x59, 0x13, 0x55, 0x5, 0x59, 0x23, 0x55, 0x7, 0x19,
+ 0x13, 0x55, 0x9, 0x7c, 0xba, 0x4, 0x7a, 0xb3, 0x54, 0xf3, 0xc3, 0x22, 0xd3,
+ 0x22, 0x7e, 0x34, 0x0, 0x4, 0x12, 0x79, 0x9d, 0x74, 0x1, 0x12, 0x79, 0xbb,
+ 0x7e, 0x73, 0x56, 0x21, 0x7a, 0x73, 0x54, 0xfa, 0x7a, 0x73, 0x54, 0xfb,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0xf3, 0x12, 0xf1, 0x5, 0x7a, 0xb3, 0x54, 0xf6,
+ 0x12, 0xef, 0x39, 0x7a, 0xb3, 0x54, 0xff, 0x7a, 0xb3, 0x55, 0x0, 0x22, 0x7c,
+ 0xb, 0xc2, 0x0, 0xd2, 0x1, 0x6d, 0x33, 0x7a, 0x37, 0x55, 0xf0, 0x7e, 0xb3,
+ 0x56, 0x28, 0xb4, 0x1, 0x7, 0xd2, 0x0, 0x74, 0x4, 0x12, 0x79, 0x0, 0xd2,
+ 0x1, 0x30, 0x1, 0x5, 0x7c, 0xb0, 0x12, 0x43, 0x1d, 0x30, 0x0, 0x3, 0x12,
+ 0x78, 0xfc, 0xa2, 0x1, 0x22, 0xca, 0xf8, 0x7e, 0xf3, 0x56, 0x21, 0x20, 0xd,
+ 0x3, 0x30, 0xe, 0x3, 0xc3, 0x80, 0x57, 0xc2, 0x30, 0x12, 0x7a, 0xb3, 0x60,
+ 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x74, 0xa, 0x6c, 0x44, 0x5c,
+ 0x57, 0x4d, 0x22, 0x68, 0x3e, 0x4e, 0x73, 0x74, 0xb, 0x7a, 0x73, 0x74, 0xb,
+ 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x7c, 0xbf, 0x12, 0x7a, 0x1d, 0x40, 0x3, 0xc3,
+ 0x80, 0x28, 0x20, 0xd, 0x6, 0x20, 0xe, 0x3, 0x30, 0x30, 0x3, 0xc3, 0x80,
+ 0x1c, 0x12, 0x7a, 0xb3, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x6e, 0x70,
+ 0xff, 0x5e, 0x73, 0x74, 0xa, 0x7a, 0x73, 0x74, 0xa, 0x12, 0x7f, 0xfd, 0xd3,
+ 0x80, 0x1, 0xd3, 0xda, 0xf8, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7c, 0xbf, 0x22,
+ 0xca, 0xf8, 0xc2, 0x0, 0x7e, 0xf3, 0x56, 0x21, 0x20, 0xd, 0x3, 0x30, 0xe,
+ 0x3, 0xc3, 0x80, 0x62, 0x7e, 0x24, 0x0, 0x1, 0x7c, 0xbf, 0x60, 0x5, 0x3e,
+ 0x24, 0x14, 0x78, 0xfb, 0x12, 0x46, 0x3e, 0x68, 0x4f, 0x7c, 0xbf, 0x12,
+ 0x98, 0xe2, 0x50, 0x2, 0xd2, 0x0, 0xd2, 0x2, 0x12, 0x46, 0xb8, 0xe4, 0x7c,
+ 0x7f, 0x12, 0x97, 0x32, 0xa2, 0x0, 0x92, 0x1, 0x7e, 0xf, 0x2d, 0x2a, 0x7e,
+ 0x18, 0x22, 0xc0, 0x7c, 0xbf, 0x12, 0x93, 0x6d, 0x20, 0xd, 0x3, 0x30, 0xe,
+ 0x3, 0xc3, 0x80, 0x22, 0x12, 0x46, 0x8f, 0x12, 0x7a, 0xb3, 0x60, 0x5, 0x3e,
+ 0x34, 0x14, 0x78, 0xfb, 0x6e, 0x70, 0xff, 0x5e, 0x73, 0x74, 0xb, 0x7a, 0x73,
+ 0x74, 0xb, 0x12, 0x7b, 0x30, 0x12, 0x7f, 0xfd, 0xd3, 0x80, 0x1, 0xd3, 0xda,
+ 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x56, 0x29, 0x2, 0x7b, 0x38, 0x6d, 0x33, 0x7a,
+ 0x37, 0x56, 0x8f, 0x22, 0x30, 0x1e, 0x24, 0xc2, 0x1e, 0x7e, 0x73, 0x53,
+ 0xec, 0x7a, 0x73, 0x54, 0x13, 0x74, 0xff, 0x7a, 0xb3, 0x53, 0xec, 0x7e,
+ 0xa3, 0x54, 0x13, 0x4c, 0xaa, 0x78, 0x5, 0x12, 0x7b, 0xff, 0x80, 0x7, 0xbe,
+ 0xa0, 0x1, 0x78, 0x2, 0xd2, 0x17, 0x30, 0x17, 0x3, 0x12, 0x7c, 0x16, 0x7e,
+ 0xb3, 0x54, 0x13, 0x14, 0x68, 0x55, 0x1b, 0xb1, 0x68, 0x5f, 0x24, 0x3, 0x68,
+ 0x2, 0x61, 0xfb, 0x12, 0x7c, 0x47, 0x38, 0x7, 0x7e, 0xb3, 0x56, 0x95, 0xb4,
+ 0x1, 0x15, 0x12, 0x7b, 0x38, 0x7e, 0xb3, 0x53, 0xf4, 0x30, 0xe0, 0x6b, 0x7e,
+ 0xb3, 0x54, 0x3e, 0x60, 0x65, 0x30, 0x12, 0x62, 0x80, 0x27, 0x7e, 0xb3,
+ 0x53, 0xf4, 0x30, 0xe0, 0x59, 0x7e, 0x37, 0x56, 0x8f, 0x7e, 0x24, 0x3, 0xe8,
+ 0x8d, 0x32, 0x7e, 0x53, 0x53, 0xf5, 0xa, 0x25, 0xbd, 0x32, 0x50, 0xc, 0x7e,
+ 0xb3, 0x54, 0x3e, 0x60, 0x3f, 0xbe, 0x34, 0x0, 0x1, 0x40, 0x39, 0x2, 0x7c,
+ 0x16, 0x12, 0x7c, 0x47, 0x38, 0x6, 0x7e, 0xb3, 0x53, 0xf4, 0x70, 0x2b, 0x2,
+ 0x7e, 0xaa, 0x7e, 0x34, 0xd, 0x16, 0x12, 0x32, 0xdf, 0x12, 0x5a, 0xa8, 0x12,
+ 0x5e, 0x92, 0x12, 0x5a, 0xb3, 0x12, 0x7b, 0xff, 0x7e, 0xb3, 0x56, 0x28,
+ 0x70, 0x3, 0x12, 0x46, 0x8f, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x6, 0x2, 0x78,
+ 0xae, 0x12, 0x7c, 0xbc, 0x22, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0xd2, 0x14,
+ 0x12, 0x7b, 0x38, 0x2, 0x7c, 0xc, 0x12, 0x5f, 0x78, 0x68, 0x4, 0xd2, 0x19,
+ 0xc2, 0x16, 0x22, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0xc, 0x7e, 0xb3, 0x2e,
+ 0x75, 0x60, 0x6, 0xe4, 0x7a, 0xb3, 0x54, 0x13, 0x22, 0xc2, 0x17, 0x12, 0x7c,
+ 0xbc, 0x12, 0x7b, 0x38, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x7a, 0xb3, 0x56,
+ 0x8e, 0x2, 0x7c, 0x3d, 0x12, 0x5f, 0x78, 0x68, 0x4, 0xd2, 0x16, 0xc2, 0x19,
+ 0x22, 0x7e, 0x73, 0x68, 0x79, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0xa0, 0x3b, 0x7e,
+ 0xb3, 0x54, 0x13, 0xb4, 0x1, 0xf, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x9, 0x7e,
+ 0xb3, 0x56, 0x93, 0x70, 0x3, 0x12, 0x7c, 0x3d, 0x7e, 0xb3, 0x54, 0x13, 0xb4,
+ 0x1, 0x38, 0x7e, 0xb3, 0x56, 0x28, 0x60, 0x26, 0x7e, 0x73, 0x56, 0x93, 0xbc,
+ 0x7a, 0x78, 0x3, 0x12, 0x7c, 0xc, 0x7e, 0xb3, 0x56, 0x93, 0x7a, 0xb3, 0x56,
+ 0x8e, 0x4, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0x73, 0x56, 0x93, 0xbe, 0x70, 0x3c,
+ 0x28, 0x5, 0xe4, 0x7a, 0xb3, 0x56, 0x93, 0x7e, 0xb3, 0x54, 0x15, 0xbe, 0xb0,
+ 0x1, 0x68, 0x3, 0x2, 0x7b, 0xff, 0x22, 0x12, 0x7b, 0x3f, 0x7e, 0xb3, 0x56,
+ 0x28, 0x70, 0x5, 0x12, 0x7f, 0x52, 0x80, 0x3, 0x12, 0x7e, 0xb9, 0x2, 0x7c,
+ 0x4f, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x13, 0x22, 0xca, 0xf8, 0x7e, 0xa3, 0x68,
+ 0x79, 0x7e, 0xb3, 0x68, 0x7a, 0xc2, 0x12, 0xbe, 0xa0, 0x1, 0x38, 0x21, 0xbe,
+ 0xb0, 0x1, 0x38, 0x1c, 0x7e, 0x47, 0x66, 0xec, 0xbe, 0x44, 0x0, 0x1e, 0x28,
+ 0x2, 0x80, 0x10, 0x7e, 0xf3, 0x52, 0x49, 0x4c, 0xff, 0x68, 0xf, 0x7e, 0x47,
+ 0x4e, 0x80, 0x4d, 0x44, 0x78, 0x7, 0xd2, 0x12, 0x12, 0x7c, 0xbc, 0x80, 0x35,
+ 0x4c, 0xaa, 0x78, 0x36, 0xb4, 0x1, 0x33, 0x7e, 0x37, 0x4e, 0x80, 0x7a, 0x37,
+ 0x52, 0x4b, 0x7e, 0xb3, 0x52, 0x49, 0xb4, 0x3, 0x1f, 0x7e, 0x37, 0x4e, 0x80,
+ 0xbe, 0x34, 0x0, 0x0, 0x28, 0x15, 0x74, 0x4, 0x7a, 0xb3, 0x52, 0x49, 0x7e,
+ 0x37, 0x52, 0x61, 0x7e, 0x27, 0x52, 0x63, 0x12, 0x7d, 0xca, 0xa1, 0xc3,
+ 0x80, 0x0, 0x12, 0xe7, 0x2b, 0xa1, 0xc3, 0x7e, 0xc7, 0x67, 0x75, 0x7e, 0xd7,
+ 0x67, 0x77, 0x4c, 0xff, 0x78, 0x19, 0x70, 0x53, 0xbe, 0xa0, 0x1, 0x78, 0x4e,
+ 0x7d, 0x3c, 0x7d, 0x2d, 0x12, 0xe6, 0xc6, 0x12, 0x7d, 0xc6, 0x74, 0x1, 0x7a,
+ 0xb3, 0x52, 0x49, 0x80, 0x3c, 0xbe, 0xf0, 0x1, 0x78, 0x2a, 0x7e, 0x27, 0x52,
+ 0x51, 0x9e, 0x27, 0x52, 0x59, 0x7e, 0x14, 0xe, 0x2c, 0x12, 0x7e, 0x71, 0x38,
+ 0x11, 0x7e, 0x27, 0x52, 0x5f, 0x9e, 0x27, 0x52, 0x57, 0x7e, 0x14, 0xe, 0x2e,
+ 0x12, 0x7e, 0x71, 0x28, 0x15, 0x74, 0x3, 0x7a, 0xb3, 0x52, 0x49, 0x80, 0x5,
+ 0xbe, 0xf0, 0x3, 0x78, 0x8, 0x7a, 0xc7, 0x52, 0x61, 0x7a, 0xd7, 0x52, 0x63,
+ 0x7e, 0xb3, 0x52, 0x49, 0x60, 0x26, 0x7d, 0x3c, 0x7d, 0x2d, 0x7e, 0x17,
+ 0x4e, 0x84, 0x7e, 0x7, 0x4e, 0x86, 0x12, 0x7e, 0x7b, 0xa, 0x2b, 0x7e, 0x73,
+ 0x52, 0x48, 0xa, 0x37, 0xbd, 0x32, 0x58, 0xb, 0x12, 0x7d, 0xc6, 0x7a, 0xc7,
+ 0x4e, 0x84, 0x7a, 0xd7, 0x4e, 0x86, 0xda, 0xf8, 0x22, 0x7d, 0x3c, 0x7d,
+ 0x2d, 0x7d, 0x42, 0x7d, 0x13, 0x7d, 0x24, 0x12, 0xe6, 0xa1, 0x7d, 0x31,
+ 0x12, 0xae, 0xa7, 0x2, 0x7d, 0xdb, 0x7e, 0x3, 0x52, 0x71, 0xbe, 0x0, 0xf0,
+ 0x50, 0x2, 0xc1, 0x70, 0x80, 0x7d, 0x6c, 0x99, 0x7e, 0xb3, 0x52, 0x48, 0xbe,
+ 0xb0, 0x20, 0x50, 0x5, 0x4, 0x7a, 0xb3, 0x52, 0x48, 0x7e, 0x1f, 0x4e, 0x88,
+ 0x7a, 0x1f, 0x2e, 0x77, 0x7e, 0x80, 0x1, 0x80, 0x45, 0x74, 0x4, 0xac, 0xb8,
+ 0x49, 0x35, 0x4e, 0x88, 0x49, 0x25, 0x4e, 0x8a, 0x7e, 0x17, 0x2e, 0x77,
+ 0x7e, 0x7, 0x2e, 0x79, 0x12, 0x7e, 0x7b, 0x7c, 0x1b, 0x7e, 0x3, 0x52, 0x48,
+ 0xbc, 0x1, 0x38, 0x22, 0xb, 0x90, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x2e, 0x34,
+ 0x4e, 0x88, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x4, 0x12, 0x8f, 0xf7, 0x7e, 0x30,
+ 0x4, 0xac, 0x39, 0x2e, 0x14, 0x4e, 0x88, 0x74, 0x4, 0x12, 0x2a, 0xc1, 0xb,
+ 0x80, 0x7e, 0x3, 0x52, 0x71, 0xbc, 0x8, 0x38, 0xb3, 0xa, 0x59, 0xb, 0x54,
+ 0x7c, 0xb, 0x7a, 0x3, 0x52, 0x71, 0x7e, 0x3, 0x52, 0x48, 0xbe, 0x0, 0x20,
+ 0x50, 0xb, 0x7e, 0x3, 0x52, 0x71, 0xbe, 0x0, 0xec, 0x40, 0x2, 0xa1, 0xe8,
+ 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xbd, 0x23, 0x22, 0x7d, 0x51,
+ 0x7d, 0x12, 0x12, 0xf1, 0x6f, 0x8, 0x4, 0x7d, 0x52, 0x80, 0x4, 0x6d, 0x55,
+ 0x9d, 0x52, 0x7c, 0xab, 0x7d, 0x21, 0x9d, 0x20, 0xbe, 0x24, 0x0, 0x0, 0x8,
+ 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x7c, 0xb7, 0xbc, 0xba,
+ 0x50, 0x3, 0x7c, 0xba, 0x22, 0x22, 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0x5, 0x20,
+ 0x12, 0x5, 0x80, 0x0, 0x2, 0x7b, 0xff, 0x22, 0x20, 0x14, 0x6, 0x12, 0x7e,
+ 0xf9, 0x12, 0x0, 0x12, 0x12, 0x46, 0x49, 0x12, 0x7f, 0x10, 0x40, 0x6, 0x12,
+ 0x7f, 0x2, 0x2, 0x0, 0x12, 0x22, 0x7e, 0x73, 0x66, 0xff, 0x7a, 0x73, 0x67,
+ 0x0, 0x7e, 0x73, 0x39, 0xa3, 0xa, 0x27, 0x7e, 0x73, 0x68, 0x79, 0xa, 0x37,
+ 0x2d, 0x32, 0x7a, 0x73, 0x68, 0x7a, 0xe4, 0x7a, 0xb3, 0x68, 0x7d, 0x7e,
+ 0x73, 0x55, 0xf7, 0x7a, 0x73, 0x54, 0x19, 0x22, 0x80, 0x3, 0x12, 0x7f, 0x31,
+ 0x30, 0x14, 0xfa, 0x22, 0x12, 0x7f, 0x99, 0x80, 0x3, 0x12, 0x7f, 0x31, 0x12,
+ 0x7f, 0x13, 0x50, 0xf8, 0x22, 0x12, 0x7f, 0x99, 0x12, 0xf2, 0x6a, 0x40, 0x3,
+ 0x12, 0x7f, 0xc4, 0x30, 0xd, 0x3, 0x12, 0x7f, 0xc4, 0x7e, 0xb3, 0x54, 0xf7,
+ 0x70, 0x6, 0x7e, 0xb3, 0x54, 0xf8, 0x60, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x80,
+ 0xb, 0x12, 0x7f, 0x9f, 0x12, 0x7f, 0x10, 0x40, 0x16, 0x20, 0x14, 0x13, 0x12,
+ 0xde, 0x6, 0x70, 0xf0, 0x12, 0x7f, 0x9f, 0x12, 0xde, 0x93, 0x74, 0x2, 0x7e,
+ 0x70, 0x17, 0x2, 0xde, 0x3f, 0x22, 0x12, 0x7f, 0x99, 0x12, 0x7f, 0x13, 0x40,
+ 0x6, 0x12, 0x7f, 0x2, 0x12, 0x0, 0x12, 0x12, 0xf2, 0x62, 0x12, 0x7f, 0xa6,
+ 0x80, 0x16, 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0xd, 0x7e, 0xb3, 0x55, 0xfc, 0x70,
+ 0x7, 0x12, 0xde, 0xb, 0x80, 0x5, 0x80, 0x0, 0x12, 0x7f, 0x31, 0x30, 0x14,
+ 0xe7, 0x7e, 0xb3, 0x55, 0xfc, 0xbe, 0xb0, 0x0, 0x28, 0x5, 0x14, 0x7a, 0xb3,
+ 0x55, 0xfc, 0xd2, 0x0, 0x12, 0x7f, 0xa6, 0xd2, 0xa, 0x2, 0x5e, 0x72, 0xe4,
+ 0x7a, 0xb3, 0x56, 0x2a, 0x22, 0x74, 0x81, 0x7a, 0xb3, 0x55, 0xf6, 0x22,
+ 0xa2, 0x0, 0xa9, 0x95, 0xcb, 0xa2, 0x0, 0xa9, 0x92, 0xcb, 0xa2, 0x0, 0xa9,
+ 0x92, 0xca, 0xa2, 0x0, 0xa9, 0x91, 0xcb, 0x22, 0x12, 0x7f, 0x99, 0x12, 0x7f,
+ 0x13, 0x50, 0xfb, 0x22, 0x30, 0x26, 0x6, 0x12, 0xde, 0xe2, 0x2, 0xde, 0xfb,
+ 0x22, 0x12, 0xc0, 0x1d, 0x12, 0x7f, 0xf6, 0x12, 0x7f, 0xda, 0x2, 0x34, 0x3,
+ 0x7e, 0x8, 0x39, 0xfa, 0x2, 0x7f, 0xe1, 0xb, 0xa, 0x30, 0xbe, 0x37, 0x55,
+ 0xf0, 0x28, 0x6, 0x9e, 0x37, 0x55, 0xf0, 0x80, 0x2, 0x6d, 0x33, 0x1b, 0xa,
+ 0x30, 0x22, 0x7e, 0x8, 0x4e, 0x80, 0x2, 0x7f, 0xe1, 0x7e, 0x73, 0x53, 0xf8,
+ 0x7e, 0xb3, 0x54, 0x13, 0x70, 0x35, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x22,
+ 0x7e, 0x63, 0x53, 0xf6, 0xbe, 0x60, 0x14, 0x28, 0x5, 0x7e, 0x60, 0x14, 0x80,
+ 0x7, 0xa5, 0xbe, 0x0, 0x3, 0x7e, 0x60, 0x1, 0xa, 0x26, 0x7e, 0x34, 0x0,
+ 0x64, 0x12, 0x29, 0xee, 0x7c, 0x67, 0x80, 0x63, 0x7e, 0xb3, 0x55, 0xf8, 0xa,
+ 0x27, 0xb4, 0x1, 0x2, 0x80, 0x32, 0x80, 0x3e, 0x7e, 0xf, 0x39, 0xfc, 0x69,
+ 0x20, 0x0, 0x6, 0x5e, 0x24, 0x0, 0x1, 0x78, 0xe, 0x7e, 0x63, 0x53, 0xf7,
+ 0xbe, 0x60, 0x7f, 0x28, 0x3f, 0x7e, 0x60, 0x7f, 0x80, 0x3a, 0x7e, 0xb3,
+ 0x56, 0x8e, 0xbe, 0xb0, 0x3c, 0x68, 0x2, 0x70, 0x23, 0x7e, 0xb3, 0x55, 0xf8,
+ 0xa, 0x27, 0xb4, 0x1, 0xe, 0x7e, 0x34, 0x1, 0xf4, 0x8d, 0x32, 0x9e, 0x34,
+ 0x0, 0x5, 0x7c, 0x67, 0x80, 0x18, 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32, 0x1b,
+ 0x35, 0x7c, 0x67, 0x80, 0xc, 0xa, 0x27, 0x7e, 0x34, 0x3, 0xe8, 0x8d, 0x32,
+ 0xb, 0x36, 0x7c, 0x67, 0x7e, 0x73, 0x54, 0x1a, 0xac, 0x67, 0x7e, 0x24, 0x0,
+ 0x18, 0x12, 0x29, 0xee, 0x7a, 0x73, 0x55, 0xf2, 0xc2, 0x14, 0x6d, 0x33,
+ 0x7a, 0x37, 0x55, 0xf0, 0x22, 0x7e, 0xb3, 0x56, 0xbd, 0x4, 0x7a, 0xb3, 0x56,
+ 0xbd, 0x7e, 0x73, 0x56, 0xbd, 0x7a, 0x73, 0x53, 0xff, 0x22, 0xe4, 0x7a,
+ 0xb3, 0x54, 0x13, 0x12, 0x6e, 0xb, 0x7a, 0xb3, 0x74, 0x9, 0x12, 0x5b, 0x9a,
+ 0x12, 0x45, 0x56, 0x7e, 0x34, 0xd, 0xac, 0x12, 0x5a, 0xa8, 0x12, 0x80, 0xec,
+ 0x12, 0x80, 0xe0, 0x2, 0x2d, 0xb4, 0x7e, 0x8, 0x56, 0x4a, 0x7e, 0x34, 0x0,
+ 0x1a, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x0, 0x7e, 0x34, 0x0, 0xa, 0x74,
+ 0x14, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x1, 0x64, 0x7e, 0x34, 0x0, 0xa, 0xe4,
+ 0x2, 0x0, 0x2e, 0xca, 0xd8, 0xca, 0x79, 0x7e, 0xf3, 0x68, 0x79, 0x7c, 0xbf,
+ 0x7e, 0x8, 0x68, 0x29, 0x7e, 0x78, 0x67, 0x1b, 0x70, 0x35, 0x12, 0x80, 0xec,
+ 0x7e, 0x8, 0x2, 0x6f, 0x12, 0x84, 0xbb, 0x7e, 0x8, 0x2, 0x79, 0x12, 0x84,
+ 0xa6, 0x7e, 0x8, 0x2, 0x47, 0x7e, 0x34, 0x0, 0xa, 0x74, 0x1, 0x12, 0x0,
+ 0x2e, 0x7e, 0x8, 0x2, 0x51, 0x12, 0x84, 0xbb, 0x7e, 0x8, 0x2, 0x5b, 0x12,
+ 0x84, 0xa6, 0x7e, 0x8, 0x2, 0x65, 0x12, 0x84, 0xa6, 0x81, 0x92, 0x7e, 0xb3,
+ 0x39, 0xa3, 0xa, 0x3b, 0xa, 0x2f, 0x2d, 0x23, 0x7e, 0xb3, 0x68, 0x7a, 0xa,
+ 0x3b, 0xbd, 0x32, 0x8, 0x6, 0x74, 0x3, 0x7a, 0xb3, 0x2, 0x83, 0x6c, 0x99,
+ 0x81, 0x8b, 0x12, 0x84, 0xcd, 0x29, 0x84, 0x0, 0x4, 0xbe, 0x80, 0xff, 0x78,
+ 0x2, 0x81, 0x89, 0xb, 0x4a, 0xd0, 0xbe, 0xd4, 0x0, 0x20, 0x28, 0x8, 0x90,
+ 0x1, 0x8a, 0x12, 0x84, 0xfc, 0x40, 0x5, 0x75, 0x27, 0x1, 0x80, 0x3, 0x75,
+ 0x27, 0x0, 0x69, 0xd4, 0x0, 0x2, 0xbe, 0xd4, 0x0, 0x20, 0x28, 0x8, 0x90,
+ 0x1, 0x8b, 0x12, 0x84, 0xfc, 0x40, 0x5, 0x7e, 0xa0, 0x1, 0x80, 0x2, 0x6c,
+ 0xaa, 0x7e, 0x50, 0x8, 0xac, 0x58, 0x7f, 0x60, 0x2d, 0xd2, 0x7e, 0x6b, 0xb0,
+ 0xb4, 0x2, 0x2, 0x80, 0x2, 0x81, 0x29, 0x7e, 0x50, 0x4, 0xac, 0x58, 0x49,
+ 0xc2, 0x2, 0x1f, 0xb, 0x4a, 0xd0, 0x9d, 0xdc, 0x49, 0x22, 0x2, 0x21, 0x69,
+ 0xc4, 0x0, 0x2, 0x9d, 0xc2, 0xbe, 0xd4, 0x0, 0x0, 0x8, 0x4, 0x7d, 0xbd,
+ 0x80, 0x4, 0x6d, 0xbb, 0x9d, 0xbd, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x4, 0x7d,
+ 0xac, 0x80, 0x4, 0x6d, 0xaa, 0x9d, 0xac, 0x29, 0xf4, 0x0, 0x5, 0x2d, 0x3f,
+ 0x7d, 0x2e, 0x29, 0xe1, 0x0, 0x6, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x5b, 0xbc,
+ 0xbf, 0x50, 0x6, 0xa, 0x38, 0x19, 0xf3, 0x2, 0x5b, 0xa, 0x38, 0x9, 0xb3,
+ 0x2, 0x65, 0xbc, 0xbe, 0x50, 0x6, 0xa, 0x38, 0x19, 0xe3, 0x2, 0x65, 0xa,
+ 0x38, 0x9, 0xb3, 0x2, 0x51, 0xbe, 0xb0, 0x64, 0x50, 0xa, 0xa, 0x38, 0x2e,
+ 0x34, 0x2, 0x51, 0x4, 0x7a, 0x39, 0xb0, 0x6c, 0xdd, 0x7e, 0x73, 0x68, 0x79,
+ 0xbe, 0x70, 0x8, 0x40, 0x5, 0x7e, 0xd0, 0xa, 0x80, 0x8, 0xbe, 0x70, 0x3,
+ 0x40, 0x3, 0x7e, 0xd0, 0x9, 0x7e, 0x73, 0x2, 0x83, 0xbe, 0x70, 0x0, 0x28,
+ 0xa, 0x7e, 0xd0, 0xa, 0x7c, 0xb7, 0x14, 0x7a, 0xb3, 0x2, 0x83, 0x12, 0x84,
+ 0x9f, 0xbc, 0xbd, 0x50, 0x6, 0xa, 0x38, 0x19, 0xd3, 0x1, 0x0, 0xa, 0x38,
+ 0x9, 0xb3, 0x2, 0x6f, 0x60, 0x2, 0x41, 0xfa, 0xa, 0x38, 0x9, 0xb3, 0x2,
+ 0x51, 0xbe, 0xb0, 0x12, 0x50, 0x5e, 0xa, 0x38, 0x9, 0x63, 0x1, 0x0, 0x7e,
+ 0x70, 0x2, 0xac, 0x67, 0xa, 0x2f, 0xbd, 0x32, 0x58, 0x9, 0xa, 0x3f, 0x1e,
+ 0x34, 0x7c, 0xb7, 0x12, 0x84, 0xad, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x5b, 0xbe,
+ 0xb0, 0x3c, 0x28, 0x46, 0xa, 0x2b, 0xa, 0x3f, 0x2e, 0x34, 0x0, 0x14, 0xbd,
+ 0x32, 0x48, 0x11, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0xa, 0x28, 0x9, 0xb2, 0x2,
+ 0x65, 0xa, 0x2b, 0xbd, 0x32, 0x58, 0x29, 0x7d, 0x3a, 0x2d, 0x3b, 0xbe, 0x34,
+ 0x0, 0x80, 0x50, 0x6, 0x6d, 0xaa, 0x7d, 0xba, 0x80, 0x19, 0x1e, 0xb4, 0x1e,
+ 0xb4, 0x7d, 0xab, 0x1e, 0xa4, 0x1e, 0xa4, 0x80, 0xd, 0x12, 0x84, 0x9f, 0xbe,
+ 0xb0, 0x14, 0x28, 0x5, 0x74, 0x14, 0x12, 0x84, 0xad, 0x7d, 0x3a, 0x2d, 0x3b,
+ 0xbe, 0x34, 0x0, 0x4, 0x50, 0x4, 0x6d, 0xaa, 0x7d, 0xba, 0x12, 0x84, 0x9f,
+ 0xa, 0x3b, 0xbd, 0x3b, 0x28, 0x5d, 0xbd, 0x3a, 0x28, 0x59, 0xe5, 0x27, 0xbe,
+ 0xb0, 0x1, 0x68, 0x11, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x49, 0x93, 0x2, 0x1f,
+ 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x1b, 0x1a, 0x90, 0xbe, 0xa0, 0x1, 0x68, 0x6,
+ 0x12, 0x84, 0xd7, 0x12, 0x84, 0xee, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x64, 0x7e,
+ 0x39, 0xb0, 0x4, 0x7a, 0x39, 0xb0, 0xa, 0x38, 0x9, 0xb3, 0x1, 0x64, 0xbe,
+ 0xb0, 0x32, 0x50, 0x2, 0x81, 0x89, 0x12, 0x84, 0x9f, 0xbe, 0xb0, 0x14, 0x50,
+ 0xa, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x0, 0x4, 0x7a, 0x39, 0xb0, 0x74, 0x1, 0xa,
+ 0x38, 0x19, 0xb3, 0x2, 0x79, 0x81, 0x89, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x79,
+ 0x60, 0x34, 0xbe, 0xb4, 0x0, 0x1e, 0x38, 0x6, 0xbe, 0xa4, 0x0, 0x1e, 0x28,
+ 0x4, 0x74, 0x1, 0x80, 0x1e, 0xbe, 0xb4, 0x0, 0xa, 0x50, 0x6, 0xbe, 0xa4,
+ 0x0, 0xa, 0x40, 0x4, 0x74, 0x6, 0x80, 0xe, 0xbe, 0xb4, 0x0, 0x5, 0x50, 0x6,
+ 0xbe, 0xa4, 0x0, 0x5, 0x40, 0x8, 0x74, 0x3, 0xa, 0x38, 0x19, 0xb3, 0x2,
+ 0x47, 0x12, 0x84, 0xb4, 0xbe, 0xb0, 0x1, 0x28, 0x3b, 0xa, 0x38, 0x2e, 0x34,
+ 0x2, 0x47, 0x14, 0x7a, 0x39, 0xb0, 0x12, 0x84, 0xb4, 0xa, 0x2b, 0x7d, 0x3d,
+ 0x12, 0x29, 0xee, 0x7e, 0x50, 0x4, 0xac, 0x58, 0x49, 0x92, 0x2, 0x1f, 0x2d,
+ 0x93, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x1b, 0x1a, 0x90, 0x12, 0x84, 0xb4, 0xa,
+ 0x2b, 0x7d, 0x3c, 0x12, 0x29, 0xee, 0x7d, 0x23, 0x12, 0x84, 0xd7, 0x2d,
+ 0x32, 0x12, 0x84, 0xee, 0x74, 0x1, 0xa, 0x38, 0x19, 0xb3, 0x2, 0x6f, 0xe4,
+ 0x19, 0xb3, 0x2, 0x79, 0x12, 0x84, 0xcd, 0xb, 0x4a, 0x30, 0x12, 0x84, 0xc3,
+ 0x69, 0x34, 0x0, 0x2, 0x59, 0x32, 0x2, 0x21, 0xa, 0x38, 0x9, 0x53, 0x1, 0x0,
+ 0xbe, 0x50, 0x14, 0x40, 0x7, 0x74, 0xa, 0x12, 0x84, 0xad, 0x80, 0x11, 0xbe,
+ 0x50, 0x1, 0x28, 0xc, 0xa, 0x38, 0x2e, 0x34, 0x1, 0x0, 0x7c, 0xb5, 0x14,
+ 0x7a, 0x39, 0xb0, 0xe4, 0xa, 0x38, 0x19, 0xb3, 0x1, 0x64, 0x80, 0x60, 0x12,
+ 0x84, 0xe1, 0x70, 0x35, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0xb, 0x1a, 0x30, 0x12,
+ 0x84, 0xc3, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x69, 0x31, 0x0, 0x2, 0x7e, 0x50,
+ 0x4, 0xac, 0x58, 0x59, 0x32, 0x2, 0x21, 0x12, 0x84, 0x97, 0x7d, 0x2e, 0x29,
+ 0xb1, 0x0, 0x5, 0xa, 0x38, 0x19, 0xb3, 0x2, 0x5b, 0x12, 0x84, 0x97, 0x29,
+ 0xb1, 0x0, 0x6, 0x80, 0x20, 0x12, 0x84, 0xe1, 0xb4, 0x1, 0x20, 0xe4, 0xa,
+ 0x38, 0x19, 0xb3, 0x2, 0x6f, 0x19, 0xb3, 0x2, 0x79, 0x74, 0x1, 0x19, 0xb3,
+ 0x2, 0x47, 0xe4, 0x19, 0xb3, 0x2, 0x51, 0x19, 0xb3, 0x2, 0x5b, 0xa, 0x38,
+ 0x19, 0xb3, 0x2, 0x65, 0xb, 0x90, 0x12, 0x85, 0xb, 0x28, 0x2, 0x21, 0x6c,
+ 0xda, 0x79, 0xda, 0xd8, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x79, 0x2d, 0x3f, 0x22,
+ 0xa, 0x38, 0x9, 0xb3, 0x1, 0x0, 0x22, 0x7e, 0x34, 0x0, 0xa, 0x2, 0x0, 0x2e,
+ 0xa, 0x38, 0x19, 0xb3, 0x1, 0x0, 0x22, 0xa, 0x38, 0x9, 0xb3, 0x2, 0x47,
+ 0x22, 0x7e, 0x34, 0x0, 0xa, 0xe4, 0x2, 0x0, 0x2e, 0x7e, 0x50, 0x4, 0xac,
+ 0x58, 0x59, 0x32, 0x2, 0x1f, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x79, 0x7f, 0x47,
+ 0x2d, 0x93, 0x22, 0x7e, 0x70, 0x4, 0xac, 0x78, 0x49, 0x33, 0x2, 0x21, 0x22,
+ 0x7e, 0x70, 0x8, 0xac, 0x78, 0x2d, 0x31, 0x7d, 0x20, 0x7e, 0x1b, 0xb0, 0x22,
+ 0x7e, 0x50, 0x9, 0xac, 0x59, 0x7f, 0x47, 0x2d, 0x92, 0x79, 0x34, 0x0, 0x2,
+ 0x22, 0xe4, 0x93, 0x7c, 0x5b, 0x74, 0x40, 0xac, 0x5b, 0x9e, 0x24, 0x0, 0x20,
+ 0xbd, 0xd2, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xb9, 0x22, 0x7e, 0x8,
+ 0x2e, 0x77, 0xca, 0x69, 0xca, 0xf8, 0x7f, 0x70, 0x7c, 0x86, 0x7c, 0xf7,
+ 0x7c, 0xab, 0x6c, 0x99, 0xa1, 0xd7, 0x7c, 0x3f, 0xa1, 0xcf, 0x7e, 0x10, 0x9,
+ 0xac, 0x19, 0x9, 0x20, 0x67, 0xd3, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0xb0,
+ 0x67, 0x1f, 0xbc, 0xb2, 0x68, 0x2, 0xa1, 0xcd, 0xbe, 0x20, 0xff, 0x78, 0x2,
+ 0xa1, 0xcd, 0x7e, 0xd0, 0x8, 0xac, 0xd2, 0x9, 0xb6, 0x68, 0x29, 0x70, 0xa,
+ 0x7d, 0x30, 0x2e, 0x34, 0x67, 0x1b, 0x6d, 0x22, 0x80, 0xb, 0x7e, 0x70, 0x9,
+ 0xac, 0x79, 0x2e, 0x34, 0x67, 0xcf, 0x6d, 0x22, 0x29, 0x11, 0x0, 0x4, 0x12,
+ 0x85, 0xe5, 0x39, 0x16, 0x0, 0x4, 0xb, 0x1a, 0x0, 0x12, 0x85, 0xe5, 0x1b,
+ 0x6a, 0x0, 0x69, 0x1, 0x0, 0x2, 0x12, 0x85, 0xe5, 0x79, 0x6, 0x0, 0x2, 0x7e,
+ 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67, 0x20, 0x12, 0x85, 0xe5, 0x39, 0x16,
+ 0x0, 0x5, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67, 0x21, 0x12, 0x85,
+ 0xe5, 0x39, 0x16, 0x0, 0x6, 0x7e, 0x10, 0x9, 0xac, 0x13, 0x9, 0x10, 0x67,
+ 0x22, 0x12, 0x85, 0xe5, 0x39, 0x16, 0x0, 0x7, 0x7e, 0x10, 0x9, 0xac, 0x13,
+ 0x9, 0x10, 0x67, 0x23, 0x12, 0x85, 0xe5, 0x39, 0x16, 0x0, 0x8, 0xb, 0xa0,
+ 0x80, 0x8, 0xb, 0x30, 0xbc, 0x83, 0x28, 0x2, 0xa1, 0x2b, 0xb, 0x90, 0x12,
+ 0x85, 0xb, 0x28, 0x2, 0xa1, 0x27, 0x7c, 0xba, 0xda, 0xf8, 0xda, 0x69, 0x22,
+ 0x7e, 0xd0, 0x9, 0xac, 0xda, 0x7f, 0x67, 0x2d, 0xd6, 0x22, 0xca, 0x79, 0x7c,
+ 0xeb, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0xfb, 0x7e, 0x70, 0x9, 0xac, 0x7f,
+ 0x7e, 0x8, 0x2e, 0x77, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe4, 0x6c, 0x77, 0x7c,
+ 0x6e, 0x12, 0x85, 0x13, 0x7c, 0x7e, 0x7c, 0x6f, 0x12, 0x85, 0x13, 0x7c,
+ 0x1b, 0x6c, 0x0, 0x80, 0x36, 0x6c, 0x99, 0x80, 0x17, 0x74, 0x9, 0xac, 0xb9,
+ 0x9, 0xa5, 0x2e, 0x7b, 0x7e, 0x30, 0x9, 0xac, 0x30, 0x9, 0x81, 0x67, 0x1f,
+ 0xbc, 0x8a, 0x68, 0x6, 0xb, 0x90, 0xbc, 0x19, 0x38, 0xe5, 0xbc, 0x19, 0x78,
+ 0x11, 0x7e, 0x70, 0x9, 0xac, 0x70, 0x12, 0xd1, 0xc9, 0xac, 0x31, 0x2e, 0x14,
+ 0x2e, 0x77, 0x12, 0x87, 0xe1, 0xb, 0x0, 0xbc, 0xf0, 0x38, 0xc6, 0x74, 0x9,
+ 0xac, 0xbf, 0xca, 0x59, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x67, 0xcf, 0x12,
+ 0x2b, 0x7, 0x1b, 0xfd, 0xda, 0x79, 0x22, 0xca, 0x79, 0x7e, 0xf3, 0x68, 0x79,
+ 0x7e, 0xe3, 0x68, 0x7a, 0x7c, 0xbf, 0x7c, 0x7e, 0x12, 0x86, 0xfe, 0x7c,
+ 0xbf, 0x12, 0x85, 0xef, 0x4c, 0xee, 0x78, 0x17, 0x12, 0x8f, 0xff, 0xca,
+ 0x59, 0x7e, 0x18, 0x67, 0x1b, 0x7e, 0x8, 0x67, 0xcf, 0x12, 0x2b, 0x7, 0x1b,
+ 0xfd, 0x12, 0x86, 0xb4, 0x80, 0xe, 0x7e, 0xb3, 0x68, 0x80, 0x70, 0x8, 0x12,
+ 0x86, 0xb4, 0x7c, 0xbf, 0x12, 0xb9, 0xe4, 0x7c, 0xbf, 0x12, 0xbc, 0xb0,
+ 0xda, 0x79, 0x22, 0x7e, 0xa3, 0x68, 0x79, 0x6c, 0x77, 0x80, 0x3d, 0x7e,
+ 0x90, 0x9, 0xac, 0x97, 0x9, 0x64, 0x67, 0xd3, 0x12, 0x87, 0xf2, 0x70, 0x2d,
+ 0x7e, 0x30, 0x1, 0x7e, 0x50, 0x9, 0xac, 0x56, 0x19, 0x32, 0x1, 0xd, 0x49,
+ 0x14, 0x67, 0x1b, 0x59, 0x12, 0x1, 0xe, 0x49, 0x14, 0x67, 0x1d, 0x59, 0x12,
+ 0x1, 0x10, 0xe4, 0x19, 0xb2, 0x1, 0x12, 0x19, 0xb2, 0x1, 0xa, 0x19, 0xb2,
+ 0x1, 0xb, 0x19, 0xb2, 0x1, 0xc, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xbf, 0x22,
+ 0x7c, 0x67, 0x7c, 0x7b, 0xa5, 0xbf, 0x0, 0xd, 0xbe, 0x60, 0x0, 0x28, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x68, 0x80, 0x2, 0x87, 0x5c, 0xa5, 0xbe, 0x0, 0x16, 0x6c,
+ 0xaa, 0x80, 0x9, 0x12, 0x87, 0xe9, 0x19, 0x62, 0x67, 0xd3, 0xb, 0xa0, 0x90,
+ 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xee, 0x6c, 0xaa, 0x80, 0x26, 0x7e,
+ 0x30, 0x9, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x1b, 0xb, 0x18, 0x20, 0x12, 0x5d,
+ 0x6f, 0x1b, 0x18, 0x20, 0x7e, 0x30, 0x9, 0xac, 0x3a, 0x2e, 0x14, 0x67, 0x1d,
+ 0xb, 0x18, 0x20, 0x12, 0x5d, 0x6f, 0x1b, 0x18, 0x20, 0xb, 0xa0, 0xbc, 0x7a,
+ 0x38, 0xd6, 0x22, 0x12, 0x87, 0x82, 0x74, 0x2, 0xac, 0x7b, 0x7e, 0x8, 0x1,
+ 0x8f, 0xe4, 0x12, 0x0, 0x2e, 0x90, 0xd, 0xe, 0x93, 0x7c, 0x7b, 0x74, 0x2,
+ 0xac, 0x7b, 0x7e, 0x8, 0x1, 0x6f, 0xe4, 0x2, 0x0, 0x2e, 0x74, 0xff, 0x12,
+ 0x0, 0x2e, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0x7b, 0x22, 0x12, 0x87, 0x82,
+ 0x74, 0x9, 0xac, 0x7b, 0x7e, 0x8, 0x67, 0x1b, 0x12, 0x87, 0x7d, 0x74, 0x9,
+ 0xac, 0x7b, 0x7e, 0x8, 0x67, 0xcf, 0x12, 0x87, 0x7d, 0x74, 0x9, 0xac, 0x7b,
+ 0x7e, 0x8, 0x67, 0x75, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x68, 0x29,
+ 0x12, 0xb7, 0xa5, 0x7e, 0x8, 0x68, 0x79, 0x7e, 0x34, 0x0, 0xc, 0xe4, 0x2,
+ 0x0, 0x2e, 0x12, 0x90, 0x1c, 0x12, 0x91, 0xb, 0x12, 0x90, 0xcd, 0x12, 0x91,
+ 0xc8, 0x12, 0x37, 0xad, 0x12, 0x32, 0xe7, 0x12, 0x91, 0xa9, 0x12, 0x87,
+ 0x8a, 0x12, 0x9f, 0xd7, 0x2, 0x5f, 0x4c, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0xb,
+ 0x10, 0x22, 0x7e, 0x60, 0xff, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x22, 0x7e, 0x50,
+ 0x8, 0xac, 0x56, 0x9, 0xb2, 0x68, 0x29, 0x22, 0x7e, 0x37, 0x56, 0xa3, 0xb,
+ 0x34, 0x7a, 0x37, 0x56, 0xa3, 0x7e, 0x37, 0x56, 0xa5, 0xbe, 0x37, 0x56,
+ 0xa3, 0x28, 0x3, 0x2, 0x88, 0x14, 0x22, 0xe5, 0x9a, 0x60, 0x3, 0xa9, 0xd6,
+ 0xdf, 0x22, 0x2, 0x87, 0xfc, 0xca, 0x7b, 0xca, 0x6b, 0xca, 0x5b, 0xca, 0x4b,
+ 0xca, 0x2b, 0xca, 0x1b, 0xca, 0xb, 0xc0, 0xd0, 0xc0, 0x83, 0xc0, 0x82, 0xc2,
+ 0x8f, 0x12, 0x88, 0x1c, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xd0, 0xda, 0xb, 0xda,
+ 0x1b, 0xda, 0x2b, 0xda, 0x4b, 0xda, 0x5b, 0xda, 0x6b, 0xda, 0x7b, 0x32,
+ 0x7e, 0xa3, 0x52, 0x71, 0x7e, 0x70, 0x4, 0xac, 0x7a, 0xb, 0x34, 0xbe, 0x37,
+ 0x54, 0xc0, 0x40, 0x39, 0x7e, 0x37, 0x54, 0xc0, 0xb, 0x34, 0x7a, 0x37, 0x54,
+ 0xc0, 0xbe, 0x34, 0x0, 0x1, 0x78, 0x5, 0x7e, 0xb3, 0x54, 0x41, 0x22, 0xbe,
+ 0x34, 0x0, 0x2, 0x78, 0x3, 0x7c, 0xba, 0x22, 0xbe, 0x34, 0x0, 0x2, 0x50,
+ 0x9, 0x7d, 0x23, 0x1b, 0x25, 0x9, 0xb2, 0x56, 0x9c, 0x22, 0x9e, 0x34, 0x0,
+ 0x3, 0x2e, 0x37, 0x4e, 0x82, 0x7e, 0x39, 0xb0, 0x22, 0x74, 0xff, 0x22, 0x7e,
+ 0x73, 0x54, 0x60, 0x7c, 0xa7, 0x5e, 0xa0, 0xf, 0x7c, 0xb7, 0x23, 0x54, 0x1,
+ 0x3, 0x54, 0x80, 0x4e, 0xb3, 0x54, 0xc3, 0x4c, 0xba, 0x22, 0xca, 0x59, 0xca,
+ 0x1b, 0xca, 0xb, 0xc0, 0x83, 0xc0, 0x82, 0x12, 0x64, 0x20, 0xd0, 0x82, 0xd0,
+ 0x83, 0xda, 0xb, 0xda, 0x1b, 0xda, 0x59, 0x32, 0xca, 0xb8, 0xca, 0x78, 0xa9,
+ 0xc0, 0x93, 0xa9, 0xd3, 0xa7, 0x12, 0x88, 0xed, 0x75, 0x8, 0x0, 0x7e, 0x73,
+ 0x39, 0xb1, 0xbe, 0x70, 0x6, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x39, 0xb1, 0xda,
+ 0x78, 0xda, 0xb8, 0x32, 0x75, 0x8, 0x0, 0xc2, 0x95, 0xa9, 0xc2, 0x93, 0x22,
+ 0xbe, 0xb0, 0xeb, 0x68, 0x3, 0xb4, 0xec, 0x33, 0x7e, 0x27, 0x54, 0xc4, 0x4d,
+ 0x22, 0x78, 0xe, 0xa5, 0xbf, 0xaa, 0xa, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x27,
+ 0x54, 0xc4, 0x15, 0xf, 0x7e, 0x27, 0x54, 0xc4, 0xbe, 0x24, 0x0, 0x1, 0x78,
+ 0x10, 0xa5, 0xbf, 0x9, 0x6, 0x7e, 0x34, 0x0, 0x2, 0x80, 0x2, 0x6d, 0x33,
+ 0x7a, 0x37, 0x54, 0xc4, 0x75, 0xf, 0xea, 0x22, 0xc4, 0x54, 0xf0, 0x7a, 0xb3,
+ 0x54, 0xc3, 0x22, 0x7c, 0x6b, 0x2e, 0x60, 0xdd, 0x68, 0x26, 0x2e, 0x60,
+ 0xfd, 0x68, 0x21, 0x1b, 0x61, 0x68, 0x1d, 0x2e, 0x60, 0xfa, 0x68, 0x18,
+ 0x1b, 0x60, 0x68, 0x14, 0x80, 0x0, 0xb4, 0x25, 0x7, 0xd2, 0x1e, 0x7a, 0x73,
+ 0x53, 0xec, 0x22, 0xa, 0x2b, 0x19, 0x72, 0x53, 0xee, 0xd2, 0x1d, 0x22, 0xca,
+ 0x79, 0x7c, 0xfb, 0x7f, 0x51, 0x7f, 0x40, 0x74, 0x9, 0xac, 0xbf, 0x9, 0xb5,
+ 0x67, 0x7a, 0xf5, 0x2f, 0x74, 0x9, 0xac, 0xbf, 0x9, 0xb5, 0x67, 0x7b, 0x1e,
+ 0xb0, 0xbe, 0xb0, 0xf, 0x28, 0x2, 0x74, 0xf, 0xc4, 0x54, 0xf0, 0xf5, 0x30,
+ 0x74, 0x9, 0xac, 0xbf, 0x9, 0xe5, 0x67, 0x79, 0x7e, 0x73, 0x68, 0x85, 0xbc,
+ 0x7e, 0x28, 0x53, 0x7e, 0xb3, 0x68, 0x80, 0x70, 0x28, 0x75, 0x31, 0xf, 0x7e,
+ 0x8, 0x0, 0x2f, 0xa, 0x3e, 0x2e, 0x34, 0x2, 0xde, 0x6d, 0x22, 0x74, 0x1,
+ 0x12, 0x8a, 0x1d, 0x75, 0x31, 0x20, 0x7e, 0x8, 0x0, 0x30, 0xa, 0x3e, 0x2e,
+ 0x34, 0x2, 0xe9, 0x74, 0x10, 0x12, 0x8a, 0x1d, 0x80, 0xe, 0xa, 0x3e, 0x9,
+ 0xb3, 0x2, 0xde, 0xf5, 0x2f, 0x9, 0xb3, 0x2, 0xe9, 0xf5, 0x30, 0x12, 0x8c,
+ 0xef, 0xb4, 0x1, 0x11, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x2, 0xde, 0x19, 0xb3,
+ 0x2, 0xe9, 0x75, 0x2f, 0x0, 0x75, 0x30, 0x0, 0x7e, 0xb3, 0x68, 0x99, 0xb4,
+ 0xff, 0x16, 0x85, 0x2e, 0x2f, 0x75, 0x2f, 0x0, 0x74, 0x9, 0xac, 0xbf, 0x9,
+ 0xb5, 0x67, 0x79, 0xbe, 0xb0, 0xff, 0x68, 0x3, 0x75, 0x2f, 0x1, 0xe5, 0x2f,
+ 0x7a, 0x4b, 0xb0, 0xe5, 0x30, 0x7a, 0x5b, 0xb0, 0xda, 0x79, 0x22, 0x7c,
+ 0x9b, 0x7e, 0x1b, 0xa0, 0x4c, 0xaa, 0x78, 0x7, 0x7e, 0xb, 0xb0, 0x7a, 0x1b,
+ 0xb0, 0x22, 0xa, 0xda, 0x7e, 0xb, 0x80, 0xa, 0xe8, 0x7d, 0xfe, 0x9d, 0xfd,
+ 0xbe, 0xf4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xed, 0x80, 0x4, 0x6d, 0xee, 0x9d,
+ 0xef, 0xe5, 0x31, 0xa, 0xfb, 0xbd, 0xef, 0x8, 0xf, 0xbc, 0x8a, 0x7c, 0xba,
+ 0x28, 0x4, 0x2c, 0xb9, 0x80, 0x2, 0x9c, 0xb9, 0x7a, 0x1b, 0xb0, 0x7e, 0x1b,
+ 0x70, 0x7a, 0xb, 0x70, 0x22, 0xca, 0x3b, 0x7c, 0xeb, 0x75, 0x27, 0x0, 0x6c,
+ 0xdd, 0x75, 0x28, 0x0, 0x75, 0x29, 0x0, 0x75, 0x2a, 0x0, 0x7e, 0x18, 0x68,
+ 0x29, 0x7a, 0x1f, 0x2e, 0x79, 0x75, 0x2d, 0x0, 0x7e, 0x18, 0x2, 0xf3, 0x7a,
+ 0x1f, 0x2e, 0x7d, 0x7e, 0xb3, 0x68, 0x82, 0x70, 0xe, 0x7e, 0xb3, 0x68, 0x7e,
+ 0x70, 0x8, 0x7e, 0xb3, 0x68, 0x7f, 0x70, 0x2, 0x81, 0x90, 0x30, 0x28, 0xa,
+ 0x7e, 0x8, 0x3, 0x4d, 0x7a, 0xf, 0x2e, 0x7d, 0x80, 0x4, 0x7a, 0x1f, 0x2e,
+ 0x7d, 0x7e, 0xf, 0x2e, 0x7d, 0x12, 0x8c, 0xe6, 0x7e, 0xf, 0x2e, 0x7d, 0x2e,
+ 0x14, 0x0, 0x3e, 0x7e, 0x34, 0x0, 0x1c, 0x12, 0x31, 0xec, 0x61, 0xb4, 0x74,
+ 0x9, 0xac, 0xbf, 0x49, 0xc5, 0x67, 0x75, 0x49, 0x45, 0x67, 0x77, 0x7a, 0x47,
+ 0x2e, 0x77, 0x9, 0xb5, 0x67, 0x79, 0xf5, 0x2b, 0x90, 0xd, 0xe, 0xe4, 0x93,
+ 0xbe, 0xb1, 0x2b, 0x38, 0x2, 0x61, 0xb2, 0x7e, 0xa1, 0x2b, 0x5e, 0xa0, 0xf,
+ 0x74, 0x8, 0xa4, 0x7e, 0x1f, 0x2e, 0x79, 0x2d, 0x35, 0x7e, 0x1b, 0xc0, 0xbe,
+ 0xc0, 0x3, 0x78, 0x2, 0x61, 0xb2, 0xbe, 0xc0, 0x1, 0x78, 0x31, 0x75, 0x2c,
+ 0x0, 0x80, 0x22, 0x7e, 0x71, 0x2c, 0x74, 0x9, 0xac, 0x7b, 0x9, 0xb3, 0x2,
+ 0x88, 0x54, 0xf, 0xbe, 0xb1, 0x2b, 0x78, 0xe, 0x49, 0xc3, 0x2, 0x84, 0x49,
+ 0xd3, 0x2, 0x86, 0x7a, 0xd7, 0x2e, 0x77, 0x80, 0xc, 0x5, 0x2c, 0x90, 0xd,
+ 0xe, 0xe4, 0x93, 0xbe, 0xb1, 0x2c, 0x38, 0xd4, 0x85, 0x27, 0x2e, 0x7e, 0x8,
+ 0x0, 0x28, 0x7e, 0x18, 0x0, 0x29, 0x7c, 0xbf, 0x12, 0x89, 0x68, 0x5e, 0xc4,
+ 0xf, 0xff, 0x7e, 0xd7, 0x2e, 0x77, 0x5e, 0xd4, 0xf, 0xff, 0x7a, 0xd7, 0x2e,
+ 0x77, 0x7e, 0x90, 0x9, 0xac, 0x9f, 0x9, 0x74, 0x67, 0x79, 0xa, 0x57, 0x12,
+ 0x6c, 0x33, 0x7d, 0xd5, 0x2e, 0xd7, 0x2e, 0x77, 0x7a, 0xd7, 0x2e, 0x77,
+ 0xbe, 0x70, 0xff, 0x68, 0x12, 0xbe, 0xc0, 0x1, 0x68, 0x2, 0x5, 0x27, 0x5,
+ 0x2a, 0xa, 0x5c, 0x12, 0x6f, 0xe6, 0x2d, 0xc5, 0x80, 0x4, 0x2e, 0xc4, 0xc0,
+ 0x0, 0x12, 0x8c, 0xca, 0x79, 0xc1, 0x0, 0x2, 0x7e, 0xd7, 0x2e, 0x77, 0x12,
+ 0x8c, 0xca, 0x79, 0xd1, 0x0, 0x4, 0x7e, 0xa1, 0x28, 0x12, 0x8c, 0xd5, 0x39,
+ 0xa1, 0x0, 0x6, 0x7e, 0xa1, 0x29, 0x12, 0x8c, 0xd5, 0x39, 0xa1, 0x0, 0x7,
+ 0xb, 0xd0, 0xb, 0xf0, 0x7e, 0x73, 0x68, 0x85, 0xbc, 0x7f, 0x28, 0x2, 0x41,
+ 0xc6, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x58, 0x74, 0x1, 0x12, 0x8c, 0xc1,
+ 0x7e, 0x73, 0x54, 0x41, 0x7e, 0xf, 0x2e, 0x7d, 0x39, 0x70, 0x0, 0x40, 0x7e,
+ 0xb3, 0x68, 0x7f, 0xb4, 0x1, 0x44, 0x7e, 0x73, 0x52, 0x71, 0x7e, 0xf, 0x2e,
+ 0x7d, 0x39, 0x70, 0x0, 0x41, 0x6c, 0xff, 0x80, 0x26, 0x74, 0x4, 0xac, 0xbf,
+ 0x49, 0x35, 0x4e, 0x88, 0x7e, 0xf, 0x2e, 0x7d, 0x2d, 0x15, 0x79, 0x30, 0x0,
+ 0x42, 0x74, 0x4, 0xac, 0xbf, 0x49, 0x35, 0x4e, 0x8a, 0x7e, 0xf, 0x2e, 0x7d,
+ 0x2d, 0x15, 0x79, 0x30, 0x0, 0x44, 0xb, 0xf0, 0x7e, 0x73, 0x52, 0x71, 0xbc,
+ 0x7f, 0x38, 0xd2, 0x80, 0x4, 0xe4, 0x12, 0x8c, 0xc1, 0xe5, 0x27, 0x7e, 0x1f,
+ 0x2e, 0x7d, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x33, 0x68, 0x7b, 0x7e, 0x1f, 0x2e,
+ 0x7d, 0x7a, 0x1b, 0x30, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x1c, 0x7e, 0xb3,
+ 0x68, 0x7f, 0xb4, 0x1, 0x2a, 0x74, 0x5, 0x7a, 0xb3, 0x55, 0xfc, 0xc2, 0x95,
+ 0x75, 0x2d, 0x1, 0x4c, 0xee, 0x68, 0x18, 0xb2, 0x28, 0xc2, 0x86, 0x80, 0x12,
+ 0xe5, 0x2a, 0xbe, 0xb0, 0x0, 0x28, 0xe, 0x75, 0x2d, 0x1, 0x4c, 0xee, 0x68,
+ 0x4, 0xb2, 0x28, 0xc2, 0x86, 0x12, 0x90, 0xa, 0x7e, 0xb3, 0x68, 0x7e, 0x60,
+ 0xd, 0x7e, 0xb3, 0x39, 0xa3, 0x70, 0x7, 0x7e, 0xf, 0x2e, 0x79, 0x12, 0xb7,
+ 0xa5, 0xe4, 0x7a, 0xb3, 0x68, 0x82, 0x7a, 0xb3, 0x68, 0x7e, 0x7a, 0xb3,
+ 0x68, 0x7f, 0x80, 0x6, 0x4c, 0xee, 0x68, 0x2, 0xd2, 0x86, 0x12, 0x8f, 0xff,
+ 0xca, 0x59, 0x7e, 0x18, 0x67, 0x75, 0x7e, 0x8, 0x2, 0x84, 0x12, 0x2b, 0x7,
+ 0x1b, 0xfd, 0xe5, 0x2a, 0x70, 0x10, 0x12, 0x87, 0x82, 0x74, 0x9, 0xac, 0x7b,
+ 0x7e, 0x8, 0x2, 0x84, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe5, 0x2d, 0xda, 0x3b,
+ 0x22, 0x7e, 0x1f, 0x2e, 0x7d, 0x39, 0xb1, 0x0, 0x3e, 0x22, 0x74, 0x6, 0xac,
+ 0xbd, 0x7e, 0x1f, 0x2e, 0x7d, 0x2d, 0x35, 0x22, 0x7e, 0x30, 0x6, 0xac, 0x3d,
+ 0x7e, 0x1f, 0x2e, 0x7d, 0x2d, 0x31, 0x22, 0x74, 0x1, 0x2, 0x8a, 0x64, 0x7e,
+ 0x34, 0x0, 0x3e, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x74, 0x8, 0xac, 0xbe, 0x9,
+ 0xb5, 0x68, 0x29, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x6d, 0x11, 0x7d, 0xf1,
+ 0x7e, 0x83, 0x68, 0x79, 0x7c, 0xd8, 0x7e, 0x57, 0x2, 0x13, 0xbe, 0x57, 0x56,
+ 0x22, 0x28, 0x12, 0x7e, 0x54, 0xff, 0xff, 0x9e, 0x57, 0x2, 0x13, 0x2e, 0x57,
+ 0x56, 0x22, 0xb, 0x54, 0x7c, 0xfb, 0x80, 0xa, 0x7e, 0x57, 0x56, 0x22, 0x9e,
+ 0x57, 0x2, 0x13, 0x7c, 0xfb, 0x7e, 0x57, 0x56, 0x22, 0x7a, 0x57, 0x2, 0x13,
+ 0x7e, 0xa3, 0x54, 0x13, 0x4c, 0xaa, 0x78, 0x19, 0xe5, 0x16, 0xb4, 0x1, 0x14,
+ 0x4c, 0x88, 0x68, 0x10, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x2, 0xe1, 0xc4, 0xbe,
+ 0xb3, 0x68, 0x79, 0x78, 0x2, 0xe1, 0xc4, 0x7a, 0xa1, 0x16, 0xc2, 0x20, 0xc2,
+ 0x1f, 0x7e, 0xd4, 0x67, 0x1b, 0x4c, 0xdd, 0x68, 0x6, 0x7e, 0xb3, 0x68, 0x7a,
+ 0x70, 0x23, 0x6c, 0x11, 0x80, 0x1a, 0x74, 0x2, 0xac, 0xb1, 0x12, 0x8f, 0xe7,
+ 0x7e, 0x70, 0x9, 0xac, 0x71, 0x19, 0xa3, 0x1, 0xa9, 0x74, 0x1, 0xa, 0xe1,
+ 0x19, 0xbe, 0x2, 0x15, 0xb, 0x10, 0x12, 0x8f, 0xd7, 0x38, 0xe1, 0xe4, 0x7a,
+ 0xb3, 0x1, 0x6e, 0x6c, 0x11, 0xe1, 0x61, 0x74, 0x9, 0xac, 0xb1, 0x9, 0xe5,
+ 0x67, 0x1f, 0x5e, 0xe0, 0xf, 0x12, 0x8f, 0xdf, 0x38, 0x2, 0xe1, 0x5f, 0x12,
+ 0x8c, 0xef, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xe1, 0x45, 0x6c, 0x0, 0xe1, 0x38,
+ 0x74, 0x9, 0xac, 0xb0, 0x9, 0x85, 0x1, 0xa9, 0x7a, 0x81, 0x27, 0xbc, 0x8e,
+ 0x68, 0x2, 0xe1, 0x36, 0x49, 0x25, 0x1, 0xa7, 0x7e, 0x30, 0x9, 0xac, 0x31,
+ 0x2d, 0x1d, 0x49, 0xe1, 0x0, 0x2, 0x7d, 0x3e, 0x12, 0x37, 0x98, 0x8, 0x4,
+ 0x9d, 0xe2, 0x80, 0x4, 0x6d, 0xee, 0x9d, 0xe3, 0x74, 0x9, 0xac, 0xb0, 0x49,
+ 0x55, 0x1, 0xa5, 0xb, 0x18, 0x30, 0x12, 0xf1, 0x6f, 0x8, 0x6, 0x9d, 0x35,
+ 0x7d, 0xc3, 0x80, 0x4, 0x6d, 0xcc, 0x9d, 0xc2, 0x2d, 0xce, 0x12, 0x8f, 0xd0,
+ 0x49, 0xf5, 0x1, 0xff, 0x59, 0xc5, 0x1, 0xff, 0xe5, 0x27, 0xa, 0xeb, 0x9,
+ 0xbe, 0x2, 0x15, 0xbe, 0xb0, 0x0, 0x28, 0x12, 0x2e, 0xe4, 0x2, 0x15, 0x14,
+ 0x7a, 0xe9, 0xb0, 0x74, 0x3c, 0xac, 0xbf, 0xbd, 0x5c, 0x28, 0x2, 0xe1, 0x5f,
+ 0x7e, 0x50, 0x6, 0xac, 0x5f, 0x7d, 0x32, 0x2e, 0x34, 0x0, 0x14, 0xbd, 0x3f,
+ 0x50, 0x6, 0xbd, 0x3c, 0x50, 0x2, 0xd2, 0x20, 0x74, 0x2, 0xac, 0xbf, 0xbd,
+ 0x5f, 0x50, 0x6, 0xbd, 0x5c, 0x50, 0x2, 0xd2, 0x1f, 0x7e, 0x70, 0x6, 0xac,
+ 0x7f, 0xbd, 0x3f, 0x50, 0xc, 0x74, 0x3c, 0xac, 0xbf, 0x7d, 0xe5, 0x2d, 0xef,
+ 0xbd, 0xec, 0x40, 0x3f, 0xbd, 0x3f, 0x50, 0x13, 0xbd, 0x3c, 0x50, 0xf, 0x12,
+ 0x8f, 0xef, 0x50, 0x2, 0xe1, 0x5f, 0x3e, 0x24, 0xbd, 0x2f, 0x50, 0x2, 0xe1,
+ 0x5f, 0x7d, 0x23, 0x2d, 0x2f, 0xbd, 0x2c, 0x50, 0x20, 0xbd, 0x3f, 0x50,
+ 0x1c, 0x74, 0x6, 0xac, 0xbf, 0xbd, 0x5f, 0x50, 0x14, 0x12, 0x8f, 0xef, 0x50,
+ 0x2, 0xe1, 0x5f, 0x7e, 0x30, 0x6, 0xac, 0x3f, 0x3e, 0x14, 0xbd, 0x1f, 0x50,
+ 0x2, 0xe1, 0x5f, 0x7e, 0xb3, 0x1, 0x6e, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xe1,
+ 0x5f, 0x74, 0x14, 0xac, 0xbf, 0xbd, 0x5c, 0x50, 0x78, 0x7e, 0x30, 0x8, 0xac,
+ 0x3e, 0x9, 0xb1, 0x68, 0x29, 0x70, 0x8, 0x74, 0x3, 0x19, 0xb1, 0x68, 0x29,
+ 0x80, 0x26, 0x74, 0x1, 0x19, 0xb1, 0x68, 0x29, 0x6c, 0x99, 0x80, 0x17, 0x7e,
+ 0x30, 0x9, 0xac, 0x39, 0x9, 0x81, 0x67, 0xd3, 0xbc, 0x8e, 0x78, 0x8, 0x74,
+ 0xff, 0x19, 0xb1, 0x67, 0xd3, 0x80, 0x7, 0xb, 0x90, 0x12, 0x85, 0xb, 0x38,
+ 0xe4, 0x7e, 0xa0, 0x3, 0x7e, 0x31, 0x27, 0x74, 0x8, 0xac, 0x3b, 0x19, 0xa1,
+ 0x68, 0x2a, 0xbe, 0xd0, 0x0, 0x28, 0x2c, 0x1b, 0xd0, 0x7e, 0x70, 0x9, 0xac,
+ 0x71, 0x2e, 0x34, 0x67, 0x1b, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x9, 0x12, 0x2a,
+ 0xc1, 0x12, 0xd1, 0xc4, 0xac, 0x31, 0x12, 0x8f, 0xc9, 0x12, 0x8f, 0xf7,
+ 0x7e, 0x30, 0x9, 0xac, 0x3d, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0x1b, 0x10,
+ 0x12, 0x8f, 0xd0, 0x59, 0xc5, 0x1, 0xff, 0x80, 0x29, 0xb, 0x0, 0x90, 0xd,
+ 0xe, 0xe4, 0x93, 0xbc, 0xb0, 0x28, 0x2, 0xa1, 0xb6, 0x80, 0x1a, 0x6d, 0x11,
+ 0x74, 0x2, 0xac, 0xbe, 0x12, 0x8f, 0xe7, 0x7e, 0x30, 0x9, 0xac, 0x3e, 0x19,
+ 0xa1, 0x1, 0xa9, 0x74, 0x1, 0xa, 0x1e, 0x19, 0xb1, 0x2, 0x15, 0xb, 0x10,
+ 0xbc, 0xd1, 0x28, 0x2, 0xa1, 0x96, 0x12, 0x8f, 0xff, 0xca, 0x59, 0x7e, 0x18,
+ 0x67, 0x1b, 0x7e, 0x8, 0x1, 0xa5, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x11,
+ 0x80, 0x39, 0x7e, 0x70, 0x9, 0xac, 0x71, 0x9, 0xe3, 0x1, 0xa9, 0x12, 0x8f,
+ 0xdf, 0x28, 0x29, 0x7e, 0x50, 0x8, 0xac, 0x5e, 0x9, 0xb2, 0x68, 0x29, 0xbe,
+ 0xb0, 0x1, 0x68, 0x3, 0xb4, 0x3, 0x18, 0x6d, 0x22, 0x74, 0x2, 0xac, 0xbe,
+ 0x59, 0x25, 0x1, 0xff, 0x74, 0xff, 0x19, 0xb3, 0x1, 0xa9, 0x74, 0x1, 0xa,
+ 0xce, 0x19, 0xbc, 0x2, 0x15, 0xb, 0x10, 0x12, 0x8f, 0xd7, 0x38, 0xc2, 0x7a,
+ 0xd3, 0x68, 0x79, 0xe4, 0x7a, 0xb3, 0x1, 0x8e, 0xda, 0x79, 0xda, 0xd8, 0x22,
+ 0x2e, 0x14, 0x67, 0x1b, 0x74, 0x9, 0x22, 0x7e, 0xa1, 0x27, 0x74, 0x2, 0xa4,
+ 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xb1, 0x22, 0x90, 0xd, 0xe, 0xe4,
+ 0x93, 0xbc, 0xbe, 0x22, 0x59, 0x15, 0x1, 0xff, 0x7e, 0xa0, 0xff, 0x22, 0x9,
+ 0x81, 0x0, 0x6, 0xbe, 0x80, 0x14, 0x22, 0x12, 0x2a, 0xc1, 0x7e, 0x34, 0x2e,
+ 0x77, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7c, 0xab, 0x74, 0x9, 0xa4, 0x22,
+ 0x7e, 0xb3, 0x3, 0xab, 0x4, 0x7a, 0xb3, 0x3, 0xab, 0x7e, 0x73, 0x3, 0xab,
+ 0x7a, 0x73, 0x53, 0xfd, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xbf, 0xe4, 0x7a,
+ 0xb3, 0x54, 0x60, 0x90, 0x1, 0x8a, 0x93, 0x7a, 0xb3, 0x54, 0x62, 0x90, 0x1,
+ 0x8b, 0xe4, 0x93, 0x7a, 0xb3, 0x54, 0x63, 0x90, 0xd, 0xe, 0xe4, 0x93, 0x7a,
+ 0xb3, 0x54, 0x65, 0xe4, 0x7a, 0xb3, 0x54, 0x66, 0x12, 0x77, 0xf4, 0x7a,
+ 0xb3, 0x54, 0x6e, 0x7a, 0xb3, 0x54, 0x74, 0x90, 0x1, 0x8e, 0x93, 0x7a, 0xb3,
+ 0x54, 0x7e, 0x90, 0x1, 0x8f, 0xe4, 0x93, 0x7a, 0xb3, 0x54, 0x7f, 0x7e, 0x73,
+ 0x3, 0xf1, 0x7a, 0x73, 0x54, 0x80, 0x7e, 0x73, 0x3, 0xf2, 0x7a, 0x73, 0x54,
+ 0x81, 0x7e, 0x73, 0x3, 0xf3, 0x7a, 0x73, 0x54, 0x82, 0x7e, 0x73, 0x3, 0xf4,
+ 0x7a, 0x73, 0x54, 0x83, 0x7e, 0x73, 0x3, 0xf5, 0x7a, 0x73, 0x54, 0x84, 0x74,
+ 0x1, 0x7a, 0xb3, 0x54, 0x90, 0x7e, 0x34, 0xd, 0xf5, 0x12, 0x32, 0xdf, 0x7a,
+ 0x37, 0x54, 0x9d, 0x7e, 0x34, 0x0, 0x5, 0xca, 0x39, 0x7e, 0x18, 0x3, 0xd1,
+ 0x7e, 0x8, 0x54, 0xa0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x74, 0x2, 0x7a, 0xb3,
+ 0x54, 0x69, 0xe4, 0x7a, 0xb3, 0x54, 0x71, 0x74, 0x64, 0x7a, 0xb3, 0x54,
+ 0x72, 0xe4, 0x7a, 0xb3, 0x54, 0xa9, 0x12, 0x45, 0xfc, 0xe4, 0x7a, 0xb3,
+ 0x54, 0x8d, 0x22, 0x7e, 0x18, 0x1d, 0xa0, 0x7a, 0x1f, 0x2d, 0x2a, 0x7e,
+ 0x18, 0x4, 0x0, 0x7a, 0x1f, 0x2d, 0x2e, 0x7e, 0xf, 0x2d, 0x2a, 0x12, 0x91,
+ 0x3, 0x7e, 0xf, 0x2d, 0x2e, 0x7e, 0x34, 0x5, 0x20, 0x12, 0x0, 0x2e, 0x7e,
+ 0x8, 0x2d, 0x0, 0x7e, 0x34, 0x0, 0x26, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x2e,
+ 0x74, 0x22, 0x7e, 0x8, 0x3a, 0x0, 0x7e, 0x34, 0x5, 0x20, 0xe4, 0x2, 0x0,
+ 0x2e, 0x7e, 0x34, 0xb, 0x65, 0xca, 0x39, 0x7e, 0x34, 0x1, 0x88, 0x7e, 0x24,
+ 0x0, 0xff, 0x7e, 0x8, 0x68, 0xa4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x37,
+ 0x68, 0xaf, 0x2e, 0x37, 0x68, 0xad, 0x7a, 0x37, 0x74, 0xc, 0x90, 0x1, 0x8e,
+ 0xe4, 0x93, 0xca, 0xb8, 0x90, 0x1, 0x8f, 0xe4, 0x93, 0x7c, 0x7b, 0xda, 0xb8,
+ 0x12, 0x91, 0x5e, 0x90, 0xd, 0x98, 0xe4, 0x93, 0x70, 0x6, 0x7e, 0x63, 0x68,
+ 0xa7, 0x80, 0x4, 0x7e, 0x63, 0x68, 0xa6, 0x7e, 0x70, 0x40, 0xac, 0x67, 0x1b,
+ 0x34, 0x7a, 0x37, 0x74, 0xe, 0x22, 0xa, 0x27, 0x12, 0x5d, 0x71, 0xa, 0x3b,
+ 0x2d, 0x32, 0x7a, 0x73, 0x74, 0x10, 0xe4, 0x7a, 0xb3, 0x74, 0x11, 0x6c,
+ 0xaa, 0x7e, 0x73, 0x74, 0x10, 0x7c, 0xba, 0x60, 0x5, 0x1e, 0x70, 0x14, 0x78,
+ 0xfb, 0x7c, 0xb7, 0x30, 0xe0, 0x9, 0x7e, 0xb3, 0x74, 0x11, 0x4, 0x7a, 0xb3,
+ 0x74, 0x11, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40, 0xde, 0x22, 0x7e, 0xb3, 0x68,
+ 0xaa, 0x7e, 0x73, 0x68, 0xab, 0x12, 0x91, 0x5e, 0x7e, 0xb3, 0x68, 0xaa,
+ 0x7e, 0x73, 0x68, 0xab, 0x22, 0x7e, 0x8, 0x65, 0x60, 0x7e, 0x34, 0x1, 0xa1,
+ 0xe4, 0x12, 0x0, 0x2e, 0x90, 0xd, 0xf, 0x93, 0x7c, 0x7b, 0x74, 0x9, 0xac,
+ 0x7b, 0x7e, 0x8, 0x65, 0xdc, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x7e, 0x34, 0x0,
+ 0x8, 0xca, 0x39, 0x7e, 0x34, 0xc, 0xed, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8,
+ 0x3, 0xac, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39,
+ 0x7e, 0x34, 0xc, 0xf5, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x3, 0xb4, 0x12,
+ 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x34, 0xc,
+ 0xfd, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x3, 0xbc, 0x12, 0x2b, 0x7, 0x1b,
+ 0xfd, 0x7e, 0x34, 0x0, 0x8, 0xca, 0x39, 0x7e, 0x34, 0xd, 0x5, 0x7e, 0x24,
+ 0x0, 0xff, 0x7e, 0x8, 0x3, 0xc4, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6c, 0x33,
+ 0x7c, 0xb3, 0x12, 0x92, 0xc7, 0xb, 0x30, 0xbe, 0x30, 0x4, 0x40, 0xf4, 0x2,
+ 0x92, 0x35, 0x7e, 0x8, 0x54, 0xc7, 0x7e, 0x34, 0x0, 0x2c, 0xe4, 0x12, 0x0,
+ 0x2e, 0x7e, 0x34, 0x0, 0x1, 0x7a, 0x37, 0x54, 0xc7, 0x7a, 0xb3, 0x54, 0xc9,
+ 0x7a, 0xb3, 0x54, 0xca, 0x7a, 0xb3, 0x54, 0xcb, 0x7a, 0x37, 0x54, 0xdd,
+ 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xdf, 0xe4, 0x7a, 0xb3, 0x54, 0xe0, 0x74, 0x2,
+ 0x7a, 0xb3, 0x54, 0xe1, 0x7a, 0x37, 0x54, 0xe8, 0x74, 0xb, 0x7a, 0xb3, 0x54,
+ 0xea, 0xe4, 0x7a, 0xb3, 0x54, 0xeb, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xec, 0x7e,
+ 0xb3, 0x55, 0xf8, 0x7e, 0x34, 0x0, 0x2, 0x7a, 0x37, 0x54, 0xd2, 0xb4, 0x1,
+ 0x18, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xd4, 0x7a, 0xb3, 0x54, 0xd5, 0x7a, 0xb3,
+ 0x54, 0xd6, 0x74, 0x6, 0x7a, 0xb3, 0x54, 0xd7, 0x74, 0x1, 0x80, 0x16, 0x74,
+ 0x1, 0x7a, 0xb3, 0x54, 0xd4, 0xe4, 0x7a, 0xb3, 0x54, 0xd5, 0x74, 0x1, 0x7a,
+ 0xb3, 0x54, 0xd6, 0x7a, 0xb3, 0x54, 0xd7, 0xe4, 0x7a, 0xb3, 0x54, 0xd8,
+ 0x74, 0x1, 0x7a, 0xb3, 0x54, 0xd9, 0x22, 0x7c, 0x5b, 0x7e, 0x70, 0x8, 0xac,
+ 0x75, 0x9, 0x43, 0x3, 0xb1, 0x74, 0x3, 0xac, 0xb5, 0x19, 0x45, 0x3, 0xe2,
+ 0x7c, 0xb4, 0x12, 0x93, 0x0, 0x7c, 0x4b, 0x74, 0x3, 0xac, 0xb5, 0x19, 0x45,
+ 0x3, 0xe0, 0x74, 0x8, 0xac, 0xb5, 0x9, 0xb5, 0x3, 0xb1, 0x12, 0x93, 0x0,
+ 0x7c, 0xab, 0x7e, 0x70, 0x3, 0xac, 0x75, 0x19, 0xa3, 0x3, 0xe1, 0x22, 0x7c,
+ 0xab, 0xe4, 0xa, 0x3a, 0x80, 0x3, 0x1e, 0x34, 0x4, 0xbe, 0x34, 0x0, 0x4,
+ 0x38, 0xf7, 0x22, 0x7f, 0x60, 0xa, 0xfb, 0x12, 0x93, 0x0, 0x7c, 0x7b, 0xa,
+ 0x57, 0x2e, 0x54, 0x0, 0xb, 0x7e, 0x18, 0x0, 0x1, 0x60, 0x5, 0x2f, 0x11,
+ 0x14, 0x78, 0xfb, 0x12, 0x96, 0xf4, 0xbe, 0xf4, 0x0, 0x4, 0x68, 0x38, 0x7e,
+ 0x33, 0x68, 0xa6, 0x7a, 0x33, 0x2e, 0x77, 0x7e, 0x33, 0x68, 0xa7, 0x7a,
+ 0x33, 0x2e, 0x78, 0x74, 0xb, 0x7a, 0xb3, 0x2e, 0x79, 0x7d, 0xed, 0x7a, 0xe7,
+ 0x2e, 0x7b, 0x7a, 0xe7, 0x2e, 0x7f, 0xbe, 0xf4, 0x0, 0x2, 0x38, 0xb, 0xe4,
+ 0x7a, 0xb3, 0x2e, 0x79, 0x7e, 0x34, 0x0, 0x4, 0x8d, 0x3f, 0x7e, 0x8, 0x2e,
+ 0x77, 0x2, 0x57, 0x86, 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x7a, 0x1d, 0x2f, 0x7a,
+ 0xd, 0x2b, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x33, 0x12, 0x46, 0xb3, 0x7e,
+ 0xb3, 0x54, 0xa9, 0xb4, 0x1, 0x7, 0x7e, 0x34, 0x0, 0x1, 0x12, 0x58, 0x3d,
+ 0x7e, 0xd, 0x2b, 0x7e, 0x1d, 0x33, 0x12, 0x93, 0xe0, 0x20, 0x1, 0xd, 0x7e,
+ 0xb3, 0x55, 0xf8, 0x70, 0x11, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0xa, 0x7e,
+ 0x18, 0x13, 0x60, 0x7e, 0xd, 0x2f, 0x12, 0x93, 0xe0, 0x7e, 0xd, 0x2b, 0x12,
+ 0x93, 0xd7, 0x12, 0x93, 0x11, 0x20, 0x1, 0xd, 0x7e, 0xb3, 0x55, 0xf8, 0x70,
+ 0x10, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x9, 0x7e, 0xd, 0x2f, 0x12, 0x93,
+ 0xd7, 0x12, 0x93, 0x11, 0xda, 0xf8, 0x22, 0x74, 0x8, 0xac, 0xbf, 0x9, 0xb5,
+ 0x3, 0xb1, 0x22, 0x12, 0x97, 0xe5, 0x12, 0xe3, 0xca, 0x12, 0x97, 0xcd, 0x7d,
+ 0x3f, 0x7a, 0x37, 0x2e, 0x7f, 0x7e, 0x34, 0x0, 0x20, 0x12, 0x97, 0xba, 0x2,
+ 0x54, 0xe0, 0xca, 0x79, 0xd2, 0x0, 0x12, 0x7f, 0xbb, 0xc2, 0x2a, 0x7e, 0xe3,
+ 0x54, 0xff, 0xa, 0x3e, 0x9, 0xb3, 0x54, 0xf7, 0x60, 0x3c, 0xa, 0x3b, 0x1b,
+ 0x34, 0x7c, 0xa7, 0x7a, 0xa3, 0x54, 0x8b, 0xb4, 0x1, 0x4, 0x74, 0x1, 0x80,
+ 0x1, 0xe4, 0x7a, 0xb3, 0x2e, 0x74, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x54, 0xf7,
+ 0x9, 0xf3, 0x54, 0xfa, 0x7a, 0xf3, 0x55, 0xfd, 0x7c, 0xbe, 0x7c, 0x7f, 0x12,
+ 0x97, 0x32, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xbf, 0xd5, 0x7e, 0xb3, 0x54,
+ 0xff, 0x4, 0x7a, 0xb3, 0x54, 0xff, 0x7e, 0xb3, 0x2e, 0x74, 0xbe, 0xb0, 0x1,
+ 0x68, 0x7, 0x7e, 0xb3, 0x56, 0xa7, 0xb4, 0x3, 0x34, 0x74, 0x3, 0xac, 0xbf,
+ 0x9, 0xb5, 0x3, 0xe2, 0x7e, 0xf, 0x2d, 0x26, 0x12, 0x93, 0x11, 0x7c, 0xbe,
+ 0x7c, 0x7f, 0x12, 0x98, 0xfe, 0x92, 0x0, 0x30, 0x0, 0x19, 0x7a, 0xe3, 0x2e,
+ 0x75, 0x7a, 0xe3, 0x54, 0x8c, 0x12, 0x96, 0xeb, 0x7a, 0x73, 0x56, 0x49,
+ 0x7a, 0xf3, 0x56, 0x27, 0x12, 0xe3, 0x43, 0x12, 0x97, 0x7, 0x12, 0x97, 0x5e,
+ 0x7e, 0x73, 0x54, 0xff, 0xa, 0x37, 0xbd, 0x32, 0x48, 0x15, 0x12, 0x96, 0xfd,
+ 0xd2, 0x2, 0x12, 0x46, 0xb8, 0x12, 0x2f, 0xb2, 0x7e, 0x34, 0x8, 0x0, 0x12,
+ 0x5b, 0x91, 0x12, 0x78, 0xae, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0x94, 0xbd,
+ 0x12, 0xdf, 0xc8, 0xda, 0x79, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf7,
+ 0x7c, 0x7b, 0x74, 0x3, 0xac, 0xbf, 0x9, 0xb5, 0x3, 0xe1, 0xf5, 0x2a, 0x74,
+ 0x8, 0xac, 0xbf, 0x9, 0x65, 0x3, 0xb1, 0xa, 0xf6, 0x6d, 0xee, 0x7e, 0xb3,
+ 0x3, 0xca, 0xf5, 0x29, 0x7c, 0xbf, 0x12, 0x98, 0xe2, 0x92, 0x1, 0x20, 0x1,
+ 0xa, 0x6d, 0x22, 0x7a, 0x27, 0x56, 0x4a, 0x7a, 0x27, 0x56, 0x4c, 0x20, 0x1,
+ 0x2, 0xc1, 0x52, 0xa5, 0xbf, 0x0, 0x2, 0x80, 0x2, 0xc1, 0x52, 0x7e, 0xa3,
+ 0x68, 0xa9, 0x12, 0x97, 0x6e, 0x85, 0x29, 0x27, 0x12, 0x96, 0xd0, 0x7e,
+ 0x68, 0x18, 0x80, 0x7e, 0xd1, 0x27, 0xbe, 0xd0, 0x4, 0x28, 0x3, 0x7e, 0xd0,
+ 0x4, 0x7e, 0x70, 0x1, 0x80, 0x31, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96, 0xa7,
+ 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12, 0x96,
+ 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12, 0x96,
+ 0x57, 0xb, 0xe0, 0xbc, 0xde, 0x38, 0xdc, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d,
+ 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xcb, 0xe5, 0x29, 0xa, 0xdb, 0x7e, 0xb3,
+ 0x68, 0xa4, 0xa, 0xcb, 0x9d, 0xcd, 0x12, 0x96, 0xc4, 0x7e, 0x70, 0x1, 0x80,
+ 0x33, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96, 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e,
+ 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12, 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96,
+ 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12, 0x96, 0x57, 0xb, 0xe0, 0xe5, 0x27,
+ 0xbc, 0xbe, 0x38, 0xda, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d, 0xe2, 0xb, 0x70,
+ 0xbc, 0xa7, 0x38, 0xc9, 0xa, 0x4d, 0xe5, 0x28, 0xa, 0xcb, 0x9d, 0xc4, 0x12,
+ 0x96, 0xc4, 0x7e, 0x70, 0x1, 0x80, 0x31, 0x6c, 0xee, 0x80, 0x20, 0x12, 0x96,
+ 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3, 0xb, 0x5a, 0x20, 0x12,
+ 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3, 0x12, 0x96, 0x7b, 0x12,
+ 0x96, 0x57, 0xb, 0xe0, 0xbc, 0xde, 0x38, 0xdc, 0x12, 0x96, 0x8d, 0x28, 0x2,
+ 0x7d, 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38, 0xcb, 0x7e, 0x73, 0x68, 0xa4, 0xac,
+ 0x7a, 0x7d, 0xd3, 0x12, 0x96, 0xc8, 0x7e, 0x70, 0x1, 0x80, 0x33, 0x6c, 0xee,
+ 0x80, 0x20, 0x12, 0x96, 0xa7, 0x28, 0x6, 0x49, 0x21, 0x2e, 0xbf, 0x80, 0x3,
+ 0xb, 0x5a, 0x20, 0x12, 0x96, 0x6b, 0x50, 0x5, 0x12, 0x96, 0x61, 0x80, 0x3,
+ 0x12, 0x96, 0x7b, 0x12, 0x96, 0x57, 0xb, 0xe0, 0xe5, 0x27, 0xbc, 0xbe, 0x38,
+ 0xda, 0x12, 0x96, 0x8d, 0x28, 0x2, 0x7d, 0xe2, 0xb, 0x70, 0xbc, 0xa7, 0x38,
+ 0xc9, 0x7e, 0x37, 0x56, 0x4a, 0x7a, 0x37, 0x56, 0x4c, 0x7d, 0x3e, 0x6d,
+ 0x22, 0xe5, 0x2a, 0x60, 0x5, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x12, 0x96, 0xf4,
+ 0x7a, 0x37, 0x56, 0x4a, 0x12, 0x96, 0xeb, 0x7a, 0x73, 0x56, 0x49, 0xda,
+ 0x79, 0xda, 0xd8, 0x22, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x59, 0x42, 0x2f, 0x7,
+ 0x22, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x49, 0x42, 0x2f, 0x7, 0x22, 0x59, 0x21,
+ 0x2e, 0xbf, 0x7e, 0x50, 0x2, 0xac, 0x57, 0x49, 0x22, 0x2f, 0x7, 0xbd, 0x24,
+ 0x22, 0x7c, 0x5e, 0xac, 0x5a, 0xa, 0x17, 0x2d, 0x21, 0x3e, 0x24, 0x7f, 0x6,
+ 0x2d, 0x12, 0xb, 0xa, 0x40, 0x22, 0x7e, 0x30, 0x2, 0xac, 0x37, 0x49, 0x21,
+ 0x2f, 0x7, 0x49, 0x1, 0x2e, 0xbf, 0x9d, 0x2, 0x59, 0x1, 0x2e, 0x77, 0x49,
+ 0x21, 0x2e, 0x77, 0xbd, 0x2e, 0x22, 0x7c, 0x5e, 0xac, 0x5a, 0xa, 0x17, 0x2d,
+ 0x21, 0x3e, 0x24, 0x7f, 0x56, 0x2d, 0xb2, 0xb, 0x5a, 0x40, 0x7e, 0x30, 0x2,
+ 0xac, 0x37, 0x49, 0x1, 0x2e, 0xbf, 0xbd, 0x4, 0x22, 0xa, 0xda, 0xad, 0xdc,
+ 0x3e, 0xd4, 0x2e, 0xd4, 0x18, 0x80, 0x6d, 0xcc, 0x7e, 0x70, 0x2, 0xac, 0x7a,
+ 0x7e, 0x8, 0x2e, 0xbf, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x70, 0x2, 0xac, 0x7a,
+ 0x7e, 0x8, 0x2f, 0x7, 0x74, 0xff, 0x2, 0x0, 0x2e, 0x74, 0x8, 0xac, 0xbf,
+ 0x9, 0x75, 0x3, 0xac, 0x22, 0x2f, 0x11, 0x2f, 0x11, 0x7d, 0x1f, 0x2, 0x2a,
+ 0x3a, 0x30, 0x16, 0x6, 0x12, 0x5b, 0x7, 0x12, 0x97, 0x67, 0x22, 0x7e, 0x8,
+ 0x9, 0x20, 0x7e, 0x1f, 0x2d, 0x2e, 0x2, 0x93, 0xe0, 0xca, 0xf8, 0x6c, 0xff,
+ 0x12, 0x93, 0xf9, 0xb, 0xf0, 0x12, 0x97, 0x5e, 0xa, 0x3f, 0xbd, 0x32, 0x48,
+ 0xf2, 0x7e, 0xb3, 0x54, 0x8c, 0x7e, 0x73, 0x56, 0x21, 0x12, 0x97, 0x32,
+ 0xda, 0xf8, 0x22, 0x14, 0x68, 0x21, 0x14, 0x68, 0x25, 0xb, 0xb1, 0x78, 0x1a,
+ 0x7e, 0x8, 0xe, 0x40, 0x7a, 0xf, 0x2d, 0x26, 0x7e, 0x8, 0x1d, 0xa0, 0x7a,
+ 0xf, 0x2d, 0x2a, 0xa5, 0xbf, 0x2, 0xd, 0x7e, 0x18, 0x27, 0xe0, 0x80, 0x3,
+ 0x12, 0x97, 0xd8, 0x7a, 0x1f, 0x2d, 0x2a, 0x22, 0x7e, 0x73, 0x55, 0x0, 0xa,
+ 0x27, 0x1b, 0x24, 0x22, 0x4e, 0x70, 0x4, 0x1b, 0xa, 0x30, 0x22, 0x7e, 0xb3,
+ 0x68, 0xa8, 0xf5, 0x28, 0x22, 0xca, 0x3b, 0x6d, 0x77, 0x7e, 0xb3, 0x68,
+ 0xa7, 0xf5, 0x27, 0x12, 0x97, 0x6e, 0x7e, 0xd3, 0x68, 0xa9, 0x6c, 0xcc,
+ 0x80, 0x17, 0x7d, 0x17, 0x3e, 0x14, 0x2e, 0x14, 0x4, 0x0, 0x6d, 0x0, 0x7c,
+ 0xbd, 0x12, 0xbd, 0x5b, 0xe5, 0x27, 0xa, 0x3b, 0x2d, 0x73, 0xb, 0xc0, 0xe5,
+ 0x28, 0xbc, 0xbc, 0x38, 0xe3, 0xda, 0x3b, 0x22, 0x12, 0x97, 0xc3, 0x12,
+ 0x97, 0x75, 0x2, 0x97, 0xb3, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0xc1, 0x22, 0x7a,
+ 0x37, 0x2e, 0x81, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0x12,
+ 0x7a, 0xb3, 0x67, 0x13, 0x22, 0x7a, 0xb3, 0x2e, 0x7a, 0x7d, 0x3d, 0x7a,
+ 0x37, 0x2e, 0x7b, 0x22, 0x7e, 0x18, 0x13, 0x60, 0x7a, 0x1f, 0x2d, 0x26,
+ 0x7e, 0x18, 0x22, 0xc0, 0x22, 0x7f, 0x61, 0x7f, 0x70, 0x7e, 0x8, 0x2e, 0x77,
+ 0x7e, 0x34, 0x0, 0x10, 0xe4, 0x2, 0x0, 0x2e, 0x12, 0x9f, 0xf0, 0x12, 0x9f,
+ 0xed, 0x2, 0x97, 0xfe, 0xca, 0xf8, 0x12, 0x98, 0x17, 0x12, 0x4d, 0x95, 0x6c,
+ 0xff, 0x7c, 0xbf, 0x12, 0x68, 0xdb, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x40, 0xf4,
+ 0xda, 0xf8, 0x22, 0x6c, 0xaa, 0x7e, 0x30, 0x3c, 0xac, 0x3a, 0x12, 0x6b,
+ 0xa1, 0x7e, 0x34, 0x0, 0x3c, 0xe4, 0x12, 0x0, 0x2e, 0xb, 0xa0, 0xbe, 0xa0,
+ 0x4, 0x40, 0xe9, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c, 0xf7, 0x7c, 0xeb, 0x6c,
+ 0xdd, 0x74, 0x8, 0xac, 0xbd, 0x19, 0xe5, 0x3, 0xae, 0x19, 0xf5, 0x3, 0xaf,
+ 0xb, 0xd0, 0xbe, 0xd0, 0x4, 0x78, 0xed, 0x6c, 0xdd, 0x74, 0xee, 0xac, 0xbd,
+ 0x12, 0x98, 0x9b, 0x7a, 0xf1, 0x29, 0x7e, 0x70, 0x3c, 0xac, 0x7d, 0x7d,
+ 0x13, 0x12, 0x6b, 0x95, 0x2e, 0x34, 0x34, 0xe7, 0x6d, 0x22, 0x7c, 0xbe,
+ 0x12, 0x98, 0xa2, 0x7d, 0x3f, 0xb, 0x34, 0x74, 0x3c, 0xac, 0xbd, 0x49, 0x25,
+ 0x34, 0xb7, 0x12, 0x98, 0x8f, 0xac, 0xbd, 0x12, 0x39, 0xa7, 0xb, 0xd0, 0xbe,
+ 0xd0, 0x4, 0x40, 0xc6, 0xda, 0x79, 0xda, 0xd8, 0x22, 0x12, 0x39, 0xab, 0x7d,
+ 0x3f, 0x2e, 0x34, 0x0, 0x19, 0x74, 0x3c, 0x22, 0x7d, 0xf5, 0x2e, 0xf4, 0x1,
+ 0x0, 0x22, 0xb, 0xa, 0x40, 0x5e, 0x80, 0xc7, 0x1b, 0xa, 0x40, 0x54, 0x7,
+ 0xa, 0x5b, 0x7d, 0x45, 0x7c, 0x89, 0x6c, 0x99, 0x3e, 0x44, 0x3e, 0x44, 0x3e,
+ 0x44, 0xb, 0xa, 0x50, 0x4d, 0x54, 0x12, 0x5f, 0xc1, 0x5e, 0x20, 0xe3, 0x1b,
+ 0x1a, 0x10, 0xe5, 0x29, 0x54, 0x7, 0xa, 0x1b, 0x7d, 0x1, 0x7c, 0x1, 0x6c,
+ 0x11, 0x3e, 0x4, 0x3e, 0x4, 0xb, 0x1a, 0x10, 0x4d, 0x10, 0x1b, 0x1a, 0x10,
+ 0x22, 0x7c, 0xab, 0xd2, 0x2, 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x4, 0xc2, 0x2,
+ 0x80, 0xb, 0x4c, 0xaa, 0x68, 0x5, 0xbe, 0xa0, 0x2, 0x78, 0x2, 0xc2, 0x2,
+ 0xa2, 0x2, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0xd2, 0x1, 0x7e, 0xb3, 0x56, 0xa7,
+ 0xb4, 0x3, 0x4b, 0x7c, 0xb6, 0x12, 0x98, 0xe2, 0x50, 0x44, 0x7e, 0xa3, 0x54,
+ 0x69, 0xbe, 0xa0, 0x2, 0x40, 0x31, 0x12, 0x51, 0x2d, 0x68, 0x28, 0x7e, 0x63,
+ 0x56, 0xbe, 0xa, 0x26, 0x2e, 0x24, 0x0, 0x4e, 0x12, 0x9f, 0x3a, 0x24, 0xff,
+ 0x92, 0x1, 0x7c, 0xb6, 0x4, 0x7a, 0xb3, 0x56, 0xbe, 0x7e, 0x63, 0x56, 0xbe,
+ 0xbe, 0x60, 0x8, 0x40, 0x15, 0xe4, 0x7a, 0xb3, 0x56, 0xbe, 0x80, 0xe, 0xd2,
+ 0x1, 0x80, 0xa, 0xbc, 0xa7, 0x78, 0x4, 0xd2, 0x1, 0x80, 0x2, 0xc2, 0x1,
+ 0xa2, 0x1, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x67, 0xb,
+ 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x12, 0x9f, 0x9c, 0x28, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x2e, 0x74, 0x70, 0x5, 0xe4, 0x7a,
+ 0xb3, 0x67, 0x1a, 0x7e, 0xb3, 0x56, 0x95, 0xb4, 0x1, 0x5, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x1a, 0x7e, 0xb3, 0x56, 0x21, 0x12, 0x98, 0xe2, 0x7e, 0xb3, 0x55,
+ 0xf8, 0x70, 0x1c, 0x7e, 0xb3, 0x56, 0x28, 0xb4, 0x1, 0x15, 0x7e, 0xb3, 0x54,
+ 0x13, 0xb4, 0x1, 0xe, 0x7e, 0x73, 0x56, 0x8e, 0xbe, 0x70, 0x3a, 0x50, 0x5,
+ 0xe4, 0x7a, 0xb3, 0x67, 0x1a, 0x22, 0x12, 0x99, 0x59, 0x12, 0xbd, 0x21,
+ 0x12, 0x9a, 0x50, 0x2, 0x99, 0xc2, 0xc2, 0x0, 0x7e, 0xa3, 0x2e, 0x75, 0xbe,
+ 0xa0, 0x2, 0x50, 0x2e, 0x7e, 0xb3, 0x67, 0x14, 0x60, 0x21, 0xa, 0x4a, 0x9,
+ 0xb4, 0x56, 0xa9, 0xbe, 0xb3, 0x67, 0xa, 0x50, 0xc, 0x7d, 0x34, 0x2e, 0x34,
+ 0x56, 0xa9, 0x4, 0x7a, 0x39, 0xb0, 0x80, 0x10, 0xe4, 0x19, 0xb4, 0x56, 0xa9,
+ 0xd2, 0x0, 0x80, 0x7, 0xe4, 0xa, 0x3a, 0x19, 0xb3, 0x56, 0xa9, 0x20, 0x0,
+ 0x2a, 0x7e, 0xb3, 0x67, 0x14, 0xb4, 0x1, 0x1e, 0xe4, 0x7a, 0xb3, 0x67, 0x1a,
+ 0x7e, 0x73, 0x67, 0xa, 0xbe, 0x73, 0x56, 0xa8, 0x28, 0xc, 0xe4, 0x7a, 0xb3,
+ 0x67, 0x14, 0x7e, 0xb3, 0x56, 0xa8, 0x4, 0x80, 0x4, 0xe4, 0x80, 0x1, 0xe4,
+ 0x7a, 0xb3, 0x56, 0xa8, 0x7e, 0xb3, 0x67, 0x1a, 0xb4, 0x1, 0x1a, 0x7e, 0x73,
+ 0x67, 0x9, 0xbe, 0x73, 0x56, 0xac, 0x28, 0xc, 0xe4, 0x7a, 0xb3, 0x67, 0x1a,
+ 0x7e, 0xb3, 0x56, 0xac, 0x4, 0x80, 0x6, 0x74, 0x1, 0x80, 0x2, 0x74, 0x1,
+ 0x7a, 0xb3, 0x56, 0xac, 0x22, 0x7e, 0x47, 0x66, 0xf4, 0x7e, 0x7, 0x68, 0x8b,
+ 0x7e, 0x34, 0x0, 0x6, 0xad, 0x30, 0x7e, 0x14, 0x0, 0x4, 0x12, 0x9b, 0x10,
+ 0x8, 0x5, 0x7e, 0xa0, 0x4, 0x80, 0x1d, 0x7d, 0x30, 0x3e, 0x34, 0x12, 0x9b,
+ 0xe, 0x8, 0x5, 0x7e, 0xa0, 0x3, 0x80, 0xf, 0x7d, 0x30, 0x12, 0x9b, 0xe, 0x8,
+ 0x5, 0x7e, 0xa0, 0x2, 0x80, 0x3, 0x7e, 0xa0, 0x1, 0x7e, 0xb3, 0x67, 0x11,
+ 0x60, 0x3, 0x7e, 0xa0, 0x4, 0xa, 0x2a, 0x7e, 0x14, 0xd, 0xc8, 0x7e, 0x4,
+ 0x0, 0xff, 0xb, 0xa, 0x30, 0xad, 0x32, 0x12, 0x9f, 0xb7, 0x7e, 0xb3, 0x66,
+ 0xea, 0xbe, 0xb0, 0x0, 0x28, 0x28, 0x7e, 0xb3, 0x67, 0xb, 0x70, 0x22, 0x7e,
+ 0x37, 0x67, 0x7, 0xbe, 0x34, 0x0, 0x2, 0x48, 0x9, 0x12, 0x9f, 0x85, 0x7a,
+ 0x37, 0x67, 0x7, 0x80, 0xf, 0x7e, 0x63, 0x67, 0x9, 0x7e, 0x70, 0x2, 0xac,
+ 0x67, 0x7c, 0xb7, 0x7a, 0xb3, 0x67, 0x9, 0x7e, 0xb3, 0x54, 0x13, 0xb4, 0x1,
+ 0xe, 0x7e, 0x27, 0x67, 0x7, 0x7e, 0x34, 0x0, 0x5, 0xad, 0x32, 0x7a, 0x37,
+ 0x67, 0x7, 0x7e, 0xb3, 0x55, 0x73, 0xbe, 0xb0, 0x0, 0x28, 0x1a, 0xbe, 0xb0,
+ 0x4, 0x38, 0x15, 0x7e, 0xb3, 0x68, 0x9d, 0xb4, 0x1, 0xe, 0x7e, 0x34, 0x0,
+ 0x1, 0x7a, 0x37, 0x67, 0x7, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x9, 0x22, 0x3e,
+ 0x34, 0x7d, 0x21, 0x12, 0x29, 0xee, 0xbd, 0x34, 0x22, 0x12, 0x9b, 0x6e,
+ 0x12, 0x99, 0xb6, 0x12, 0x9b, 0x5a, 0x40, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x14,
+ 0x7e, 0xb3, 0x67, 0x14, 0x60, 0x16, 0xe4, 0x7a, 0xb3, 0x56, 0xa8, 0x7e, 0x8,
+ 0x56, 0xa9, 0x7e, 0x34, 0x0, 0x2, 0x12, 0x0, 0x2e, 0x74, 0xf, 0x7a, 0xb3,
+ 0x74, 0xb, 0x12, 0x9b, 0x5a, 0x40, 0x6, 0x12, 0x9b, 0x9e, 0x12, 0x9f, 0xad,
+ 0x7e, 0xb3, 0x67, 0x1a, 0x60, 0x4, 0xe4, 0x2, 0xe3, 0xdb, 0x22, 0x7e, 0xb3,
+ 0x56, 0x28, 0x70, 0xc, 0x7e, 0x73, 0x56, 0x0, 0xbe, 0x73, 0x56, 0x29, 0x40,
+ 0x2, 0xc3, 0x22, 0xd3, 0x22, 0x12, 0x9c, 0x2, 0x12, 0xbe, 0xd0, 0x12, 0x9f,
+ 0x7f, 0x2, 0x9b, 0x7a, 0x7e, 0x27, 0x74, 0xc, 0x1e, 0x24, 0x1e, 0x24, 0xe4,
+ 0x7a, 0xb3, 0x67, 0x11, 0x7e, 0x37, 0x66, 0xec, 0xbd, 0x32, 0x38, 0x8, 0x7e,
+ 0x37, 0x66, 0xee, 0xbd, 0x32, 0x28, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67, 0x11,
+ 0x22, 0x7e, 0x18, 0x9, 0x20, 0x7a, 0x1d, 0x27, 0x7e, 0x1f, 0x2d, 0x2a, 0x7f,
+ 0x1, 0xe4, 0x12, 0x9b, 0xce, 0x7e, 0xb3, 0x55, 0xf8, 0x70, 0x18, 0x7e, 0xb3,
+ 0x56, 0x28, 0xb4, 0x1, 0x11, 0x7e, 0x18, 0xe, 0x40, 0x7a, 0x1d, 0x27, 0x7e,
+ 0x18, 0x1d, 0xa0, 0x7f, 0x1, 0xe4, 0x2, 0x9b, 0xce, 0x22, 0x7c, 0xab, 0x12,
+ 0x97, 0xe5, 0x7e, 0xb3, 0x68, 0xa7, 0x7a, 0xb3, 0x2e, 0x78, 0x7e, 0xb3,
+ 0x68, 0xa6, 0x7a, 0xb3, 0x2e, 0x77, 0x7a, 0xa3, 0x2e, 0x79, 0xe4, 0x12,
+ 0x97, 0xcd, 0x7e, 0x1d, 0x27, 0x7a, 0x37, 0x2e, 0x7d, 0x7d, 0x3f, 0x7a,
+ 0x37, 0x2e, 0x7f, 0x7e, 0x34, 0x0, 0x10, 0x12, 0x97, 0xba, 0x2, 0x54, 0xe0,
+ 0xe4, 0x7a, 0xb3, 0x67, 0xb, 0x75, 0x27, 0x0, 0x75, 0x28, 0x0, 0x7e, 0xb3,
+ 0x68, 0xa6, 0xf5, 0x29, 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x2a, 0x7e, 0x8, 0x0,
+ 0x27, 0x7e, 0x37, 0x68, 0x89, 0x12, 0x9c, 0x3d, 0xe4, 0x33, 0x7a, 0xb3,
+ 0x67, 0xb, 0x12, 0x9f, 0xc5, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0xf, 0x12, 0xbf,
+ 0x24, 0xe4, 0x33, 0x7a, 0xb3, 0x67, 0x10, 0x22, 0xca, 0xd8, 0xca, 0x79,
+ 0x7d, 0x43, 0x7f, 0x70, 0x12, 0x9f, 0x94, 0x28, 0x33, 0x6c, 0xff, 0x80,
+ 0x2a, 0x74, 0x2, 0xac, 0xbf, 0x9, 0xe5, 0x65, 0x60, 0x9, 0xd5, 0x65, 0x61,
+ 0x7c, 0xbe, 0x7c, 0x7d, 0x12, 0x36, 0x62, 0x7d, 0xd3, 0x7f, 0x7, 0x7c, 0x7d,
+ 0x12, 0xbf, 0xb0, 0x50, 0x7, 0xbd, 0x4d, 0x58, 0x6, 0xd3, 0x80, 0xb, 0xd3,
+ 0x80, 0x8, 0xb, 0xf0, 0x12, 0x9c, 0x83, 0x38, 0xd1, 0xc3, 0xda, 0x79, 0xda,
+ 0xd8, 0x22, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7f, 0x22, 0xca, 0xf8, 0xc2, 0x0,
+ 0xc2, 0x1, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x5, 0x12, 0x9f, 0x65, 0x80, 0x6f,
+ 0x7e, 0xb3, 0x54, 0x3e, 0x70, 0x69, 0x7e, 0xb3, 0x54, 0x30, 0xbe, 0xb0, 0x1,
+ 0x68, 0x60, 0x12, 0x9d, 0x59, 0x92, 0x1, 0x12, 0xbe, 0xa2, 0x92, 0x0, 0x30,
+ 0x0, 0x13, 0x7e, 0x34, 0xd, 0xe7, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x56, 0x9a,
+ 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x96, 0x80, 0x14, 0x30, 0x1, 0x17, 0x7e, 0x34,
+ 0xd, 0xe7, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x56, 0x9a, 0x74, 0x1, 0x7a, 0xb3,
+ 0x56, 0x97, 0x74, 0x1, 0x7a, 0xb3, 0x56, 0x95, 0x7e, 0xb3, 0x56, 0x96, 0x60,
+ 0xe, 0x6c, 0xff, 0x80, 0x3, 0x12, 0x9d, 0xd, 0x12, 0x9c, 0x83, 0x38, 0xf8,
+ 0x80, 0x12, 0x7e, 0xb3, 0x56, 0x97, 0x60, 0xc, 0x6c, 0xff, 0x80, 0x3, 0x12,
+ 0x9d, 0xd, 0x12, 0x9c, 0x83, 0x38, 0xf8, 0xda, 0xf8, 0x22, 0x7c, 0xbf, 0x6c,
+ 0x77, 0x12, 0x9d, 0x1b, 0xb, 0xf0, 0x22, 0x7c, 0xb1, 0x6c, 0x77, 0x7c, 0x67,
+ 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0xab, 0x7c, 0xb7, 0x54, 0x7, 0xa,
+ 0x2b, 0x2e, 0x24, 0x0, 0x5e, 0x12, 0x9f, 0x3a, 0x7c, 0x7b, 0x4c, 0x66, 0x68,
+ 0xb, 0xa, 0x2a, 0x12, 0x9f, 0x8c, 0x4c, 0xb7, 0x7a, 0x29, 0xb0, 0x22, 0x7c,
+ 0xb7, 0x64, 0xff, 0xa, 0x2a, 0x2e, 0x24, 0x65, 0xd8, 0x2, 0x9d, 0x50, 0x7e,
+ 0x29, 0x70, 0x5c, 0x7b, 0x7a, 0x29, 0x70, 0x22, 0xca, 0x3b, 0x7e, 0xe3,
+ 0x68, 0xa6, 0x7e, 0xd3, 0x68, 0xa7, 0xc2, 0x2c, 0x7e, 0xd7, 0x66, 0xf0, 0xe,
+ 0xd4, 0x6c, 0xcc, 0xc1, 0xd2, 0x7e, 0x30, 0x2, 0xac, 0x3c, 0x9, 0xb1, 0x65,
+ 0x60, 0x7a, 0xb3, 0x2e, 0x77, 0x9, 0x71, 0x65, 0x61, 0x7a, 0x73, 0x2e, 0x78,
+ 0x12, 0x36, 0x62, 0x7d, 0xc3, 0xbd, 0xdc, 0x8, 0x2, 0xc1, 0xd0, 0xbe, 0xe3,
+ 0x2e, 0x77, 0x38, 0x2, 0xc1, 0xd0, 0xbe, 0xd3, 0x2e, 0x78, 0x38, 0x2, 0xc1,
+ 0xd0, 0x7d, 0x1c, 0xe, 0x14, 0x7d, 0xec, 0xe, 0xe4, 0xe, 0xe4, 0x2d, 0xe1,
+ 0x6d, 0xff, 0x12, 0x9f, 0x50, 0x12, 0x9f, 0x10, 0x80, 0x32, 0x6c, 0x99,
+ 0x7e, 0xf3, 0x2e, 0x77, 0x80, 0x1e, 0x7c, 0xbf, 0x7e, 0x73, 0x2e, 0x7c,
+ 0x12, 0x9e, 0xe5, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0x9f, 0x7, 0x80,
+ 0x8, 0x7e, 0x73, 0x2e, 0x7b, 0xbc, 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0,
+ 0x0, 0x58, 0xdd, 0x4c, 0x99, 0x68, 0x8, 0x12, 0x9f, 0x23, 0x12, 0x9e, 0xed,
+ 0x58, 0xc9, 0x12, 0x9f, 0x43, 0x58, 0x38, 0x12, 0x9f, 0x10, 0x80, 0x2e,
+ 0x12, 0x9f, 0x2d, 0x80, 0x1e, 0x7c, 0xb8, 0x7e, 0x73, 0x2e, 0x7c, 0x12,
+ 0x9e, 0xe5, 0x18, 0x9, 0xbd, 0xc0, 0x48, 0x5, 0x12, 0x9e, 0xf5, 0x80, 0x8,
+ 0x7e, 0x73, 0x2e, 0x7a, 0xbc, 0x78, 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38,
+ 0xde, 0x4c, 0x99, 0x68, 0x8, 0x12, 0x9f, 0x23, 0x12, 0x9e, 0xed, 0x58, 0xcd,
+ 0x12, 0x9f, 0x50, 0xa, 0x5d, 0x1b, 0x54, 0x7e, 0x73, 0x2e, 0x78, 0xa, 0x17,
+ 0xbd, 0x15, 0x58, 0x77, 0x12, 0x9e, 0xfe, 0x80, 0x2e, 0x6c, 0x99, 0x7e,
+ 0xf3, 0x2e, 0x77, 0x80, 0x1a, 0x7c, 0xbf, 0x12, 0x9e, 0xe1, 0x18, 0x9, 0xbd,
+ 0xc0, 0x48, 0x5, 0x12, 0x9f, 0x7, 0x80, 0x8, 0x7e, 0x73, 0x2e, 0x7b, 0xbc,
+ 0x7f, 0x58, 0x7, 0x1b, 0xf0, 0xbe, 0xf0, 0x0, 0x58, 0xe1, 0x4c, 0x99, 0x68,
+ 0x9, 0x12, 0x9f, 0x19, 0xbe, 0xd3, 0x2e, 0x79, 0x38, 0xcc, 0x12, 0x9f, 0x43,
+ 0x58, 0x39, 0x7e, 0x73, 0x2e, 0x78, 0x12, 0x9e, 0xfe, 0x80, 0x2a, 0x12,
+ 0x9f, 0x2d, 0x80, 0x1a, 0x7c, 0xb8, 0x12, 0x9e, 0xe1, 0x18, 0x9, 0xbd, 0xc0,
+ 0x48, 0x5, 0x12, 0x9e, 0xf5, 0x80, 0x8, 0x7e, 0x73, 0x2e, 0x7a, 0xbc, 0x78,
+ 0x28, 0x6, 0xb, 0x80, 0xbc, 0xe8, 0x38, 0xe2, 0x4c, 0x99, 0x68, 0x9, 0x12,
+ 0x9f, 0x19, 0xbe, 0xd3, 0x2e, 0x79, 0x38, 0xd0, 0x90, 0xd, 0xe2, 0xe4, 0x93,
+ 0xa, 0x1b, 0xbd, 0x1f, 0x38, 0x14, 0xd2, 0x2c, 0x7e, 0x73, 0x2e, 0x77, 0x7a,
+ 0x73, 0x56, 0x98, 0x7e, 0x73, 0x2e, 0x78, 0x7a, 0x73, 0x56, 0x99, 0x80, 0xc,
+ 0xb, 0xc0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7c, 0x28, 0x2, 0xa1, 0x6f, 0xa2,
+ 0x2c, 0xda, 0x3b, 0x22, 0x7e, 0x73, 0x2e, 0x79, 0x12, 0x36, 0x62, 0x7d, 0x3,
+ 0xbd, 0xe0, 0x22, 0x7e, 0x73, 0x2e, 0x7c, 0xbe, 0x70, 0x0, 0x22, 0xb, 0xf4,
+ 0xb, 0x90, 0x7a, 0x83, 0x2e, 0x7a, 0x22, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73,
+ 0x2e, 0x79, 0x22, 0xb, 0xf4, 0xb, 0x90, 0x7a, 0xf3, 0x2e, 0x7b, 0x22, 0x7e,
+ 0x73, 0x2e, 0x78, 0x7a, 0x73, 0x2e, 0x7c, 0x22, 0x7e, 0xb3, 0x2e, 0x79, 0x4,
+ 0x7a, 0xb3, 0x2e, 0x79, 0x22, 0x7e, 0xb3, 0x2e, 0x7c, 0x14, 0x7a, 0xb3,
+ 0x2e, 0x7c, 0x22, 0x6c, 0x99, 0x7e, 0x83, 0x2e, 0x77, 0xa, 0x18, 0xb, 0x14,
+ 0x7c, 0x83, 0x22, 0x7a, 0x51, 0x82, 0x7a, 0x41, 0x83, 0xe4, 0x93, 0x22, 0xa,
+ 0x5e, 0x1b, 0x54, 0x7e, 0x73, 0x2e, 0x77, 0xa, 0x17, 0xbd, 0x15, 0x22, 0x7e,
+ 0x73, 0x2e, 0x77, 0xa, 0x37, 0xb, 0x34, 0x7a, 0x73, 0x2e, 0x7a, 0x7e, 0x73,
+ 0x2e, 0x77, 0x7a, 0x73, 0x2e, 0x7b, 0x22, 0x7e, 0x37, 0x56, 0x9a, 0xbe,
+ 0x34, 0x0, 0x0, 0x28, 0x7, 0x1b, 0x34, 0x7a, 0x37, 0x56, 0x9a, 0x22, 0xe4,
+ 0x12, 0x9f, 0xa4, 0x7a, 0xb3, 0x56, 0x95, 0x22, 0xe4, 0x7a, 0xb3, 0x67, 0xe,
+ 0x22, 0x7e, 0x24, 0x0, 0x2, 0x2, 0x29, 0xee, 0x2e, 0x24, 0x65, 0xd8, 0x7e,
+ 0x29, 0xb0, 0x22, 0x7e, 0x73, 0x66, 0xea, 0xbe, 0x70, 0x0, 0x22, 0x7e, 0x73,
+ 0x68, 0x7a, 0xbe, 0x70, 0x0, 0x22, 0x7a, 0xb3, 0x56, 0x96, 0x7a, 0xb3, 0x56,
+ 0x97, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xea, 0x7a, 0xb3, 0x66, 0xeb, 0x22,
+ 0x7a, 0x37, 0x67, 0x7, 0x90, 0xd, 0xca, 0xe4, 0x93, 0x7a, 0xb3, 0x67, 0x9,
+ 0x22, 0x7e, 0x37, 0x66, 0xee, 0x2e, 0x37, 0x66, 0xec, 0xbe, 0x37, 0x67, 0x5,
+ 0x28, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x56, 0x9a, 0xe4,
+ 0x7a, 0xb3, 0x56, 0x98, 0x7a, 0xb3, 0x56, 0x99, 0x7a, 0xb3, 0x56, 0x95, 0x2,
+ 0x9f, 0xa4, 0x2, 0x40, 0x6d, 0x12, 0xe0, 0x9a, 0x90, 0x1, 0x90, 0xe4, 0x93,
+ 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x2, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x0, 0x7a,
+ 0x37, 0x34, 0x83, 0x7e, 0x37, 0x68, 0xb7, 0x7a, 0x37, 0x34, 0x85, 0x7e,
+ 0x34, 0x43, 0x21, 0x7a, 0x37, 0x34, 0x87, 0x7e, 0x34, 0x23, 0x45, 0x7a,
+ 0x37, 0x34, 0x89, 0x7e, 0x34, 0x12, 0x5, 0x7a, 0x37, 0x34, 0x8b, 0xc2, 0xa,
+ 0x12, 0x5e, 0x72, 0x7e, 0xb3, 0x55, 0xf8, 0xb4, 0x1, 0xa, 0x12, 0x5f, 0x78,
+ 0x68, 0x5, 0xd2, 0xa, 0x12, 0x5d, 0xc8, 0x7e, 0x34, 0x0, 0x1e, 0x7e, 0x8,
+ 0x34, 0x3f, 0x7e, 0x24, 0x0, 0x22, 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x0, 0x20,
+ 0x7e, 0x27, 0x34, 0x83, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27,
+ 0x34, 0x85, 0x12, 0x3f, 0x20, 0x7e, 0x34, 0x0, 0x39, 0x7e, 0x8, 0x34, 0x87,
+ 0x7e, 0x24, 0x0, 0x3, 0x2, 0x40, 0x57, 0x7c, 0x7b, 0xc4, 0x23, 0x54, 0x1f,
+ 0xa, 0x2b, 0x9, 0xa2, 0x65, 0xd8, 0x7c, 0xb7, 0x54, 0x7, 0xa, 0x3b, 0x2e,
+ 0x34, 0x0, 0x5e, 0x12, 0x49, 0xe4, 0x5c, 0xba, 0x22, 0x6c, 0x33, 0x6c, 0x22,
+ 0x80, 0x20, 0x7c, 0xb2, 0x12, 0xa0, 0x72, 0x60, 0x17, 0x74, 0x2, 0xac, 0xb2,
+ 0x9, 0x15, 0x65, 0x60, 0x9, 0x5, 0x65, 0x61, 0x7c, 0xb1, 0x7c, 0x70, 0x12,
+ 0xa0, 0xc4, 0x50, 0x2, 0xb, 0x30, 0xb, 0x20, 0x7e, 0x73, 0x66, 0xea, 0xbc,
+ 0x72, 0x38, 0xd8, 0x7c, 0xb3, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c,
+ 0xab, 0x4c, 0x77, 0x68, 0x18, 0x7e, 0xb3, 0x68, 0xa9, 0x14, 0xbc, 0xb7,
+ 0x68, 0xf, 0x4c, 0xaa, 0x68, 0xb, 0x7e, 0xb3, 0x68, 0xa8, 0x14, 0xbc, 0xba,
+ 0x68, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xca, 0x3b, 0x6c, 0xff, 0x75, 0x2d, 0x0,
+ 0x12, 0xa0, 0x8e, 0x7c, 0xdb, 0x6c, 0xee, 0x7e, 0xb3, 0x68, 0xa8, 0xf5,
+ 0x2b, 0x7e, 0xb3, 0x68, 0xa9, 0xf5, 0x2c, 0xe4, 0x7a, 0xb3, 0x56, 0xb7,
+ 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x2, 0x80, 0x2, 0x41, 0x2d, 0x75, 0x2d,
+ 0x0, 0x6c, 0xcc, 0x41, 0x1b, 0x7e, 0x70, 0x2, 0xac, 0x7c, 0x12, 0xa7, 0xa1,
+ 0x75, 0x27, 0x3, 0x75, 0x28, 0x3, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x8, 0x75,
+ 0x27, 0x4, 0x75, 0x28, 0x4, 0x21, 0xe0, 0x7e, 0x63, 0x66, 0xea, 0xbe, 0x60,
+ 0x6, 0x40, 0x1e, 0x12, 0xa0, 0xbf, 0x50, 0x45, 0xbe, 0xd0, 0x1, 0x78, 0x2,
+ 0x80, 0x21, 0xbe, 0xd0, 0x2, 0x38, 0x2, 0x80, 0x27, 0xbe, 0xd0, 0x3, 0x38,
+ 0x32, 0x80, 0x28, 0x80, 0x2e, 0x80, 0x2c, 0xbe, 0x60, 0x4, 0x40, 0x2f, 0x12,
+ 0xa0, 0xbf, 0x50, 0x22, 0xbe, 0xd0, 0x1, 0x78, 0x8, 0x75, 0x27, 0x5, 0x75,
+ 0x28, 0x5, 0x80, 0x71, 0xbe, 0xd0, 0x2, 0x38, 0x8, 0x75, 0x27, 0x3, 0x75,
+ 0x28, 0x3, 0x80, 0x64, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2, 0x80, 0x5c, 0x75,
+ 0x27, 0x1, 0x75, 0x28, 0x1, 0x80, 0x54, 0xe5, 0x29, 0xbe, 0xb0, 0x1, 0x28,
+ 0xe, 0xe5, 0x2b, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x29, 0xa, 0x3b, 0xbd, 0x32,
+ 0x48, 0x3, 0x75, 0x27, 0x2, 0xe5, 0x2a, 0xbe, 0xb0, 0x1, 0x28, 0xe, 0xe5,
+ 0x2c, 0xa, 0x2b, 0x1b, 0x25, 0xe5, 0x2a, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x3,
+ 0x75, 0x28, 0x2, 0xc2, 0x0, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7c, 0x6c, 0x12,
+ 0xe2, 0xa0, 0xbe, 0xb0, 0xff, 0x68, 0x6, 0x75, 0x27, 0x2, 0x75, 0x28, 0x2,
+ 0x7c, 0xbc, 0x7e, 0x8, 0x0, 0x27, 0x7e, 0x18, 0x0, 0x28, 0x12, 0xa8, 0x36,
+ 0xe5, 0x27, 0x7e, 0x71, 0x28, 0x7c, 0x6c, 0x7c, 0x5e, 0x7e, 0x41, 0x2d,
+ 0x12, 0xa9, 0xa0, 0x7e, 0x70, 0x9, 0xac, 0x7e, 0x9, 0x53, 0x65, 0xe2, 0xbc,
+ 0x5f, 0x28, 0x2, 0x7c, 0xf5, 0x90, 0xd, 0x98, 0xe4, 0x93, 0xb4, 0x1, 0x11,
+ 0x7d, 0x13, 0x2e, 0x14, 0x65, 0xdc, 0x6d, 0x0, 0x2e, 0x34, 0x65, 0xde, 0x6d,
+ 0x22, 0x12, 0xa7, 0xae, 0xb, 0xe0, 0xb, 0xc0, 0x7e, 0x73, 0x66, 0xea, 0xbc,
+ 0x7c, 0x28, 0x2, 0x21, 0x15, 0x7a, 0xe3, 0x66, 0xea, 0x7a, 0xf3, 0x56, 0xb7,
+ 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x6c, 0xdd, 0x12, 0x97, 0x6e, 0x7e, 0xb3,
+ 0x66, 0xea, 0xf5, 0x29, 0x12, 0xa5, 0x3, 0x92, 0x0, 0xe5, 0x29, 0x70, 0x14,
+ 0x6d, 0x33, 0x7a, 0x37, 0x53, 0x33, 0xe4, 0x7a, 0xb3, 0x53, 0x35, 0x7a,
+ 0xb3, 0x53, 0x72, 0x7a, 0x35, 0x12, 0x81, 0x22, 0x20, 0x0, 0x2, 0x61, 0xe7,
+ 0x75, 0x30, 0x0, 0x6d, 0x77, 0x7e, 0x35, 0x12, 0x4d, 0x33, 0x78, 0x3, 0xe4,
+ 0x80, 0x2, 0x74, 0x1, 0x7a, 0xb3, 0x2e, 0xb3, 0x6c, 0xcc, 0x61, 0xcc, 0x7c,
+ 0xbc, 0x12, 0xa0, 0x72, 0x70, 0x2, 0x61, 0xca, 0x7e, 0x70, 0x2, 0xac, 0x7c,
+ 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x2a, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x2b, 0x7c,
+ 0xbc, 0x12, 0xa5, 0xe3, 0x7a, 0x35, 0x2c, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x9,
+ 0x7c, 0xbc, 0x12, 0xa7, 0xbd, 0x50, 0x2, 0x61, 0xca, 0xc2, 0x1, 0x6d, 0x33,
+ 0x7a, 0x35, 0x2e, 0xe5, 0x2a, 0x7e, 0x71, 0x2b, 0x12, 0xa0, 0xc4, 0x50,
+ 0x62, 0xe5, 0x2a, 0xa, 0x5b, 0x1b, 0x54, 0xf5, 0x27, 0x80, 0x2f, 0xe5, 0x2b,
+ 0xa, 0xb, 0x1b, 0x4, 0x80, 0x19, 0xe5, 0x27, 0x7c, 0x71, 0x12, 0x36, 0x62,
+ 0x7d, 0x43, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x8, 0x7d, 0x54, 0x2e, 0x55, 0x2e,
+ 0x7a, 0x55, 0x2e, 0xb, 0x10, 0xe5, 0x2b, 0xa, 0x3b, 0xb, 0x34, 0xa, 0x51,
+ 0xbd, 0x53, 0x8, 0xdb, 0x5, 0x27, 0xe5, 0x2a, 0xa, 0x2b, 0xb, 0x24, 0xe5,
+ 0x27, 0xa, 0x3b, 0xbd, 0x32, 0x8, 0xc3, 0x90, 0xd, 0xd9, 0xe4, 0x93, 0xa,
+ 0x2b, 0xb, 0x24, 0x7e, 0x35, 0x2c, 0xad, 0x32, 0xbe, 0x35, 0x2e, 0x8, 0x4,
+ 0xc2, 0x2, 0x80, 0x4, 0xd2, 0x2, 0x80, 0x0, 0xe5, 0x2a, 0x7e, 0x71, 0x2b,
+ 0x7e, 0x8, 0x0, 0x31, 0x12, 0xdc, 0xa9, 0x24, 0xff, 0x92, 0x1, 0x20, 0x2d,
+ 0x1a, 0xe5, 0x2a, 0x7e, 0x71, 0x2b, 0x12, 0xa4, 0x3b, 0x24, 0xff, 0x92, 0x3,
+ 0xe4, 0x33, 0xa, 0x3b, 0xbe, 0x34, 0x0, 0xff, 0x68, 0x4, 0xa2, 0x3, 0x92,
+ 0x1, 0x7e, 0xb3, 0x2e, 0xb3, 0xb4, 0x1, 0x52, 0x20, 0x1, 0x4f, 0xe5, 0x2a,
+ 0xbe, 0xb0, 0x4, 0x40, 0xe, 0xe5, 0x28, 0xa, 0x2b, 0x1b, 0x26, 0xe5, 0x2a,
+ 0xa, 0x3b, 0xbd, 0x32, 0x8, 0x1d, 0x7e, 0x25, 0x12, 0x7e, 0x34, 0x0, 0x5,
+ 0x12, 0xa4, 0x2d, 0x8, 0x2e, 0x7e, 0x17, 0x66, 0xf0, 0x3e, 0x14, 0x3e, 0x14,
+ 0x12, 0xa4, 0x25, 0x8, 0x21, 0xd2, 0x1, 0x80, 0x1d, 0x7e, 0x25, 0x12, 0x7e,
+ 0x34, 0x0, 0x7, 0x12, 0xa4, 0x2d, 0x8, 0x11, 0x7e, 0x7, 0x66, 0xf0, 0x7e,
+ 0x14, 0x0, 0x5, 0xad, 0x10, 0x12, 0xa4, 0x25, 0x8, 0x2, 0xd2, 0x1, 0x30,
+ 0x1, 0x7, 0x7e, 0x35, 0x31, 0x2d, 0x73, 0x5, 0x30, 0x20, 0x1, 0x1b, 0x7c,
+ 0xbc, 0x6c, 0x77, 0x12, 0x9d, 0x1b, 0x7e, 0xa1, 0x2a, 0x7e, 0x70, 0x2, 0xac,
+ 0x7d, 0x19, 0xa3, 0x2e, 0x77, 0xe5, 0x2b, 0x19, 0xb3, 0x2e, 0x78, 0xb, 0xd0,
+ 0xb, 0xc0, 0xe5, 0x29, 0xbc, 0xbc, 0x28, 0x2, 0x41, 0x78, 0xe5, 0x30, 0xbe,
+ 0xb0, 0x0, 0x28, 0xc, 0xe5, 0x30, 0xa, 0x2b, 0x7d, 0x37, 0x12, 0x29, 0xee,
+ 0x7a, 0x35, 0x12, 0x12, 0x36, 0x10, 0x7e, 0x73, 0x66, 0xea, 0xa, 0x37, 0x3e,
+ 0x34, 0xca, 0x39, 0x7e, 0x18, 0x65, 0x60, 0x7e, 0x8, 0x53, 0x36, 0x12, 0x2b,
+ 0x7, 0x1b, 0xfd, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x53, 0x35, 0xa, 0x3d,
+ 0x3e, 0x34, 0xca, 0x39, 0x7e, 0x18, 0x2e, 0x77, 0x7e, 0x8, 0x52, 0xf7, 0x12,
+ 0x2b, 0x7, 0x1b, 0xfd, 0x7a, 0xd3, 0x53, 0x72, 0xc2, 0x2d, 0xda, 0x3b, 0x22,
+ 0x7e, 0x35, 0x2c, 0xad, 0x32, 0xbd, 0x31, 0x22, 0xad, 0x32, 0x7e, 0x15,
+ 0x31, 0x7e, 0x24, 0x0, 0xa, 0xad, 0x12, 0xbd, 0x13, 0x22, 0x7c, 0x17, 0x7c,
+ 0xb, 0x7c, 0x71, 0x12, 0x36, 0x62, 0x7d, 0x13, 0x6c, 0xaa, 0x80, 0x45, 0x7e,
+ 0x50, 0x2, 0xac, 0x5a, 0x9, 0x72, 0x53, 0x36, 0x9, 0x62, 0x53, 0x37, 0xa,
+ 0xf0, 0xa, 0x47, 0x12, 0xa4, 0xee, 0x8, 0x6, 0xa, 0x27, 0x9d, 0x2f, 0x80,
+ 0x4, 0x6d, 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18, 0x1d, 0x12, 0xa4,
+ 0xea, 0x8, 0x6, 0xa, 0x26, 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x24,
+ 0xbe, 0x24, 0x0, 0x1, 0x18, 0x8, 0x12, 0xa4, 0xf5, 0x18, 0x3, 0x74, 0x1,
+ 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x53, 0x35, 0xbc, 0xba, 0x38, 0xb3, 0x6c, 0xaa,
+ 0x80, 0x44, 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x9, 0x72, 0x52, 0xf7, 0x9, 0x62,
+ 0x52, 0xf8, 0xa, 0xf0, 0xa, 0x47, 0x12, 0xa4, 0xee, 0x8, 0x6, 0xa, 0x27,
+ 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18,
+ 0x1c, 0x12, 0xa4, 0xea, 0x8, 0x6, 0xa, 0x26, 0x9d, 0x2f, 0x80, 0x4, 0x6d,
+ 0x22, 0x9d, 0x24, 0xbe, 0x24, 0x0, 0x1, 0x18, 0x7, 0x12, 0xa4, 0xf5, 0x8,
+ 0x2, 0xe4, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x53, 0x72, 0xbc, 0xba, 0x38, 0xb4,
+ 0x74, 0xff, 0x22, 0xa, 0xf1, 0xa, 0x46, 0x9d, 0x4f, 0xbe, 0x44, 0x0, 0x0,
+ 0x22, 0x7e, 0xf4, 0xd, 0xde, 0x7e, 0xe4, 0x0, 0xff, 0xb, 0x7a, 0x20, 0xbd,
+ 0x21, 0x22, 0xca, 0x79, 0xc2, 0x4, 0x7e, 0x73, 0x56, 0xb7, 0xbe, 0x70, 0x6,
+ 0x38, 0x3, 0xc3, 0xa1, 0xcf, 0x7e, 0xc7, 0x66, 0xf0, 0x7e, 0xe3, 0x66, 0xea,
+ 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x3, 0xc3, 0xa1, 0xcf, 0x90, 0xd, 0xd8, 0xe4,
+ 0x93, 0x7c, 0xab, 0xbc, 0xae, 0x90, 0xd, 0xd7, 0x28, 0x7, 0xe4, 0x93, 0xa4,
+ 0x7d, 0xb5, 0x80, 0x6, 0xe4, 0x93, 0xac, 0xbe, 0x7d, 0xb5, 0x7e, 0x1f, 0x2d,
+ 0x2e, 0x7e, 0x14, 0xd, 0xd3, 0x12, 0xa7, 0x99, 0x7e, 0x14, 0xd, 0xd5, 0x12,
+ 0x4f, 0x69, 0x12, 0xc0, 0x38, 0x7d, 0x3, 0x6c, 0xff, 0x6c, 0x99, 0x80, 0x22,
+ 0x7c, 0xb9, 0x12, 0xa5, 0xe3, 0x7d, 0xd3, 0x7d, 0x1d, 0x3e, 0x14, 0xbd,
+ 0x1c, 0x48, 0xf, 0x7e, 0x34, 0xd, 0xdc, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a,
+ 0x10, 0xbd, 0x1d, 0x8, 0x2, 0xb, 0xf0, 0xb, 0x90, 0x7e, 0x83, 0x66, 0xea,
+ 0xbc, 0x89, 0x38, 0xd6, 0xbd, 0xb0, 0x50, 0x2c, 0x12, 0xa5, 0xda, 0x38,
+ 0x1c, 0x7e, 0x34, 0xd, 0xde, 0x12, 0xa5, 0xd2, 0xbd, 0xdc, 0x58, 0x5, 0xbe,
+ 0xe0, 0x1, 0x38, 0xc, 0x74, 0x2, 0xac, 0xbf, 0xa, 0x4e, 0x1b, 0x44, 0xbd,
+ 0x54, 0x48, 0xb, 0x7e, 0x34, 0xd, 0xda, 0x12, 0xa5, 0xd2, 0x7a, 0xd7, 0x53,
+ 0x33, 0x12, 0xa5, 0xda, 0x28, 0x2, 0xd2, 0x4, 0x7e, 0x34, 0xd, 0xe0, 0x12,
+ 0xa5, 0xd2, 0xbd, 0xdc, 0x58, 0x5, 0xe4, 0x7a, 0xb3, 0x66, 0xea, 0xa2, 0x4,
+ 0xda, 0x79, 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xd0, 0x22, 0x7e, 0xd7,
+ 0x53, 0x33, 0xbe, 0xd4, 0x0, 0x0, 0x22, 0x7c, 0xab, 0x7e, 0x70, 0x2, 0xac,
+ 0x7a, 0x9, 0xb3, 0x65, 0x60, 0x9, 0x73, 0x65, 0x61, 0x2, 0x36, 0x62, 0xca,
+ 0x79, 0x6c, 0xff, 0xc2, 0x0, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x6, 0x7e, 0xd4,
+ 0x2, 0xbc, 0x80, 0x4, 0x7e, 0xd4, 0x3, 0xe8, 0x7e, 0xb3, 0x68, 0xa3, 0xb4,
+ 0x1, 0x4, 0x7e, 0xd4, 0x0, 0xf0, 0x7e, 0xc7, 0x66, 0xf0, 0x6c, 0xee, 0x80,
+ 0x71, 0xc2, 0x0, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7d, 0xb3, 0x74, 0x2, 0xac,
+ 0xbe, 0x9, 0xb5, 0x65, 0x60, 0x12, 0xa8, 0x14, 0xbd, 0x3b, 0x58, 0x4, 0xd2,
+ 0x0, 0x80, 0x26, 0x7e, 0x73, 0x68, 0x7a, 0xbe, 0x73, 0x66, 0xea, 0x78, 0x1c,
+ 0x7e, 0xa7, 0x56, 0xb8, 0x1e, 0xa4, 0xbd, 0xac, 0x50, 0x12, 0x7c, 0xbe,
+ 0x7e, 0x70, 0x1, 0x12, 0xa6, 0xa3, 0x7d, 0x1d, 0x6d, 0x0, 0xbf, 0x10, 0x8,
+ 0x2, 0xd2, 0x0, 0x30, 0x0, 0x2a, 0x7c, 0xbe, 0x12, 0xa0, 0x72, 0x60, 0x23,
+ 0x7e, 0xa4, 0x0, 0x9, 0xca, 0xa9, 0x7e, 0x70, 0x9, 0xac, 0x7e, 0x2e, 0x34,
+ 0x65, 0xdc, 0x6d, 0x22, 0x7e, 0x30, 0x9, 0xac, 0x3f, 0x2e, 0x14, 0x67, 0x1b,
+ 0x6d, 0x0, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0xb, 0xf0, 0xb, 0xe0, 0x12, 0xa7,
+ 0x7a, 0x38, 0x8a, 0x7a, 0x73, 0x66, 0xff, 0x7a, 0xf3, 0x68, 0x79, 0x7a,
+ 0xc7, 0x56, 0xb8, 0xda, 0x79, 0x22, 0x7c, 0x67, 0x7c, 0x7b, 0x7e, 0x50, 0x2,
+ 0xac, 0x57, 0x9, 0xa2, 0x65, 0x60, 0x9, 0x72, 0x65, 0x61, 0x90, 0xd, 0xb9,
+ 0xe4, 0x93, 0xbc, 0xba, 0x78, 0x3, 0x9f, 0x11, 0x22, 0x7c, 0xba, 0x2, 0xa6,
+ 0xc5, 0x7c, 0x16, 0x7c, 0x7, 0x7c, 0x9b, 0x7e, 0x83, 0x68, 0xa8, 0x7a, 0x83,
+ 0x2e, 0x77, 0x7e, 0x83, 0x68, 0xa9, 0x7a, 0x83, 0x2e, 0x78, 0x9f, 0x77, 0xa,
+ 0x31, 0xa, 0x19, 0x9d, 0x13, 0x7c, 0x83, 0x80, 0x7c, 0x7a, 0x81, 0x28, 0xbe,
+ 0x80, 0x0, 0x58, 0xc, 0x1a, 0x58, 0x1a, 0x19, 0x9d, 0x15, 0xa, 0x59, 0x2d,
+ 0x51, 0xf5, 0x28, 0x7e, 0x73, 0x2e, 0x77, 0xbc, 0x78, 0x18, 0xc, 0x1a, 0x59,
+ 0x1a, 0x18, 0x9d, 0x15, 0xa, 0x59, 0x9d, 0x51, 0xf5, 0x28, 0xa, 0x11, 0xa,
+ 0x50, 0x9d, 0x51, 0xf5, 0x27, 0x80, 0x3a, 0x85, 0x27, 0x29, 0xe5, 0x27,
+ 0xbe, 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x27, 0x1a, 0x5b, 0x1a, 0x10, 0x9d, 0x15,
+ 0xa, 0x50, 0x2d, 0x51, 0xf5, 0x29, 0x7e, 0x73, 0x2e, 0x78, 0xbe, 0x71, 0x27,
+ 0x18, 0xe, 0x1a, 0x30, 0xe5, 0x27, 0x1a, 0x1b, 0x9d, 0x13, 0xa, 0x50, 0x9d,
+ 0x51, 0xf5, 0x29, 0x12, 0xa7, 0x81, 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x71, 0x5,
+ 0x27, 0xa, 0x21, 0xa, 0x30, 0x2d, 0x32, 0xe5, 0x27, 0x1a, 0x1b, 0xbd, 0x13,
+ 0x8, 0xb8, 0xb, 0x80, 0xa, 0x11, 0xa, 0x59, 0x2d, 0x51, 0x1a, 0x18, 0xbd,
+ 0x15, 0x18, 0x2, 0xc1, 0xe7, 0x7f, 0x17, 0x22, 0x2, 0xa0, 0xe4, 0x2, 0xa5,
+ 0xf5, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7e, 0x22, 0xe5, 0x28, 0x7e, 0x71,
+ 0x29, 0x2, 0x36, 0x62, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7e, 0x24, 0x0, 0x3,
+ 0x2, 0x29, 0xee, 0x7e, 0x14, 0xd, 0x18, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa,
+ 0x20, 0x22, 0x9, 0xb3, 0x65, 0x60, 0xf5, 0x29, 0x9, 0xb3, 0x65, 0x61, 0xf5,
+ 0x2a, 0x22, 0x7f, 0x20, 0xb, 0x2a, 0x10, 0xb, 0x1a, 0x0, 0x1b, 0x2a, 0x0,
+ 0x1b, 0x1a, 0x10, 0x22, 0x7c, 0x4b, 0x74, 0x2, 0xac, 0xb4, 0x9, 0x55, 0x65,
+ 0x60, 0x9, 0x65, 0x65, 0x61, 0x7e, 0x73, 0x66, 0xf2, 0xbc, 0x75, 0x78, 0xa,
+ 0x7e, 0x73, 0x66, 0xf3, 0xbc, 0x76, 0x78, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x6c,
+ 0x11, 0x80, 0x28, 0x74, 0x2, 0xac, 0xb1, 0x9, 0x5, 0x65, 0x60, 0x9, 0x95,
+ 0x65, 0x61, 0x7c, 0xb0, 0x7c, 0x79, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x2, 0x58,
+ 0x58, 0xd, 0x7e, 0x17, 0x66, 0xf4, 0xbe, 0x14, 0xff, 0x38, 0x58, 0x3, 0x12,
+ 0x9d, 0x17, 0xb, 0x10, 0x7e, 0x83, 0x66, 0xea, 0xbc, 0x81, 0x38, 0xd0, 0x22,
+ 0x7e, 0x37, 0x68, 0x87, 0x7e, 0x53, 0x68, 0xa8, 0xbc, 0x5b, 0x38, 0x15,
+ 0x7e, 0xb3, 0x53, 0xf2, 0xb4, 0xaa, 0xa, 0x7e, 0x63, 0x53, 0xf0, 0x7e, 0x70,
+ 0x20, 0xac, 0x67, 0x22, 0x7e, 0x37, 0x68, 0x8d, 0x22, 0xca, 0x79, 0x7c,
+ 0xab, 0x7e, 0xb3, 0x67, 0x0, 0x60, 0x43, 0xb4, 0x1, 0x9, 0x7e, 0xb3, 0x66,
+ 0xea, 0xbe, 0xb0, 0x2, 0x68, 0x37, 0x7e, 0x93, 0x66, 0xea, 0xbe, 0x90, 0x2,
+ 0x78, 0x15, 0x7e, 0xf0, 0x9, 0xac, 0xfa, 0x9, 0xb7, 0x65, 0xe2, 0xbe, 0xb0,
+ 0x14, 0x28, 0x7, 0x74, 0x4, 0x7a, 0xb, 0xb0, 0x80, 0x16, 0xbe, 0x90, 0x1,
+ 0x78, 0x14, 0x74, 0x9, 0xa4, 0x9, 0xb5, 0x65, 0xe2, 0xbe, 0xb0, 0x7, 0x28,
+ 0x8, 0x74, 0x7, 0x7a, 0xb, 0xb0, 0x7a, 0x1b, 0xb0, 0xda, 0x79, 0x22, 0xca,
+ 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x21, 0x41, 0x7e, 0x70, 0x2, 0xac, 0x7e, 0x9,
+ 0xb3, 0x65, 0x60, 0xf5, 0x32, 0x9, 0xb3, 0x65, 0x61, 0xf5, 0x33, 0x75, 0x2b,
+ 0x3, 0x75, 0x2c, 0x3, 0x12, 0xa7, 0x89, 0x7d, 0xe3, 0x7e, 0xf7, 0x68, 0x9b,
+ 0xbd, 0xfe, 0x28, 0x2, 0x7d, 0xef, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x71, 0x27,
+ 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x28, 0xe5, 0x32, 0x7e, 0x61, 0x2b, 0x7e, 0x8,
+ 0x0, 0x2d, 0x12, 0xa9, 0x4d, 0xf5, 0x29, 0xe5, 0x33, 0x7e, 0x71, 0x28, 0x7e,
+ 0x61, 0x2c, 0x7e, 0x8, 0x0, 0x2e, 0x12, 0xa9, 0x4d, 0x7c, 0xab, 0x7a, 0xa1,
+ 0x2a, 0xe5, 0x29, 0xa, 0x4b, 0xe5, 0x2d, 0xa, 0xfb, 0x2d, 0xf4, 0x7d, 0x3f,
+ 0x7c, 0xb7, 0xf5, 0x2f, 0xa, 0x4a, 0xe5, 0x2e, 0xa, 0x5b, 0x2d, 0x54, 0xf5,
+ 0x30, 0x75, 0x31, 0x0, 0x7e, 0xd1, 0x2d, 0x80, 0x2c, 0x7e, 0xc1, 0x2e, 0x80,
+ 0x1f, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0x36, 0x62, 0x7e, 0x53, 0x68, 0x86, 0xa,
+ 0x25, 0x7d, 0xd3, 0x9d, 0xd2, 0xbe, 0xd4, 0x0, 0x0, 0x8, 0x6, 0xbd, 0xed,
+ 0x38, 0x2, 0x5, 0x31, 0xb, 0xc0, 0xe5, 0x30, 0xbc, 0xbc, 0x38, 0xdb, 0xb,
+ 0xd0, 0xe5, 0x2f, 0xbc, 0xbd, 0x38, 0xce, 0xbe, 0xf1, 0x31, 0x50, 0x3, 0x7e,
+ 0xf1, 0x31, 0xb, 0xe0, 0x12, 0xa7, 0x7a, 0x28, 0x2, 0x1, 0x8e, 0x7c, 0xbf,
+ 0xda, 0x3b, 0x22, 0xca, 0xf8, 0x7c, 0xf6, 0x7c, 0x87, 0x7c, 0x9b, 0xa, 0x2f,
+ 0x7d, 0x32, 0x3e, 0x34, 0xb, 0x34, 0x7c, 0xb7, 0xbc, 0xf9, 0x38, 0x14, 0xa,
+ 0xf8, 0x1b, 0xf4, 0xa, 0x3f, 0x9d, 0xf3, 0xa, 0x39, 0xbd, 0x3f, 0x18, 0x6,
+ 0x7c, 0xab, 0xa, 0x39, 0x80, 0x1d, 0xbc, 0xf9, 0x28, 0xd, 0xa, 0x39, 0xa,
+ 0x5f, 0x2d, 0x53, 0xb, 0x54, 0x7c, 0xab, 0xe4, 0x80, 0x10, 0xa, 0x3f, 0xa,
+ 0x58, 0x2d, 0x53, 0xa, 0x39, 0x9d, 0x53, 0x7c, 0xab, 0x9d, 0x32, 0x7c, 0xb7,
+ 0x7a, 0xb, 0xb0, 0x7c, 0xba, 0xda, 0xf8, 0x22, 0xca, 0x3b, 0x7c, 0xf5, 0x7c,
+ 0xe6, 0x7c, 0xd7, 0x7c, 0xcb, 0x9f, 0x55, 0x7f, 0x65, 0x7f, 0x45, 0x75,
+ 0x44, 0x0, 0x7e, 0x37, 0x68, 0x9b, 0x7a, 0x35, 0x45, 0x6c, 0xaa, 0x12, 0xab,
+ 0xf6, 0xe4, 0x19, 0xb3, 0x65, 0xe2, 0x12, 0xa7, 0x89, 0x7a, 0x35, 0x45,
+ 0x7e, 0x37, 0x68, 0x9b, 0xbe, 0x35, 0x45, 0x8, 0x3, 0x7a, 0x35, 0x45, 0x7e,
+ 0x73, 0x68, 0xa6, 0x7e, 0xb3, 0x68, 0xa7, 0xf5, 0x35, 0x74, 0x2, 0xac, 0xbe,
+ 0x9, 0x65, 0x65, 0x60, 0x7a, 0x61, 0x36, 0x9, 0xb5, 0x65, 0x61, 0xf5, 0x37,
+ 0x7c, 0xb6, 0x7c, 0x6c, 0x7e, 0x8, 0x0, 0x3a, 0x12, 0xa9, 0x4d, 0xf5, 0x38,
+ 0xe5, 0x37, 0x7e, 0x71, 0x35, 0x7c, 0x6d, 0x7e, 0x8, 0x0, 0x3b, 0x12, 0xa9,
+ 0x4d, 0xf5, 0x39, 0x85, 0x3a, 0x30, 0x85, 0x3b, 0x31, 0xe5, 0x35, 0x7e,
+ 0x71, 0x3a, 0xac, 0x7b, 0xe5, 0x3b, 0xa, 0x2b, 0x2d, 0x32, 0x7a, 0x35, 0x3c,
+ 0x75, 0x2e, 0x0, 0x61, 0x50, 0xe5, 0x36, 0xa, 0x2b, 0xe5, 0x30, 0xa, 0x3b,
+ 0x12, 0x37, 0x98, 0x8, 0xc, 0xe5, 0x36, 0xa, 0x2b, 0xe5, 0x30, 0xa, 0x5b,
+ 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5, 0x33, 0x75, 0x2f, 0x0,
+ 0x61, 0x2e, 0x7e, 0x35, 0x3c, 0x3e, 0x34, 0x49, 0x33, 0x4, 0x0, 0x7a, 0x35,
+ 0x3e, 0x7e, 0x53, 0x68, 0x86, 0xa, 0x25, 0x9d, 0x32, 0x7a, 0x35, 0x3e, 0xbe,
+ 0x34, 0x0, 0x0, 0x18, 0x2, 0x61, 0x22, 0x7e, 0x35, 0x45, 0xbe, 0x35, 0x3e,
+ 0x18, 0x2, 0x5, 0x44, 0x75, 0x32, 0x0, 0xe5, 0x37, 0xa, 0x2b, 0xe5, 0x31,
+ 0xa, 0x3b, 0x12, 0x37, 0x98, 0x8, 0xc, 0xe5, 0x37, 0xa, 0x2b, 0xe5, 0x31,
+ 0xa, 0x5b, 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5, 0x34, 0xe5,
+ 0x33, 0xbe, 0xb0, 0x1, 0x38, 0x7, 0xe5, 0x34, 0xbe, 0xb0, 0x1, 0x28, 0x37,
+ 0xbe, 0xc0, 0x3, 0x40, 0x9, 0xbe, 0xd0, 0x3, 0x40, 0x4, 0xd2, 0x0, 0x80,
+ 0x2, 0xc2, 0x0, 0xe5, 0x30, 0x7e, 0x71, 0x31, 0x7c, 0x6e, 0x12, 0xe2, 0xa0,
+ 0xf5, 0x32, 0xbe, 0xb0, 0x2, 0x68, 0x5, 0xe5, 0x32, 0xb4, 0x3, 0x7, 0x7e,
+ 0x35, 0x3e, 0xe, 0x34, 0x80, 0x7, 0xe5, 0x32, 0xb4, 0x1, 0x5, 0x6d, 0x33,
+ 0x7a, 0x35, 0x3e, 0x7e, 0x45, 0x3e, 0x7d, 0x34, 0x1a, 0x26, 0x1a, 0x24,
+ 0x2f, 0x61, 0x7e, 0xf5, 0x3c, 0x3e, 0xf4, 0x7d, 0x1f, 0x2e, 0x14, 0xe, 0x34,
+ 0x12, 0x4f, 0x69, 0x7a, 0x15, 0x40, 0x2e, 0xf4, 0x13, 0xd4, 0x7e, 0xe4, 0x0,
+ 0xff, 0xb, 0x7a, 0x0, 0x7a, 0x5, 0x42, 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x2a,
+ 0x20, 0x2f, 0x41, 0x7e, 0x15, 0x42, 0x1a, 0x2, 0x1a, 0x0, 0x7d, 0x34, 0x1a,
+ 0x26, 0x1a, 0x24, 0x12, 0x2a, 0x20, 0x2f, 0x51, 0x7e, 0x35, 0x3c, 0xb, 0x34,
+ 0x7a, 0x35, 0x3c, 0x5, 0x31, 0x5, 0x2f, 0xe5, 0x39, 0xbe, 0xb1, 0x2f, 0x28,
+ 0x2, 0x41, 0x4d, 0xe5, 0x39, 0xa, 0x3b, 0x7e, 0x25, 0x3c, 0x9d, 0x23, 0xe5,
+ 0x35, 0xa, 0x3b, 0x2d, 0x32, 0x7a, 0x35, 0x3c, 0x85, 0x3b, 0x31, 0x5, 0x30,
+ 0x5, 0x2e, 0xe5, 0x38, 0xbe, 0xb1, 0x2e, 0x28, 0x2, 0x41, 0x29, 0xbe, 0x68,
+ 0x0, 0x0, 0x78, 0x4, 0x7e, 0x68, 0x0, 0x1, 0x7f, 0x14, 0x7f, 0x6, 0x12,
+ 0x2a, 0x8d, 0x7d, 0xf3, 0x12, 0xaf, 0x9b, 0x7d, 0x23, 0xbe, 0xf4, 0x0, 0x0,
+ 0x58, 0x2, 0x6d, 0xff, 0xbe, 0x24, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x22, 0x7e,
+ 0x70, 0x9, 0xac, 0x7f, 0x59, 0xf3, 0x65, 0xdc, 0x59, 0x23, 0x65, 0xde, 0xe5,
+ 0x44, 0x19, 0xb3, 0x65, 0xe2, 0x9, 0x53, 0x65, 0xe2, 0xbe, 0x50, 0x2d, 0x28,
+ 0x6, 0x74, 0x2d, 0x19, 0xb3, 0x65, 0xe2, 0x7c, 0xbe, 0x12, 0xa5, 0xe3, 0x7d,
+ 0xf3, 0xbe, 0xf4, 0x0, 0x0, 0x18, 0x4, 0x7e, 0xf4, 0x0, 0x1, 0x7e, 0x73,
+ 0x68, 0x9a, 0xa, 0x17, 0x6d, 0x0, 0x7f, 0x16, 0x12, 0x2a, 0x8d, 0x12, 0xab,
+ 0xef, 0xbf, 0x10, 0x28, 0x6, 0x7d, 0x3f, 0x1a, 0x26, 0x1a, 0x24, 0x7e, 0x14,
+ 0x0, 0x7f, 0x12, 0x2a, 0x31, 0x12, 0xab, 0xef, 0x12, 0x2a, 0x3c, 0x7c, 0xa7,
+ 0x12, 0xab, 0xf6, 0xe5, 0x36, 0x19, 0xb3, 0x65, 0xe3, 0xe5, 0x37, 0x19,
+ 0xb3, 0x65, 0xe4, 0xda, 0x3b, 0x22, 0x7d, 0x1f, 0x1a, 0x2, 0x1a, 0x0, 0x22,
+ 0x7e, 0x70, 0x9, 0xac, 0x7f, 0x19, 0xa3, 0x65, 0xe1, 0x22, 0xca, 0xf8, 0x7e,
+ 0x45, 0x27, 0x7c, 0xb9, 0x7a, 0xb3, 0x55, 0x2f, 0x74, 0xff, 0x7a, 0xb3,
+ 0x55, 0x2e, 0x6d, 0x55, 0x80, 0x1f, 0x7d, 0xf5, 0x3e, 0xf4, 0x3e, 0xf4,
+ 0x7f, 0x60, 0x2d, 0xdf, 0xb, 0x6a, 0xf0, 0x7d, 0xe5, 0x3e, 0xe4, 0x59, 0xfe,
+ 0x2e, 0x77, 0x69, 0xf6, 0x0, 0x2, 0x59, 0xfe, 0x30, 0x57, 0xb, 0x54, 0xbd,
+ 0x45, 0x38, 0xdd, 0x7e, 0x33, 0x55, 0x2f, 0xbe, 0x30, 0x4, 0x38, 0x2, 0x81,
+ 0xc5, 0x69, 0xf1, 0x0, 0x1c, 0x69, 0x11, 0x0, 0x1e, 0xbd, 0x1f, 0x18, 0x19,
+ 0x4d, 0x11, 0x78, 0x4, 0x7e, 0x14, 0x0, 0x1, 0x7d, 0x3f, 0x7d, 0x21, 0x12,
+ 0x29, 0xee, 0x7c, 0xf7, 0x74, 0x40, 0x7a, 0xb3, 0x55, 0x32, 0x80, 0x40,
+ 0x4d, 0xff, 0x78, 0x4, 0x7e, 0xf4, 0x0, 0x1, 0x7d, 0x31, 0x7d, 0x2f, 0x12,
+ 0x29, 0xee, 0x7c, 0xf7, 0x74, 0x80, 0x7a, 0xb3, 0x55, 0x32, 0x7d, 0xf, 0x2d,
+ 0xf, 0xbd, 0x1, 0x8, 0x21, 0x1a, 0x2, 0x1a, 0x0, 0x7e, 0x73, 0x55, 0x32,
+ 0xa, 0x37, 0x6d, 0x22, 0x12, 0x2a, 0x20, 0x7d, 0x5f, 0x1a, 0x4a, 0x1a, 0x48,
+ 0x12, 0xab, 0xef, 0x2f, 0x2, 0x12, 0x2a, 0x3c, 0x7a, 0x73, 0x55, 0x32, 0xbe,
+ 0xf0, 0x5, 0x58, 0x14, 0x12, 0xac, 0xe4, 0x12, 0xeb, 0x69, 0x12, 0xac, 0xe4,
+ 0x12, 0xac, 0xed, 0x12, 0xac, 0xe4, 0x12, 0xec, 0x58, 0x80, 0xa, 0x74, 0x7d,
+ 0x80, 0x2, 0x74, 0x7f, 0x7a, 0xb3, 0x55, 0x2e, 0xe4, 0x7a, 0xb3, 0x55, 0x2f,
+ 0x7e, 0x73, 0x56, 0xa2, 0xbe, 0x73, 0x55, 0x2e, 0x48, 0x6, 0x7e, 0xb3, 0x55,
+ 0x30, 0x80, 0x1, 0xe4, 0xda, 0xf8, 0x22, 0x7e, 0x8, 0x2e, 0x77, 0x7e, 0x18,
+ 0x30, 0x57, 0x22, 0xca, 0x3b, 0x7f, 0x71, 0x7e, 0x60, 0x1, 0xb, 0xa, 0x20,
+ 0xb, 0x7a, 0x50, 0x7c, 0x4b, 0x7a, 0x53, 0x32, 0x37, 0x7a, 0x43, 0x33, 0x27,
+ 0x7e, 0x70, 0x1, 0x7e, 0xa0, 0x1, 0xc1, 0xe, 0x7e, 0x90, 0x2, 0xac, 0x9a,
+ 0x7f, 0x60, 0x2d, 0xd4, 0xb, 0x6a, 0xd0, 0x7d, 0x7d, 0x7c, 0xbf, 0xf5, 0x29,
+ 0x7f, 0x67, 0x2d, 0xd4, 0xb, 0x6a, 0x40, 0xa, 0xd5, 0xa, 0xbb, 0x7d, 0xab,
+ 0x9d, 0xad, 0x7d, 0x7a, 0x7c, 0x8f, 0xbe, 0x80, 0x0, 0x58, 0x5, 0x6e, 0x80,
+ 0xff, 0xb, 0x80, 0xa, 0xa4, 0xa, 0x79, 0x9d, 0x7a, 0xbe, 0xf0, 0x0, 0x58,
+ 0x5, 0x6e, 0xf0, 0xff, 0xb, 0xf0, 0xbe, 0x80, 0x2, 0x58, 0x7, 0xbe, 0xf0,
+ 0x2, 0x58, 0x2, 0xc1, 0xc, 0xbe, 0x60, 0x0, 0x18, 0x2, 0xa1, 0xf4, 0xbe,
+ 0x70, 0xec, 0x28, 0x2, 0xc1, 0x18, 0xbe, 0x80, 0x8, 0x58, 0x5, 0xbe, 0xf0,
+ 0x8, 0x48, 0x61, 0xa, 0xa7, 0xb, 0xa4, 0x7d, 0x6a, 0x7c, 0x7d, 0xa, 0xa5,
+ 0x2d, 0xab, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x32, 0x37, 0xa, 0xd9, 0xa, 0xa4,
+ 0x2d, 0xad, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x33, 0x27, 0x9, 0xba, 0x32, 0x37,
+ 0xa, 0xdb, 0xa, 0xc5, 0x2d, 0xcd, 0xe, 0xc4, 0x7d, 0x6c, 0x7c, 0xbd, 0xa,
+ 0xc7, 0x19, 0xbc, 0x32, 0x36, 0x9, 0xbc, 0x33, 0x27, 0xa, 0xcb, 0xa, 0xa4,
+ 0x2d, 0xac, 0x12, 0xae, 0x5c, 0x19, 0xba, 0x33, 0x26, 0x2d, 0xdb, 0x12,
+ 0xae, 0x53, 0x19, 0xbd, 0x32, 0x38, 0xa, 0xd9, 0x12, 0xae, 0x51, 0x19, 0xbd,
+ 0x33, 0x28, 0xb, 0xd5, 0x7d, 0x6d, 0x7c, 0x7d, 0x80, 0x24, 0xbe, 0x80, 0x4,
+ 0x58, 0x5, 0xbe, 0xf0, 0x4, 0x48, 0x1a, 0xe5, 0x29, 0xa, 0xcb, 0xa, 0xd5,
+ 0x12, 0xae, 0x51, 0x19, 0xbd, 0x32, 0x37, 0xa, 0xc9, 0xa, 0xd4, 0x12, 0xae,
+ 0x51, 0x19, 0xbd, 0x33, 0x27, 0xb, 0x70, 0xbe, 0x70, 0xf0, 0x50, 0x1f, 0x7e,
+ 0x51, 0x29, 0x7c, 0x49, 0xe5, 0x29, 0xa, 0xd7, 0x19, 0xbd, 0x32, 0x37, 0x19,
+ 0x9d, 0x33, 0x27, 0xb, 0x70, 0xb, 0xa0, 0x7e, 0xb3, 0x55, 0x2f, 0xbc, 0xba,
+ 0x28, 0x2, 0xa1, 0xc, 0x7a, 0x73, 0x55, 0x2f, 0x7e, 0xa0, 0x1, 0x80, 0x25,
+ 0xa, 0x3a, 0x9, 0xb3, 0x32, 0x37, 0xa, 0x2b, 0x7e, 0x70, 0x2, 0xac, 0x7a,
+ 0x7f, 0x60, 0x2d, 0xd3, 0x1b, 0x6a, 0x20, 0xa, 0x2a, 0x9, 0xb2, 0x33, 0x27,
+ 0xa, 0x4b, 0x2d, 0x3f, 0x7d, 0x2e, 0x1b, 0x1a, 0x40, 0xb, 0xa0, 0x7e, 0xb3,
+ 0x55, 0x2f, 0xbc, 0xba, 0x38, 0xd3, 0xda, 0x3b, 0x22, 0x2d, 0xdc, 0xe, 0xd4,
+ 0x7d, 0x6d, 0x7c, 0xbd, 0xa, 0xd7, 0x22, 0xe, 0xa4, 0x7d, 0x6a, 0x7c, 0xbd,
+ 0xa, 0xa7, 0x22, 0x12, 0xaf, 0xab, 0x58, 0x5, 0x12, 0xa8, 0x86, 0x80, 0x2,
+ 0x74, 0xff, 0x7a, 0xb3, 0x56, 0xb6, 0x22, 0x12, 0xaf, 0x13, 0x7a, 0x37,
+ 0x52, 0x65, 0x12, 0xae, 0x9e, 0x7a, 0x37, 0x52, 0x67, 0x12, 0xb6, 0xe, 0x60,
+ 0x1, 0x22, 0x7e, 0x73, 0x52, 0x71, 0xa, 0x37, 0x7a, 0x35, 0x27, 0x7e, 0x8,
+ 0x4e, 0x88, 0x7e, 0x18, 0x52, 0x49, 0x2, 0xac, 0x0, 0x7e, 0x37, 0x52, 0x5f,
+ 0x9e, 0x37, 0x52, 0x57, 0x22, 0x7e, 0x17, 0x52, 0x59, 0xbd, 0x13, 0x28, 0xa,
+ 0x7a, 0x37, 0x52, 0x59, 0x7a, 0x27, 0x52, 0x5b, 0x80, 0x10, 0x7e, 0x17,
+ 0x52, 0x51, 0xbd, 0x13, 0x50, 0x8, 0x7a, 0x37, 0x52, 0x51, 0x7a, 0x27, 0x52,
+ 0x53, 0x7e, 0x17, 0x52, 0x57, 0xbd, 0x12, 0x28, 0xa, 0x7a, 0x27, 0x52, 0x57,
+ 0x7a, 0x37, 0x52, 0x55, 0x80, 0x10, 0x7e, 0x17, 0x52, 0x5f, 0xbd, 0x12,
+ 0x50, 0x8, 0x7a, 0x27, 0x52, 0x5f, 0x7a, 0x37, 0x52, 0x5d, 0x7e, 0xb3, 0x52,
+ 0x71, 0xb4, 0xa, 0xf, 0x12, 0xaf, 0x13, 0x7a, 0x37, 0x52, 0x69, 0x12, 0xae,
+ 0x9e, 0x7a, 0x37, 0x52, 0x6b, 0x22, 0xb4, 0xf, 0xe, 0x12, 0xaf, 0x13, 0x7a,
+ 0x37, 0x52, 0x6d, 0x12, 0xae, 0x9e, 0x7a, 0x37, 0x52, 0x6f, 0x22, 0x7e,
+ 0x37, 0x52, 0x51, 0x9e, 0x37, 0x52, 0x59, 0x22, 0x7e, 0xb3, 0x68, 0x9d,
+ 0x70, 0x6, 0xe4, 0x7a, 0xb3, 0x68, 0x9e, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xff,
+ 0x74, 0x1, 0x12, 0xca, 0x44, 0x12, 0xc0, 0xc1, 0x74, 0x1, 0x12, 0x0, 0x19,
+ 0x12, 0xae, 0x65, 0xc2, 0x0, 0x12, 0xc7, 0xc9, 0x7e, 0xb3, 0x2e, 0x74, 0xb4,
+ 0x1, 0x3, 0x12, 0xaf, 0xa2, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x54, 0x3e, 0x70,
+ 0x8, 0x12, 0xaf, 0x8f, 0x12, 0xaf, 0x95, 0x80, 0x2f, 0x12, 0x7c, 0xc3, 0x12,
+ 0xaf, 0xb4, 0x50, 0xd, 0x12, 0xae, 0x76, 0x7c, 0xfb, 0x12, 0xe7, 0x37, 0x12,
+ 0xaf, 0x8f, 0x80, 0x5, 0x12, 0xe4, 0xc2, 0x7c, 0xfb, 0x4c, 0xff, 0x68, 0x11,
+ 0x7c, 0xbf, 0x12, 0xe6, 0x25, 0x60, 0xa, 0x7a, 0xf3, 0x54, 0x41, 0x74, 0x1,
+ 0x7a, 0xb3, 0x68, 0x7f, 0xda, 0xf8, 0x22, 0xe4, 0x7a, 0xb3, 0x52, 0x49,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x39, 0xf1, 0x22, 0x7f, 0x15, 0x7f, 0x6, 0x2, 0x2a,
+ 0x8d, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x66, 0xfe, 0x22, 0x7e, 0x37,
+ 0x66, 0xf0, 0xbe, 0x34, 0x2, 0x58, 0x22, 0x7e, 0xb3, 0x52, 0x49, 0xb4, 0x4,
+ 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a, 0xb3, 0x66, 0xff, 0x12, 0xc0, 0xc1,
+ 0xe4, 0x12, 0x0, 0x19, 0x7e, 0xb3, 0x2e, 0x74, 0xb4, 0x1, 0x3, 0x12, 0xaf,
+ 0xa2, 0x22, 0xca, 0x69, 0xca, 0xf8, 0x7e, 0x68, 0x68, 0x29, 0x6c, 0xaa,
+ 0x80, 0x1a, 0x12, 0x87, 0xe9, 0x19, 0x62, 0x67, 0x1f, 0x74, 0xff, 0xa, 0x4a,
+ 0x19, 0xb4, 0x2e, 0x8b, 0xe4, 0x19, 0xb4, 0x2e, 0x77, 0x19, 0xb4, 0x2e,
+ 0x81, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xdd, 0x7e,
+ 0x63, 0x68, 0x79, 0xa5, 0xbe, 0x0, 0x32, 0x7e, 0xb3, 0x56, 0x64, 0x70, 0x2,
+ 0x41, 0xab, 0x6c, 0xaa, 0x80, 0x1b, 0x7e, 0x24, 0x7f, 0xff, 0x7e, 0x30, 0x8,
+ 0xac, 0x3a, 0x7f, 0x76, 0x2d, 0xf1, 0x79, 0x27, 0x0, 0x2, 0x2d, 0x1d, 0x7d,
+ 0xc, 0x79, 0x20, 0x0, 0x4, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc,
+ 0xba, 0x38, 0xdc, 0x41, 0xab, 0x7e, 0xb3, 0x56, 0x64, 0x70, 0x33, 0xbe,
+ 0x60, 0x0, 0x28, 0x2e, 0x6c, 0xaa, 0x80, 0x20, 0x12, 0xb2, 0xfa, 0xac, 0x3a,
+ 0x12, 0xb3, 0x7, 0xac, 0x5a, 0x12, 0xb2, 0xd1, 0x74, 0x1, 0xa, 0x4a, 0x19,
+ 0xb4, 0x2e, 0x77, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x19, 0xa2, 0x67, 0x1f, 0xb,
+ 0xa0, 0x7e, 0x63, 0x68, 0x79, 0xbc, 0x6a, 0x38, 0xd8, 0x41, 0xab, 0x6c,
+ 0xaa, 0x80, 0x19, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0xb2, 0xc9, 0x59, 0x42,
+ 0x2d, 0x32, 0x59, 0x42, 0x2d, 0x34, 0x59, 0x42, 0x2d, 0x5a, 0x59, 0x42,
+ 0x2d, 0x5c, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xde,
+ 0x7e, 0x63, 0x56, 0x64, 0xbe, 0x63, 0x68, 0x79, 0x28, 0xa, 0xbe, 0x60, 0x2,
+ 0x40, 0x5, 0x7e, 0x70, 0x1, 0x80, 0x2, 0x6c, 0x77, 0x6c, 0xaa, 0x21, 0x71,
+ 0x6c, 0xff, 0x21, 0x68, 0x7e, 0x50, 0x8, 0xac, 0x5f, 0x7f, 0x56, 0x2d, 0xb2,
+ 0x69, 0x5, 0x0, 0x2, 0xbe, 0x4, 0x7f, 0xff, 0x78, 0x2, 0x21, 0x66, 0xa,
+ 0x1f, 0x9, 0xb1, 0x2e, 0x81, 0x60, 0x2, 0x21, 0x66, 0xa5, 0xbf, 0x1, 0x6a,
+ 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x42, 0x56, 0x79, 0xbe, 0x44, 0x7f, 0xff,
+ 0x68, 0x5b, 0x49, 0xe2, 0x56, 0x79, 0x69, 0xf5, 0x0, 0x2, 0x7d, 0x4f, 0x9d,
+ 0x4e, 0x2d, 0x4f, 0x49, 0xe2, 0x56, 0x65, 0x69, 0xf5, 0x0, 0x4, 0x7d, 0x2f,
+ 0x9d, 0x2e, 0x2d, 0x2f, 0xbe, 0x44, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x44, 0xbe,
+ 0x24, 0x0, 0x0, 0x58, 0x2, 0x6d, 0x22, 0x7e, 0x63, 0x68, 0xa8, 0x12, 0xb2,
+ 0xee, 0xbd, 0xf4, 0x18, 0x6, 0x7d, 0x46, 0x9e, 0x44, 0x0, 0x21, 0x7e, 0x63,
+ 0x68, 0xa9, 0x12, 0xb2, 0xee, 0xbd, 0xf2, 0x18, 0x6, 0x7d, 0x26, 0x9e, 0x24,
+ 0x0, 0x21, 0x12, 0xb2, 0xe4, 0x59, 0x4f, 0x2d, 0x32, 0x59, 0x2f, 0x2d, 0x34,
+ 0x80, 0xf, 0x12, 0xb2, 0xe4, 0x59, 0xf, 0x2d, 0x32, 0x69, 0x5, 0x0, 0x4,
+ 0x59, 0xf, 0x2d, 0x34, 0xa, 0xa, 0x19, 0xf0, 0x2e, 0x8b, 0x74, 0x1, 0x19,
+ 0xb1, 0x2e, 0x81, 0x80, 0x9, 0xb, 0xf0, 0x12, 0xb2, 0xc1, 0x28, 0x2, 0x1,
+ 0xbc, 0xb, 0xa0, 0x7e, 0x63, 0x56, 0x64, 0xbc, 0x6a, 0x28, 0x2, 0x1, 0xb8,
+ 0x6c, 0xaa, 0x80, 0x1a, 0x12, 0xb2, 0xda, 0x69, 0x30, 0x0, 0x2, 0x7e, 0x50,
+ 0x2, 0xac, 0x5a, 0x59, 0x32, 0x56, 0x79, 0x69, 0x30, 0x0, 0x4, 0x59, 0x32,
+ 0x56, 0x65, 0xb, 0xa0, 0x12, 0x87, 0x82, 0xbc, 0x7a, 0x38, 0xdf, 0x6c, 0xaa,
+ 0x80, 0x2b, 0xa, 0x2a, 0x9, 0xb2, 0x2e, 0x8b, 0xb4, 0xff, 0x20, 0x6c, 0xff,
+ 0x80, 0x18, 0xa, 0x4f, 0x9, 0xb4, 0x2e, 0x81, 0x70, 0xe, 0xa, 0x2a, 0x19,
+ 0xf2, 0x2e, 0x8b, 0x74, 0x1, 0x19, 0xb4, 0x2e, 0x81, 0x80, 0x6, 0xb, 0xf0,
+ 0xbc, 0x7f, 0x38, 0xe4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xd1, 0x6c, 0xaa, 0x80,
+ 0x1a, 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x49, 0x43, 0x67, 0x1b, 0x12, 0xb2, 0xc9,
+ 0x59, 0x42, 0x2d, 0x5a, 0x49, 0x33, 0x67, 0x1d, 0x59, 0x32, 0x2d, 0x5c, 0xb,
+ 0xa0, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xba, 0x38, 0xde, 0x7e, 0x34, 0x2d,
+ 0x32, 0x7a, 0x37, 0x2e, 0x97, 0x7e, 0x34, 0x2d, 0x5a, 0x7a, 0x37, 0x2e,
+ 0x99, 0x7e, 0x34, 0x2d, 0x82, 0x7a, 0x37, 0x2e, 0x9b, 0x7e, 0x73, 0x56,
+ 0x64, 0x7a, 0x73, 0x2e, 0x95, 0x7e, 0x73, 0x68, 0x79, 0x7a, 0x73, 0x2e,
+ 0x96, 0x7e, 0x8, 0x2e, 0x95, 0x12, 0x55, 0x4f, 0x6c, 0xaa, 0x80, 0x4a, 0x7e,
+ 0x70, 0xff, 0x6c, 0xff, 0x80, 0x19, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x12,
+ 0x2d, 0x82, 0xa, 0x2a, 0xbd, 0x21, 0x78, 0x8, 0xa, 0x3f, 0x9, 0x73, 0x2e,
+ 0x8b, 0x80, 0x7, 0xb, 0xf0, 0x12, 0xb2, 0xc1, 0x38, 0xe2, 0xbe, 0x70, 0xff,
+ 0x68, 0x1e, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x19, 0x72, 0x67, 0x1f, 0x74, 0x1,
+ 0xa, 0x47, 0x19, 0xb4, 0x2e, 0x77, 0x12, 0xb2, 0xfa, 0xac, 0x37, 0x12, 0xb3,
+ 0x7, 0xac, 0x57, 0x12, 0xb2, 0xd1, 0xb, 0xa0, 0x7e, 0x63, 0x68, 0x79, 0xbc,
+ 0x6a, 0x38, 0xae, 0x6c, 0xaa, 0x80, 0x20, 0xa, 0x3a, 0x9, 0xb3, 0x2e, 0x77,
+ 0xbe, 0xb0, 0x1, 0x68, 0x13, 0x7e, 0x44, 0x7f, 0xff, 0x12, 0xb2, 0xda, 0x79,
+ 0x40, 0x0, 0x2, 0x2d, 0x3d, 0x7d, 0x2c, 0x79, 0x41, 0x0, 0x4, 0xb, 0xa0,
+ 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xba, 0x38, 0xd7, 0x7e, 0x73, 0x68, 0x79,
+ 0x7a, 0x73, 0x56, 0x64, 0x7f, 0x6, 0x7e, 0x18, 0x2e, 0x77, 0x12, 0xb3, 0x17,
+ 0xda, 0xf8, 0xda, 0x69, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xbf, 0x22,
+ 0x7e, 0x50, 0x2, 0xac, 0x5a, 0x3e, 0x24, 0x22, 0x7f, 0x6, 0x2d, 0x12, 0x79,
+ 0x40, 0x0, 0x4, 0x22, 0x7e, 0x70, 0x8, 0xac, 0x7a, 0x7f, 0x6, 0x2d, 0x13,
+ 0x22, 0x7e, 0xd0, 0x2, 0xac, 0xda, 0x7d, 0xf6, 0x3e, 0xf4, 0x22, 0x7e, 0xd0,
+ 0x40, 0xac, 0xd6, 0x7d, 0xf6, 0x9e, 0xf4, 0x0, 0x20, 0x22, 0x7e, 0x90, 0x9,
+ 0xac, 0x9a, 0x49, 0x24, 0x67, 0x1b, 0x7e, 0x30, 0x8, 0x22, 0x2d, 0x1d, 0x7d,
+ 0xc, 0x79, 0x20, 0x0, 0x2, 0x49, 0x44, 0x67, 0x1d, 0x7e, 0x50, 0x8, 0x22,
+ 0xca, 0x79, 0x7e, 0xa3, 0x68, 0x79, 0x6c, 0x99, 0x80, 0x6f, 0xa, 0xf9, 0x2d,
+ 0xf3, 0x7d, 0xe2, 0x7e, 0x7b, 0xb0, 0xb4, 0x1, 0x30, 0x12, 0xb3, 0x98, 0x29,
+ 0xb7, 0x0, 0x1, 0xb4, 0x1, 0x6, 0x74, 0x3, 0x39, 0xb7, 0x0, 0x1, 0x12, 0xb3,
+ 0x98, 0x29, 0x87, 0x0, 0x1, 0xbe, 0x80, 0x3, 0x78, 0x3, 0xe4, 0x80, 0x35,
+ 0x4c, 0x88, 0x78, 0x4, 0x74, 0x2, 0x80, 0x2d, 0xbe, 0x80, 0x2, 0x78, 0x2b,
+ 0x74, 0x2, 0x80, 0x24, 0x12, 0xb3, 0x98, 0x29, 0xb7, 0x0, 0x1, 0xbe, 0xb0,
+ 0x2, 0x68, 0x2, 0x70, 0x14, 0x74, 0x1, 0x7a, 0x7b, 0xb0, 0x7c, 0x8a, 0xb,
+ 0xa0, 0x7e, 0xf0, 0x9, 0xac, 0xf8, 0x19, 0x97, 0x67, 0x1f, 0x80, 0x5, 0x74,
+ 0x3, 0x7a, 0x7b, 0xb0, 0x12, 0xb3, 0x98, 0x7e, 0x7b, 0xb0, 0x39, 0xb7, 0x0,
+ 0x1, 0xb, 0x90, 0x12, 0x85, 0xb, 0x38, 0x8c, 0xda, 0x79, 0x22, 0x7e, 0xf0,
+ 0x8, 0xac, 0xf9, 0x7f, 0x70, 0x2d, 0xf7, 0x22, 0xca, 0xf8, 0x7e, 0xb3, 0x68,
+ 0x79, 0x70, 0x17, 0xe4, 0x7a, 0xb3, 0x68, 0x82, 0x12, 0x9f, 0x9c, 0x28,
+ 0x1f, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x7e, 0xe4, 0x7a, 0xb3, 0x68, 0x81, 0x80,
+ 0x12, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x82, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x6,
+ 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x7d, 0x12, 0x8f, 0xff, 0xca, 0x59, 0x7e, 0x18,
+ 0x67, 0x1b, 0x7e, 0x8, 0x67, 0x75, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x90, 0x1,
+ 0x74, 0xe4, 0x93, 0xbe, 0xb0, 0x0, 0x28, 0x2d, 0x6c, 0xff, 0x80, 0x24, 0x74,
+ 0x9, 0xac, 0xbf, 0x49, 0x35, 0x67, 0x1b, 0x12, 0xb5, 0x24, 0x74, 0x9, 0xac,
+ 0xbf, 0x59, 0x35, 0x67, 0x75, 0x49, 0x35, 0x67, 0x1d, 0x12, 0xb4, 0x1f,
+ 0x74, 0x9, 0xac, 0xbf, 0x59, 0x35, 0x67, 0x77, 0xb, 0xf0, 0x12, 0xb2, 0xc1,
+ 0x38, 0xd7, 0xda, 0xf8, 0x22, 0xca, 0x79, 0x7d, 0x13, 0x9f, 0x11, 0x7e,
+ 0xf4, 0xd, 0xad, 0x7e, 0xe4, 0x0, 0xff, 0xb, 0x7a, 0xe0, 0x7d, 0xe, 0x7e,
+ 0xd4, 0xd, 0xab, 0x7e, 0xc4, 0x0, 0xff, 0xb, 0x6a, 0xd0, 0x7d, 0xfd, 0x90,
+ 0x1, 0x74, 0xe4, 0x93, 0x70, 0x4, 0x7d, 0x31, 0xa1, 0xf, 0x90, 0xd, 0x98,
+ 0xe4, 0x93, 0xb4, 0x1, 0x9, 0x7e, 0x54, 0xd, 0x9d, 0x12, 0xb7, 0x89, 0x80,
+ 0x2, 0x7d, 0x4d, 0x90, 0xd, 0xaf, 0xe4, 0x93, 0x7c, 0xfb, 0xa, 0x5f, 0xbd,
+ 0x51, 0x28, 0x1d, 0x7d, 0x25, 0x9d, 0x21, 0x7e, 0x14, 0xd, 0xb1, 0x12, 0xb5,
+ 0x12, 0xa, 0x1f, 0x6d, 0x0, 0xbf, 0x10, 0x48, 0x4, 0x7f, 0x10, 0x1b, 0x1c,
+ 0x9f, 0x1, 0x7f, 0x10, 0xa1, 0xf, 0x90, 0xd, 0xb0, 0xe4, 0x93, 0x7c, 0xeb,
+ 0xa, 0x5e, 0x7d, 0xd4, 0x9d, 0xd5, 0xbd, 0xd1, 0x50, 0x25, 0xbd, 0x41, 0x40,
+ 0x73, 0x7d, 0x21, 0x9d, 0x2d, 0x7e, 0x14, 0xd, 0xb3, 0x12, 0xb5, 0x12, 0xa,
+ 0x1e, 0x6d, 0x0, 0xbf, 0x10, 0x48, 0x4, 0x7f, 0x10, 0x1b, 0x1c, 0x7d, 0x1f,
+ 0x9d, 0x15, 0x6d, 0x0, 0x2f, 0x10, 0x80, 0x52, 0xbd, 0x1, 0x28, 0x1d, 0x7d,
+ 0x30, 0x9d, 0x31, 0x6d, 0x22, 0x7e, 0x14, 0xd, 0xb5, 0x12, 0x4f, 0x69, 0x12,
+ 0x2a, 0x31, 0x12, 0xb5, 0x1d, 0x7d, 0x1e, 0x6d, 0x0, 0x9f, 0x1, 0x7f, 0x10,
+ 0x80, 0x19, 0x7d, 0x31, 0x9d, 0x30, 0x6d, 0x22, 0x7e, 0x14, 0xd, 0xb7, 0x12,
+ 0x4f, 0x69, 0x12, 0x2a, 0x31, 0x12, 0xb5, 0x1d, 0x7d, 0x1e, 0x6d, 0x0, 0x2f,
+ 0x10, 0xa, 0x1f, 0x6d, 0x0, 0xbf, 0x10, 0x58, 0x4, 0x7f, 0x10, 0x80, 0xc,
+ 0x7d, 0x1f, 0x9d, 0x15, 0x6d, 0x0, 0xbf, 0x10, 0x8, 0x2, 0x7f, 0x10, 0xda,
+ 0x79, 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xad, 0x32, 0x6d, 0x22,
+ 0x7c, 0x76, 0x7c, 0x65, 0x1a, 0x24, 0x22, 0xca, 0xf8, 0x7e, 0x14, 0xd, 0x9f,
+ 0x12, 0xb7, 0x9d, 0x7d, 0x2c, 0x7e, 0x14, 0xd, 0x9d, 0x7e, 0x4, 0x0, 0xff,
+ 0xb, 0xa, 0xd0, 0x90, 0x1, 0x74, 0xe4, 0x93, 0x70, 0x2, 0xc1, 0x3, 0x90,
+ 0xd, 0x98, 0xe4, 0x93, 0xb4, 0x1, 0xb, 0x7e, 0x54, 0xd, 0xab, 0x12, 0xb7,
+ 0x89, 0x1b, 0x44, 0x80, 0x5, 0xb, 0xa, 0x40, 0x1b, 0x44, 0x90, 0xd, 0xa1,
+ 0xe4, 0x93, 0x7c, 0xfb, 0xa, 0x5f, 0xbd, 0x53, 0x28, 0x20, 0x7d, 0xe5, 0x9d,
+ 0xe3, 0x7e, 0x34, 0xd, 0xa3, 0x12, 0xb6, 0x6, 0x12, 0xb7, 0x61, 0xa, 0x3f,
+ 0xbf, 0x71, 0x40, 0x4, 0x7f, 0x71, 0x1b, 0x7c, 0x1b, 0x1c, 0x9f, 0x17, 0x7f,
+ 0x71, 0x80, 0x79, 0x90, 0xd, 0xa2, 0xe4, 0x93, 0x7c, 0x3b, 0xa, 0x53, 0x7d,
+ 0x4, 0x9d, 0x5, 0xbd, 0x3, 0x50, 0x22, 0x7d, 0xe3, 0x9d, 0xe0, 0x7e, 0x34,
+ 0xd, 0xa5, 0x12, 0xb6, 0x6, 0x12, 0xb7, 0x61, 0xa, 0x33, 0xbf, 0x71, 0x40,
+ 0x4, 0x7f, 0x71, 0x1b, 0x7c, 0x7d, 0x3d, 0x9d, 0x35, 0x6d, 0x22, 0x2f, 0x71,
+ 0x80, 0x46, 0xbd, 0x23, 0x28, 0x19, 0x7d, 0xf2, 0x1b, 0xf4, 0x9d, 0xf3,
+ 0x6d, 0xee, 0x7e, 0x34, 0xd, 0xa7, 0x12, 0xb7, 0x70, 0x1b, 0x34, 0x6d, 0x22,
+ 0x9f, 0x17, 0x7f, 0x71, 0x80, 0x11, 0x7d, 0xf3, 0x9d, 0xf2, 0x6d, 0xee,
+ 0x7e, 0x34, 0xd, 0xa9, 0x12, 0xb7, 0x70, 0x6d, 0x22, 0x2f, 0x71, 0xa, 0x3f,
+ 0x6d, 0x22, 0xbf, 0x71, 0x50, 0x4, 0x7f, 0x71, 0x80, 0xc, 0x7d, 0x3d, 0x9d,
+ 0x35, 0x6d, 0x22, 0xbf, 0x71, 0x28, 0x2, 0x7f, 0x71, 0x7d, 0x3f, 0xda, 0xf8,
+ 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xf0, 0x22, 0xca, 0xf8, 0x6c, 0xff,
+ 0x7e, 0xb7, 0x52, 0x65, 0x7e, 0xc7, 0x52, 0x67, 0x7e, 0x97, 0x52, 0x4d,
+ 0x7e, 0xd7, 0x52, 0x4f, 0x7e, 0xa7, 0x52, 0x61, 0x7e, 0xe7, 0x52, 0x63,
+ 0xe4, 0x7e, 0x73, 0x52, 0x71, 0x1b, 0x70, 0x7d, 0x2b, 0x7d, 0x1c, 0x12,
+ 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x73, 0x52, 0x71, 0xbe, 0x70, 0xa,
+ 0x28, 0x13, 0xe4, 0x7e, 0x70, 0x9, 0x7e, 0x27, 0x52, 0x69, 0x7e, 0x17, 0x52,
+ 0x6b, 0x12, 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x73, 0x52, 0x71, 0xbe,
+ 0x70, 0xf, 0x28, 0x13, 0xe4, 0x7e, 0x70, 0xe, 0x7e, 0x27, 0x52, 0x6d, 0x7e,
+ 0x17, 0x52, 0x6f, 0x12, 0xed, 0x14, 0x40, 0x2, 0xe1, 0x5c, 0x7e, 0x34, 0xe,
+ 0x14, 0x12, 0xb6, 0x6, 0xbd, 0xfc, 0x28, 0x50, 0x7e, 0x34, 0xe, 0x12, 0x12,
+ 0xb6, 0x6, 0xbd, 0xfb, 0x50, 0x45, 0x7e, 0x34, 0xe, 0x18, 0x12, 0x32, 0xdf,
+ 0x12, 0xb7, 0x91, 0x7d, 0x8f, 0x9d, 0x83, 0xbe, 0x87, 0x52, 0x4b, 0x50,
+ 0x31, 0x7e, 0x34, 0xe, 0x16, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x80, 0x9d,
+ 0xf8, 0xbe, 0xf7, 0x52, 0x4b, 0x28, 0x1e, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x3c,
+ 0x7d, 0xfb, 0x3e, 0xf4, 0xbd, 0xf3, 0x38, 0x2, 0xe1, 0x5c, 0xbd, 0xa9, 0x50,
+ 0x5, 0x7e, 0xf0, 0x20, 0xe1, 0x5c, 0x7e, 0xf0, 0x21, 0xe1, 0x5c, 0x7e, 0x34,
+ 0xe, 0x1c, 0x12, 0xb6, 0x6, 0xbd, 0xfb, 0x38, 0x2, 0xe1, 0x5c, 0x7e, 0x34,
+ 0xe, 0x1a, 0x12, 0xb6, 0x6, 0xbd, 0xfc, 0x50, 0x75, 0x7e, 0xb3, 0x52, 0x4a,
+ 0x70, 0x6f, 0x7e, 0x34, 0xe, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xb7, 0x91, 0x7d,
+ 0xaf, 0x9d, 0xa3, 0xbe, 0xa7, 0x52, 0x4b, 0x50, 0x5b, 0x7e, 0x34, 0xe, 0x1e,
+ 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0xa0, 0x9d, 0xfa, 0xbe, 0xf7, 0x52, 0x4b,
+ 0x28, 0x48, 0x7d, 0xfb, 0x3e, 0xf4, 0x7e, 0x34, 0x0, 0x3, 0xad, 0x3c, 0xbd,
+ 0x3f, 0x28, 0x3a, 0xbd, 0xed, 0x50, 0x5, 0x7e, 0xf0, 0x22, 0x80, 0x31, 0x7e,
+ 0xa3, 0x52, 0x71, 0x7e, 0x10, 0x4, 0xac, 0x1a, 0x49, 0x30, 0x4e, 0x84, 0x49,
+ 0x10, 0x4e, 0x86, 0x49, 0x20, 0x4e, 0x74, 0x49, 0x0, 0x4e, 0x76, 0x9d, 0x10,
+ 0xbe, 0x14, 0x0, 0x20, 0x18, 0xd, 0x9d, 0x32, 0xbe, 0x34, 0x0, 0x10, 0x48,
+ 0x5, 0xbe, 0xa0, 0x6, 0x50, 0x3, 0x7e, 0xf0, 0x23, 0x7c, 0xbf, 0xda, 0xf8,
+ 0x22, 0xad, 0xfe, 0x6d, 0xee, 0x7d, 0x3f, 0x7d, 0x2e, 0x7c, 0x76, 0x7c,
+ 0x65, 0x7f, 0x71, 0x22, 0x7e, 0x24, 0x0, 0xff, 0xb, 0x1a, 0x10, 0x7f, 0x17,
+ 0x12, 0x2a, 0x31, 0x7f, 0x71, 0x7c, 0x76, 0x7c, 0x65, 0xa, 0x24, 0x7f, 0x71,
+ 0x7d, 0x3c, 0x22, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x40, 0x22, 0x7e, 0x14,
+ 0xe, 0x30, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0xf0, 0x22, 0x7e, 0x4, 0x0, 0xff,
+ 0xb, 0xa, 0xc0, 0x22, 0xca, 0xf8, 0x6c, 0xaa, 0x80, 0x40, 0x7e, 0xf0, 0x3,
+ 0x7e, 0x90, 0x8, 0xac, 0x9a, 0x7f, 0x10, 0x2d, 0x34, 0x7a, 0x1b, 0xf0, 0x74,
+ 0x3, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x1, 0x7e, 0x34, 0x7f, 0xff,
+ 0x7f, 0x70, 0x2d, 0xf4, 0x79, 0x37, 0x0, 0x2, 0x7f, 0x70, 0x2d, 0xf4, 0x79,
+ 0x37, 0x0, 0x4, 0xe4, 0x7f, 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x6, 0x7f,
+ 0x10, 0x2d, 0x34, 0x39, 0xb1, 0x0, 0x7, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4,
+ 0x93, 0xbc, 0xba, 0x38, 0xb7, 0xda, 0xf8, 0x22, 0x7e, 0xb3, 0x54, 0x13,
+ 0xbe, 0xb0, 0x1, 0x68, 0x28, 0x12, 0xb8, 0x29, 0x38, 0x23, 0xbe, 0xa3, 0x68,
+ 0x79, 0x50, 0x18, 0x7e, 0xb3, 0x68, 0x83, 0xbe, 0xb3, 0x1, 0xa4, 0x28, 0x13,
+ 0x7e, 0xb3, 0x1, 0xa4, 0x4, 0x7a, 0xb3, 0x1, 0xa4, 0x7a, 0xa3, 0x68, 0x79,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x1, 0xa4, 0x22, 0x7e, 0xa3, 0x68, 0x7a, 0xbe, 0xa0,
+ 0x0, 0x22, 0x7e, 0xb3, 0x68, 0x79, 0x70, 0x22, 0x12, 0xb8, 0x29, 0x28, 0x1d,
+ 0x7e, 0xb3, 0x1, 0xa3, 0x70, 0x11, 0x7a, 0xa3, 0x68, 0x79, 0x74, 0x1, 0x7a,
+ 0xb3, 0x68, 0x80, 0x7e, 0xb3, 0x1, 0xa3, 0x4, 0x80, 0x1, 0xe4, 0x7a, 0xb3,
+ 0x1, 0xa3, 0x22, 0xe4, 0x7a, 0xb3, 0x1, 0xa3, 0x7a, 0xb3, 0x68, 0x80, 0x22,
+ 0x2, 0xb8, 0x66, 0xca, 0x3b, 0x7c, 0xc4, 0x7c, 0xd5, 0x7c, 0xeb, 0x7d, 0xf3,
+ 0x7e, 0x17, 0x68, 0x97, 0xbd, 0x13, 0x38, 0x6, 0x7e, 0xd4, 0x1, 0x0, 0x80,
+ 0x17, 0x6d, 0x22, 0x7c, 0x56, 0x7c, 0x67, 0x6c, 0x77, 0x12, 0x2a, 0x3a,
+ 0x7d, 0xd3, 0xbe, 0xd4, 0x0, 0x10, 0x50, 0x4, 0x7e, 0xd4, 0x0, 0x10, 0x74,
+ 0x2, 0xac, 0xbc, 0x49, 0x45, 0x1, 0x8f, 0xbd, 0x4f, 0x28, 0x6, 0x49, 0xd5,
+ 0x1, 0x6f, 0x80, 0x4, 0x59, 0xd5, 0x1, 0x6f, 0x59, 0xf5, 0x1, 0x8f, 0xa,
+ 0xcc, 0x9, 0xac, 0x1, 0x83, 0x4c, 0xaa, 0x68, 0x3c, 0xbe, 0xa0, 0xff, 0x78,
+ 0xa, 0x7e, 0xf0, 0xff, 0xe4, 0x19, 0xbc, 0x1, 0x83, 0x80, 0x25, 0xa, 0x2a,
+ 0x7e, 0x34, 0x0, 0x8, 0x9d, 0x32, 0x7c, 0xb7, 0x7e, 0x34, 0x0, 0x2, 0x60,
+ 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x2e, 0x34, 0x0, 0x23, 0x7c, 0xf7, 0x2e,
+ 0xc4, 0x1, 0x83, 0x7c, 0xba, 0x14, 0x7a, 0xc9, 0xb0, 0xa, 0xcf, 0xbd, 0xcd,
+ 0x50, 0x2, 0x7d, 0xdc, 0xbe, 0xd4, 0x1, 0x0, 0x28, 0x4, 0x7e, 0xd4, 0x1,
+ 0x0, 0x7e, 0x73, 0x68, 0x79, 0xbe, 0x70, 0x5, 0x28, 0x4, 0x1e, 0xd4, 0x1e,
+ 0xd4, 0xbe, 0xd4, 0x0, 0x20, 0x50, 0x11, 0x7e, 0x70, 0x9, 0xac, 0x7c, 0x9,
+ 0xb3, 0x1, 0x12, 0xb4, 0x1, 0x5, 0xe4, 0x19, 0xb3, 0x1, 0x12, 0xbe, 0xd4,
+ 0x0, 0x40, 0x28, 0xc, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x9, 0xac, 0x7c, 0x19,
+ 0xa3, 0x1, 0x12, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0xbb, 0x9f, 0x7d, 0xe3, 0x7e,
+ 0x90, 0x9, 0xac, 0x9e, 0x49, 0xc4, 0x67, 0xcf, 0x74, 0x9, 0xac, 0xbd, 0x49,
+ 0x35, 0x67, 0x1b, 0x7d, 0x23, 0x9d, 0x2c, 0xbe, 0x24, 0x0, 0x0, 0x8, 0x6,
+ 0x7d, 0xf3, 0x9d, 0xfc, 0x80, 0x4, 0x6d, 0xff, 0x9d, 0xf2, 0x12, 0xb9, 0xd5,
+ 0xbd, 0x3c, 0x7e, 0x70, 0x9, 0x28, 0xd, 0xac, 0x7e, 0x2e, 0x34, 0x67, 0xcf,
+ 0x2d, 0xfc, 0x1b, 0x38, 0xf0, 0x80, 0xb, 0xac, 0x7e, 0x2e, 0x34, 0x67, 0xcf,
+ 0x9d, 0xcf, 0x1b, 0x38, 0xc0, 0x7e, 0x90, 0x9, 0xac, 0x9e, 0x49, 0x34, 0x67,
+ 0xd1, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x25, 0x67, 0x1d, 0x7d, 0xc2, 0x9d, 0xc3,
+ 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0xf2, 0x9d, 0xf3, 0x80, 0x4, 0x6d,
+ 0xff, 0x9d, 0xfc, 0x12, 0xb9, 0xd5, 0xbd, 0x23, 0x28, 0x13, 0x74, 0x9, 0xac,
+ 0xbe, 0x7d, 0xe5, 0x2e, 0xe4, 0x67, 0xd1, 0x7d, 0x23, 0x2d, 0x2f, 0x1b,
+ 0xe8, 0x20, 0x80, 0xe, 0x7e, 0x50, 0x9, 0xac, 0x5e, 0x2e, 0x24, 0x67, 0xd1,
+ 0x9d, 0x3f, 0x1b, 0x28, 0x30, 0xda, 0x3b, 0x22, 0x7d, 0x1d, 0xad, 0x1f,
+ 0x7c, 0x32, 0x7c, 0x21, 0xa, 0x0, 0x7d, 0xf1, 0x5d, 0xfe, 0x22, 0xca, 0x3b,
+ 0x7c, 0xfb, 0x6c, 0xee, 0x41, 0x7e, 0x6c, 0xdd, 0x80, 0x16, 0x74, 0x9, 0xac,
+ 0xbd, 0x9, 0x65, 0x67, 0xd3, 0x74, 0x9, 0xac, 0xbe, 0x9, 0x75, 0x67, 0x1f,
+ 0xbc, 0x67, 0x68, 0x7, 0xb, 0xd0, 0x12, 0xba, 0x87, 0x38, 0xe5, 0x12, 0xba,
+ 0x87, 0x28, 0x74, 0x7e, 0x50, 0x9, 0xac, 0x5d, 0x9, 0xc2, 0x67, 0xd3, 0x49,
+ 0x42, 0x67, 0xd1, 0x74, 0x9, 0xac, 0xbe, 0x49, 0xa5, 0x67, 0x1d, 0x7d, 0x3a,
+ 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xa4, 0x80, 0x4, 0x6d,
+ 0xaa, 0x9d, 0xa3, 0x49, 0x42, 0x67, 0xcf, 0x49, 0xb5, 0x67, 0x1b, 0x7d,
+ 0x3b, 0x9d, 0x34, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xb4, 0x80, 0x4,
+ 0x6d, 0xbb, 0x9d, 0xb3, 0x2d, 0xba, 0x74, 0x8, 0xac, 0xbc, 0x9, 0xb5, 0x68,
+ 0x29, 0xb4, 0x1, 0xe, 0x6d, 0xaa, 0x74, 0x2, 0xac, 0xbc, 0x59, 0xa5, 0x1,
+ 0x6f, 0x59, 0xa5, 0x1, 0x8f, 0x7d, 0x3b, 0x7c, 0xbd, 0x7c, 0x5e, 0x7c, 0x4c,
+ 0x12, 0xba, 0x8f, 0x7c, 0xbd, 0x12, 0xb8, 0x63, 0xb, 0xe0, 0xbc, 0xfe, 0x28,
+ 0x2, 0x21, 0xec, 0xda, 0x3b, 0x22, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xbc, 0xbd,
+ 0x22, 0xca, 0x3b, 0x7c, 0xab, 0x7d, 0x3, 0x7e, 0x20, 0x10, 0x7d, 0x30, 0x7e,
+ 0x90, 0x9, 0xac, 0x95, 0x9, 0x34, 0x67, 0x21, 0xbe, 0x30, 0x10, 0x28, 0x2,
+ 0x7c, 0x23, 0xbe, 0x20, 0x20, 0x28, 0x3, 0x7e, 0x20, 0x20, 0x49, 0xe4, 0x67,
+ 0x1b, 0xbe, 0xe4, 0x6, 0x50, 0x40, 0x20, 0x7e, 0x33, 0x68, 0xa8, 0x12, 0xbb,
+ 0x8b, 0xbd, 0xef, 0x38, 0x15, 0x49, 0xe4, 0x67, 0x1d, 0xbe, 0xe4, 0x6, 0x50,
+ 0x40, 0xb, 0x7e, 0x33, 0x68, 0xa9, 0x12, 0xbb, 0x8b, 0xbd, 0xef, 0x28, 0x3,
+ 0x7e, 0x20, 0x8, 0x7e, 0xf0, 0x10, 0xac, 0xf2, 0xbd, 0x70, 0x40, 0x5d, 0x7e,
+ 0xf0, 0x9, 0xac, 0xf4, 0x9, 0xb7, 0x1, 0x12, 0x70, 0x52, 0x7e, 0xd0, 0x8,
+ 0xac, 0xd2, 0xbd, 0x60, 0x50, 0x3c, 0x9, 0xb7, 0x1, 0xb, 0x70, 0x1f, 0x9,
+ 0xb7, 0x1, 0xc, 0xbe, 0xb0, 0x0, 0x28, 0xc, 0x7d, 0x37, 0x2e, 0x34, 0x1,
+ 0xc, 0x14, 0x7a, 0x39, 0xb0, 0x80, 0x6, 0x74, 0x1, 0x19, 0xb7, 0x1, 0xb,
+ 0x6d, 0x33, 0x80, 0x34, 0x9, 0xb7, 0x1, 0xc, 0xbe, 0xb0, 0x14, 0x50, 0x2b,
+ 0x7d, 0x37, 0x2e, 0x34, 0x1, 0xc, 0x4, 0x7a, 0x39, 0xb0, 0x6d, 0x33, 0x80,
+ 0x1d, 0xe4, 0x19, 0xb7, 0x1, 0xc, 0x19, 0xb7, 0x1, 0xb, 0x6d, 0x33, 0x80,
+ 0x10, 0x6c, 0x33, 0x7e, 0xf0, 0x9, 0xac, 0xf4, 0x19, 0x37, 0x1, 0xc, 0xe4,
+ 0x19, 0xb7, 0x1, 0xb, 0x7e, 0x30, 0x8, 0xac, 0x23, 0xbd, 0x10, 0x40, 0x2a,
+ 0x7e, 0x70, 0x9, 0xac, 0x7a, 0x49, 0x33, 0x67, 0xcf, 0x59, 0x34, 0x67, 0x1b,
+ 0x74, 0x9, 0xa4, 0x49, 0x35, 0x67, 0xd1, 0x74, 0x9, 0xac, 0xb5, 0x59, 0x35,
+ 0x67, 0x1d, 0x7e, 0xa0, 0x1, 0x7e, 0x70, 0x9, 0xac, 0x74, 0x19, 0xa3, 0x1,
+ 0xa, 0x6d, 0x33, 0xda, 0x3b, 0x22, 0x7e, 0xf0, 0x40, 0xac, 0xf3, 0x7d, 0xf7,
+ 0x9e, 0xf4, 0x0, 0x65, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x3e, 0xf4, 0x22,
+ 0xca, 0x3b, 0x7c, 0x37, 0x7c, 0xab, 0x7e, 0x24, 0xff, 0xfc, 0x7d, 0x32,
+ 0x7e, 0x23, 0x68, 0x79, 0x7e, 0xf0, 0x9, 0xac, 0xf3, 0x9, 0xb7, 0x1, 0xd,
+ 0xb4, 0x1, 0x63, 0xa5, 0xba, 0x1, 0xc, 0xbe, 0x34, 0xff, 0x0, 0x28, 0x10,
+ 0x7e, 0x34, 0xff, 0x0, 0x80, 0xa, 0xbe, 0x34, 0xff, 0xe0, 0x28, 0x4, 0x7e,
+ 0x34, 0xff, 0xe0, 0x49, 0x7, 0x1, 0xe, 0x7e, 0xd0, 0x9, 0xac, 0xda, 0x49,
+ 0xf6, 0x67, 0x1b, 0x7d, 0x40, 0x12, 0xa4, 0xee, 0x8, 0x4, 0x9d, 0xf, 0x80,
+ 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x4, 0x1, 0x0, 0x28, 0x5, 0xe4, 0x19, 0xb7,
+ 0x1, 0xd, 0x49, 0x7, 0x1, 0x10, 0x49, 0xf6, 0x67, 0x1d, 0x7d, 0x40, 0x12,
+ 0xa4, 0xee, 0x8, 0x4, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x4,
+ 0x1, 0x0, 0x28, 0x5, 0xe4, 0x19, 0xb7, 0x1, 0xd, 0x49, 0xe7, 0x1, 0xe, 0x7e,
+ 0xd0, 0x9, 0xac, 0xda, 0x49, 0x46, 0x67, 0x1b, 0x7d, 0xf4, 0x9d, 0xfe, 0xbe,
+ 0xf4, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x4, 0x9d, 0xe, 0x80, 0x4, 0x6d, 0x0, 0x9d,
+ 0xf, 0xbe, 0x4, 0x4, 0x0, 0x38, 0x29, 0x74, 0x9, 0xac, 0x3b, 0x49, 0xf1,
+ 0x1, 0x10, 0x7e, 0x30, 0x9, 0xac, 0x3a, 0x49, 0x11, 0x67, 0x1d, 0x7d, 0x1,
+ 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d, 0x11,
+ 0x9d, 0x10, 0xbe, 0x14, 0x4, 0x0, 0x28, 0x2, 0x7d, 0x32, 0xbe, 0x44, 0x6,
+ 0x50, 0x40, 0x29, 0x7e, 0x43, 0x68, 0xa8, 0x12, 0xbc, 0xa6, 0x12, 0x5d,
+ 0x6f, 0xbd, 0x42, 0x38, 0x1b, 0x74, 0x9, 0xa4, 0x49, 0x15, 0x67, 0x1d, 0xbe,
+ 0x14, 0x6, 0x50, 0x40, 0xe, 0x7e, 0x43, 0x68, 0xa9, 0x12, 0xbc, 0xa6, 0x12,
+ 0x5d, 0x6f, 0xbd, 0x12, 0x28, 0x4, 0x7e, 0x34, 0xff, 0xff, 0xda, 0x3b, 0x22,
+ 0x7e, 0x50, 0x40, 0xac, 0x45, 0x9e, 0x24, 0x0, 0x65, 0x22, 0x6c, 0xaa, 0x80,
+ 0x63, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x49, 0x32, 0x67, 0xcf, 0x12, 0x4b, 0x9b,
+ 0x59, 0x32, 0x67, 0x1b, 0x7e, 0x50, 0x9, 0xac, 0x5a, 0x49, 0x32, 0x67, 0xd1,
+ 0x12, 0x4b, 0x9b, 0x59, 0x32, 0x67, 0x1d, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9,
+ 0xb4, 0x67, 0xd3, 0x19, 0xb4, 0x67, 0x1f, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9,
+ 0xb4, 0x67, 0xd4, 0x19, 0xb4, 0x67, 0x20, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9,
+ 0xb4, 0x67, 0xd5, 0x19, 0xb4, 0x67, 0x21, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9,
+ 0xb4, 0x67, 0xd6, 0x19, 0xb4, 0x67, 0x22, 0x7e, 0x90, 0x9, 0xac, 0x9a, 0x9,
+ 0xb4, 0x67, 0xd7, 0x19, 0xb4, 0x67, 0x23, 0xb, 0xa0, 0x90, 0xd, 0xe, 0xe4,
+ 0x93, 0xbc, 0xba, 0x38, 0x94, 0x22, 0xd2, 0x0, 0xe4, 0x7a, 0xb3, 0x67, 0x14,
+ 0x7a, 0xb3, 0x67, 0x17, 0x7e, 0xb3, 0x67, 0xc, 0xb4, 0x1, 0x6, 0x74, 0x1,
+ 0x7a, 0xb3, 0x67, 0x14, 0x7e, 0xb3, 0x67, 0x10, 0x70, 0x2, 0xc2, 0x0, 0x7e,
+ 0xb3, 0x2e, 0x74, 0x70, 0x2, 0xc2, 0x0, 0x7e, 0xb3, 0x67, 0x12, 0xb4, 0x1,
+ 0x2, 0xc2, 0x0, 0x20, 0x0, 0x5, 0xe4, 0x7a, 0xb3, 0x67, 0x14, 0x22, 0xca,
+ 0x3b, 0x7c, 0xfb, 0x7f, 0x60, 0x75, 0x29, 0x0, 0x9f, 0x44, 0x6d, 0x11, 0x7d,
+ 0xb1, 0x7d, 0x61, 0x7f, 0x76, 0x6c, 0xee, 0x80, 0x18, 0xb, 0x7a, 0x30, 0x12,
+ 0x2b, 0x2c, 0x7d, 0xa3, 0xb, 0xf5, 0xbd, 0xba, 0x50, 0x2, 0x7d, 0xba, 0x7d,
+ 0x3a, 0x6d, 0x22, 0x2f, 0x41, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe4, 0xbe, 0xb4,
+ 0x0, 0x1e, 0x58, 0xb, 0x7e, 0xb3, 0x54, 0x15, 0xb4, 0x1, 0x4, 0x6d, 0x33,
+ 0xc1, 0x8d, 0xbe, 0xb4, 0x4, 0xb0, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0xf4, 0x80,
+ 0x1c, 0xbe, 0xb4, 0x3, 0x20, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0xc2, 0x80, 0x10,
+ 0xbe, 0xb4, 0x0, 0x0, 0x8, 0x6, 0x7e, 0xb4, 0x1, 0x90, 0x80, 0x4, 0x6d,
+ 0x33, 0xc1, 0x8d, 0x7e, 0xb3, 0x56, 0x28, 0x70, 0x4, 0x7e, 0xb4, 0x1, 0x90,
+ 0xa, 0x1f, 0x12, 0xbe, 0x98, 0x9f, 0x44, 0x7f, 0x76, 0x6c, 0xee, 0x80, 0x1c,
+ 0xb, 0x7a, 0x60, 0xb, 0xf5, 0x7d, 0x36, 0x12, 0x2b, 0x2c, 0x7d, 0xa3, 0xbd,
+ 0x1a, 0x28, 0xa, 0x7d, 0x36, 0x1a, 0x26, 0x1a, 0x24, 0x2f, 0x41, 0x5, 0x29,
+ 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe0, 0x6d, 0x11, 0xe5, 0x29, 0xbe, 0xb0, 0x0,
+ 0x28, 0x7, 0xe5, 0x29, 0xa, 0x1b, 0x12, 0xbe, 0x98, 0xbd, 0x1b, 0x8, 0x4,
+ 0x7d, 0x1b, 0x80, 0xa, 0x6d, 0x0, 0x9d, 0xb, 0xbd, 0x1, 0x8, 0x2, 0x7d,
+ 0x10, 0x7f, 0x76, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x20, 0x6c, 0xee, 0x80, 0x16,
+ 0x12, 0xbe, 0x90, 0x8, 0xd, 0x7d, 0x31, 0xe, 0x34, 0xbd, 0x30, 0x58, 0x5,
+ 0x9d, 0x1, 0x1b, 0x7a, 0x0, 0xb, 0xf5, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0xe6,
+ 0x80, 0x43, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x3d, 0x6c, 0xee, 0x80, 0x35, 0x12,
+ 0xbe, 0x90, 0x58, 0x2c, 0xbe, 0x4, 0x0, 0x0, 0x8, 0x5, 0xb, 0x7a, 0x20,
+ 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x20, 0x7d, 0x51, 0xe, 0x54, 0xbe, 0x54, 0x0,
+ 0x0, 0x8, 0x6, 0x7d, 0x31, 0xe, 0x34, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x35,
+ 0xbd, 0x32, 0x58, 0x5, 0x9d, 0x1, 0x1b, 0x7a, 0x0, 0xb, 0xf5, 0xb, 0xe0,
+ 0xbc, 0xfe, 0x38, 0xc7, 0x7d, 0x31, 0xda, 0x3b, 0x22, 0xb, 0x7a, 0x0, 0xbe,
+ 0x4, 0x0, 0x0, 0x22, 0x6d, 0x0, 0x7f, 0x14, 0x12, 0x2a, 0x8d, 0x7d, 0x13,
+ 0x22, 0x7e, 0x63, 0x68, 0xa7, 0x7e, 0x73, 0x68, 0xa6, 0xac, 0x76, 0x7d,
+ 0x13, 0x1e, 0x14, 0x7e, 0x27, 0x66, 0xee, 0x2e, 0x27, 0x66, 0xec, 0xbd,
+ 0x21, 0x38, 0x10, 0x1e, 0x34, 0x1e, 0x34, 0xbe, 0x37, 0x66, 0xec, 0x40, 0x6,
+ 0xbe, 0x37, 0x66, 0xee, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xe4, 0x7a, 0xb3,
+ 0x67, 0xc, 0x7e, 0xa3, 0x66, 0xeb, 0xbe, 0xa0, 0x0, 0x28, 0x1d, 0x7e, 0x27,
+ 0x68, 0x8b, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x4, 0x12,
+ 0x29, 0xee, 0xbe, 0x37, 0x66, 0xf4, 0x8, 0x6, 0x74, 0x1, 0x7a, 0xb3, 0x67,
+ 0xc, 0x7e, 0xb3, 0x67, 0xc, 0xb4, 0x1, 0x21, 0xbe, 0xa0, 0x0, 0x28, 0x1c,
+ 0xbe, 0xa0, 0x3, 0x50, 0x17, 0x7e, 0xb3, 0x66, 0xea, 0xb4, 0x1, 0x10, 0x90,
+ 0xd, 0xb9, 0xe4, 0x93, 0xbe, 0xb3, 0x65, 0x60, 0x68, 0x5, 0xe4, 0x7a, 0xb3,
+ 0x67, 0xc, 0x22, 0xd2, 0x0, 0x6c, 0x99, 0x80, 0x35, 0x74, 0x2, 0xac, 0xb9,
+ 0x9, 0x5, 0x53, 0xb0, 0x9, 0x15, 0x53, 0xb1, 0x12, 0xbf, 0xa9, 0x74, 0x2,
+ 0xac, 0xb9, 0x49, 0x25, 0x53, 0x73, 0x7d, 0xf3, 0x9d, 0xf2, 0xbe, 0xf4, 0x0,
+ 0x0, 0x8, 0x4, 0x7d, 0x1f, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x1f, 0xbe, 0x17,
+ 0x67, 0x3, 0x28, 0x4, 0xc2, 0x0, 0x80, 0xa, 0xb, 0x90, 0x7e, 0x83, 0x53,
+ 0xaf, 0xbc, 0x89, 0x38, 0xc3, 0x20, 0x0, 0x31, 0x6c, 0x99, 0x80, 0x21, 0x74,
+ 0x2, 0xac, 0xb9, 0x9, 0x5, 0x65, 0x60, 0x9, 0x15, 0x65, 0x61, 0x12, 0xbf,
+ 0xa9, 0x74, 0x2, 0xac, 0xb9, 0x59, 0x35, 0x53, 0x73, 0x19, 0x5, 0x53, 0xb0,
+ 0x19, 0x15, 0x53, 0xb1, 0xb, 0x90, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x79, 0x38,
+ 0xd7, 0x7a, 0x73, 0x53, 0xaf, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x5, 0xe4, 0x7a,
+ 0xb3, 0x53, 0xaf, 0xa2, 0x0, 0x22, 0x7c, 0xb0, 0x7c, 0x71, 0x2, 0x36, 0x62,
+ 0x7c, 0x67, 0x7e, 0xb, 0x70, 0xbc, 0x7b, 0x38, 0x1a, 0x29, 0x70, 0x0, 0x2,
+ 0xbc, 0x7b, 0x28, 0x12, 0x29, 0x70, 0x0, 0x1, 0xbc, 0x76, 0x38, 0xa, 0x29,
+ 0x70, 0x0, 0x3, 0xbc, 0x76, 0x28, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0xab,
+ 0x6d, 0x33, 0x6c, 0x55, 0x12, 0xf0, 0xaa, 0x49, 0x11, 0x34, 0x8d, 0x59,
+ 0x10, 0x56, 0x50, 0x12, 0xf0, 0xaa, 0x49, 0x41, 0x34, 0x8d, 0xbd, 0x43,
+ 0x28, 0x2, 0x7d, 0x34, 0x49, 0x11, 0x34, 0x97, 0x59, 0x10, 0x56, 0x5a, 0x7e,
+ 0x30, 0x2, 0xac, 0x35, 0x7e, 0x10, 0x14, 0xac, 0x1a, 0x2d, 0x1, 0x49, 0x10,
+ 0x34, 0x97, 0xbd, 0x13, 0x28, 0x2, 0x7d, 0x31, 0xb, 0x50, 0xbe, 0x50, 0x5,
+ 0x40, 0xc3, 0x7a, 0x37, 0x56, 0x4e, 0x22, 0x7e, 0x37, 0x55, 0xf0, 0xbe,
+ 0x37, 0x53, 0x33, 0x50, 0xa, 0x7e, 0x37, 0x53, 0x33, 0x9e, 0x37, 0x55, 0xf0,
+ 0x80, 0x2, 0x6d, 0x33, 0x7a, 0x37, 0x53, 0x33, 0x22, 0x7d, 0xf1, 0x7d, 0xe2,
+ 0x7d, 0xd3, 0x7e, 0x8, 0x2e, 0xb4, 0x12, 0x97, 0xed, 0x12, 0xc0, 0xb8, 0x7e,
+ 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0xb4, 0x7d, 0x3d, 0x7a, 0x37, 0x2e,
+ 0xb8, 0x7e, 0x8, 0x2e, 0xb4, 0x7d, 0x3e, 0x7d, 0x2f, 0x2, 0xc0, 0x61, 0x7f,
+ 0x20, 0xa9, 0xd6, 0xcb, 0x69, 0x12, 0x0, 0x4, 0x7e, 0x7, 0x56, 0xba, 0x59,
+ 0x10, 0x0, 0x4, 0x69, 0x12, 0x0, 0x8, 0x7e, 0x7, 0x56, 0xba, 0x59, 0x10,
+ 0x0, 0x8, 0x7e, 0x2b, 0x30, 0x7c, 0x3, 0x6c, 0x11, 0x29, 0x32, 0x0, 0x1,
+ 0xa, 0x13, 0x2d, 0x10, 0x7e, 0x7, 0x56, 0xba, 0x59, 0x10, 0x0, 0xc, 0x12,
+ 0xc0, 0xaf, 0x12, 0x57, 0xe3, 0x6d, 0x22, 0x12, 0x55, 0x27, 0x7e, 0x34,
+ 0x80, 0x40, 0x12, 0x54, 0x57, 0x49, 0x33, 0x0, 0x3a, 0xa9, 0xc6, 0xcb, 0x22,
+ 0x7e, 0x17, 0x56, 0xba, 0x59, 0x21, 0x0, 0xe, 0x22, 0x7e, 0x73, 0x68, 0xa7,
+ 0x7a, 0x73, 0x2e, 0xb5, 0x22, 0x6c, 0xaa, 0x80, 0x9, 0xe4, 0xa, 0x4a, 0x19,
+ 0xb4, 0x65, 0xd8, 0xb, 0xa0, 0x90, 0xd, 0xf, 0xe4, 0x93, 0xc4, 0x23, 0x54,
+ 0x1f, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3a, 0xbd, 0x32, 0x48, 0xe4, 0x12, 0x9f,
+ 0xad, 0x6d, 0x33, 0x7a, 0x37, 0x66, 0xec, 0x7a, 0x37, 0x66, 0xee, 0x7a,
+ 0x37, 0x66, 0xf0, 0x7a, 0x37, 0x66, 0xf4, 0x7e, 0xd4, 0x2e, 0x79, 0x1e,
+ 0xd4, 0x3e, 0xd4, 0x6d, 0xcc, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x2e,
+ 0xb9, 0x7d, 0x3d, 0x7a, 0x37, 0x2e, 0xbd, 0x7e, 0x34, 0x2d, 0x82, 0x7a,
+ 0x37, 0x2e, 0xbb, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0xb6, 0x12,
+ 0xc0, 0xb8, 0x7e, 0x37, 0x68, 0x89, 0x7a, 0x37, 0x2e, 0xbf, 0x7e, 0x37,
+ 0x68, 0x8b, 0x7a, 0x37, 0x2e, 0xc1, 0x7e, 0x37, 0x68, 0x93, 0x7a, 0x37,
+ 0x2e, 0xc3, 0x7e, 0x37, 0x68, 0x95, 0x7a, 0x37, 0x2e, 0xc5, 0x12, 0xc2,
+ 0x1e, 0x1b, 0x34, 0x7a, 0x73, 0x2e, 0xb7, 0x7e, 0x73, 0x56, 0xc1, 0x7a,
+ 0x73, 0x2e, 0xb8, 0x7e, 0x8, 0x2e, 0xb5, 0x7e, 0x18, 0x2e, 0xc7, 0x12, 0x56,
+ 0xd3, 0x7e, 0x73, 0x2e, 0xc7, 0x7a, 0x73, 0x66, 0xea, 0x7e, 0x73, 0x2e,
+ 0xc8, 0x7a, 0x73, 0x66, 0xeb, 0x7e, 0x37, 0x2e, 0xc9, 0x7a, 0x37, 0x66,
+ 0xec, 0x7e, 0x37, 0x2e, 0xcb, 0x7a, 0x37, 0x66, 0xee, 0x7e, 0x37, 0x2e,
+ 0xd1, 0x7a, 0x37, 0x66, 0xf0, 0x7e, 0x37, 0x2e, 0xd3, 0x7d, 0x23, 0x7a,
+ 0x53, 0x66, 0xf2, 0xa, 0x36, 0x7a, 0x73, 0x66, 0xf3, 0x7e, 0x37, 0x2e, 0xcd,
+ 0x7a, 0x37, 0x66, 0xf4, 0x7e, 0x37, 0x2e, 0xcf, 0x7d, 0x23, 0x7a, 0x53,
+ 0x66, 0xf6, 0xa, 0x36, 0x7a, 0x73, 0x66, 0xf7, 0x6c, 0xaa, 0x80, 0x3c, 0x7c,
+ 0xba, 0xc4, 0x23, 0x54, 0x1f, 0x7c, 0x7b, 0x7c, 0xba, 0x54, 0x7, 0x7e, 0x44,
+ 0x0, 0x1, 0x60, 0x5, 0x3e, 0x44, 0x14, 0x78, 0xfb, 0x7c, 0x69, 0xa, 0x27,
+ 0x12, 0x9f, 0x8c, 0x4c, 0xb6, 0x7a, 0x29, 0xb0, 0x7e, 0x50, 0x2, 0xac, 0x5a,
+ 0x49, 0x12, 0x2d, 0x82, 0xa, 0x2, 0x7c, 0xb1, 0x19, 0xb2, 0x65, 0x60, 0x7c,
+ 0xb3, 0x19, 0xb2, 0x65, 0x61, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xea, 0xbc, 0xba,
+ 0x38, 0xbc, 0x6c, 0xaa, 0x80, 0x1c, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x16,
+ 0x2d, 0x34, 0xb, 0x1a, 0x30, 0xa, 0x26, 0x7c, 0xb5, 0x19, 0xb4, 0x65, 0x9c,
+ 0x7c, 0xb7, 0x19, 0xb4, 0x65, 0x9d, 0xb, 0xa0, 0x7e, 0xb3, 0x66, 0xeb, 0xbc,
+ 0xba, 0x38, 0xdc, 0x22, 0x90, 0xd, 0xf, 0x93, 0xa, 0x3b, 0x22, 0xca, 0x3b,
+ 0x7c, 0xfb, 0xc2, 0x2, 0xc2, 0x3, 0xc2, 0x4, 0xd2, 0x5, 0x7e, 0x94, 0x0,
+ 0x51, 0x7e, 0xe3, 0x66, 0xea, 0xe4, 0x7a, 0xb3, 0x52, 0xb2, 0x7a, 0xb3,
+ 0x52, 0xb3, 0x7a, 0xb3, 0x52, 0x74, 0x7a, 0xb3, 0x52, 0xf4, 0x7e, 0x8, 0x52,
+ 0xb4, 0x12, 0xc2, 0x1e, 0xe4, 0x12, 0x0, 0x2e, 0x12, 0xc2, 0x1e, 0x3e, 0x34,
+ 0x7e, 0x8, 0x52, 0x75, 0xe4, 0x12, 0x0, 0x2e, 0xbe, 0xe0, 0x2, 0x50, 0x2,
+ 0x81, 0xfe, 0x6c, 0xdd, 0x81, 0xf8, 0x74, 0x2, 0x7c, 0x7d, 0xac, 0x7b, 0x12,
+ 0xa7, 0xa1, 0x4c, 0xdd, 0x68, 0x8, 0xa, 0x8d, 0x9, 0xb8, 0x52, 0xb4, 0x70,
+ 0xa, 0xa, 0x3d, 0xb, 0x34, 0xa, 0x8d, 0x19, 0x78, 0x52, 0xb4, 0xa, 0x5d,
+ 0xb, 0x54, 0xf5, 0x27, 0x81, 0xef, 0x7e, 0xa1, 0x27, 0x74, 0x2, 0x7c, 0x7a,
+ 0xac, 0x7b, 0x9, 0xa3, 0x65, 0x60, 0x7a, 0xa1, 0x2b, 0x9, 0xb3, 0x65, 0x61,
+ 0xf5, 0x2c, 0xa, 0x2a, 0xe5, 0x29, 0xa, 0xb, 0x7d, 0x30, 0x12, 0x37, 0x98,
+ 0x8, 0x6, 0x7d, 0x50, 0x9d, 0x52, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x53, 0xf5,
+ 0x2d, 0xe5, 0x2c, 0xa, 0x2b, 0xe5, 0x2a, 0xa, 0xb, 0x7d, 0x30, 0x12, 0x37,
+ 0x98, 0x8, 0x6, 0x7d, 0x80, 0x9d, 0x82, 0x80, 0x4, 0x6d, 0x88, 0x9d, 0x83,
+ 0x7d, 0x38, 0x7c, 0xc7, 0xe5, 0x2d, 0xbe, 0xb0, 0x6, 0x40, 0x2, 0x81, 0xed,
+ 0xbe, 0xc0, 0x6, 0x40, 0x2, 0x81, 0xed, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x12,
+ 0x36, 0x62, 0x7a, 0x35, 0x2f, 0xe5, 0x2b, 0x7e, 0x71, 0x2c, 0x12, 0x36,
+ 0x62, 0x7d, 0x83, 0x7e, 0x25, 0x2f, 0xbd, 0x28, 0x8, 0x4, 0x7d, 0x38, 0x80,
+ 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35, 0x33, 0xbd, 0x28, 0x58, 0x4, 0x7d, 0x38,
+ 0x80, 0x3, 0x7e, 0x35, 0x2f, 0x7a, 0x35, 0x35, 0x7e, 0x35, 0x33, 0xe, 0x34,
+ 0x7a, 0x35, 0x31, 0x75, 0x2e, 0x0, 0xe5, 0x2d, 0xbe, 0xb0, 0x1, 0x38, 0x21,
+ 0xbe, 0xc0, 0x1, 0x38, 0x1c, 0x7c, 0xbf, 0x30, 0xe0, 0x17, 0x7e, 0xb3, 0x52,
+ 0x74, 0x4, 0x7a, 0xb3, 0x52, 0x74, 0x75, 0x2e, 0x1, 0x7e, 0xb3, 0x52, 0xb2,
+ 0x4, 0x7a, 0xb3, 0x52, 0xb2, 0x81, 0x91, 0xe5, 0x2d, 0xbe, 0xb0, 0x1, 0x38,
+ 0x7, 0xbe, 0xc0, 0x1, 0x38, 0x2, 0x81, 0x91, 0xe5, 0x2d, 0xbe, 0xb0, 0x6,
+ 0x40, 0x2, 0x81, 0x91, 0xbe, 0xc0, 0x6, 0x40, 0x2, 0x81, 0x91, 0x7c, 0xbf,
+ 0x20, 0xe1, 0x2, 0x81, 0x91, 0xc2, 0x3, 0xe5, 0x2d, 0xbe, 0xb0, 0x2, 0x28,
+ 0x5, 0xbe, 0xc0, 0x2, 0x38, 0x2, 0xd2, 0x3, 0x12, 0xc5, 0x17, 0x12, 0xd8,
+ 0x24, 0x12, 0xc7, 0x12, 0x7a, 0xd, 0x3d, 0x7d, 0x38, 0x2e, 0x35, 0x2f, 0x12,
+ 0x9f, 0x85, 0x7a, 0x35, 0x37, 0xc2, 0x2, 0xbe, 0x8, 0x7f, 0xff, 0x78, 0x5,
+ 0x9f, 0x11, 0x7a, 0x1d, 0x3d, 0x7e, 0x35, 0x37, 0x7a, 0x35, 0x46, 0x12,
+ 0xc5, 0x17, 0x7e, 0xd, 0x3d, 0x12, 0xd7, 0xbd, 0x92, 0x4, 0x12, 0xdc, 0x1f,
+ 0x92, 0x1, 0x7e, 0x35, 0x35, 0x12, 0xc5, 0x4, 0x20, 0x1, 0x1a, 0xe5, 0x2d,
+ 0xbe, 0xb0, 0x4, 0x38, 0x13, 0xbe, 0xc0, 0x4, 0x38, 0xe, 0xa, 0x2c, 0xe5,
+ 0x2d, 0xa, 0x3b, 0x12, 0xc5, 0x10, 0x18, 0x3, 0x12, 0xc5, 0x1, 0x85, 0x2a,
+ 0x46, 0x85, 0x2b, 0x47, 0x85, 0x2c, 0x48, 0x7e, 0x8, 0x0, 0x41, 0x7e, 0x18,
+ 0x0, 0x43, 0xe5, 0x29, 0x12, 0xc7, 0x4c, 0xe5, 0x2d, 0xa, 0x4b, 0xbe, 0x45,
+ 0x43, 0x8, 0x7, 0xa, 0x3c, 0xbe, 0x35, 0x43, 0x18, 0x8, 0x12, 0xc5, 0xc,
+ 0x18, 0x3, 0x7e, 0x95, 0x41, 0x7e, 0x5, 0x43, 0xbe, 0x4, 0x0, 0x3, 0x78,
+ 0x5, 0x7e, 0x35, 0x35, 0x80, 0x14, 0xbe, 0x4, 0x0, 0x4, 0x78, 0x5, 0x7e,
+ 0x35, 0x37, 0x80, 0x9, 0xbe, 0x4, 0x0, 0x5, 0x78, 0x6, 0x7e, 0x35, 0x33,
+ 0x12, 0xc5, 0x4, 0x7e, 0xb3, 0x54, 0x3e, 0xb4, 0x1, 0x4, 0x7e, 0x94, 0x0,
+ 0x3c, 0x7e, 0xb3, 0x68, 0x9e, 0x60, 0x18, 0x12, 0xc5, 0x1, 0xe5, 0x2d, 0xbe,
+ 0xb0, 0x2, 0x38, 0xe, 0xbe, 0xc0, 0x2, 0x38, 0x9, 0x12, 0xc5, 0xc, 0x18,
+ 0x4, 0x7e, 0x94, 0x0, 0x32, 0x7d, 0x19, 0x1a, 0x2, 0x1a, 0x0, 0x7e, 0x1d,
+ 0x39, 0x12, 0x2a, 0x20, 0x7e, 0x8, 0x0, 0x64, 0x12, 0x2a, 0x8d, 0x7f, 0x1,
+ 0x7e, 0x1d, 0x3d, 0xbf, 0x10, 0x8, 0x2, 0xd2, 0x2, 0x30, 0x4, 0x5, 0x20,
+ 0x3, 0x2, 0xc2, 0x2, 0x30, 0x2, 0x3, 0x75, 0x2e, 0x2, 0xe5, 0x2e, 0xbe,
+ 0xb0, 0x0, 0x28, 0x55, 0xe5, 0x27, 0xa, 0x4b, 0x9, 0x14, 0x52, 0xb4, 0xa5,
+ 0xb9, 0x0, 0xc, 0xa, 0x3d, 0x9, 0xa3, 0x52, 0xb4, 0x19, 0xa4, 0x52, 0xb4,
+ 0x80, 0x3d, 0xa, 0x3d, 0x9, 0x53, 0x52, 0xb4, 0x7a, 0x51, 0x45, 0xbc, 0x51,
+ 0x28, 0x3, 0x7a, 0x11, 0x45, 0x75, 0x28, 0x0, 0x80, 0x23, 0x9, 0x64, 0x52,
+ 0xb4, 0xe5, 0x28, 0xa, 0xb, 0x9, 0x30, 0x52, 0xb4, 0xbc, 0x36, 0x68, 0xa,
+ 0xa, 0x3d, 0x9, 0x63, 0x52, 0xb4, 0xbc, 0x36, 0x78, 0x7, 0x7e, 0xa1, 0x45,
+ 0x19, 0xa0, 0x52, 0xb4, 0x5, 0x28, 0xbe, 0xe1, 0x28, 0x38, 0xd8, 0x5, 0x27,
+ 0xbe, 0xe1, 0x27, 0x28, 0x2, 0x41, 0x94, 0xb, 0xd0, 0xbc, 0xed, 0x28, 0x2,
+ 0x41, 0x6d, 0xda, 0x3b, 0x22, 0x7e, 0x35, 0x33, 0x1a, 0x26, 0x1a, 0x24,
+ 0x7a, 0x1d, 0x39, 0x22, 0xa, 0x2c, 0x7d, 0x34, 0x2d, 0x32, 0xbe, 0x34, 0x0,
+ 0x6, 0x22, 0xe5, 0x29, 0x7e, 0x71, 0x2a, 0x7e, 0x61, 0x2b, 0x7e, 0x51, 0x2c,
+ 0x22, 0xca, 0xd8, 0xca, 0x79, 0xc2, 0x0, 0x7e, 0xe0, 0x3, 0xe4, 0x7a, 0xb3,
+ 0x52, 0xb1, 0x7e, 0xd3, 0x68, 0x7a, 0x12, 0xda, 0xe9, 0x7e, 0xf3, 0x66,
+ 0xea, 0xbe, 0xf0, 0x1, 0x38, 0x2, 0xa1, 0xed, 0x7c, 0xbe, 0x12, 0xc2, 0x25,
+ 0x4c, 0xdd, 0x78, 0x4, 0xc2, 0x0, 0x80, 0x5f, 0xbe, 0xd0, 0x1, 0x28, 0xd,
+ 0x7e, 0x73, 0x52, 0xf5, 0xbe, 0x70, 0x6, 0x28, 0x4, 0xc2, 0x0, 0x80, 0x4d,
+ 0xc2, 0x0, 0x7e, 0x53, 0x66, 0xea, 0xbc, 0x5d, 0x78, 0x11, 0x12, 0xc7, 0x2c,
+ 0x50, 0x5, 0x7e, 0xe0, 0x3, 0x80, 0x3, 0x7e, 0xe0, 0x1, 0xd2, 0x0, 0x80,
+ 0x32, 0x7e, 0x43, 0x52, 0xb2, 0xa, 0x34, 0xa, 0x25, 0x7d, 0x12, 0x9d, 0x13,
+ 0xb, 0x14, 0xa, 0x3d, 0xbd, 0x31, 0x78, 0x7, 0x7e, 0xe0, 0x1, 0xd2, 0x0,
+ 0x80, 0x17, 0x7e, 0x73, 0x52, 0x74, 0xa, 0x37, 0x9d, 0x23, 0xb, 0x24, 0x7e,
+ 0x73, 0x52, 0xf6, 0xbd, 0x32, 0x78, 0x5, 0x7e, 0xe0, 0x3, 0xd2, 0x0, 0x30,
+ 0x0, 0x5, 0x7c, 0xbe, 0x12, 0xc2, 0x25, 0x7e, 0x8, 0x52, 0xb4, 0x12, 0xc5,
+ 0xfc, 0x7a, 0xb3, 0x52, 0xb1, 0x7e, 0xa3, 0x52, 0xb1, 0x7a, 0xa3, 0x66,
+ 0xea, 0x74, 0x2, 0xa4, 0xca, 0x59, 0x7e, 0x18, 0x52, 0x75, 0x7e, 0x8, 0x65,
+ 0x60, 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x7e, 0x73, 0x66, 0xea, 0x7a, 0x73, 0x52,
+ 0xf6, 0x12, 0xcf, 0x7b, 0x7a, 0xb3, 0x52, 0xf5, 0x80, 0xa, 0x74, 0x64, 0x7a,
+ 0xb3, 0x52, 0xf5, 0x7a, 0xf3, 0x52, 0xf6, 0xda, 0x79, 0xda, 0xd8, 0x22,
+ 0xca, 0x79, 0x7f, 0x70, 0x75, 0x2a, 0xff, 0x7e, 0xb3, 0x66, 0xea, 0xf5,
+ 0x2b, 0x6c, 0x99, 0x6c, 0xff, 0x6c, 0xee, 0x80, 0xd, 0xa, 0x1e, 0x12, 0xc7,
+ 0xa, 0xbc, 0x7f, 0x40, 0x2, 0x7c, 0xf7, 0xb, 0xe0, 0xe5, 0x2b, 0xbc, 0xbe,
+ 0x38, 0xed, 0x7e, 0xe0, 0x1, 0xc1, 0xde, 0x75, 0x2c, 0x0, 0x6d, 0xdd, 0x75,
+ 0x27, 0x0, 0xc1, 0xba, 0x12, 0xc7, 0x19, 0x9, 0xb1, 0x65, 0x60, 0xf5, 0x28,
+ 0x9, 0xb1, 0x65, 0x61, 0xf5, 0x29, 0xe5, 0x27, 0xa, 0x1b, 0x12, 0xc7, 0xa,
+ 0xbc, 0x7e, 0x78, 0x6b, 0x5, 0x2c, 0xe5, 0x2c, 0xb4, 0x1, 0x3, 0x12, 0xc7,
+ 0x3, 0xbe, 0xf0, 0x1, 0x78, 0x4e, 0x7e, 0xa3, 0x52, 0xf1, 0xbe, 0xa0, 0xff,
+ 0x68, 0x45, 0x7e, 0xb3, 0x52, 0xf0, 0xa, 0x3b, 0xe5, 0x29, 0xa, 0xcb, 0x7d,
+ 0x1c, 0x9d, 0x13, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x9d, 0xc3, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc1, 0xa, 0x3a, 0xe5, 0x28, 0xa, 0x1b, 0x7d, 0x51, 0x9d,
+ 0x53, 0xbe, 0x54, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x13, 0x80, 0x4, 0x6d, 0x11,
+ 0x9d, 0x15, 0x2d, 0x1c, 0x7c, 0x83, 0xbe, 0x81, 0x2a, 0x50, 0x16, 0x12,
+ 0xc7, 0x3, 0x7a, 0x81, 0x2a, 0x80, 0xe, 0x12, 0xa7, 0x81, 0x7d, 0xc3, 0xbd,
+ 0xdc, 0x58, 0x5, 0x7d, 0xdc, 0x12, 0xc7, 0x3, 0x5, 0x27, 0xe5, 0x2b, 0xbe,
+ 0xb1, 0x27, 0x28, 0x2, 0xc1, 0x33, 0xe5, 0x2c, 0xbe, 0xb0, 0x0, 0x28, 0x12,
+ 0x74, 0x2, 0xac, 0xb9, 0x19, 0x5, 0x52, 0x75, 0x74, 0x2, 0xac, 0xb9, 0x19,
+ 0x15, 0x52, 0x76, 0xb, 0x90, 0xb, 0xe0, 0xbc, 0xfe, 0x40, 0x2, 0xc1, 0x29,
+ 0xbe, 0x90, 0x1, 0x78, 0x12, 0x7e, 0x83, 0x52, 0x75, 0x7a, 0x83, 0x52, 0xf1,
+ 0x7e, 0x83, 0x52, 0x76, 0x7a, 0x83, 0x52, 0xf0, 0x80, 0x3, 0x12, 0xc7, 0x21,
+ 0x7c, 0xb9, 0xda, 0x79, 0x22, 0x7e, 0x1, 0x28, 0x7e, 0x11, 0x29, 0x22, 0x7f,
+ 0x17, 0x2d, 0x31, 0x7e, 0x1b, 0x70, 0x22, 0x7d, 0x13, 0x1a, 0x2, 0x1a, 0x0,
+ 0x22, 0x7e, 0x31, 0x27, 0x74, 0x2, 0xac, 0x3b, 0x22, 0x74, 0xff, 0x7a, 0xb3,
+ 0x52, 0xf1, 0x7a, 0xb3, 0x52, 0xf0, 0x22, 0x6c, 0xaa, 0x80, 0x12, 0x7e,
+ 0x70, 0x9, 0xac, 0x7a, 0x9, 0xb3, 0x65, 0xe2, 0xbe, 0xb0, 0x10, 0x28, 0x2,
+ 0xd3, 0x22, 0xb, 0xa0, 0x7e, 0xb3, 0x67, 0x0, 0xbc, 0xba, 0x38, 0xe6, 0xc3,
+ 0x22, 0x7c, 0x9b, 0x7f, 0x71, 0x7f, 0x60, 0x7e, 0x34, 0x2d, 0x6c, 0x7e,
+ 0x24, 0x0, 0xff, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x30, 0x12, 0x2a, 0xe2, 0x7e,
+ 0x58, 0x2e, 0x77, 0x7c, 0xb9, 0x7e, 0x71, 0x46, 0x12, 0x36, 0x62, 0x7d, 0x3,
+ 0xe5, 0x47, 0x7e, 0x71, 0x48, 0x12, 0x36, 0x62, 0x2d, 0x30, 0xe, 0x34, 0x7f,
+ 0x5, 0x7e, 0x50, 0x8, 0xb, 0xa, 0x50, 0xbd, 0x53, 0x58, 0xf, 0x69, 0x30,
+ 0x0, 0x2, 0x1b, 0x6a, 0x30, 0x69, 0x30, 0x0, 0x4, 0x1b, 0x7a, 0x30, 0x22,
+ 0x2e, 0x14, 0x0, 0x6, 0x1b, 0x50, 0x78, 0xe2, 0x22, 0xca, 0xf8, 0xd2, 0x7,
+ 0x6c, 0xff, 0x80, 0x13, 0x7c, 0xbf, 0x7e, 0x70, 0x1, 0x12, 0xa6, 0xa3, 0xbe,
+ 0x18, 0x2, 0xee, 0x58, 0x3, 0xc3, 0x80, 0xc, 0xb, 0xf0, 0x7e, 0x33, 0x66,
+ 0xea, 0xbc, 0x3f, 0x38, 0xe5, 0xa2, 0x7, 0xda, 0xf8, 0x22, 0xca, 0xf8, 0xc2,
+ 0x4, 0xc2, 0x5, 0xc2, 0x6, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x3, 0x12, 0xc9,
+ 0x5f, 0x7e, 0x34, 0x2, 0x58, 0x12, 0xcf, 0xfc, 0x7a, 0xb3, 0x55, 0x73, 0x7e,
+ 0x34, 0x0, 0x5, 0x12, 0xcb, 0x80, 0x92, 0x2, 0x7e, 0xb3, 0x68, 0x9e, 0x70,
+ 0x63, 0x7e, 0xa3, 0x55, 0x73, 0xbe, 0xa0, 0x0, 0x38, 0x3, 0x2, 0xc8, 0x9c,
+ 0xbe, 0xa0, 0x4, 0x28, 0x2, 0x1, 0x9c, 0xd2, 0x1, 0x20, 0x1, 0x2, 0x1, 0x9c,
+ 0xbe, 0xa0, 0x4, 0x78, 0x5, 0x7e, 0xf0, 0x2, 0x80, 0x17, 0xbe, 0xa0, 0x3,
+ 0x78, 0x5, 0x7e, 0xf0, 0x3, 0x80, 0xd, 0xbe, 0xa0, 0x2, 0x78, 0x5, 0x7e,
+ 0xf0, 0x5, 0x80, 0x3, 0x7e, 0xf0, 0x8, 0x7c, 0xbf, 0x12, 0xc8, 0xa6, 0x92,
+ 0x3, 0x12, 0xc7, 0xa1, 0x92, 0x5, 0xd2, 0x6, 0x30, 0x3, 0x9, 0x30, 0x5, 0x6,
+ 0x30, 0x6, 0x3, 0x12, 0xc8, 0x9f, 0x30, 0x2, 0x50, 0x30, 0x5, 0x4d, 0x30,
+ 0x6, 0x4a, 0x12, 0xc8, 0x9f, 0x80, 0x45, 0x7e, 0x73, 0x55, 0x73, 0xbe, 0x70,
+ 0x0, 0x28, 0x7, 0x12, 0xc8, 0x9f, 0x6d, 0x33, 0x80, 0x12, 0x7e, 0xb3, 0x66,
+ 0xea, 0x70, 0x12, 0x74, 0x1, 0x7a, 0xb3, 0x68, 0x9e, 0x7e, 0x37, 0x55, 0x74,
+ 0xb, 0x34, 0x7a, 0x37, 0x55, 0x74, 0x80, 0x2, 0xd2, 0x4, 0x20, 0x4, 0xd,
+ 0x7e, 0x37, 0x55, 0x74, 0xbe, 0x34, 0xe, 0x10, 0x50, 0x3, 0x30, 0x0, 0xb,
+ 0xe4, 0x7a, 0xb3, 0x68, 0x9e, 0x6d, 0x33, 0x7a, 0x37, 0x55, 0x74, 0xda,
+ 0xf8, 0x22, 0x74, 0x2, 0x7a, 0xb3, 0x68, 0x9e, 0x22, 0x7c, 0x9b, 0x7e, 0x73,
+ 0x55, 0x77, 0xa5, 0xbf, 0x0, 0xe, 0x7e, 0x63, 0x66, 0xf2, 0xa, 0x27, 0x19,
+ 0x62, 0x55, 0x9c, 0x74, 0x1, 0x80, 0x20, 0x7e, 0xb3, 0x66, 0xf2, 0x7e, 0x8,
+ 0x55, 0x9c, 0x12, 0xc9, 0x44, 0x40, 0x17, 0x7e, 0x83, 0x66, 0xf2, 0x7e,
+ 0x73, 0x55, 0x77, 0xa, 0x57, 0x19, 0x85, 0x55, 0x9c, 0x7e, 0xb3, 0x55, 0x77,
+ 0x4, 0x7a, 0xb3, 0x55, 0x77, 0x7e, 0x73, 0x55, 0x76, 0xa5, 0xbf, 0x0, 0xe,
+ 0x7e, 0x63, 0x66, 0xf3, 0xa, 0x27, 0x19, 0x62, 0x55, 0x78, 0x74, 0x1, 0x80,
+ 0x20, 0x7e, 0xb3, 0x66, 0xf3, 0x7e, 0x8, 0x55, 0x78, 0x12, 0xc9, 0x44, 0x40,
+ 0x17, 0x7e, 0x83, 0x66, 0xf3, 0x7e, 0x73, 0x55, 0x76, 0xa, 0x57, 0x19, 0x85,
+ 0x55, 0x78, 0x7e, 0xb3, 0x55, 0x76, 0x4, 0x7a, 0xb3, 0x55, 0x76, 0x7e, 0xa3,
+ 0x55, 0x77, 0xbc, 0xa9, 0x50, 0x19, 0x7e, 0x73, 0x55, 0x76, 0xbc, 0x79,
+ 0x50, 0x11, 0x7e, 0x50, 0x3, 0xac, 0x59, 0xe, 0x24, 0xa, 0x17, 0xa, 0x3a,
+ 0x2d, 0x31, 0xbd, 0x32, 0x48, 0x5, 0x12, 0xc9, 0x5f, 0xd3, 0x22, 0xc3, 0x22,
+ 0x6c, 0x66, 0x80, 0x11, 0xa, 0x26, 0x7f, 0x70, 0x2d, 0xf2, 0x7e, 0x7b, 0xa0,
+ 0xbc, 0xab, 0x78, 0x2, 0xd3, 0x22, 0xb, 0x60, 0xbc, 0x76, 0x38, 0xeb, 0xc3,
+ 0x22, 0xe4, 0x7a, 0xb3, 0x55, 0x77, 0x7a, 0xb3, 0x55, 0x76, 0x7e, 0x8, 0x55,
+ 0x9c, 0x7e, 0x34, 0x0, 0x12, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x55, 0x78, 0x7e,
+ 0x34, 0x0, 0x24, 0x2, 0x0, 0x2e, 0xca, 0x79, 0x7e, 0xf4, 0x2d, 0x9c, 0x7e,
+ 0xe4, 0x0, 0xff, 0x69, 0x37, 0x0, 0x4, 0x69, 0x27, 0x0, 0x2, 0xb, 0x7a,
+ 0x10, 0x7a, 0x1f, 0x2e, 0x79, 0x7a, 0x17, 0x2e, 0x77, 0x7e, 0xb3, 0x68,
+ 0x9d, 0x70, 0x2, 0x41, 0x41, 0x7e, 0xb3, 0x68, 0x9e, 0x70, 0x2, 0x41, 0x41,
+ 0x7e, 0xb3, 0x66, 0xea, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0x41, 0x41, 0x7e, 0x0,
+ 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xae, 0x7e, 0xb3, 0x56, 0xb6, 0xbe, 0xb0, 0xff,
+ 0x68, 0x24, 0x6c, 0x11, 0x7e, 0x30, 0x2, 0xac, 0x31, 0x9, 0x71, 0x2e, 0x77,
+ 0xbe, 0x73, 0x56, 0xb6, 0x38, 0xc, 0x74, 0x1, 0x7a, 0xb3, 0x55, 0xae, 0x9,
+ 0x1, 0x2e, 0x78, 0x80, 0x7, 0xb, 0x10, 0xbe, 0x10, 0x3, 0x40, 0xde, 0xa,
+ 0x30, 0x7e, 0xf7, 0x66, 0xf0, 0xad, 0x3f, 0x7e, 0x14, 0x0, 0x14, 0x7d, 0x21,
+ 0x12, 0x29, 0xee, 0x7d, 0x53, 0x7e, 0xe7, 0x68, 0x87, 0xbd, 0xe5, 0x50, 0x4,
+ 0x7a, 0x57, 0x68, 0x87, 0x7e, 0x34, 0x0, 0x7, 0xad, 0x3f, 0x7d, 0x21, 0x12,
+ 0x29, 0xee, 0x7d, 0x43, 0x6c, 0x11, 0x80, 0x1e, 0x74, 0x2, 0xac, 0xb1, 0x9,
+ 0xf5, 0x65, 0x60, 0x9, 0xe5, 0x65, 0x61, 0x7c, 0xbf, 0x7c, 0x7e, 0x12, 0x36,
+ 0x62, 0x7d, 0xf3, 0xbd, 0x4f, 0x8, 0x3, 0x12, 0x9d, 0x17, 0xb, 0x10, 0x7e,
+ 0x73, 0x66, 0xea, 0xbc, 0x71, 0x38, 0xda, 0xda, 0x79, 0x22, 0xb4, 0x1, 0x2,
+ 0x80, 0x2, 0x41, 0xcb, 0x7e, 0xb3, 0x53, 0xf9, 0xb4, 0x1, 0x2f, 0x12, 0xca,
+ 0xd5, 0x7e, 0x34, 0x0, 0xc8, 0x7a, 0x37, 0x68, 0x87, 0x7a, 0x37, 0x68, 0x89,
+ 0x7e, 0x34, 0xff, 0x38, 0x12, 0xca, 0xcc, 0x7a, 0x37, 0x68, 0x93, 0x7e,
+ 0x24, 0xfe, 0xd4, 0x7a, 0x27, 0x68, 0x95, 0x7e, 0x24, 0x1, 0x2c, 0x7a, 0x27,
+ 0x68, 0x8d, 0x7a, 0x37, 0x68, 0x8f, 0x22, 0x12, 0xca, 0xd5, 0x7e, 0x34,
+ 0xff, 0x9c, 0x12, 0xca, 0xcc, 0x7a, 0x37, 0x68, 0x8d, 0x7a, 0x37, 0x68,
+ 0x8f, 0x7a, 0x37, 0x68, 0x93, 0x7e, 0x34, 0xfe, 0xd4, 0x7a, 0x37, 0x68,
+ 0x95, 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0x16, 0x7e, 0x37, 0x55, 0x74, 0xbe,
+ 0x34, 0x0, 0x0, 0x28, 0x6, 0x7e, 0x34, 0x0, 0x78, 0x80, 0xa, 0x7e, 0x34,
+ 0x0, 0xaa, 0x80, 0x4, 0x7e, 0x34, 0x0, 0x64, 0x7a, 0x37, 0x68, 0x87, 0x7e,
+ 0x34, 0x0, 0x64, 0x7a, 0x37, 0x68, 0x89, 0x22, 0x7a, 0x37, 0x68, 0x8b, 0x7e,
+ 0x34, 0x1, 0x2c, 0x22, 0x90, 0xd, 0x10, 0xe4, 0x93, 0x7a, 0xb3, 0x68, 0x86,
+ 0x22, 0x7e, 0x34, 0x0, 0xaa, 0x7a, 0x37, 0x68, 0x87, 0x12, 0xca, 0xd5, 0x7e,
+ 0x34, 0x0, 0x64, 0x12, 0x4b, 0x68, 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef,
+ 0x22, 0x7e, 0xb3, 0x53, 0xf9, 0xb4, 0x1, 0x5, 0x12, 0xcb, 0x57, 0x80, 0x37,
+ 0x7e, 0xb3, 0x54, 0x3e, 0x60, 0x5, 0x12, 0x4f, 0xc9, 0x80, 0x2c, 0x7e, 0xb3,
+ 0x68, 0xa3, 0xb4, 0x1, 0x5, 0x12, 0xca, 0xdf, 0x80, 0x20, 0x12, 0x4f, 0x63,
+ 0x7e, 0xb3, 0x56, 0xbf, 0x70, 0x17, 0x7e, 0xb3, 0x68, 0xa3, 0x70, 0x11,
+ 0x7e, 0xb3, 0x68, 0x7a, 0x70, 0xb, 0x7e, 0x34, 0xd, 0x2c, 0x12, 0x32, 0xdf,
+ 0x7a, 0x37, 0x68, 0x87, 0x7e, 0x34, 0xd, 0x20, 0x12, 0x32, 0xdf, 0x12, 0xcb,
+ 0x4e, 0x12, 0x32, 0xdf, 0x7a, 0x37, 0x68, 0x8f, 0x22, 0x7a, 0x37, 0x68,
+ 0x8d, 0x7e, 0x34, 0xd, 0x22, 0x22, 0x7e, 0xb3, 0x66, 0xea, 0x70, 0x6, 0x7e,
+ 0x34, 0xd, 0x2c, 0x80, 0x4, 0x7e, 0x34, 0xd, 0x18, 0x12, 0x32, 0xdf, 0x2e,
+ 0x34, 0x0, 0x78, 0x12, 0x32, 0xce, 0x2e, 0x34, 0x0, 0x78, 0x12, 0x4b, 0x68,
+ 0x12, 0x4f, 0xb6, 0x7a, 0x73, 0x53, 0xef, 0x22, 0x7c, 0x3b, 0x7d, 0x23,
+ 0xc2, 0x7, 0x7e, 0x23, 0x55, 0xaf, 0xa, 0x42, 0x7e, 0xa3, 0x66, 0xf2, 0xa,
+ 0x3a, 0x12, 0xcc, 0x19, 0x8, 0x4, 0x9d, 0x34, 0x80, 0x4, 0x6d, 0x33, 0x9d,
+ 0x30, 0xbe, 0x34, 0x0, 0x1, 0x18, 0x5f, 0x7e, 0x23, 0x55, 0xb0, 0xa, 0x2,
+ 0x7e, 0xb3, 0x66, 0xf3, 0xa, 0x3b, 0x7d, 0x43, 0x9d, 0x40, 0xbe, 0x44, 0x0,
+ 0x0, 0x8, 0x4, 0x9d, 0x30, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x34, 0xbe, 0x34,
+ 0x0, 0x1, 0x18, 0x3b, 0x60, 0x39, 0x7e, 0xb3, 0x68, 0xa9, 0x14, 0xbe, 0xb3,
+ 0x66, 0xf3, 0x68, 0x2e, 0x4c, 0xaa, 0x68, 0x2a, 0x7e, 0xb3, 0x68, 0xa8,
+ 0x14, 0xbe, 0xb3, 0x66, 0xf2, 0x68, 0x1f, 0xbe, 0x30, 0x0, 0x28, 0x1a, 0x7e,
+ 0x37, 0x55, 0xb1, 0xb, 0x34, 0x7a, 0x37, 0x55, 0xb1, 0xbd, 0x32, 0x40, 0x12,
+ 0x6d, 0x33, 0x7a, 0x37, 0x55, 0xb1, 0xd2, 0x7, 0x80, 0x8, 0x80, 0x0, 0x6d,
+ 0x33, 0x7a, 0x37, 0x55, 0xb1, 0x7a, 0xa3, 0x55, 0xaf, 0x7e, 0x73, 0x66,
+ 0xf3, 0x7a, 0x73, 0x55, 0xb0, 0xa2, 0x7, 0x22, 0x7d, 0x3, 0x9d, 0x4, 0xbe,
+ 0x4, 0x0, 0x0, 0x22, 0xca, 0x3b, 0x7c, 0xd7, 0x7c, 0xcb, 0xc2, 0x0, 0x75,
+ 0x31, 0x0, 0x6d, 0x33, 0x7a, 0x35, 0x32, 0x7a, 0x35, 0x34, 0x7e, 0x74, 0x0,
+ 0xd, 0x7a, 0x35, 0x36, 0xa, 0x3d, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe7, 0x3,
+ 0x12, 0xcd, 0x3c, 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0xd5, 0x9, 0xf5, 0x31, 0xb4,
+ 0x2, 0x7, 0x12, 0xcd, 0x3c, 0x3e, 0x74, 0x80, 0x2f, 0xe5, 0x31, 0x70, 0x29,
+ 0x12, 0xcd, 0x3c, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x9, 0xb3, 0x39, 0x50, 0x9,
+ 0x73, 0x39, 0x51, 0x12, 0x36, 0x62, 0x7a, 0x35, 0x36, 0x74, 0x2, 0xac, 0xbd,
+ 0x49, 0x35, 0x38, 0xdb, 0xe, 0x34, 0xbe, 0x35, 0x36, 0x8, 0x6, 0x1e, 0x74,
+ 0x80, 0x2, 0x1e, 0x74, 0x7e, 0x10, 0x9, 0xac, 0x1d, 0x49, 0x40, 0x38, 0xef,
+ 0x74, 0x9, 0xac, 0xbc, 0x49, 0x25, 0x67, 0x1b, 0x7d, 0x12, 0x9d, 0x14, 0xbe,
+ 0x14, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x34, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x31, 0x7a, 0x35, 0x32, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x45, 0x38, 0xf1,
+ 0x74, 0x9, 0xac, 0xbc, 0x49, 0x35, 0x67, 0x1d, 0x12, 0xcc, 0x19, 0x8, 0x6,
+ 0x7d, 0x13, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x2e, 0x15, 0x32,
+ 0x7a, 0x15, 0x32, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x5, 0x39, 0x49, 0x12, 0xcf,
+ 0x72, 0x8, 0x4, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x7a, 0x25,
+ 0x34, 0x74, 0x9, 0xac, 0xbd, 0x49, 0x15, 0x39, 0x4b, 0x12, 0xf1, 0xae, 0x8,
+ 0x4, 0x9d, 0x31, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32, 0x2e, 0x35, 0x34, 0x7a,
+ 0x35, 0x34, 0xbe, 0x75, 0x32, 0x50, 0x4, 0xd2, 0x0, 0x80, 0xb, 0x7d, 0x37,
+ 0x3e, 0x34, 0xbe, 0x35, 0x34, 0x50, 0x2, 0xd2, 0x0, 0x7e, 0x35, 0x34, 0xbe,
+ 0x35, 0x32, 0x50, 0x2, 0xc2, 0x0, 0xe5, 0x31, 0x70, 0xb, 0x7e, 0x35, 0x32,
+ 0xbe, 0x34, 0x0, 0x41, 0x28, 0x2, 0xc2, 0x0, 0xa2, 0x0, 0xda, 0x3b, 0x22,
+ 0x3e, 0x74, 0x3e, 0x74, 0x3e, 0x74, 0x22, 0xca, 0xd8, 0xca, 0x79, 0x7c,
+ 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x95, 0xbe, 0xb0,
+ 0xff, 0x50, 0xa, 0x7d, 0x23, 0x2e, 0x24, 0x38, 0x95, 0x4, 0x7a, 0x29, 0xb0,
+ 0x74, 0x2, 0xac, 0xbe, 0x49, 0x25, 0x38, 0x9f, 0x4d, 0x22, 0x78, 0x13, 0x9,
+ 0x53, 0x38, 0x8b, 0xbe, 0x50, 0x0, 0x28, 0x3, 0x4e, 0xf0, 0x2, 0xe4, 0x19,
+ 0xb3, 0x38, 0x8b, 0x80, 0x52, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xcc, 0x22,
+ 0x50, 0xe, 0x4e, 0xf0, 0x2, 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x38, 0x8b, 0x6d,
+ 0x33, 0x80, 0x38, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe2, 0x11, 0x7c,
+ 0xbd, 0x7c, 0x7e, 0x12, 0x36, 0x73, 0x50, 0x8, 0x12, 0xcd, 0xfc, 0x44, 0x10,
+ 0x12, 0xce, 0x6, 0xa, 0x3e, 0x9, 0xb3, 0x38, 0x8b, 0x30, 0xe3, 0x18, 0x7c,
+ 0xbd, 0x7c, 0x7e, 0x12, 0xce, 0xaa, 0x50, 0xf, 0x12, 0xcd, 0xfc, 0x44, 0x20,
+ 0x7a, 0x39, 0xb0, 0x7e, 0x34, 0xff, 0xff, 0x12, 0xce, 0xd, 0x74, 0x2, 0xac,
+ 0xbe, 0x49, 0x35, 0x38, 0x9f, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x14, 0x4e, 0xf0,
+ 0x1, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xce, 0xc4, 0x50, 0x8, 0x12, 0xcd, 0xfc,
+ 0x44, 0x80, 0x12, 0xce, 0x6, 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xa,
+ 0x3e, 0x2e, 0x34, 0x38, 0x8b, 0x7e, 0x39, 0xb0, 0x22, 0x7a, 0x39, 0xb0,
+ 0x7e, 0x34, 0xff, 0xff, 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x38, 0x9f, 0x22,
+ 0xca, 0x3b, 0x7c, 0xe7, 0x7c, 0xdb, 0x6c, 0xff, 0x7c, 0xbd, 0x7c, 0x7e,
+ 0x12, 0xd2, 0xe5, 0x7c, 0xcb, 0x30, 0xe0, 0x9, 0x4e, 0xf0, 0x1, 0x7e, 0x34,
+ 0xb, 0xb8, 0x80, 0x35, 0x7c, 0xbc, 0x30, 0xe1, 0x20, 0x4e, 0xf0, 0x1, 0x7e,
+ 0x34, 0x0, 0x2, 0x12, 0xce, 0xd, 0x7c, 0xbd, 0x7c, 0x7e, 0x12, 0xd4, 0x7f,
+ 0x50, 0x20, 0x12, 0xce, 0x9, 0x12, 0xcd, 0xfc, 0x44, 0x80, 0x7a, 0x39, 0xb0,
+ 0x80, 0x13, 0x7c, 0xbc, 0x30, 0xe3, 0x9, 0x4e, 0xf0, 0x1, 0x7e, 0x34, 0x0,
+ 0xc, 0x80, 0x2, 0x6d, 0x33, 0x12, 0xce, 0xd, 0x7c, 0xbf, 0x30, 0xe0, 0x15,
+ 0xe4, 0xa, 0x3e, 0x19, 0xb3, 0x38, 0x95, 0x12, 0xd1, 0xc4, 0xac, 0x3e, 0x2e,
+ 0x14, 0x39, 0x49, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x6d, 0x33, 0x74, 0x2, 0xac,
+ 0xbe, 0x59, 0x35, 0x38, 0xb3, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x12, 0x36, 0x5a,
+ 0x74, 0x2, 0xac, 0xbe, 0x59, 0x35, 0x38, 0xdb, 0x6d, 0x33, 0x59, 0x35, 0x38,
+ 0xc7, 0x7c, 0xbf, 0xda, 0x3b, 0x22, 0x7c, 0x37, 0x7c, 0x2b, 0x7c, 0x73,
+ 0x12, 0xcf, 0x3d, 0x50, 0x2, 0xd3, 0x22, 0x7c, 0xb2, 0x7c, 0x73, 0x12, 0xce,
+ 0xc4, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0x7c, 0xab, 0xc2, 0x0, 0x6c, 0x77,
+ 0x80, 0x5d, 0xbc, 0x7a, 0x68, 0x57, 0x7e, 0x10, 0x9, 0xac, 0x17, 0x9, 0x60,
+ 0x67, 0x1f, 0x12, 0xcf, 0x68, 0x70, 0x49, 0x12, 0x87, 0xf2, 0xb4, 0x2, 0x43,
+ 0x7e, 0x90, 0x9, 0xac, 0x96, 0x49, 0xf4, 0x38, 0xef, 0x49, 0x20, 0x67, 0x1b,
+ 0x12, 0xcf, 0x34, 0x8, 0x4, 0x9d, 0x2f, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21,
+ 0xbe, 0x24, 0x0, 0xd, 0x28, 0x4, 0xd2, 0x0, 0x80, 0x29, 0x49, 0xf4, 0x38,
+ 0xf1, 0x49, 0x20, 0x67, 0x1d, 0x12, 0xcf, 0x34, 0x8, 0x4, 0x9d, 0x2f, 0x80,
+ 0x4, 0x6d, 0x22, 0x9d, 0x21, 0xbe, 0x24, 0x0, 0xd, 0x28, 0x4, 0xd2, 0x0,
+ 0x80, 0xa, 0xb, 0x70, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xb7, 0x38, 0x9b, 0xa2,
+ 0x0, 0x22, 0x7d, 0x12, 0x9d, 0x1f, 0xbe, 0x14, 0x0, 0x0, 0x22, 0x7c, 0xab,
+ 0xc2, 0x0, 0x6c, 0x77, 0x80, 0x18, 0xbc, 0x7a, 0x68, 0x12, 0x7e, 0x50, 0x9,
+ 0xac, 0x57, 0x9, 0x62, 0x67, 0x1f, 0x12, 0xcf, 0x68, 0x70, 0x4, 0xd2, 0x0,
+ 0x80, 0xa, 0xb, 0x70, 0x7e, 0xb3, 0x68, 0x79, 0xbc, 0xb7, 0x38, 0xe0, 0xa2,
+ 0x0, 0x22, 0x5e, 0x60, 0xf, 0xa, 0x26, 0x9, 0xb2, 0x38, 0x8b, 0x22, 0x7d,
+ 0x12, 0x9d, 0x10, 0xbe, 0x14, 0x0, 0x0, 0x22, 0xca, 0x3b, 0x7e, 0xa0, 0x64,
+ 0x6c, 0x77, 0x80, 0x64, 0xa, 0x27, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x52, 0x7e,
+ 0xf0, 0x2, 0xac, 0xf6, 0x9, 0xb7, 0x65, 0x60, 0xa, 0xb, 0x7e, 0xd0, 0x2,
+ 0xac, 0xd7, 0x9, 0xb6, 0x65, 0x60, 0xa, 0x2b, 0x12, 0xcf, 0x72, 0x8, 0x4,
+ 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21, 0x9, 0x47, 0x65, 0x61, 0xa,
+ 0x44, 0x9, 0x46, 0x65, 0x61, 0xa, 0x14, 0x7d, 0x1, 0x12, 0xcc, 0x1b, 0x8,
+ 0x4, 0x9d, 0x14, 0x80, 0x4, 0x6d, 0x11, 0x9d, 0x10, 0x7c, 0x43, 0xbc, 0x45,
+ 0x50, 0x4, 0x7c, 0x35, 0x80, 0x2, 0x7c, 0x34, 0xbc, 0xa3, 0x28, 0x2, 0x7c,
+ 0xa3, 0xb, 0x60, 0x7e, 0x23, 0x66, 0xea, 0xbc, 0x26, 0x38, 0xa6, 0xb, 0x70,
+ 0x7e, 0xb3, 0x66, 0xea, 0xbc, 0xb7, 0x38, 0x94, 0xbe, 0xa0, 0x64, 0x78, 0x2,
+ 0x6c, 0xaa, 0x7c, 0xba, 0xda, 0x3b, 0x22, 0x7d, 0x23, 0x12, 0x9f, 0x94,
+ 0x28, 0x4c, 0x7e, 0x37, 0x66, 0xf0, 0xbd, 0x32, 0x8, 0x2, 0xe4, 0x22, 0x7e,
+ 0xb3, 0x66, 0xf2, 0x7e, 0x73, 0x66, 0xf3, 0x12, 0xa0, 0xc4, 0x50, 0x32,
+ 0x7e, 0x27, 0x68, 0x89, 0x7d, 0x32, 0x3e, 0x34, 0xbe, 0x37, 0x66, 0xf0,
+ 0x48, 0x3, 0x74, 0x1, 0x22, 0x7d, 0x32, 0x3e, 0x34, 0x3e, 0x34, 0xbe, 0x37,
+ 0x66, 0xf0, 0x48, 0x3, 0x74, 0x2, 0x22, 0x7e, 0x34, 0x0, 0x6, 0xad, 0x32,
+ 0xbe, 0x37, 0x66, 0xf0, 0x48, 0x3, 0x74, 0x3, 0x22, 0x74, 0x4, 0x22, 0x74,
+ 0xff, 0x22, 0xe4, 0x22, 0x7c, 0x1b, 0x90, 0xd, 0xe, 0xe4, 0x93, 0xa, 0x3b,
+ 0x1b, 0x34, 0x7c, 0x7, 0x80, 0x12, 0xbc, 0x10, 0x68, 0xc, 0x12, 0xd0, 0xd2,
+ 0x9, 0xb1, 0x68, 0x29, 0xbe, 0xb0, 0x3, 0x68, 0x7, 0x1b, 0x0, 0xbe, 0x0,
+ 0x0, 0x58, 0xe9, 0xbe, 0x0, 0x0, 0x58, 0x2, 0x7c, 0x1, 0x6c, 0x99, 0x80,
+ 0x4a, 0x1a, 0xe9, 0x7e, 0xf4, 0x0, 0x9, 0xad, 0xfe, 0x9, 0x8f, 0x67, 0x1f,
+ 0xbc, 0x81, 0x78, 0x2e, 0x12, 0xd1, 0x17, 0x7d, 0x1f, 0x12, 0x8f, 0xc9,
+ 0x12, 0x2a, 0xc1, 0x1a, 0x29, 0x7e, 0x34, 0x0, 0x9, 0xad, 0x32, 0x19, 0x3,
+ 0x67, 0x1f, 0xe4, 0x12, 0xd0, 0xd2, 0x19, 0xb1, 0x68, 0x2a, 0x19, 0xb1,
+ 0x68, 0x29, 0x7e, 0xb3, 0x68, 0x79, 0x4, 0x7a, 0xb3, 0x68, 0x79, 0x80, 0xa,
+ 0xbc, 0x80, 0x78, 0x6, 0x74, 0xff, 0x19, 0xbf, 0x67, 0x1f, 0xb, 0x90, 0x12,
+ 0x85, 0xb, 0x18, 0xb1, 0x22, 0x1a, 0x10, 0x3e, 0x14, 0x3e, 0x14, 0x3e, 0x14,
+ 0x22, 0xca, 0xf8, 0x7f, 0x60, 0x6c, 0xff, 0x12, 0xd1, 0xd, 0x30, 0xe2, 0x5,
+ 0x7c, 0xbf, 0x12, 0xd0, 0x51, 0xb, 0xf0, 0xbe, 0xf0, 0xa, 0x78, 0xee, 0x6c,
+ 0xff, 0x12, 0xd1, 0xd, 0x30, 0xe3, 0x5, 0x7c, 0xbf, 0x12, 0xd1, 0xd1, 0xb,
+ 0xf0, 0xbe, 0xf0, 0xa, 0x40, 0xee, 0x12, 0xd2, 0x55, 0xda, 0xf8, 0x22, 0xa,
+ 0x3f, 0x2d, 0x3d, 0x7d, 0x2c, 0x7e, 0x1b, 0xb0, 0x22, 0x7e, 0x70, 0x9, 0xac,
+ 0x71, 0x2e, 0x34, 0x39, 0x49, 0x22, 0x7c, 0x17, 0x7c, 0x3b, 0x12, 0xd1,
+ 0x17, 0x74, 0x9, 0xac, 0x3b, 0x2e, 0x14, 0x67, 0x1b, 0x12, 0x2a, 0xc1, 0x6c,
+ 0x0, 0x7e, 0x70, 0x8, 0xac, 0x71, 0x19, 0x3, 0x68, 0x2a, 0xe4, 0x19, 0xb3,
+ 0x68, 0x29, 0x74, 0x8, 0xa, 0x31, 0x19, 0xb3, 0x1, 0x83, 0x22, 0xca, 0xf8,
+ 0x7f, 0x70, 0x7e, 0x93, 0x68, 0x79, 0x6c, 0x88, 0x80, 0x5d, 0x7e, 0x70, 0x9,
+ 0xac, 0x78, 0x12, 0xd1, 0xbc, 0x12, 0xd1, 0xc9, 0xac, 0x3f, 0x2e, 0x14,
+ 0x38, 0xef, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x12, 0x36, 0x55, 0x7d, 0x23, 0x74,
+ 0x2, 0xac, 0xbf, 0x49, 0x35, 0x38, 0xc7, 0xbd, 0x32, 0x28, 0x6, 0x49, 0x35,
+ 0x38, 0xc7, 0x80, 0x3, 0x12, 0x36, 0x55, 0x74, 0x2, 0xac, 0xbf, 0x59, 0x35,
+ 0x38, 0xc7, 0xa, 0x58, 0x7f, 0x17, 0x2d, 0x35, 0x7e, 0x1b, 0x30, 0x7c, 0xb3,
+ 0x30, 0xe0, 0x9, 0x7c, 0xb8, 0x7c, 0x7f, 0x12, 0xd2, 0xa, 0x80, 0xc, 0x7c,
+ 0xb3, 0x30, 0xe1, 0x7, 0x7c, 0xb8, 0x7c, 0x7f, 0x12, 0xd1, 0x21, 0xb, 0x80,
+ 0xbc, 0x98, 0x38, 0x9f, 0xda, 0xf8, 0x22, 0x9, 0xf3, 0x67, 0x1f, 0x5e, 0xf0,
+ 0xf, 0x22, 0x7e, 0x70, 0x9, 0xac, 0x7d, 0x2e, 0x34, 0x67, 0x1b, 0x7e, 0x30,
+ 0x9, 0x22, 0x7c, 0x7b, 0x74, 0x8, 0xac, 0xb7, 0x9, 0xb5, 0x68, 0x29, 0xb4,
+ 0x1, 0x2b, 0x7e, 0x63, 0x68, 0x79, 0x80, 0x15, 0x7e, 0x50, 0x9, 0xac, 0x56,
+ 0x9, 0x32, 0x67, 0x1f, 0xbc, 0x37, 0x78, 0x6, 0x74, 0xff, 0x19, 0xb2, 0x67,
+ 0x1f, 0xb, 0x60, 0xbe, 0x60, 0xa, 0x40, 0xe6, 0x7e, 0xa0, 0x3, 0x74, 0x8,
+ 0xac, 0x7b, 0x19, 0xa3, 0x68, 0x29, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x7e,
+ 0xb3, 0x68, 0x79, 0xbe, 0xb0, 0x0, 0x28, 0x3d, 0x14, 0x7a, 0xb3, 0x68, 0x79,
+ 0x7e, 0x70, 0xff, 0x74, 0x9, 0xac, 0x5b, 0x19, 0x72, 0x67, 0x1f, 0x7e, 0x70,
+ 0x3, 0x7e, 0x50, 0x8, 0xac, 0x5a, 0x19, 0x72, 0x68, 0x29, 0x7e, 0x50, 0x2,
+ 0xac, 0x5a, 0x49, 0x32, 0x38, 0x9f, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x9, 0x2e,
+ 0x24, 0x38, 0x9f, 0x1b, 0x34, 0x1b, 0x28, 0x30, 0x7e, 0xb3, 0x39, 0xa3, 0x4,
+ 0x7a, 0xb3, 0x39, 0xa3, 0x22, 0xca, 0x3b, 0x6c, 0xff, 0x6c, 0xee, 0x6c,
+ 0x11, 0x7e, 0x30, 0x9, 0xac, 0x31, 0x7d, 0x31, 0x2e, 0x34, 0x67, 0x1b, 0x2e,
+ 0x14, 0x2e, 0x81, 0x12, 0x87, 0xe1, 0xa5, 0xb9, 0xa, 0xea, 0x7e, 0x8, 0x67,
+ 0x1b, 0x7e, 0x34, 0x0, 0x5a, 0x74, 0xff, 0x12, 0x0, 0x2e, 0x6c, 0x11, 0x7e,
+ 0x90, 0x9, 0xac, 0x91, 0x9, 0xd4, 0x2e, 0x85, 0xbe, 0xd0, 0xff, 0x68, 0x4b,
+ 0x74, 0x8, 0xac, 0xbd, 0x9, 0xc5, 0x68, 0x29, 0xbe, 0xc0, 0x2, 0x68, 0x4,
+ 0x4c, 0xcc, 0x78, 0x15, 0x7d, 0x34, 0x2e, 0x34, 0x2e, 0x81, 0x7e, 0x30, 0x9,
+ 0xac, 0x3f, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0xb, 0xf0, 0x80, 0x25, 0xbe,
+ 0xc0, 0x1, 0x78, 0x20, 0x7d, 0x34, 0x2e, 0x34, 0x2e, 0x81, 0xa, 0x2e, 0x7e,
+ 0x3, 0x68, 0x79, 0xa, 0x40, 0x2d, 0x42, 0x7e, 0x54, 0x0, 0x9, 0xad, 0x54,
+ 0x7d, 0x15, 0x12, 0x8f, 0xc9, 0x12, 0x2a, 0xc1, 0xb, 0xe0, 0xb, 0x10, 0xbe,
+ 0x10, 0xa, 0x40, 0xa0, 0xda, 0x3b, 0x22, 0x7c, 0xa7, 0x7c, 0x5b, 0x7e, 0x70,
+ 0x9, 0xac, 0x75, 0x49, 0x43, 0x67, 0x1b, 0x49, 0x23, 0x67, 0x1d, 0xe4, 0xa,
+ 0x3a, 0x19, 0xb3, 0x38, 0x8b, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14, 0xbe, 0x44,
+ 0x0, 0x0, 0x50, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe, 0x24, 0x8, 0xe8,
+ 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x4, 0x38, 0x28, 0x19, 0xbe, 0x44, 0x4,
+ 0x38, 0x38, 0x13, 0xbe, 0x24, 0x0, 0x0, 0x40, 0xd, 0xbe, 0x24, 0x8, 0xe8,
+ 0x38, 0x7, 0x12, 0xd4, 0x75, 0x44, 0x1, 0x80, 0x3c, 0xbe, 0x44, 0x0, 0x0,
+ 0x40, 0x19, 0xbe, 0x44, 0x0, 0x28, 0x38, 0x13, 0xbe, 0x24, 0x0, 0x0, 0x40,
+ 0xd, 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x7, 0x12, 0xd4, 0x75, 0x44, 0x2, 0x80,
+ 0x1d, 0xbe, 0x44, 0x4, 0x10, 0x40, 0x1a, 0xbe, 0x44, 0x4, 0x38, 0x38, 0x14,
+ 0xbe, 0x24, 0x0, 0x0, 0x40, 0xe, 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x8, 0x12,
+ 0xd4, 0x75, 0x44, 0x2, 0x7a, 0x19, 0xb0, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14,
+ 0xbe, 0x44, 0x0, 0x28, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe,
+ 0x24, 0x8, 0xe8, 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x4, 0x10, 0x40, 0x1a,
+ 0xbe, 0x44, 0x4, 0x38, 0x38, 0x14, 0xbe, 0x24, 0x0, 0x0, 0x40, 0xe, 0xbe,
+ 0x24, 0x8, 0xe8, 0x38, 0x8, 0x12, 0xd4, 0x75, 0x44, 0x4, 0x7a, 0x19, 0xb0,
+ 0x7e, 0x33, 0x53, 0xfa, 0xa5, 0xbb, 0x0, 0x3c, 0xbe, 0x44, 0x0, 0x0, 0x40,
+ 0x14, 0xbe, 0x44, 0x0, 0x0, 0x38, 0xe, 0xbe, 0x24, 0x8, 0xe8, 0x40, 0x8,
+ 0xbe, 0x24, 0x8, 0xe8, 0x38, 0x2, 0x81, 0x5d, 0xbe, 0x44, 0x4, 0x38, 0x50,
+ 0x2, 0x81, 0x70, 0xbe, 0x44, 0x4, 0x38, 0x28, 0x2, 0x81, 0x70, 0xbe, 0x24,
+ 0x8, 0xe8, 0x50, 0x2, 0x81, 0x70, 0xbe, 0x24, 0x8, 0xe8, 0x28, 0x2, 0x81,
+ 0x70, 0x80, 0x6a, 0xa5, 0xbb, 0x1, 0x34, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x14,
+ 0xbe, 0x44, 0x0, 0xa0, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe,
+ 0x24, 0x0, 0x78, 0x38, 0x2, 0x80, 0x4c, 0xbe, 0x44, 0x0, 0x0, 0x40, 0x59,
+ 0xbe, 0x44, 0x0, 0xa0, 0x38, 0x53, 0xbe, 0x24, 0x8, 0x70, 0x40, 0x4d, 0xbe,
+ 0x24, 0x8, 0xe8, 0x38, 0x47, 0x80, 0x32, 0xbe, 0x44, 0x3, 0x98, 0x40, 0x14,
+ 0xbe, 0x44, 0x4, 0x38, 0x38, 0xe, 0xbe, 0x24, 0x0, 0x0, 0x40, 0x8, 0xbe,
+ 0x24, 0x0, 0x78, 0x38, 0x2, 0x80, 0x18, 0xbe, 0x44, 0x3, 0x98, 0x40, 0x25,
+ 0xbe, 0x44, 0x4, 0x38, 0x38, 0x1f, 0xbe, 0x24, 0x8, 0x70, 0x40, 0x19, 0xbe,
+ 0x24, 0x8, 0xe8, 0x38, 0x13, 0xe4, 0x19, 0xb3, 0x38, 0x8b, 0x7d, 0x23, 0x2e,
+ 0x24, 0x38, 0x8b, 0x7e, 0x29, 0xb0, 0x44, 0x8, 0x7a, 0x29, 0xb0, 0x9, 0xb3,
+ 0x38, 0x8b, 0x22, 0x7d, 0x13, 0x2e, 0x14, 0x38, 0x8b, 0x7e, 0x19, 0xb0,
+ 0x22, 0xca, 0x3b, 0x7c, 0x17, 0x7c, 0xb, 0xc2, 0x0, 0x6c, 0xdd, 0x20, 0x0,
+ 0x78, 0xbc, 0x1d, 0x68, 0x6d, 0xa, 0x1d, 0x9, 0xb1, 0x38, 0x8b, 0x60, 0x65,
+ 0x74, 0x9, 0xac, 0xbd, 0x9, 0x95, 0x38, 0xf6, 0x9, 0x85, 0x38, 0xf7, 0x74,
+ 0x9, 0xac, 0xb0, 0x9, 0xf5, 0x67, 0x22, 0x9, 0xe5, 0x67, 0x23, 0xbc, 0xf9,
+ 0x78, 0x49, 0xbc, 0xe8, 0x28, 0x4, 0xa, 0x58, 0x80, 0x2, 0xa, 0x5e, 0xbc,
+ 0xe8, 0x50, 0x4, 0xa, 0x18, 0x80, 0x2, 0xa, 0x1e, 0x9d, 0x15, 0xbe, 0x14,
+ 0x0, 0x5, 0x18, 0x2d, 0xd2, 0x0, 0xbc, 0xe8, 0x28, 0x4, 0x7c, 0xc8, 0x80,
+ 0x13, 0x7c, 0xce, 0x80, 0xf, 0x7c, 0xb9, 0x7c, 0x7c, 0x12, 0x37, 0x81, 0x58,
+ 0x4, 0xc2, 0x0, 0x80, 0x12, 0xb, 0xc0, 0xbc, 0xe8, 0x50, 0x4, 0xa, 0x58,
+ 0x80, 0x2, 0xa, 0x5e, 0xa, 0x1c, 0xbd, 0x15, 0x8, 0xe1, 0xb, 0xd0, 0xbe,
+ 0xd0, 0xa, 0x40, 0x85, 0xa2, 0x0, 0xda, 0x3b, 0x22, 0xca, 0x79, 0x7c, 0xf7,
+ 0x7c, 0xeb, 0x75, 0x38, 0x1, 0x75, 0x42, 0x1, 0x6d, 0xff, 0x7d, 0xdf, 0x7e,
+ 0x8, 0x2e, 0x89, 0x7e, 0x34, 0x0, 0x51, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8,
+ 0x2e, 0x81, 0x7e, 0x34, 0x0, 0x8, 0x12, 0x0, 0x2e, 0x74, 0x9, 0xac, 0xbe,
+ 0x9, 0x15, 0x67, 0x22, 0x9, 0x5, 0x67, 0x23, 0x74, 0x1, 0x7a, 0xb3, 0x2e,
+ 0xb1, 0x7a, 0x11, 0x3c, 0x7a, 0x11, 0x3d, 0x7a, 0x1, 0x41, 0x7a, 0x1, 0x40,
+ 0x75, 0x45, 0x1, 0xe5, 0x45, 0x1a, 0xcb, 0x1a, 0x11, 0x9d, 0x1c, 0xbe, 0x14,
+ 0x0, 0x0, 0x58, 0x3, 0xe4, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3a, 0x1a, 0x11,
+ 0x2d, 0x1c, 0x90, 0x1, 0x8a, 0x12, 0xd7, 0x9c, 0x58, 0x2, 0x80, 0x2, 0x7c,
+ 0xb3, 0xf5, 0x3b, 0x1a, 0x10, 0x9d, 0x1c, 0xbe, 0x14, 0x0, 0x0, 0x58, 0x3,
+ 0xe4, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3e, 0x1a, 0x10, 0x2d, 0x1c, 0x90, 0x1,
+ 0x8b, 0x12, 0xd7, 0x9c, 0x58, 0x2, 0x80, 0x2, 0x7c, 0xb3, 0xf5, 0x3f, 0x85,
+ 0x3a, 0x39, 0xc1, 0xe2, 0x7e, 0x91, 0x3e, 0xc1, 0xd8, 0x12, 0xd7, 0x85, 0x9,
+ 0xb1, 0x2e, 0xb1, 0xbe, 0xb0, 0x1, 0x78, 0x2, 0xc1, 0xd6, 0xe5, 0x39, 0x7c,
+ 0x79, 0x12, 0x36, 0x62, 0xbe, 0x34, 0x0, 0x0, 0xe5, 0x39, 0x7c, 0x79, 0x8,
+ 0x7, 0x12, 0x36, 0x62, 0x7d, 0xe3, 0x80, 0x7, 0x12, 0x36, 0x62, 0x6d, 0xee,
+ 0x9d, 0xe3, 0xbe, 0xe4, 0x0, 0x32, 0x50, 0x2, 0xc1, 0xd6, 0xe5, 0x45, 0xb4,
+ 0x1, 0xc, 0x7e, 0xa0, 0x1, 0x12, 0xd7, 0x85, 0x19, 0xa1, 0x2e, 0xb1, 0x80,
+ 0x2b, 0x12, 0xd7, 0x85, 0x9, 0xb1, 0x2e, 0xa8, 0xb4, 0x1, 0x2, 0x80, 0x19,
+ 0x9, 0xb1, 0x2e, 0xba, 0xb4, 0x1, 0x2, 0x80, 0x10, 0x9, 0xb1, 0x2e, 0xb0,
+ 0xb4, 0x1, 0x2, 0x80, 0x7, 0x9, 0xb1, 0x2e, 0xb2, 0xb4, 0x1, 0x6, 0x74, 0x1,
+ 0x19, 0xb1, 0x2e, 0xb1, 0x1a, 0xc1, 0xe5, 0x39, 0x1a, 0x1b, 0x9d, 0x1c,
+ 0x7e, 0x34, 0x0, 0x9, 0xad, 0x31, 0x1a, 0x20, 0x1a, 0xc9, 0x9d, 0xc2, 0x2d,
+ 0x3c, 0x9, 0xb3, 0x2e, 0xb1, 0xb4, 0x1, 0x2, 0x80, 0x2, 0xc1, 0xd6, 0xe5,
+ 0x39, 0xbe, 0xb1, 0x3c, 0x8, 0x4, 0xe5, 0x3c, 0x80, 0x2, 0xe5, 0x39, 0xf5,
+ 0x3c, 0xe5, 0x39, 0xbe, 0xb1, 0x3d, 0x58, 0x4, 0xe5, 0x3d, 0x80, 0x2, 0xe5,
+ 0x39, 0xf5, 0x3d, 0xbe, 0x91, 0x40, 0x8, 0x4, 0xe5, 0x40, 0x80, 0x2, 0x7c,
+ 0xb9, 0xf5, 0x40, 0xbe, 0x91, 0x41, 0x58, 0x4, 0xe5, 0x41, 0x80, 0x2, 0x7c,
+ 0xb9, 0xf5, 0x41, 0xbe, 0x14, 0x0, 0x0, 0x8, 0xa, 0x1a, 0x31, 0xe5, 0x39,
+ 0x1a, 0x5b, 0x9d, 0x53, 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x51, 0x7e, 0x14, 0x0,
+ 0x1, 0x7d, 0x31, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78, 0xfb, 0x7c, 0xb7, 0xf5,
+ 0x43, 0xbe, 0xc4, 0x0, 0x0, 0x8, 0x8, 0x1a, 0x30, 0x1a, 0x59, 0x9d, 0x53,
+ 0x80, 0x4, 0x6d, 0x55, 0x9d, 0x5c, 0x60, 0x5, 0x3e, 0x14, 0x14, 0x78, 0xfb,
+ 0x7c, 0x83, 0x7a, 0x81, 0x44, 0xa, 0x38, 0x12, 0xd7, 0xa5, 0x2d, 0xd1, 0xe5,
+ 0x43, 0xa, 0x3b, 0x12, 0xd7, 0xa5, 0x2d, 0xf1, 0x5, 0x42, 0xe5, 0x45, 0x1a,
+ 0xcb, 0x3e, 0xc4, 0x2e, 0xc4, 0x2e, 0x7f, 0xb, 0xc8, 0x10, 0x2d, 0x1e, 0x1b,
+ 0xc8, 0x10, 0xb, 0x90, 0xe5, 0x3f, 0xbc, 0xb9, 0x48, 0x2, 0xa1, 0xa5, 0x5,
+ 0x39, 0xe5, 0x3b, 0xbe, 0xb1, 0x39, 0x48, 0x2, 0xa1, 0xa0, 0x5, 0x45, 0xe5,
+ 0x45, 0xb4, 0x4, 0x2, 0x80, 0x2, 0xa1, 0x51, 0xe5, 0x40, 0x1a, 0xeb, 0xe5,
+ 0x41, 0x1a, 0xcb, 0x9d, 0xce, 0xb, 0xc4, 0x1e, 0xd4, 0x1e, 0xd4, 0x1e, 0xd4,
+ 0x1e, 0xd4, 0xad, 0xdc, 0xe5, 0x3c, 0x1a, 0xcb, 0xe5, 0x3d, 0x1a, 0xeb,
+ 0x9d, 0xec, 0xb, 0xe4, 0x1e, 0xf4, 0x1e, 0xf4, 0x1e, 0xf4, 0x1e, 0xf4, 0xad,
+ 0xfe, 0x7e, 0x50, 0x2, 0xac, 0x5f, 0x49, 0x32, 0x38, 0xb3, 0x7d, 0xef, 0x3e,
+ 0xe4, 0x3e, 0xe4, 0xbd, 0x3e, 0x28, 0x5, 0x75, 0x38, 0x2, 0x80, 0x36, 0x7d,
+ 0xef, 0x3e, 0xe4, 0xbd, 0xed, 0x38, 0x2, 0x80, 0x29, 0xe5, 0x42, 0xbe, 0xb0,
+ 0x19, 0x8, 0x2, 0x80, 0x20, 0xe5, 0x42, 0xbe, 0xb0, 0x5, 0x58, 0xd, 0x4c,
+ 0x11, 0x68, 0x15, 0x12, 0x37, 0xef, 0xbc, 0xb1, 0x78, 0x2, 0x80, 0xc, 0x7e,
+ 0xe7, 0x2e, 0x85, 0x3e, 0xe4, 0xbe, 0xe7, 0x2e, 0x87, 0x28, 0x3, 0x75, 0x38,
+ 0x0, 0xbd, 0x3f, 0x28, 0x6, 0x49, 0x32, 0x38, 0xb3, 0x80, 0x2, 0x7d, 0x3f,
+ 0x59, 0x32, 0x38, 0xb3, 0xe5, 0x38, 0xda, 0x79, 0x22, 0x1a, 0x31, 0xe5,
+ 0x39, 0x1a, 0x2b, 0x9d, 0x23, 0x7e, 0x34, 0x0, 0x9, 0xad, 0x32, 0x1a, 0x20,
+ 0x1a, 0x19, 0x9d, 0x12, 0x2d, 0x13, 0x22, 0xe4, 0x93, 0xa, 0x5b, 0x1b, 0x54,
+ 0xbd, 0x51, 0x22, 0xad, 0x3e, 0x7d, 0x13, 0x1e, 0x14, 0x1e, 0x14, 0x1e,
+ 0x14, 0x22, 0x7e, 0x8, 0x56, 0xbf, 0x7e, 0x34, 0x0, 0x1, 0x74, 0xff, 0x2,
+ 0x0, 0x2e, 0xca, 0x79, 0x7f, 0x60, 0x7c, 0xf5, 0x7c, 0xe6, 0x12, 0xda, 0x39,
+ 0x7d, 0xb3, 0x7c, 0xbe, 0x7c, 0x7f, 0x12, 0xda, 0x39, 0x2d, 0x3b, 0x12,
+ 0x9f, 0x85, 0x7d, 0xa3, 0x7e, 0x25, 0x46, 0x7d, 0x12, 0x9d, 0x1a, 0xbe,
+ 0x14, 0x0, 0x0, 0x8, 0x6, 0x7d, 0x32, 0x9d, 0x3a, 0x80, 0x4, 0x6d, 0x33,
+ 0x9d, 0x31, 0x7d, 0x12, 0x1a, 0x2, 0x1a, 0x0, 0x9f, 0x6, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0x6, 0x7d, 0xd, 0x9d, 0x20, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x21,
+ 0x7e, 0x14, 0x0, 0x3, 0xad, 0x13, 0xbd, 0x12, 0x58, 0xf, 0xbe, 0x24, 0x0,
+ 0x64, 0x8, 0x9, 0xbe, 0x34, 0x0, 0x46, 0x8, 0x3, 0xd3, 0x80, 0x1, 0xc3,
+ 0xda, 0x79, 0x22, 0xca, 0x3b, 0x7c, 0x45, 0x7c, 0x57, 0x7c, 0x7b, 0x75,
+ 0x46, 0x0, 0x7e, 0xe0, 0xff, 0x75, 0x4c, 0x0, 0x7e, 0xf4, 0x7f, 0xff, 0xbc,
+ 0x67, 0x28, 0x4, 0x7c, 0xd7, 0x80, 0x2, 0x7c, 0xd6, 0xbc, 0x67, 0x50, 0x4,
+ 0x7c, 0xa7, 0x80, 0x2, 0x7c, 0xa6, 0xbc, 0x45, 0x28, 0x4, 0x7c, 0xc5, 0x80,
+ 0x2, 0x7c, 0xc4, 0xbc, 0x45, 0x50, 0x4, 0x7c, 0xb5, 0x80, 0x2, 0x7c, 0xb4,
+ 0xf5, 0x47, 0x7a, 0xd1, 0x48, 0x7a, 0xc1, 0x49, 0x7a, 0xa1, 0x4a, 0x85,
+ 0x47, 0x4b, 0x75, 0x4c, 0x1, 0xbe, 0x51, 0x49, 0x78, 0x8, 0xe5, 0x48, 0xbc,
+ 0xb7, 0x50, 0xb, 0x80, 0x6, 0xe5, 0x48, 0xbc, 0xb6, 0x50, 0x3, 0x75, 0x4c,
+ 0x0, 0xe5, 0x4c, 0x60, 0x2, 0x21, 0xa8, 0x7c, 0xda, 0x21, 0xa8, 0x7e, 0x8,
+ 0x0, 0x4d, 0x7e, 0x34, 0x0, 0xc, 0x74, 0xff, 0x12, 0x0, 0x2e, 0xe5, 0x4c,
+ 0x60, 0x7a, 0x12, 0xda, 0x1, 0x18, 0x3, 0x12, 0xd9, 0xec, 0xa, 0xd, 0xb,
+ 0x4, 0xe5, 0x4a, 0xa, 0x1b, 0xbd, 0x1, 0x18, 0x9, 0xa, 0x5d, 0xb, 0x54,
+ 0xf5, 0x51, 0x7a, 0xc1, 0x52, 0xbd, 0x1, 0x18, 0xb, 0xbd, 0x23, 0x18, 0x7,
+ 0xa, 0x5d, 0xb, 0x54, 0x12, 0xd9, 0xe3, 0x7e, 0xe4, 0x80, 0x1, 0x6c, 0xff,
+ 0x12, 0xd9, 0xd5, 0x7c, 0x6b, 0xbe, 0x60, 0xff, 0x68, 0xe, 0x12, 0xd9, 0xf6,
+ 0x68, 0x9, 0x12, 0xda, 0x1f, 0x8, 0x4, 0x7d, 0xe3, 0x7c, 0xef, 0xb, 0xf0,
+ 0xbe, 0xf0, 0x3, 0x78, 0xe1, 0x12, 0xda, 0xc, 0x78, 0xa, 0x12, 0xd9, 0xdb,
+ 0xbe, 0xb1, 0x4a, 0x78, 0x2, 0x21, 0xb6, 0xe5, 0x4b, 0xbe, 0xb1, 0x49, 0x78,
+ 0xa, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x4a, 0x78, 0x2, 0x21, 0xb6, 0xbe, 0xe0,
+ 0xff, 0x78, 0x2, 0x21, 0xa8, 0x80, 0x72, 0x12, 0xda, 0x1, 0x18, 0x3, 0x12,
+ 0xd9, 0xec, 0xa, 0xd, 0x1b, 0x4, 0xe5, 0x48, 0xa, 0x1b, 0xbd, 0x1, 0x48,
+ 0x9, 0xa, 0x5d, 0x1b, 0x54, 0xf5, 0x51, 0x7a, 0xc1, 0x52, 0xbd, 0x1, 0x48,
+ 0xb, 0xbd, 0x23, 0x18, 0x7, 0xa, 0x5d, 0x1b, 0x54, 0x12, 0xd9, 0xe3, 0x7e,
+ 0xe4, 0x80, 0x1, 0x6c, 0xff, 0x12, 0xd9, 0xd5, 0x7c, 0x6b, 0xbe, 0x60, 0xff,
+ 0x68, 0xe, 0x12, 0xd9, 0xf6, 0x68, 0x9, 0x12, 0xda, 0x1f, 0x8, 0x4, 0x7d,
+ 0xe3, 0x7c, 0xef, 0xb, 0xf0, 0xbe, 0xf0, 0x3, 0x78, 0xe1, 0x12, 0xda, 0xc,
+ 0x78, 0x8, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x48, 0x68, 0x3b, 0xe5, 0x4b, 0xbe,
+ 0xb1, 0x49, 0x78, 0x8, 0x12, 0xd9, 0xdb, 0xbe, 0xb1, 0x48, 0x68, 0x2c, 0xbe,
+ 0xe0, 0xff, 0x68, 0x19, 0x7e, 0x71, 0x46, 0x74, 0x2, 0xac, 0x7b, 0x59, 0xe3,
+ 0x52, 0xd2, 0x2e, 0x10, 0x4d, 0xa5, 0xe7, 0x7c, 0xdb, 0x7c, 0xca, 0x5, 0x46,
+ 0x7e, 0xe0, 0xff, 0xe5, 0x47, 0xa, 0x2b, 0xb, 0x24, 0xa, 0x3c, 0xbd, 0x32,
+ 0x68, 0x2, 0x1, 0x92, 0x6c, 0xff, 0x80, 0x10, 0x74, 0x2, 0xac, 0xbf, 0x49,
+ 0xe5, 0x52, 0xd2, 0xbd, 0xef, 0x58, 0x2, 0x7d, 0xfe, 0xb, 0xf0, 0xe5, 0x46,
+ 0xbc, 0xbf, 0x38, 0xea, 0x7d, 0x3f, 0xda, 0x3b, 0x22, 0x7c, 0x1f, 0x3e,
+ 0x10, 0x3e, 0x10, 0x7c, 0x1, 0x2e, 0x0, 0x4d, 0xa5, 0xe6, 0x22, 0xf5, 0x55,
+ 0xa, 0x5c, 0xb, 0x54, 0xf5, 0x56, 0x22, 0x7a, 0xd1, 0x4d, 0xa, 0x5c, 0xb,
+ 0x54, 0xf5, 0x4e, 0x22, 0x2e, 0x10, 0x4e, 0xa5, 0xe7, 0x7c, 0x7b, 0xbe,
+ 0x70, 0xff, 0x22, 0xa, 0x2c, 0xb, 0x24, 0xe5, 0x4b, 0xa, 0x3b, 0xbd, 0x23,
+ 0x22, 0x7c, 0x1e, 0x3e, 0x10, 0x3e, 0x10, 0x7c, 0x1, 0x2e, 0x0, 0x4e, 0xa5,
+ 0xe6, 0x7c, 0xab, 0xbe, 0xa1, 0x4b, 0x22, 0x7c, 0xb6, 0x12, 0x36, 0x62,
+ 0x7d, 0x23, 0x7c, 0xbf, 0x3e, 0xb0, 0x3e, 0xb0, 0x24, 0x4f, 0xa, 0x3b, 0x1b,
+ 0x38, 0x20, 0xb, 0x38, 0x30, 0xbd, 0x3e, 0x22, 0xca, 0x79, 0x7c, 0x8b, 0x7e,
+ 0xb3, 0x68, 0xa8, 0xf5, 0x4b, 0x7e, 0x93, 0x68, 0xa9, 0x7e, 0x4, 0x80, 0x1,
+ 0x7c, 0xf7, 0x1a, 0x18, 0x1b, 0x14, 0x7c, 0xe3, 0x41, 0xd8, 0x7a, 0xe1,
+ 0x49, 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x5e, 0x1a, 0x18, 0x9d, 0x15, 0x1a,
+ 0x58, 0x2d, 0x51, 0xf5, 0x49, 0xe5, 0x4b, 0xbc, 0xbe, 0x18, 0xc, 0x1a, 0x58,
+ 0x1a, 0x1e, 0x9d, 0x15, 0x1a, 0x58, 0x9d, 0x51, 0xf5, 0x49, 0x1a, 0x5f,
+ 0x1b, 0x54, 0xf5, 0x48, 0x80, 0x47, 0x85, 0x48, 0x4a, 0xe5, 0x48, 0xbe,
+ 0xb0, 0x0, 0x58, 0xe, 0xe5, 0x48, 0x1a, 0x5b, 0x1a, 0x1f, 0x9d, 0x15, 0x1a,
+ 0x5f, 0x2d, 0x51, 0xf5, 0x4a, 0xbe, 0x91, 0x48, 0x18, 0xe, 0x1a, 0x3f, 0xe5,
+ 0x48, 0x1a, 0x1b, 0x9d, 0x13, 0x1a, 0x5f, 0x9d, 0x51, 0xf5, 0x4a, 0xbe,
+ 0x81, 0x49, 0x78, 0x5, 0xbe, 0xf1, 0x4a, 0x68, 0x10, 0xe5, 0x49, 0x7e, 0x71,
+ 0x4a, 0x12, 0x36, 0x62, 0x7d, 0xf3, 0xbd, 0xf0, 0x8, 0x2, 0x7d, 0xf, 0x5,
+ 0x48, 0x1a, 0xef, 0xb, 0xe4, 0xe5, 0x48, 0x1a, 0x1b, 0xbd, 0x1e, 0x8, 0xad,
+ 0xb, 0xe0, 0x1a, 0x58, 0xb, 0x54, 0x1a, 0x1e, 0xbd, 0x15, 0x18, 0x2, 0x41,
+ 0x55, 0x7d, 0x30, 0xda, 0x79, 0x22, 0xca, 0x3b, 0x75, 0x29, 0xff, 0x6c,
+ 0xff, 0x7e, 0xc0, 0xff, 0x6c, 0xee, 0x6c, 0x99, 0x6c, 0x88, 0x7e, 0xf4,
+ 0x7f, 0xff, 0x6c, 0xdd, 0x80, 0x68, 0x7e, 0x70, 0x2, 0xac, 0x7d, 0x9, 0xb3,
+ 0x65, 0x60, 0xf5, 0x27, 0x9, 0x73, 0x65, 0x61, 0x7a, 0x71, 0x28, 0x12, 0x36,
+ 0x62, 0x7d, 0x3, 0xbd, 0xf, 0x58, 0x2, 0x7d, 0xf0, 0xe5, 0x27, 0xbe, 0xb1,
+ 0x29, 0x50, 0x3, 0x85, 0x27, 0x29, 0xe5, 0x27, 0xbc, 0xbf, 0x28, 0x3, 0x7e,
+ 0xf1, 0x27, 0xe5, 0x28, 0xbc, 0xbc, 0x50, 0x3, 0x7e, 0xc1, 0x28, 0xe5, 0x28,
+ 0xbc, 0xbe, 0x28, 0x3, 0x7e, 0xe1, 0x28, 0xe5, 0x29, 0xa, 0x5b, 0xa, 0x1f,
+ 0x9d, 0x15, 0xbe, 0x14, 0x0, 0x7, 0x18, 0xc, 0xa, 0x5c, 0xa, 0x1e, 0x9d,
+ 0x15, 0xbe, 0x14, 0x0, 0x7, 0x8, 0xa, 0x7e, 0x14, 0x1, 0xf4, 0x7a, 0x17,
+ 0x52, 0xf2, 0x81, 0xa, 0xb, 0xd0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7d, 0x38,
+ 0x90, 0x7d, 0x3f, 0x3e, 0x34, 0x12, 0xa7, 0x8e, 0x7d, 0x3, 0x7c, 0xdc, 0x80,
+ 0x1c, 0x7e, 0xc1, 0x29, 0x80, 0x11, 0x7c, 0xbc, 0x7c, 0x7d, 0x12, 0x36,
+ 0x62, 0xbd, 0x30, 0x8, 0x2, 0xb, 0x90, 0xb, 0x80, 0xb, 0xc0, 0xbc, 0xfc,
+ 0x50, 0xeb, 0xb, 0xd0, 0xbc, 0xed, 0x50, 0xe0, 0x7e, 0x73, 0x68, 0x7a, 0xbe,
+ 0x70, 0x3, 0x40, 0xd, 0x12, 0xdc, 0xd, 0x50, 0x28, 0xb, 0x14, 0x7a, 0x17,
+ 0x52, 0xf2, 0x80, 0x20, 0xbe, 0x70, 0x1, 0x38, 0x1b, 0x7e, 0x17, 0x52, 0xf2,
+ 0xbe, 0x14, 0x0, 0x2, 0x28, 0x6, 0x1b, 0x15, 0x7a, 0x17, 0x52, 0xf2, 0x12,
+ 0xdc, 0x16, 0x50, 0x6, 0xb, 0x14, 0x7a, 0x17, 0x52, 0x72, 0x7e, 0x73, 0x66,
+ 0xea, 0xbe, 0x70, 0x1, 0x40, 0x2d, 0x7e, 0x30, 0x2, 0xac, 0x38, 0x74, 0x3,
+ 0xac, 0xb9, 0xbd, 0x51, 0x8, 0xf, 0x6d, 0x11, 0x7a, 0x17, 0x52, 0xf2, 0x12,
+ 0xdc, 0x16, 0x50, 0x15, 0xb, 0x14, 0x80, 0xd, 0x12, 0xdc, 0xd, 0x50, 0x6,
+ 0xb, 0x15, 0x7a, 0x17, 0x52, 0xf2, 0x6d, 0x11, 0x7a, 0x17, 0x52, 0x72, 0xda,
+ 0x3b, 0x22, 0x7e, 0x17, 0x52, 0xf2, 0xbe, 0x14, 0x3, 0xe8, 0x22, 0x7e, 0x17,
+ 0x52, 0x72, 0xbe, 0x14, 0x1, 0xf4, 0x22, 0xd2, 0x6, 0x7e, 0x34, 0x2d, 0x30,
+ 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x14, 0x2e, 0x77, 0x74, 0x3c, 0x12, 0x2a, 0xe2,
+ 0x12, 0xdc, 0x97, 0x50, 0x2, 0xc3, 0x22, 0x6c, 0xaa, 0x80, 0x11, 0x12, 0xdc,
+ 0x9f, 0x19, 0xb4, 0x2e, 0x77, 0x9, 0xb4, 0x65, 0x61, 0x19, 0xb4, 0x2e, 0x78,
+ 0xb, 0xa0, 0x7e, 0x73, 0x66, 0xea, 0xbc, 0x7a, 0x38, 0xe7, 0x6c, 0xaa, 0x80,
+ 0x36, 0xa, 0x2a, 0xb, 0x24, 0x7c, 0x65, 0x80, 0x28, 0x7e, 0x50, 0x2, 0xac,
+ 0x56, 0x9, 0x12, 0x2e, 0x77, 0x7e, 0x30, 0x2, 0xac, 0x3a, 0x9, 0xb1, 0x2e,
+ 0x77, 0xbc, 0xb1, 0x78, 0x2, 0xc2, 0x6, 0x9, 0x52, 0x2e, 0x78, 0x9, 0xb1,
+ 0x2e, 0x78, 0xbc, 0xb5, 0x78, 0x2, 0xc2, 0x6, 0xb, 0x60, 0xbc, 0x76, 0x38,
+ 0xd4, 0xb, 0xa0, 0xbc, 0x7a, 0x38, 0xc6, 0xa2, 0x6, 0x22, 0x7e, 0x73, 0x66,
+ 0xea, 0xbe, 0x70, 0x3, 0x22, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x9, 0xb4, 0x65,
+ 0x60, 0x22, 0xca, 0x3b, 0x7f, 0x70, 0x7c, 0x17, 0x7c, 0xb, 0x75, 0x33, 0x1,
+ 0x7e, 0x73, 0x68, 0xa8, 0x7c, 0xc7, 0x7e, 0x73, 0x68, 0xa9, 0x7c, 0xd7,
+ 0x6d, 0x11, 0x7d, 0x91, 0x7d, 0xa1, 0x7e, 0x24, 0x7f, 0xff, 0x7d, 0xb2,
+ 0x7d, 0xc1, 0x7d, 0xd2, 0x12, 0xbf, 0xa9, 0x7a, 0x35, 0x34, 0xa, 0x50, 0x1b,
+ 0x55, 0x7c, 0xfb, 0xa1, 0x83, 0x7a, 0xf1, 0x36, 0xbe, 0xf0, 0x0, 0x58, 0xc,
+ 0x1a, 0x3f, 0x1a, 0x40, 0x9d, 0x43, 0xa, 0x50, 0x2d, 0x54, 0xf5, 0x36, 0xbc,
+ 0xcf, 0x18, 0xc, 0x1a, 0x30, 0x1a, 0x4f, 0x9d, 0x43, 0xa, 0x50, 0x9d, 0x54,
+ 0xf5, 0x36, 0xa, 0x51, 0x1b, 0x55, 0x7c, 0xeb, 0x80, 0x72, 0x7a, 0xe1, 0x37,
+ 0xbe, 0xe0, 0x0, 0x58, 0xc, 0x1a, 0x3e, 0x1a, 0x41, 0x9d, 0x43, 0xa, 0x51,
+ 0x2d, 0x54, 0xf5, 0x37, 0xbc, 0xde, 0x18, 0xc, 0x1a, 0x31, 0x1a, 0x4e, 0x9d,
+ 0x43, 0xa, 0x51, 0x9d, 0x54, 0xf5, 0x37, 0xe5, 0x36, 0x7e, 0x71, 0x37, 0x12,
+ 0x36, 0x62, 0x7d, 0x83, 0x7c, 0xb0, 0x24, 0xfe, 0xbc, 0xbf, 0x68, 0x12,
+ 0x12, 0xdd, 0xf4, 0x68, 0xd, 0x7c, 0xb1, 0x24, 0xfe, 0xbc, 0xbe, 0x68, 0x5,
+ 0x12, 0xdd, 0xfd, 0x78, 0xe, 0x7d, 0x38, 0x2d, 0x3a, 0x7d, 0xa3, 0xbd, 0x8d,
+ 0x58, 0x1e, 0x7d, 0xd8, 0x80, 0x1a, 0xbc, 0xf, 0x78, 0x4, 0xbc, 0x1e, 0x68,
+ 0x12, 0x7d, 0x38, 0x2d, 0x39, 0x7d, 0x93, 0xbd, 0x8b, 0x58, 0x2, 0x7d, 0xb8,
+ 0xbd, 0x8c, 0x8, 0x2, 0x7d, 0xc8, 0xb, 0xe0, 0x12, 0xdd, 0xfd, 0x8, 0x89,
+ 0xb, 0xf0, 0x12, 0xdd, 0xf4, 0x18, 0x2, 0x81, 0xde, 0x7d, 0x3a, 0x12, 0x4f,
+ 0xc0, 0x7d, 0x83, 0x7e, 0x75, 0x34, 0x7d, 0x37, 0x9d, 0x38, 0x7d, 0xa3,
+ 0x7e, 0x14, 0x0, 0x9, 0xad, 0x18, 0x7d, 0x39, 0x9d, 0x31, 0x7d, 0x93, 0x7d,
+ 0x2c, 0x9d, 0x2b, 0x7e, 0x44, 0x0, 0xa, 0x7d, 0x32, 0xad, 0x34, 0x7d, 0x27,
+ 0x9d, 0x2b, 0x12, 0x29, 0xee, 0x7d, 0xb3, 0x7d, 0x2c, 0x9d, 0x2d, 0x7d,
+ 0x32, 0xad, 0x34, 0x7d, 0x27, 0x9d, 0x2d, 0x12, 0x29, 0xee, 0x7d, 0x23,
+ 0xbe, 0xa4, 0x0, 0x96, 0x8, 0x17, 0xbe, 0x94, 0x1, 0x2c, 0x8, 0x11, 0xbe,
+ 0xb4, 0x0, 0x5, 0x28, 0xb, 0xbe, 0x24, 0x0, 0x5, 0x28, 0x5, 0x75, 0x33, 0x1,
+ 0x80, 0x3, 0x75, 0x33, 0x0, 0x1b, 0x7a, 0xa0, 0xe5, 0x33, 0xda, 0x3b, 0x22,
+ 0xa, 0x20, 0xb, 0x25, 0x1a, 0x3f, 0xbd, 0x32, 0x22, 0xa, 0x21, 0xb, 0x25,
+ 0x1a, 0x3e, 0xbd, 0x32, 0x22, 0xa2, 0x93, 0xe4, 0x33, 0x22, 0x12, 0xde, 0x6,
+ 0x70, 0x2e, 0x12, 0x7f, 0x9f, 0x7e, 0xb3, 0x56, 0x24, 0xb4, 0x1, 0xd, 0x7e,
+ 0x34, 0xf, 0xa0, 0x7a, 0x37, 0x56, 0x91, 0xe4, 0x7a, 0xb3, 0x56, 0x24, 0x7e,
+ 0x37, 0x56, 0x91, 0x4d, 0x33, 0x78, 0x4, 0x74, 0x1, 0x80, 0x5, 0x12, 0xde,
+ 0x93, 0x74, 0x2, 0x7e, 0x70, 0x3, 0x2, 0xde, 0x3f, 0x22, 0x7c, 0x6b, 0x7e,
+ 0xb3, 0x55, 0xf6, 0xb4, 0x81, 0x45, 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x39, 0xa5,
+ 0xbe, 0x1, 0x1c, 0xc2, 0xaf, 0xa, 0x27, 0x5e, 0x24, 0x0, 0x2, 0x68, 0x2,
+ 0xd2, 0x95, 0x7a, 0x71, 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xc6, 0xc9, 0xa9,
+ 0xd1, 0x87, 0xd2, 0xaf, 0x80, 0x19, 0xa5, 0xbe, 0x2, 0x1b, 0xc2, 0xaf, 0x12,
+ 0xde, 0x6, 0x70, 0xc, 0x7a, 0x71, 0xcd, 0xa9, 0xd0, 0xce, 0xa9, 0xd6, 0xc9,
+ 0xa9, 0xd1, 0x87, 0xd2, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x7a,
+ 0xb3, 0x55, 0xf6, 0x22, 0xa9, 0xd5, 0xea, 0xa9, 0xc5, 0xea, 0x22, 0xd2, 0x2,
+ 0x12, 0x46, 0xb8, 0x12, 0xde, 0x6, 0x70, 0xfb, 0x22, 0xca, 0xb8, 0xa9, 0x31,
+ 0xcd, 0x10, 0xa9, 0x31, 0xe5, 0xc, 0x12, 0xde, 0x93, 0x74, 0x1, 0x7a, 0xb3,
+ 0x56, 0x24, 0xa9, 0xc1, 0xcd, 0xa9, 0x37, 0xcd, 0x7, 0xa9, 0x37, 0xe5, 0x3,
+ 0xa9, 0xc7, 0xcd, 0x75, 0xcd, 0x0, 0xda, 0xb8, 0x32, 0xc2, 0x8c, 0xc2, 0xa9,
+ 0x32, 0x12, 0xde, 0xdb, 0x20, 0x25, 0x3, 0x2, 0xde, 0xfb, 0x22, 0x30, 0x26,
+ 0x3, 0x12, 0xde, 0xe2, 0x22, 0xa9, 0xd2, 0xea, 0xa9, 0xc2, 0xea, 0xc2, 0x26,
+ 0xc2, 0x25, 0x22, 0x12, 0x5f, 0x74, 0x68, 0x8, 0xe4, 0x7a, 0xb3, 0x55, 0xf3,
+ 0x2, 0xde, 0xd1, 0x22, 0x20, 0xf, 0x3, 0x12, 0x76, 0x9c, 0xe4, 0x7a, 0xb3,
+ 0x55, 0xfb, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6, 0x74, 0x2, 0x7a, 0xb3, 0x54,
+ 0xf7, 0x7a, 0xb3, 0x54, 0xf8, 0x22, 0xca, 0xb8, 0xca, 0x39, 0x12, 0x70,
+ 0xe4, 0x7e, 0x37, 0x55, 0xf0, 0xb, 0x34, 0x7a, 0x37, 0x55, 0xf0, 0x7e, 0x37,
+ 0x56, 0x22, 0xb, 0x34, 0x7a, 0x37, 0x56, 0x22, 0x7e, 0x37, 0x56, 0x91, 0x4d,
+ 0x33, 0x68, 0x6, 0x1b, 0x34, 0x7a, 0x37, 0x56, 0x91, 0x7e, 0xb3, 0x55, 0xf2,
+ 0x60, 0x5, 0x14, 0x7a, 0xb3, 0x55, 0xf2, 0x7e, 0xb3, 0x55, 0xf2, 0x70, 0x2,
+ 0xd2, 0x14, 0x7e, 0x37, 0x56, 0x8f, 0xb, 0x34, 0x7a, 0x37, 0x56, 0x8f, 0x7e,
+ 0x37, 0x55, 0xfe, 0xbe, 0x34, 0x0, 0x0, 0x28, 0x6, 0x1b, 0x34, 0x7a, 0x37,
+ 0x55, 0xfe, 0x7e, 0xb3, 0x56, 0x2a, 0xbe, 0xb0, 0xff, 0x50, 0x5, 0x4, 0x7a,
+ 0xb3, 0x56, 0x2a, 0xda, 0x39, 0xda, 0xb8, 0x32, 0x7e, 0x14, 0xf7, 0xf0,
+ 0x7e, 0x4, 0x0, 0xff, 0x7e, 0x34, 0x47, 0x52, 0x7e, 0x24, 0x55, 0x50, 0x79,
+ 0x30, 0x0, 0x2, 0x1b, 0xa, 0x20, 0x7e, 0x34, 0x45, 0x20, 0x7e, 0x24, 0x41,
+ 0x44, 0x79, 0x30, 0x0, 0x6, 0x79, 0x20, 0x0, 0x4, 0x7e, 0x34, 0x99, 0x33,
+ 0x7e, 0x24, 0x66, 0xcc, 0x79, 0x30, 0x0, 0xa, 0x79, 0x20, 0x0, 0x8, 0x7e,
+ 0x34, 0x41, 0x47, 0x7e, 0x24, 0x46, 0x4c, 0x79, 0x30, 0x0, 0xe, 0x79, 0x20,
+ 0x0, 0xc, 0x22, 0x7e, 0xb3, 0x56, 0x29, 0x4, 0x7a, 0xb3, 0x56, 0x29, 0x7e,
+ 0x73, 0x56, 0x29, 0xbe, 0x70, 0xc8, 0x28, 0x6, 0x74, 0xc8, 0x7a, 0xb3, 0x56,
+ 0x29, 0x22, 0x75, 0xec, 0xff, 0x75, 0xee, 0xff, 0x75, 0xeb, 0x3, 0x75, 0xac,
+ 0xc0, 0xa9, 0xd0, 0xea, 0x75, 0xe1, 0x2, 0x22, 0x75, 0x9a, 0x2f, 0xa9, 0xd1,
+ 0x99, 0xa9, 0xd6, 0xdf, 0x22, 0xd2, 0xcb, 0xc2, 0x8c, 0x43, 0x89, 0x1, 0x75,
+ 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0xa9, 0x22, 0xd2, 0xcb, 0xc2, 0x8e, 0x43,
+ 0x89, 0x20, 0x75, 0x8d, 0x1, 0x75, 0x8b, 0x0, 0xd2, 0x8e, 0xd2, 0xab, 0x22,
+ 0x75, 0xb7, 0x0, 0x75, 0xb8, 0x0, 0x75, 0xf7, 0x0, 0x75, 0xf8, 0x0, 0xa9,
+ 0xd0, 0xb7, 0xd2, 0xb8, 0xa9, 0xd5, 0xb7, 0xd2, 0xbd, 0xa9, 0xd0, 0xf7,
+ 0xd2, 0xf8, 0xa9, 0xd6, 0xf7, 0xd2, 0xfe, 0xa9, 0xd1, 0xf7, 0xc2, 0xf9,
+ 0xa9, 0xc4, 0xb7, 0xd2, 0xbc, 0xa9, 0xc2, 0xb7, 0xc2, 0xba, 0xa9, 0xc1,
+ 0xb7, 0xc2, 0xb9, 0xa9, 0xc3, 0xb7, 0xc2, 0xbb, 0xa9, 0xc3, 0xf7, 0xc2,
+ 0xfb, 0x22, 0xca, 0x39, 0xca, 0xb, 0x7e, 0xf, 0x56, 0xad, 0x69, 0x30, 0x0,
+ 0x2, 0x5e, 0x34, 0x0, 0x1, 0x68, 0x22, 0x69, 0x30, 0x0, 0x4, 0x5e, 0x34,
+ 0x0, 0x1, 0x68, 0x18, 0xd2, 0xcc, 0x7e, 0x34, 0x0, 0x1, 0x79, 0x30, 0x0,
+ 0x4, 0xd2, 0xcc, 0x7e, 0xf, 0x56, 0xad, 0xb, 0xa, 0x30, 0x12, 0x97, 0x67,
+ 0xc2, 0xcc, 0xc2, 0xc3, 0xda, 0xb, 0xda, 0x39, 0x32, 0x7e, 0x8, 0x34, 0x3f,
+ 0x7e, 0x34, 0x0, 0x44, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x34, 0x32, 0x3, 0x7a,
+ 0x37, 0x34, 0x3f, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x41, 0x90, 0x1, 0x90, 0x93,
+ 0x60, 0x6, 0x7e, 0x34, 0x9d, 0x0, 0x80, 0x4, 0x7e, 0x34, 0x9d, 0x2, 0x7a,
+ 0x37, 0x34, 0x43, 0x7e, 0x37, 0x68, 0xb5, 0x7a, 0x37, 0x34, 0x45, 0x6d,
+ 0x33, 0x7a, 0x37, 0x34, 0x47, 0x7a, 0x37, 0x34, 0x49, 0x7e, 0x34, 0x2, 0x0,
+ 0x7a, 0x37, 0x34, 0x4b, 0x7e, 0x34, 0x44, 0x60, 0x7a, 0x37, 0x34, 0x4d,
+ 0x7e, 0x34, 0x29, 0x1, 0x7a, 0x37, 0x34, 0x4f, 0x7e, 0x34, 0xf, 0x70, 0x7a,
+ 0x37, 0x34, 0x51, 0x7e, 0x34, 0x8, 0xa, 0x7a, 0x37, 0x34, 0x53, 0x7e, 0x34,
+ 0x70, 0x0, 0x7a, 0x37, 0x34, 0x55, 0x7e, 0x34, 0x5, 0x80, 0x7a, 0x37, 0x34,
+ 0x57, 0x7e, 0x34, 0x80, 0x0, 0x7a, 0x37, 0x34, 0x59, 0x6d, 0x33, 0x7a, 0x37,
+ 0x34, 0x5b, 0x7e, 0x34, 0x0, 0xf0, 0x7a, 0x37, 0x34, 0x5d, 0x7e, 0x34, 0x0,
+ 0x30, 0x7a, 0x37, 0x34, 0x5f, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x61, 0x7e,
+ 0x34, 0x0, 0x2a, 0x7a, 0x37, 0x34, 0x63, 0x7e, 0x34, 0x2d, 0x2d, 0x7a, 0x37,
+ 0x34, 0x65, 0x7e, 0x34, 0x11, 0x11, 0x7a, 0x37, 0x34, 0x67, 0x7e, 0x34,
+ 0x11, 0x0, 0x7a, 0x37, 0x34, 0x69, 0x7e, 0x34, 0x1, 0x23, 0x7a, 0x37, 0x34,
+ 0x6b, 0x7e, 0x34, 0x45, 0x67, 0x7a, 0x37, 0x34, 0x6d, 0x7e, 0x34, 0x89,
+ 0xab, 0x7a, 0x37, 0x34, 0x6f, 0x7e, 0x34, 0xcd, 0xef, 0x7a, 0x37, 0x34,
+ 0x71, 0x6d, 0x33, 0x7a, 0x37, 0x34, 0x73, 0x7e, 0x34, 0x43, 0x21, 0x7a,
+ 0x37, 0x34, 0x75, 0x7e, 0x34, 0x23, 0x45, 0x7a, 0x37, 0x34, 0x77, 0x7e,
+ 0x34, 0x12, 0x5, 0x7a, 0x37, 0x34, 0x79, 0x7e, 0x34, 0xfe, 0xdc, 0x7a, 0x37,
+ 0x34, 0x7b, 0x7e, 0x34, 0xba, 0x98, 0x7a, 0x37, 0x34, 0x7d, 0x7e, 0x34,
+ 0x76, 0x54, 0x7a, 0x37, 0x34, 0x7f, 0x7e, 0x34, 0x32, 0x10, 0x7a, 0x37,
+ 0x34, 0x81, 0x22, 0xa9, 0xd5, 0xcb, 0xa9, 0xd1, 0xcb, 0xa9, 0xd2, 0xca,
+ 0xa9, 0xd2, 0xcb, 0x22, 0x2, 0x5f, 0xfa, 0xc2, 0xed, 0xc2, 0xc5, 0x32, 0x7e,
+ 0xb3, 0x54, 0xf6, 0xb4, 0x1, 0x51, 0x7e, 0xa3, 0x54, 0xf4, 0x7a, 0xa3, 0x54,
+ 0xf5, 0x7e, 0xb3, 0x54, 0xfe, 0x4, 0x7a, 0xb3, 0x54, 0xfe, 0x6c, 0x77, 0x6c,
+ 0x66, 0x80, 0xd, 0x7e, 0x50, 0x9, 0xac, 0x56, 0x9, 0xb2, 0x55, 0x9, 0x2c,
+ 0x7b, 0xb, 0x60, 0xbc, 0xa6, 0x50, 0xef, 0xa, 0x27, 0x1b, 0x24, 0x7e, 0xb3,
+ 0x54, 0xfe, 0xa, 0x3b, 0xbd, 0x32, 0x48, 0x1b, 0x7c, 0xba, 0x4, 0x7a, 0xb3,
+ 0x54, 0xf4, 0x12, 0xe2, 0x41, 0x28, 0xf, 0x12, 0xe2, 0x23, 0x50, 0x4, 0x74,
+ 0x1, 0x80, 0x2, 0x74, 0x3, 0x7a, 0xb3, 0x54, 0xf6, 0x22, 0xc2, 0x8, 0x12,
+ 0xe2, 0x41, 0x38, 0x4, 0xc2, 0x8, 0x80, 0x10, 0x7e, 0xa3, 0x54, 0xf4, 0x74,
+ 0x9, 0xa4, 0x49, 0x55, 0x55, 0x1, 0x12, 0x5b, 0xfc, 0x92, 0x8, 0xa2, 0x8,
+ 0x22, 0x7e, 0x73, 0x54, 0xf3, 0xbe, 0x73, 0x54, 0xf4, 0x22, 0x12, 0x5f,
+ 0x78, 0x78, 0x50, 0x7e, 0x37, 0x55, 0xfe, 0x4d, 0x33, 0x78, 0xf8, 0x12,
+ 0x7f, 0xfd, 0x7e, 0xb3, 0x54, 0x13, 0xb4, 0x1, 0x8, 0x7e, 0x73, 0x53, 0xf7,
+ 0xa, 0x37, 0x80, 0xc, 0x7e, 0x73, 0x53, 0xf6, 0xa, 0x27, 0x7e, 0x34, 0x0,
+ 0x64, 0x8d, 0x32, 0x1b, 0x34, 0x7a, 0x37, 0x55, 0xfe, 0x7e, 0x73, 0x54,
+ 0x1a, 0xa, 0x27, 0x7e, 0x37, 0x55, 0xfe, 0xad, 0x32, 0x7e, 0x24, 0x0, 0x18,
+ 0x8d, 0x32, 0x7a, 0x37, 0x55, 0xfe, 0x7e, 0x37, 0x55, 0xf9, 0xbe, 0x37,
+ 0x55, 0xfe, 0x50, 0x4, 0x7a, 0x37, 0x55, 0xfe, 0x22, 0xca, 0x79, 0x7c, 0x5b,
+ 0x7e, 0x40, 0xff, 0x7e, 0xa0, 0xff, 0x6c, 0x33, 0x61, 0x34, 0xbc, 0x63,
+ 0x78, 0x2, 0x61, 0x32, 0x7e, 0x90, 0x2, 0xac, 0x93, 0x9, 0x24, 0x65, 0x60,
+ 0xa, 0xf2, 0xa, 0x5, 0x9d, 0xf, 0xbe, 0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2,
+ 0xa, 0xf5, 0x9d, 0xfe, 0x7d, 0x7f, 0x7c, 0x2f, 0x80, 0x8, 0x6e, 0x4, 0xff,
+ 0xff, 0xb, 0x4, 0x7c, 0x21, 0x7e, 0x10, 0x2, 0xac, 0x13, 0x9, 0xb0, 0x65,
+ 0x61, 0xa, 0xb, 0xa, 0x47, 0x9d, 0x40, 0xbe, 0x44, 0x0, 0x0, 0x8, 0x8, 0xa,
+ 0xfb, 0xa, 0x7, 0x9d, 0xf, 0x80, 0x4, 0x6d, 0x0, 0x9d, 0x4, 0xbe, 0x20, 0x1,
+ 0x38, 0xa, 0xbe, 0x10, 0x1, 0x38, 0x5, 0x7e, 0xa0, 0x1, 0x80, 0x31, 0xbe,
+ 0x20, 0x2, 0x38, 0xa, 0xbe, 0x10, 0x2, 0x38, 0x5, 0x7e, 0x40, 0x2, 0x80,
+ 0x10, 0x30, 0x0, 0xd, 0xbe, 0x20, 0x3, 0x38, 0x8, 0xbe, 0x10, 0x3, 0x38,
+ 0x3, 0x7e, 0x40, 0x3, 0xbc, 0x4a, 0x50, 0x2, 0x7c, 0xa4, 0xb, 0x30, 0x7e,
+ 0x3, 0x66, 0xea, 0xbc, 0x3, 0x28, 0x2, 0x41, 0xae, 0x7c, 0xba, 0xda, 0x79,
+ 0x22, 0x12, 0xe3, 0xca, 0xe4, 0x7a, 0xb3, 0x2e, 0x79, 0x7e, 0x1f, 0x2d,
+ 0x26, 0x7a, 0x37, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2e, 0x7a, 0x37, 0x2e,
+ 0x7f, 0x7e, 0xb3, 0x74, 0x9, 0x70, 0xb, 0xe4, 0x7a, 0xb3, 0x2e, 0x7a, 0x7e,
+ 0x34, 0x0, 0x20, 0x80, 0xd, 0x12, 0x54, 0x1, 0x7e, 0x1f, 0x2d, 0x2a, 0x7a,
+ 0x37, 0x2e, 0x7d, 0x6d, 0x33, 0x12, 0x97, 0xba, 0x12, 0x54, 0xe0, 0x12,
+ 0xe3, 0xc3, 0x7e, 0xb3, 0x74, 0x9, 0xa, 0x4a, 0xb4, 0x1, 0x1a, 0x2d, 0x43,
+ 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x2a, 0x2d, 0x14, 0xb, 0xa, 0x10, 0x7e, 0x7f,
+ 0x2d, 0x26, 0x2d, 0xf4, 0xb, 0x7a, 0x20, 0x9d, 0x21, 0x80, 0xd, 0x2d, 0x43,
+ 0x3e, 0x44, 0x7e, 0xf, 0x2d, 0x26, 0x2d, 0x14, 0xb, 0xa, 0x20, 0x7e, 0xf,
+ 0x2d, 0x2e, 0x2d, 0x14, 0x1b, 0xa, 0x20, 0xb, 0xa0, 0xbe, 0xa0, 0x4, 0x40,
+ 0xc0, 0x22, 0x7e, 0x37, 0x74, 0xc, 0x6c, 0xaa, 0x22, 0x7e, 0x73, 0x68, 0xa7,
+ 0x7a, 0x73, 0x2e, 0x78, 0x7e, 0x73, 0x68, 0xa6, 0x7a, 0x73, 0x2e, 0x77,
+ 0x22, 0xca, 0xf8, 0x7c, 0xfb, 0x12, 0x97, 0xe9, 0x7e, 0x8, 0x2e, 0x87, 0x7e,
+ 0x34, 0x0, 0x5, 0x12, 0x0, 0x2e, 0x7e, 0xa3, 0x68, 0xa6, 0x7e, 0x73, 0x68,
+ 0xa7, 0x7e, 0xa7, 0x67, 0x7, 0x7d, 0xca, 0x3e, 0xc4, 0x3e, 0xc4, 0x4c, 0xff,
+ 0x78, 0x76, 0x7e, 0xb7, 0x74, 0xc, 0x7a, 0x73, 0x2e, 0x78, 0x7a, 0xa3, 0x2e,
+ 0x77, 0x7e, 0xd4, 0x9, 0x20, 0x7a, 0xd7, 0x2e, 0x7b, 0x7e, 0x1f, 0x2d, 0x2a,
+ 0x7d, 0xd3, 0x7a, 0xd7, 0x2e, 0x7d, 0x7e, 0x1f, 0x2d, 0x2a, 0x7d, 0xd3,
+ 0x7a, 0xd7, 0x2e, 0x7f, 0x7d, 0x3a, 0x7c, 0xb7, 0xf5, 0x27, 0x7e, 0x8, 0x2e,
+ 0x77, 0x7e, 0x18, 0x2e, 0x87, 0x7d, 0x5a, 0x12, 0x56, 0x7f, 0x7e, 0x70, 0x4,
+ 0x7d, 0xab, 0x3e, 0xa4, 0x49, 0xda, 0x9, 0x20, 0xbd, 0xcd, 0x58, 0x10, 0x7e,
+ 0xf, 0x2d, 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0x20, 0x2d, 0x2c, 0x1b, 0xa, 0x20,
+ 0x80, 0x16, 0x6d, 0x22, 0x9d, 0x2c, 0xbd, 0x2d, 0x8, 0xe, 0x7e, 0xf, 0x2d,
+ 0x2a, 0x2d, 0x1a, 0xb, 0xa, 0xa0, 0x9d, 0xac, 0x1b, 0xa, 0xa0, 0xb, 0xb4,
+ 0x1b, 0x70, 0x78, 0xc8, 0xda, 0xf8, 0x22, 0x7d, 0x23, 0x12, 0x5d, 0x71,
+ 0x7e, 0x37, 0x39, 0xf6, 0x7d, 0x13, 0x9e, 0x17, 0x39, 0xf2, 0xbe, 0x14, 0x0,
+ 0x0, 0x8, 0x6, 0x9e, 0x37, 0x39, 0xf2, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x31,
+ 0xbd, 0x32, 0x38, 0x21, 0x7e, 0x37, 0x39, 0xf8, 0x7d, 0x13, 0x9e, 0x17,
+ 0x39, 0xf4, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x6, 0x9e, 0x37, 0x39, 0xf4, 0x80,
+ 0x4, 0x6d, 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x38, 0x3, 0x74, 0x1, 0x22, 0xe4,
+ 0x22, 0xca, 0xd8, 0xca, 0x79, 0x6c, 0xff, 0x6d, 0xdd, 0x7d, 0xed, 0x7d,
+ 0xfd, 0x7e, 0xd3, 0x68, 0x79, 0x7e, 0xe3, 0x68, 0x7a, 0x7e, 0xb3, 0x39,
+ 0xf1, 0x60, 0x11, 0x7e, 0xc7, 0x39, 0xfa, 0x4d, 0xcc, 0x78, 0x2, 0xa1, 0xb2,
+ 0xbe, 0xd0, 0x1, 0x28, 0x2, 0xa1, 0xb2, 0xbe, 0xd0, 0x1, 0x78, 0x1d, 0xbe,
+ 0xb0, 0x4, 0x78, 0x2, 0xa1, 0xb2, 0x7e, 0xe7, 0x67, 0x75, 0x7e, 0xf7, 0x67,
+ 0x77, 0x7d, 0x3e, 0x7d, 0x2f, 0x12, 0xe5, 0xe6, 0xbe, 0xb0, 0x1, 0x78, 0x2,
+ 0xa1, 0xb2, 0x7e, 0xa3, 0x39, 0xf1, 0x7c, 0xba, 0x14, 0x68, 0x29, 0x14,
+ 0x68, 0x54, 0x14, 0x68, 0x23, 0x14, 0x78, 0x2, 0xa1, 0xaf, 0xb, 0xb2, 0x68,
+ 0x2, 0xa1, 0xb2, 0xbe, 0xd0, 0x1, 0x68, 0x2, 0xa1, 0xc1, 0x4c, 0xee, 0x68,
+ 0x2, 0xa1, 0xc1, 0x74, 0x1, 0x7a, 0xb3, 0x39, 0xf1, 0x12, 0xe5, 0xd4, 0x80,
+ 0x61, 0x4c, 0xdd, 0x78, 0x1d, 0xbe, 0xa0, 0x1, 0x78, 0xc, 0x74, 0x2, 0x7a,
+ 0xb3, 0x39, 0xf1, 0x7e, 0x34, 0xe, 0x6, 0x80, 0x50, 0x74, 0x4, 0x7a, 0xb3,
+ 0x39, 0xf1, 0x7e, 0x34, 0xe, 0xa, 0x80, 0x44, 0x12, 0xe5, 0xdd, 0x90, 0xd,
+ 0xf9, 0x12, 0xe5, 0xc8, 0x68, 0x45, 0x80, 0x52, 0xbe, 0xd0, 0x1, 0x78, 0x4d,
+ 0x4c, 0xee, 0x78, 0x49, 0x12, 0xe5, 0xdd, 0x7e, 0x34, 0xe, 0x2, 0x12, 0x32,
+ 0xdf, 0x7e, 0x14, 0xe, 0x6, 0x12, 0xb7, 0x9d, 0x9d, 0xc3, 0xbe, 0xc7, 0x39,
+ 0xfa, 0x40, 0x21, 0x90, 0xd, 0xf8, 0x12, 0xe5, 0xc8, 0x68, 0x19, 0x12, 0xe5,
+ 0xd4, 0x74, 0x3, 0x7a, 0xb3, 0x39, 0xf1, 0x7e, 0x34, 0xe, 0x6, 0x12, 0x32,
+ 0xdf, 0x7a, 0x37, 0x39, 0xfa, 0x80, 0x12, 0x7e, 0xf0, 0x24, 0xe4, 0x7a,
+ 0xb3, 0x39, 0xf1, 0x6d, 0x33, 0x7a, 0x37, 0x39, 0xfa, 0x7c, 0xbf, 0x80, 0x2,
+ 0x7c, 0xbf, 0xda, 0x79, 0xda, 0xd8, 0x22, 0xe4, 0x93, 0xa, 0x3b, 0x12, 0xe4,
+ 0x7c, 0xa, 0xdb, 0x4d, 0xdd, 0x22, 0x7a, 0xe7, 0x39, 0xf2, 0x7a, 0xf7, 0x39,
+ 0xf4, 0x22, 0x7a, 0xe7, 0x39, 0xf6, 0x7a, 0xf7, 0x39, 0xf8, 0x22, 0x7d,
+ 0x13, 0x7e, 0x54, 0xd, 0xfa, 0x12, 0xe6, 0x1b, 0x50, 0x1d, 0x7e, 0x54, 0xd,
+ 0xfc, 0x12, 0xe6, 0x1b, 0x28, 0x14, 0x7e, 0x14, 0xd, 0xfe, 0x12, 0xe6, 0x11,
+ 0x50, 0xb, 0x7e, 0x14, 0xe, 0x0, 0x12, 0xe6, 0x11, 0x28, 0x2, 0xe4, 0x22,
+ 0x74, 0x1, 0x22, 0x7e, 0x4, 0x0, 0xff, 0xb, 0xa, 0x30, 0xbd, 0x32, 0x22,
+ 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x30, 0xbd, 0x31, 0x22, 0x7c, 0x7b, 0xa,
+ 0x57, 0x9e, 0x54, 0x0, 0x20, 0xe, 0x54, 0xe, 0x54, 0xe, 0x54, 0xe, 0x54,
+ 0x7c, 0xab, 0x7c, 0x67, 0x5e, 0x60, 0xf0, 0xa5, 0xbe, 0x20, 0x1d, 0x7c,
+ 0xb7, 0x54, 0xf, 0x7e, 0x24, 0x0, 0x1, 0x60, 0x5, 0x3e, 0x24, 0x14, 0x78,
+ 0xfb, 0x7e, 0x73, 0x56, 0x9c, 0xa, 0x47, 0x5d, 0x42, 0x7e, 0x73, 0x54, 0x3f,
+ 0x80, 0x36, 0xa5, 0xbe, 0x30, 0x18, 0x12, 0xe6, 0x98, 0x60, 0x5, 0x3e, 0x34,
+ 0x14, 0x78, 0xfb, 0x7e, 0x53, 0x56, 0x9d, 0xa, 0x45, 0x5d, 0x43, 0x7e, 0x73,
+ 0x54, 0x40, 0x80, 0x1a, 0x12, 0xe6, 0x98, 0x60, 0x5, 0x3e, 0x34, 0x14, 0x78,
+ 0xfb, 0xa, 0x2a, 0x9, 0xb2, 0x56, 0x9c, 0xa, 0x4b, 0x5d, 0x43, 0xa, 0x5a,
+ 0x9, 0x75, 0x54, 0x41, 0xa, 0x57, 0x5d, 0x54, 0x22, 0x7c, 0xb7, 0x54, 0xf,
+ 0x7e, 0x34, 0x0, 0x1, 0x22, 0x7e, 0xa3, 0x52, 0x71, 0xbe, 0xa0, 0xf0, 0x50,
+ 0x1b, 0x74, 0x4, 0xa4, 0x59, 0x35, 0x4e, 0x88, 0x7e, 0xa3, 0x52, 0x71, 0x74,
+ 0x4, 0xa4, 0x59, 0x25, 0x4e, 0x8a, 0x7e, 0xb3, 0x52, 0x71, 0x4, 0x7a, 0xb3,
+ 0x52, 0x71, 0x22, 0x7d, 0xf2, 0x7d, 0xe3, 0x7e, 0x8, 0x52, 0x49, 0x7e, 0x34,
+ 0x0, 0x28, 0xe4, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0x4e, 0x88, 0x7e, 0x34, 0x3,
+ 0xc0, 0x12, 0x0, 0x2e, 0x7a, 0xb3, 0x54, 0x41, 0x7e, 0x34, 0xe, 0x30, 0x12,
+ 0x32, 0xdf, 0x7a, 0x37, 0x4e, 0x80, 0x7a, 0xe7, 0x52, 0x4d, 0x7a, 0xf7,
+ 0x52, 0x4f, 0x7a, 0xe7, 0x52, 0x51, 0x7a, 0xe7, 0x52, 0x55, 0x7a, 0xe7,
+ 0x52, 0x59, 0x7a, 0xe7, 0x52, 0x5d, 0x7a, 0xf7, 0x52, 0x53, 0x7a, 0xf7,
+ 0x52, 0x57, 0x7a, 0xf7, 0x52, 0x5b, 0x7a, 0xf7, 0x52, 0x5f, 0x7a, 0xe7,
+ 0x4e, 0x84, 0x7a, 0xf7, 0x4e, 0x86, 0x7a, 0xb3, 0x52, 0x71, 0x74, 0x2, 0x7a,
+ 0xb3, 0x52, 0x48, 0x22, 0x74, 0xfe, 0x7a, 0xb3, 0x54, 0x41, 0xe4, 0x7a,
+ 0xb3, 0x52, 0x49, 0x22, 0x7e, 0x18, 0x52, 0x49, 0xbe, 0xb0, 0x23, 0x38,
+ 0x2c, 0xbe, 0xb0, 0x20, 0x40, 0x27, 0x74, 0x2, 0x7a, 0xb3, 0x52, 0x71, 0x7e,
+ 0x37, 0x52, 0x4d, 0x7a, 0x37, 0x4e, 0x88, 0x7e, 0x37, 0x52, 0x4f, 0x7a,
+ 0x37, 0x4e, 0x8a, 0x7e, 0x37, 0x52, 0x61, 0x7a, 0x37, 0x4e, 0x8c, 0x7e,
+ 0x37, 0x52, 0x63, 0x7a, 0x37, 0x4e, 0x8e, 0x22, 0x60, 0x2a, 0x74, 0x6, 0x7a,
+ 0xb3, 0x52, 0x71, 0x6c, 0xaa, 0x80, 0x18, 0x12, 0xe7, 0x99, 0x69, 0x17, 0x0,
+ 0x4, 0x59, 0x10, 0x4e, 0x88, 0x12, 0xe7, 0x99, 0x69, 0x17, 0x0, 0x6, 0x59,
+ 0x10, 0x4e, 0x8a, 0xb, 0xa0, 0x7e, 0xb3, 0x52, 0x71, 0xbc, 0xba, 0x38, 0xe0,
+ 0x22, 0x7e, 0x10, 0x4, 0xac, 0x1a, 0x7f, 0x71, 0x2d, 0xf0, 0x22, 0xca, 0x3b,
+ 0xf5, 0x2d, 0x7f, 0x31, 0x7a, 0xd, 0x29, 0x75, 0x35, 0x0, 0x75, 0x36, 0x0,
+ 0x75, 0x37, 0x0, 0x7e, 0x34, 0x3, 0xe8, 0x7a, 0x35, 0x40, 0x75, 0x33, 0x3c,
+ 0x75, 0x34, 0x46, 0x75, 0x2e, 0x0, 0x2, 0xe9, 0xc2, 0x12, 0xeb, 0x61, 0x28,
+ 0x1e, 0x7e, 0x34, 0x0, 0x44, 0xca, 0x39, 0x7e, 0x71, 0x2e, 0x74, 0x44, 0xac,
+ 0x7b, 0x2e, 0x34, 0x19, 0x74, 0x7e, 0x24, 0x0, 0xff, 0x7e, 0x8, 0x32, 0x41,
+ 0x12, 0x2b, 0x7, 0x1b, 0xfd, 0x6d, 0x33, 0x7a, 0x37, 0x32, 0x37, 0x7a, 0x37,
+ 0x32, 0x39, 0x7a, 0x37, 0x32, 0x3b, 0x7a, 0x37, 0x32, 0x3d, 0x7a, 0x37,
+ 0x32, 0x3f, 0x7e, 0x18, 0x32, 0x41, 0x7a, 0x1d, 0x38, 0x7e, 0x18, 0x32,
+ 0x61, 0x7a, 0x1d, 0x3c, 0x75, 0x2f, 0x0, 0x1, 0xa8, 0xe5, 0x2f, 0xa, 0x5b,
+ 0x7e, 0x1d, 0x29, 0x2d, 0x35, 0x7e, 0x1b, 0x60, 0xa, 0x26, 0x7e, 0xd, 0x38,
+ 0x2d, 0x15, 0x7e, 0xb, 0x70, 0xa, 0xd7, 0x7d, 0xcd, 0x9d, 0xc2, 0xbe, 0xc4,
+ 0x0, 0x0, 0x8, 0x4, 0x9d, 0xd2, 0x80, 0xa, 0xa, 0x26, 0xa, 0x37, 0x9d, 0x32,
+ 0x6d, 0xdd, 0x9d, 0xd3, 0x7e, 0xc7, 0x32, 0x3b, 0xbd, 0xcd, 0x58, 0x4, 0x7a,
+ 0xd7, 0x32, 0x3b, 0xe5, 0x2f, 0xa, 0xcb, 0x7f, 0x13, 0x2d, 0x3c, 0x7e, 0x1b,
+ 0x70, 0xa, 0x27, 0xe5, 0x2f, 0xa, 0x3b, 0x7e, 0xd, 0x3c, 0x2d, 0x13, 0x7e,
+ 0xb, 0x70, 0xa, 0xc7, 0x12, 0x37, 0x98, 0x8, 0x4, 0x9d, 0xc2, 0x80, 0x4,
+ 0x6d, 0xcc, 0x9d, 0xc3, 0x7e, 0x37, 0x32, 0x3d, 0xbd, 0x3c, 0x58, 0x4, 0x7a,
+ 0xc7, 0x32, 0x3d, 0x7e, 0x37, 0x32, 0x37, 0x2d, 0x3d, 0x7a, 0x37, 0x32,
+ 0x37, 0x7e, 0x37, 0x32, 0x39, 0x2d, 0x3c, 0x7a, 0x37, 0x32, 0x39, 0x2d,
+ 0xcd, 0x7e, 0x37, 0x32, 0x3f, 0xbd, 0x3c, 0x58, 0x4, 0x7a, 0xc7, 0x32, 0x3f,
+ 0x5, 0x2f, 0xe5, 0x2d, 0xbe, 0xb1, 0x2f, 0x28, 0x2, 0x1, 0x14, 0xe5, 0x2d,
+ 0xb4, 0xa, 0x2c, 0x7e, 0x37, 0x32, 0x3b, 0xbe, 0x34, 0x0, 0x40, 0x48, 0xc,
+ 0x7e, 0x27, 0x32, 0x3d, 0xbe, 0x24, 0x0, 0x40, 0x48, 0x2, 0x21, 0xc0, 0xbe,
+ 0x34, 0x0, 0x60, 0x8, 0x2, 0x21, 0xc0, 0x7e, 0x37, 0x32, 0x3d, 0xbe, 0x34,
+ 0x0, 0x60, 0x8, 0x2, 0x21, 0xc0, 0x80, 0x2a, 0x7e, 0x37, 0x32, 0x3b, 0xbe,
+ 0x34, 0x0, 0x20, 0x8, 0xc, 0x7e, 0x27, 0x32, 0x3d, 0xbe, 0x24, 0x0, 0x20,
+ 0x8, 0x2, 0x21, 0xc0, 0xbe, 0x34, 0x0, 0x30, 0x8, 0x2, 0x21, 0xc0, 0x7e,
+ 0x37, 0x32, 0x3d, 0xbe, 0x34, 0x0, 0x30, 0x8, 0x2, 0x21, 0xc0, 0x7e, 0xa3,
+ 0x55, 0x31, 0x74, 0xc, 0xa4, 0xbe, 0x57, 0x32, 0x37, 0x58, 0x2, 0x21, 0xc0,
+ 0x7e, 0xa3, 0x55, 0x32, 0x74, 0xc, 0xa4, 0xbe, 0x57, 0x32, 0x39, 0x58, 0x2,
+ 0x21, 0xc0, 0x7e, 0xd, 0x38, 0x7e, 0x1d, 0x29, 0xe5, 0x2d, 0x12, 0xe9, 0xfc,
+ 0xf5, 0x30, 0x7e, 0xd, 0x3c, 0x7f, 0x13, 0xe5, 0x2d, 0x12, 0xe9, 0xfc, 0xf5,
+ 0x31, 0xe5, 0x33, 0xbe, 0xb1, 0x30, 0x38, 0x76, 0xe5, 0x33, 0xbe, 0xb1,
+ 0x31, 0x38, 0x6f, 0xe5, 0x31, 0x7e, 0x31, 0x31, 0xac, 0x3b, 0x1a, 0x2, 0x1a,
+ 0x0, 0xe5, 0x30, 0x7e, 0x71, 0x30, 0xac, 0x7b, 0x1a, 0x26, 0x1a, 0x24, 0x2f,
+ 0x10, 0xe5, 0x31, 0xa, 0xfb, 0x6d, 0xee, 0xe5, 0x30, 0xa, 0x1b, 0x6d, 0x0,
+ 0x2f, 0x7, 0x12, 0x2a, 0x3c, 0x7c, 0xb7, 0xf5, 0x32, 0xe5, 0x34, 0xbe, 0xb1,
+ 0x32, 0x38, 0x3b, 0x7e, 0x37, 0x32, 0x3d, 0x2e, 0x37, 0x32, 0x3b, 0x2e,
+ 0x37, 0x32, 0x3f, 0x7a, 0x35, 0x42, 0xe5, 0x32, 0xa, 0x2b, 0x7e, 0x34, 0x0,
+ 0x64, 0x9d, 0x32, 0x3e, 0x34, 0x2e, 0x35, 0x42, 0x7a, 0x35, 0x42, 0x7e,
+ 0x35, 0x40, 0xbe, 0x35, 0x42, 0x8, 0x12, 0x7e, 0x35, 0x42, 0x7a, 0x35, 0x40,
+ 0x85, 0x32, 0x36, 0x7e, 0xb3, 0x32, 0x83, 0xf5, 0x37, 0x85, 0x2e, 0x35, 0x5,
+ 0x2e, 0x12, 0xeb, 0x61, 0x28, 0x3, 0x2, 0xe7, 0xc8, 0xe5, 0x34, 0xbe, 0xb1,
+ 0x36, 0x38, 0x20, 0xe5, 0x37, 0xbe, 0xb0, 0x0, 0x28, 0x19, 0xe5, 0x37, 0xbe,
+ 0xb0, 0xff, 0x50, 0x12, 0xe5, 0x35, 0xa, 0x3b, 0xb, 0x34, 0x7a, 0x73, 0x55,
+ 0x2e, 0xe5, 0x37, 0x7a, 0xb3, 0x55, 0x30, 0x80, 0x6, 0x74, 0x7c, 0x7a, 0xb3,
+ 0x55, 0x2e, 0xe5, 0x36, 0xda, 0x3b, 0x22, 0xca, 0x3b, 0x7c, 0xfb, 0x7f,
+ 0x61, 0x7f, 0x40, 0x9f, 0x11, 0x7f, 0x51, 0x7f, 0x71, 0x7a, 0x1f, 0x32,
+ 0x85, 0x7a, 0x1f, 0x32, 0x89, 0x7a, 0x1f, 0x32, 0x8d, 0xbe, 0xf0, 0xa, 0x78,
+ 0x6, 0x7e, 0x54, 0x1, 0x3c, 0x80, 0x4, 0x7e, 0x54, 0x2, 0x35, 0x7a, 0x55,
+ 0x48, 0x6c, 0xee, 0x80, 0x66, 0xa, 0x5e, 0x7f, 0x14, 0x12, 0xeb, 0x59, 0x7a,
+ 0x55, 0x46, 0xa, 0x5e, 0x7f, 0x16, 0x12, 0xeb, 0x59, 0x7a, 0x55, 0x44, 0x7e,
+ 0x35, 0x44, 0x12, 0xc7, 0x12, 0x2f, 0x50, 0x7e, 0x65, 0x46, 0x7d, 0x16,
+ 0x1a, 0x2, 0x1a, 0x0, 0x2f, 0x70, 0x12, 0xc7, 0x12, 0x12, 0xeb, 0x4f, 0x7e,
+ 0x1f, 0x32, 0x85, 0x2f, 0x10, 0x7a, 0x1f, 0x32, 0x85, 0x7d, 0x16, 0x1a, 0x2,
+ 0x1a, 0x0, 0x7e, 0x35, 0x46, 0x12, 0xeb, 0x4f, 0x7e, 0x1f, 0x32, 0x89, 0x2f,
+ 0x10, 0x7a, 0x1f, 0x32, 0x89, 0x7e, 0x15, 0x46, 0x1a, 0x2, 0x1a, 0x0, 0x7e,
+ 0x35, 0x44, 0x12, 0xeb, 0x4f, 0x7e, 0x1f, 0x32, 0x8d, 0x2f, 0x10, 0x7a,
+ 0x1f, 0x32, 0x8d, 0xb, 0xe0, 0xbc, 0xfe, 0x38, 0x96, 0xa, 0xdf, 0x6d, 0xcc,
+ 0x12, 0xaf, 0x9b, 0x7f, 0x51, 0x7f, 0x17, 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7f,
+ 0x71, 0x7e, 0x94, 0x0, 0x64, 0x7e, 0x1f, 0x32, 0x85, 0x7d, 0x19, 0x12, 0x2a,
+ 0x31, 0x7e, 0x85, 0x48, 0x7d, 0x18, 0x7d, 0xd8, 0x1a, 0x12, 0x1a, 0xc2,
+ 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32, 0x85, 0x7e, 0x1f, 0x32, 0x89,
+ 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7f, 0x6, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32,
+ 0x89, 0x7e, 0x1f, 0x32, 0x8d, 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7d, 0x18,
+ 0x1a, 0x2, 0x1a, 0x0, 0x12, 0x2a, 0x8d, 0x7a, 0x1f, 0x32, 0x8d, 0x7f, 0x15,
+ 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x7e, 0x6f, 0x32, 0x8d, 0x9f, 0x61, 0x7f, 0x15,
+ 0x7f, 0x5, 0x12, 0x2a, 0x20, 0x7e, 0x5f, 0x32, 0x85, 0x9f, 0x51, 0x7f, 0x17,
+ 0x7f, 0x7, 0x12, 0x2a, 0x20, 0x7e, 0x7f, 0x32, 0x89, 0x9f, 0x71, 0xbe, 0x58,
+ 0x0, 0x0, 0x68, 0x6, 0xbe, 0x78, 0x0, 0x0, 0x78, 0x6, 0x7e, 0x44, 0x0, 0x64,
+ 0x80, 0x18, 0x7f, 0x16, 0x7d, 0x19, 0x12, 0x2a, 0x31, 0x7f, 0x5, 0x12, 0x2a,
+ 0x8d, 0x7f, 0x6, 0x12, 0x2a, 0x20, 0x7f, 0x7, 0x12, 0x2a, 0x8d, 0x7d, 0x43,
+ 0xbe, 0x44, 0x0, 0x0, 0x18, 0x2, 0x6d, 0x44, 0x7c, 0xb9, 0xda, 0x3b, 0x22,
+ 0x1a, 0x26, 0x1a, 0x24, 0x12, 0x2a, 0x20, 0x7f, 0x1, 0x22, 0x2d, 0x35, 0x7e,
+ 0x1b, 0x70, 0xa, 0x57, 0x22, 0x7e, 0x73, 0x56, 0xa2, 0xbe, 0x71, 0x2e, 0x22,
+ 0xca, 0xf8, 0x7f, 0x51, 0x7f, 0x40, 0x7e, 0x37, 0x52, 0x59, 0x7a, 0x37,
+ 0x32, 0x3b, 0x7e, 0x37, 0x52, 0x57, 0x7a, 0x37, 0x32, 0x3d, 0x7e, 0x37,
+ 0x52, 0x65, 0x7a, 0x37, 0x32, 0x37, 0x7e, 0x37, 0x52, 0x67, 0x7a, 0x37,
+ 0x32, 0x39, 0x6c, 0xff, 0x80, 0x1e, 0x7e, 0x34, 0x32, 0x37, 0x7e, 0x14, 0x0,
+ 0x29, 0x74, 0x9, 0x12, 0x2a, 0xc1, 0x74, 0x2, 0xac, 0xbf, 0x7f, 0x4, 0x2d,
+ 0x15, 0x7f, 0x15, 0x2d, 0x35, 0x12, 0xeb, 0xbc, 0xb, 0xf0, 0x7e, 0x73, 0x55,
+ 0x2f, 0xbc, 0x7f, 0x38, 0xda, 0xda, 0xf8, 0x22, 0x7f, 0x71, 0x7f, 0x60,
+ 0x7e, 0x35, 0x29, 0xbe, 0x34, 0x0, 0x0, 0x38, 0x7, 0x7e, 0x34, 0x0, 0x1,
+ 0x7a, 0x35, 0x29, 0x7e, 0x35, 0x2b, 0xbe, 0x34, 0x0, 0x0, 0x38, 0x7, 0x7e,
+ 0x34, 0x0, 0x1, 0x7a, 0x35, 0x2b, 0xb, 0x6a, 0x30, 0x9e, 0x35, 0x2d, 0x6d,
+ 0x22, 0x7e, 0x33, 0x55, 0x31, 0x12, 0xec, 0x11, 0x7e, 0x15, 0x29, 0x12,
+ 0x2a, 0x3a, 0x1b, 0x6a, 0x30, 0xb, 0x7a, 0x30, 0x9e, 0x35, 0x2f, 0x6d, 0x22,
+ 0x7e, 0x33, 0x55, 0x32, 0x12, 0xec, 0x11, 0x7e, 0x15, 0x2b, 0x12, 0x2a,
+ 0x3a, 0x1b, 0x7a, 0x30, 0x22, 0xa, 0x13, 0x6d, 0x0, 0x2, 0x2a, 0x20, 0xca,
+ 0x79, 0x6c, 0xaa, 0x7e, 0x90, 0x2, 0xac, 0x9a, 0x7f, 0x70, 0x2d, 0xf4, 0xb,
+ 0x7a, 0xf0, 0x7d, 0x7f, 0x7c, 0xbf, 0xa, 0xfa, 0x19, 0xbf, 0x55, 0x33, 0x7f,
+ 0x71, 0x2d, 0xf4, 0xb, 0x7a, 0x40, 0x7c, 0xb9, 0xa, 0x4a, 0x19, 0xb4, 0x55,
+ 0x53, 0xb, 0xa0, 0xbe, 0xa0, 0x20, 0x40, 0xd4, 0x7e, 0x8, 0x55, 0x33, 0x7e,
+ 0x18, 0x55, 0x53, 0x74, 0x20, 0x12, 0xe7, 0xa3, 0xda, 0x79, 0x22, 0xca,
+ 0x3b, 0x7f, 0x61, 0x7f, 0x50, 0x7e, 0x73, 0x55, 0x2f, 0xbe, 0x70, 0x20,
+ 0x40, 0x52, 0x7e, 0xf0, 0x2, 0x80, 0x3c, 0xa, 0x3f, 0x6d, 0x22, 0x74, 0x5,
+ 0x2f, 0x11, 0x14, 0x78, 0xfb, 0x7e, 0x33, 0x55, 0x2f, 0xa, 0x13, 0x6d, 0x0,
+ 0x12, 0x2a, 0x3c, 0x7c, 0xe7, 0xbe, 0xe0, 0x2, 0x50, 0x3, 0x7e, 0xe0, 0x2,
+ 0xa, 0x6f, 0x1b, 0x64, 0xa, 0x3e, 0x1b, 0x34, 0x7c, 0xc7, 0x7f, 0x5, 0x7c,
+ 0xbd, 0x12, 0xec, 0xc2, 0x7f, 0x6, 0x7c, 0xbd, 0x7c, 0x7c, 0x12, 0xec, 0xc2,
+ 0xb, 0xf0, 0x7e, 0x73, 0x55, 0x2f, 0xbc, 0x7f, 0x50, 0xbc, 0x7f, 0x5, 0x7f,
+ 0x16, 0x12, 0xec, 0x18, 0x80, 0x6, 0x74, 0x7e, 0x7a, 0xb3, 0x55, 0x2e, 0xda,
+ 0x3b, 0x22, 0x7c, 0x97, 0x7c, 0xab, 0x7f, 0x10, 0x7e, 0x30, 0x2, 0xac, 0x3a,
+ 0x2d, 0x13, 0x7d, 0x2, 0xb, 0xa, 0x10, 0x7e, 0x10, 0x2, 0xac, 0x19, 0x7f,
+ 0x71, 0x2d, 0xf0, 0xb, 0x7a, 0x0, 0x7c, 0x21, 0xa5, 0xba, 0x0, 0x14, 0xa,
+ 0x3, 0x1b, 0x7a, 0x0, 0xbc, 0x9a, 0x68, 0x24, 0x6d, 0x44, 0x74, 0x2, 0xa4,
+ 0x2d, 0x35, 0x1b, 0x1a, 0x40, 0x22, 0xbc, 0x9a, 0x68, 0x15, 0xa, 0x2, 0xa,
+ 0x13, 0x2d, 0x10, 0xe, 0x14, 0x1b, 0x7a, 0x10, 0x6d, 0x11, 0x74, 0x2, 0xa4,
+ 0x2d, 0x35, 0x1b, 0x1a, 0x10, 0x22, 0x7d, 0x41, 0x7d, 0x2, 0x7c, 0x6b, 0x74,
+ 0x4, 0xac, 0xb6, 0x49, 0x15, 0x4e, 0x88, 0x49, 0x25, 0x4e, 0x8a, 0x74, 0x4,
+ 0xac, 0xb7, 0x49, 0xf5, 0x4e, 0x88, 0x49, 0x55, 0x4e, 0x8a, 0x7d, 0x31,
+ 0x9d, 0x3f, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4, 0x9d, 0x1f, 0x80, 0x4, 0x6d,
+ 0x11, 0x9d, 0x13, 0x7d, 0x32, 0x9d, 0x35, 0xbe, 0x34, 0x0, 0x0, 0x8, 0x4,
+ 0x9d, 0x25, 0x80, 0x4, 0x6d, 0x22, 0x9d, 0x23, 0x9d, 0x24, 0x9d, 0x10, 0xbe,
+ 0x24, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x32, 0x80, 0x4, 0x6d, 0x33, 0x9d, 0x32,
+ 0x7e, 0x54, 0xe, 0xc, 0x7e, 0x44, 0x0, 0xff, 0xb, 0x2a, 0x20, 0xbd, 0x32,
+ 0x50, 0x14, 0xbe, 0x14, 0x0, 0x0, 0x8, 0x4, 0x7d, 0x31, 0x80, 0x4, 0x6d,
+ 0x33, 0x9d, 0x31, 0xbd, 0x32, 0x50, 0x2, 0xd3, 0x22, 0xc3, 0x22, 0xb, 0xa,
+ 0x30, 0x6c, 0x77, 0x1b, 0xa, 0x30, 0xa, 0x2b, 0xb, 0x24, 0x2, 0x5d, 0x59,
+ 0xb, 0xa, 0x30, 0x30, 0x2, 0x5, 0x5e, 0x60, 0xf7, 0x80, 0x3, 0x4e, 0x60,
+ 0x8, 0x1b, 0xa, 0x30, 0x22, 0x2d, 0x23, 0x3e, 0x24, 0xa, 0x3b, 0x9d, 0x23,
+ 0xe5, 0x29, 0xa, 0x3b, 0x9d, 0x23, 0xbe, 0x24, 0x0, 0x0, 0x28, 0x3, 0x12,
+ 0x6b, 0x5f, 0x22, 0xb, 0xa, 0x30, 0x5e, 0x70, 0x3, 0xb4, 0x3, 0x5, 0x4e,
+ 0x70, 0xc, 0x80, 0x6, 0xb4, 0x4, 0x3, 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30,
+ 0x22, 0xb, 0xa, 0x30, 0x5e, 0x60, 0xdf, 0x1b, 0xa, 0x30, 0x30, 0x1, 0x9,
+ 0xb, 0xa, 0x30, 0x4e, 0x60, 0x20, 0x1b, 0xa, 0x30, 0x22, 0xb, 0xa, 0x30,
+ 0x12, 0x5f, 0xf3, 0xa2, 0x1, 0xe4, 0x33, 0xa, 0x2b, 0x3e, 0x24, 0x2, 0x5d,
+ 0x59, 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xb2, 0x12, 0x6b, 0xf0, 0x79,
+ 0x50, 0x0, 0x4, 0x22, 0x7e, 0x30, 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xcb,
+ 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac, 0x7e, 0x2e, 0x34, 0x3, 0xcc, 0x6d, 0x22,
+ 0x74, 0x8, 0xac, 0xbe, 0x9, 0xb5, 0x3, 0xb2, 0x12, 0x6f, 0xa9, 0x7e, 0x30,
+ 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0x27, 0x6d, 0x0, 0x7e, 0x70, 0x5, 0xac,
+ 0x7e, 0x2e, 0x34, 0x3, 0xcc, 0x22, 0xa9, 0xd6, 0xcb, 0x69, 0x30, 0x0, 0x4,
+ 0x7e, 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x4, 0x69, 0x30, 0x0, 0x6, 0x7e,
+ 0x27, 0x56, 0xba, 0x59, 0x32, 0x0, 0x6, 0x69, 0x30, 0x0, 0x8, 0x7e, 0x27,
+ 0x56, 0xba, 0x59, 0x32, 0x0, 0x8, 0x22, 0x7e, 0x2f, 0x56, 0xb2, 0xb, 0x2a,
+ 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0x2a, 0x30, 0x7e, 0x34, 0x0, 0x1, 0x7e, 0x2f,
+ 0x56, 0xb2, 0x79, 0x32, 0x0, 0x4, 0x7e, 0x2f, 0x56, 0xb2, 0xb, 0x2a, 0x30,
+ 0x4e, 0x70, 0x1, 0x1b, 0x2a, 0x30, 0xe4, 0x7a, 0xb3, 0x56, 0xb1, 0x22, 0x7e,
+ 0xf, 0x56, 0xb2, 0xb, 0xa, 0x30, 0x5e, 0x70, 0xfd, 0x1b, 0xa, 0x30, 0x7e,
+ 0x34, 0x0, 0x1, 0x7e, 0xf, 0x56, 0xb2, 0x79, 0x30, 0x0, 0x4, 0x7e, 0xf,
+ 0x56, 0xb2, 0xb, 0xa, 0x30, 0x4e, 0x70, 0x1, 0x1b, 0xa, 0x30, 0xe4, 0x7a,
+ 0xb3, 0x56, 0xb1, 0x22, 0x12, 0x6f, 0xee, 0x7e, 0x30, 0x3c, 0xac, 0x3f,
+ 0x7d, 0x31, 0x2e, 0x34, 0x34, 0xe1, 0x6d, 0x22, 0x7a, 0x1d, 0x29, 0x7e, 0x4,
+ 0x0, 0x12, 0x7a, 0x5, 0x2d, 0x2e, 0x14, 0x34, 0xe5, 0x6d, 0x0, 0x22, 0x7d,
+ 0xf3, 0x3e, 0xf4, 0x2d, 0xf1, 0x7d, 0xe0, 0xb, 0x7a, 0xd0, 0x7d, 0xc3, 0x3e,
+ 0xc4, 0x7f, 0x72, 0x2d, 0xfc, 0x1b, 0x7a, 0xd0, 0xb, 0x34, 0x22, 0x12, 0x0,
+ 0x26, 0x7d, 0x3e, 0x2e, 0x34, 0x0, 0x7, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25,
+ 0x34, 0xc3, 0x12, 0x39, 0xab, 0xb, 0xf0, 0xbe, 0xf0, 0x4, 0x22, 0x7f, 0x70,
+ 0x7d, 0x12, 0xd2, 0xcc, 0x7e, 0x4, 0x0, 0x3, 0x7e, 0x2f, 0x56, 0xad, 0x1b,
+ 0x2a, 0x0, 0x7e, 0x2f, 0x56, 0xad, 0x79, 0x32, 0x0, 0x6, 0x22, 0x7a, 0xb3,
+ 0x54, 0xf7, 0x7a, 0xb3, 0x54, 0xf8, 0x7a, 0xb3, 0x54, 0xf9, 0x7a, 0xb3,
+ 0x54, 0xfd, 0x74, 0xff, 0x7a, 0xb3, 0x54, 0xfe, 0xe4, 0x22, 0x7e, 0xf, 0x56,
+ 0xad, 0x69, 0x30, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x7e, 0x2f, 0x56,
+ 0xad, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x7e, 0x34, 0x0,
+ 0x2, 0x7e, 0xf, 0x56, 0xad, 0x79, 0x30, 0x0, 0x4, 0x22, 0xd2, 0xcc, 0x7e,
+ 0x24, 0x0, 0x3, 0x7e, 0xf, 0x56, 0xad, 0x1b, 0xa, 0x20, 0x7e, 0xf, 0x56,
+ 0xad, 0x79, 0x30, 0x0, 0x6, 0x22, 0x7e, 0x27, 0x34, 0x83, 0x12, 0x3f, 0x20,
+ 0x7e, 0x34, 0x0, 0x27, 0x7e, 0x27, 0x34, 0x51, 0x22, 0x6d, 0x33, 0x7e, 0xf,
+ 0x39, 0xfc, 0x79, 0x30, 0x0, 0x12, 0x22, 0x12, 0x3f, 0x29, 0x7a, 0x37, 0x3f,
+ 0x2a, 0x7e, 0x34, 0x0, 0x20, 0x7e, 0x27, 0x3f, 0x2a, 0x22, 0x7e, 0xb, 0x70,
+ 0x7c, 0x47, 0x6c, 0x55, 0x29, 0x70, 0x0, 0x1, 0xa, 0x37, 0x2d, 0x32, 0x7e,
+ 0x27, 0x56, 0xba, 0x22, 0x12, 0x40, 0xbe, 0x7d, 0x3b, 0x2e, 0x34, 0x0, 0xb,
+ 0x7e, 0x30, 0x6, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0x27, 0x22, 0xe4, 0x7a, 0xb3,
+ 0x56, 0xb1, 0x7e, 0x2f, 0x56, 0xb2, 0x69, 0x32, 0x0, 0x4, 0x5e, 0x34, 0x0,
+ 0x1, 0x22, 0xe4, 0x7a, 0xb3, 0x56, 0xb1, 0x7e, 0x1f, 0x56, 0xb2, 0x69, 0x31,
+ 0x0, 0x4, 0x5e, 0x34, 0x0, 0x1, 0x22, 0x74, 0x8, 0xa4, 0x7d, 0xf5, 0xb,
+ 0xf6, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xe5, 0x2e, 0xe4, 0x1, 0x0, 0x22, 0xe5,
+ 0xc3, 0x7a, 0xb3, 0x39, 0xb5, 0xe5, 0xc3, 0x54, 0xf8, 0x4e, 0xb3, 0x39,
+ 0xb4, 0xf5, 0xc3, 0x22, 0x7d, 0x27, 0x3e, 0x24, 0x49, 0x62, 0x68, 0xc9,
+ 0x90, 0x1, 0x90, 0xe4, 0x93, 0x7f, 0x7, 0x22, 0x74, 0x3, 0x12, 0x3f, 0xc8,
+ 0x90, 0x1, 0x90, 0xe4, 0x93, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0, 0x18, 0x74,
+ 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xe5, 0x22, 0x7d, 0x3f, 0x2e, 0x34, 0x0,
+ 0x16, 0x74, 0x3c, 0xac, 0xbf, 0x49, 0x25, 0x34, 0xe1, 0x22, 0x7e, 0xb, 0xa0,
+ 0x7c, 0x4a, 0x6c, 0x55, 0x29, 0xa0, 0x0, 0x1, 0xa, 0x3a, 0x22, 0x7d, 0x2a,
+ 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x1, 0x0, 0x7d, 0x1a, 0x3e, 0x14, 0x22, 0x7e,
+ 0x34, 0x0, 0x2, 0x7e, 0x2f, 0x56, 0xad, 0x79, 0x32, 0x0, 0x4, 0x22, 0x74,
+ 0x1, 0x7a, 0xb3, 0x56, 0xb1, 0x22, 0x7e, 0x1f, 0x56, 0xad, 0x69, 0x31, 0x0,
+ 0x4, 0x5e, 0x34, 0x0, 0x2, 0x22, 0x74, 0xee, 0xac, 0xbf, 0x7d, 0xb5, 0x2e,
+ 0xb4, 0x1, 0x0, 0x7d, 0x3b, 0x22, 0x7e, 0x10, 0x2, 0xac, 0x15, 0x7e, 0x30,
+ 0x14, 0xac, 0x3a, 0x2d, 0x10, 0x22, 0x12, 0x3f, 0xaa, 0x7a, 0x37, 0x3f,
+ 0x2c, 0x7e, 0x34, 0x0, 0x20, 0x22, 0x54, 0x1, 0xa, 0x5b, 0xc4, 0x23, 0x54,
+ 0xe0, 0x7c, 0xab, 0xe4, 0x22, 0xb, 0x16, 0xb, 0xa, 0x30, 0x4e, 0x60, 0x10,
+ 0x22, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x3e, 0x34, 0x22, 0x7e, 0x30,
+ 0x3c, 0xac, 0x3f, 0x2e, 0x14, 0x34, 0xe1, 0x6d, 0x0, 0x22, 0x7e, 0x24, 0x0,
+ 0x4, 0x12, 0x40, 0xbe, 0x7e, 0x34, 0x1, 0x4, 0x22, 0xc2, 0x19, 0xc2, 0x18,
+ 0x7e, 0xb3, 0x56, 0x21, 0xbe, 0xb0, 0x1, 0x22, 0x7a, 0xb3, 0x54, 0xf4, 0x74,
+ 0xff, 0x7a, 0xb3, 0x54, 0xf5, 0xe4, 0x22, 0x74, 0x1, 0x7a, 0xb3, 0x54, 0x15,
+ 0x7a, 0xb3, 0x56, 0xa7, 0x22, 0x7e, 0xb3, 0x54, 0x60, 0x44, 0x80, 0x7a,
+ 0xb3, 0x54, 0x60, 0x22, 0x5e, 0x60, 0xbf, 0x1b, 0x28, 0x30, 0x22, 0x7e, 0xf,
+ 0x2d, 0x2a, 0x2d, 0x12, 0xb, 0xa, 0x20, 0x22, 0x7e, 0xa4, 0x0, 0x9, 0x90,
+ 0x1, 0x90, 0xe4, 0x93, 0x22, 0x2e, 0x14, 0x34, 0xc1, 0x6d, 0x0, 0x22, 0x7d,
+ 0x36, 0x12, 0x3f, 0xaa, 0x7d, 0x27, 0x3e, 0x24, 0x22, 0x74, 0x1, 0x12, 0x6a,
+ 0xf9, 0x7e, 0x8, 0x3f, 0x26, 0x22, 0x7a, 0xb3, 0x54, 0xf6, 0xd2, 0x26, 0xd2,
+ 0x25, 0x22, 0x3e, 0x34, 0x2e, 0x34, 0xa0, 0x0, 0x6d, 0x22, 0x22, 0x7d, 0x23,
+ 0x9d, 0x25, 0xbe, 0x24, 0x0, 0x0, 0x22, 0x7e, 0x8, 0x34, 0x83, 0x7e, 0x18,
+ 0x34, 0x51, 0x22, 0x7e, 0x8, 0x34, 0x43, 0x7e, 0x18, 0x34, 0x51, 0x22, 0x74,
+ 0x8, 0xac, 0xbe, 0x9, 0xf5, 0x3, 0xb0, 0x22, 0x7e, 0x34, 0x1, 0x0, 0x7e,
+ 0x8, 0x68, 0xb9, 0x22, 0x7e, 0xa7, 0x68, 0xad, 0x7e, 0xb7, 0x68, 0xaf, 0x22,
+ 0x7e, 0xf, 0x39, 0xfc, 0x79, 0x30, 0x0, 0x1a, 0x22, 0x7d, 0x23, 0x9d, 0x21,
+ 0xbe, 0x24, 0x0, 0x0, 0x22, 0x74, 0x2, 0xac, 0xbf, 0x9, 0x5, 0x2e, 0x77,
+ 0x22, 0x7e, 0x34, 0x3a, 0x0, 0x7a, 0x37, 0x39, 0xe6, 0x22, 0x7e, 0x1f, 0x2d,
+ 0x2e, 0x7a, 0x37, 0x39, 0xe4, 0x22, 0x7e, 0x73, 0x54, 0x66, 0x7a, 0x73,
+ 0x74, 0x9, 0x22, 0x7e, 0x34, 0x0, 0x19, 0x7e, 0x27, 0x3f, 0x5a, 0x22, 0x7e,
+ 0x34, 0x0, 0x18, 0x7e, 0x27, 0x3f, 0x58, 0x22, 0x7e, 0x34, 0x0, 0x16, 0x7e,
+ 0x27, 0x3f, 0x52, 0x22, 0x7e, 0x34, 0x0, 0x14, 0x7e, 0x27, 0x3f, 0x46, 0x22,
+ 0x7e, 0x34, 0x0, 0x21, 0x7e, 0x27, 0x3f, 0x4e, 0x22, 0x7e, 0x34, 0x0, 0x21,
+ 0x7e, 0x27, 0x3f, 0x4c, 0x22, 0x7e, 0x34, 0x0, 0x26, 0x7e, 0x27, 0x3f, 0x30,
+ 0x22, 0x7e, 0x34, 0x0, 0x1b, 0x7e, 0x27, 0x3f, 0x44, 0x22, 0x7e, 0x34, 0x0,
+ 0x28, 0x7e, 0x27, 0x3f, 0x34, 0x22, 0x7e, 0x34, 0x0, 0x2a, 0x7e, 0x27, 0x3f,
+ 0x38, 0x22, 0x7e, 0x34, 0x0, 0x1, 0x7e, 0x27, 0x3f, 0x36, 0x22, 0x7e, 0x34,
+ 0x0, 0x27, 0x7e, 0x27, 0x3f, 0x32, 0x22, 0x7e, 0x34, 0x0, 0x25, 0x7e, 0x27,
+ 0x3f, 0x2e, 0x22, 0x7e, 0x34, 0x0, 0x1f, 0x7e, 0x27, 0x3f, 0x76, 0x22, 0x7e,
+ 0x34, 0x1, 0x35, 0x7e, 0x8, 0x2e, 0x77, 0x22, 0xc2, 0xa, 0x12, 0x5e, 0x72,
+ 0xc2, 0x0, 0x22, 0x7e, 0x73, 0x56, 0x2a, 0xbe, 0x70, 0x64, 0x22, 0x90, 0x1,
+ 0x8a, 0xe4, 0x93, 0x24, 0xfe, 0x22, 0x49, 0x25, 0x34, 0xc1, 0x2, 0x39, 0xab,
+ 0x7e, 0xa3, 0x56, 0x21, 0x74, 0x8, 0xa4, 0x22, 0x12, 0x3f, 0x10, 0x7e, 0x34,
+ 0x0, 0x2, 0x22, 0x12, 0x3f, 0x10, 0x7e, 0x34, 0x0, 0x17, 0x22, 0x7e, 0x24,
+ 0x43, 0x21, 0x2, 0x39, 0xab, 0x5e, 0x24, 0x7d, 0xfd, 0x4e, 0x40, 0x58, 0x22,
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/firmware/fw_sample.i
diff --git a/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i b/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i
new file mode 100644
index 000000000000..d4594a30959e
--- /dev/null
+++ b/drivers/input/touchscreen/focal_ft8719_d2t/include/pramboot/FT8719_Pramboot_V0.5_20171221.i
@@ -0,0 +1,233 @@
+0x2, 0x8, 0x69, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2, 0xb, 0x5a,
+ 0x6d, 0x11, 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10, 0x7e, 0x18, 0xc6, 0xe,
+ 0xb, 0x1a, 0x30, 0x4d, 0x33, 0x78, 0xf5, 0x7e, 0x18, 0xc6, 0x8, 0xb, 0x1a,
+ 0x50, 0x22, 0xff, 0x2, 0x7, 0xd8, 0x7e, 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30,
+ 0x70, 0x5, 0x5e, 0x70, 0xef, 0x80, 0x3, 0x4e, 0x70, 0x10, 0x1b, 0xa, 0x30,
+ 0x22, 0x2, 0xb, 0x8a, 0xca, 0xf8, 0xe4, 0x7a, 0xb3, 0x2, 0xeb, 0x7e, 0x34,
+ 0xf0, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x7a, 0x1f, 0x2, 0x55, 0x74, 0x1f, 0x12,
+ 0xa, 0x34, 0x7e, 0x34, 0xf0, 0x0, 0x7e, 0x24, 0x0, 0x1, 0x12, 0x9, 0xb5,
+ 0xe4, 0x33, 0x7c, 0xfb, 0xbe, 0xf0, 0x1, 0x78, 0xa, 0x7e, 0xb3, 0x2, 0xeb,
+ 0x44, 0x2, 0x7a, 0xb3, 0x2, 0xeb, 0x6c, 0xaa, 0xa, 0x3a, 0x19, 0xa3, 0x2,
+ 0xe3, 0xb, 0xa0, 0xbe, 0xa0, 0x8, 0x78, 0xf3, 0x7e, 0x34, 0x0, 0x8, 0x7a,
+ 0x37, 0x2, 0x59, 0x7e, 0x1f, 0x2, 0x55, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0x3,
+ 0x71, 0x6c, 0xaa, 0x6c, 0x77, 0xa, 0x2a, 0x19, 0x72, 0x2, 0xe3, 0xb, 0xa0,
+ 0xbe, 0xa0, 0x8, 0x78, 0xf3, 0x7e, 0x34, 0x0, 0x8, 0x7a, 0x37, 0x2, 0xde,
+ 0x7e, 0x1f, 0x2, 0x55, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0xb, 0x6b, 0x7e, 0xf0,
+ 0x1, 0x6c, 0xaa, 0xa, 0x3a, 0x9, 0xb3, 0x2, 0xe3, 0xbc, 0xba, 0x68, 0x4,
+ 0x6c, 0xff, 0x80, 0x7, 0xb, 0xa0, 0xbe, 0xa0, 0x8, 0x40, 0xeb, 0xbe, 0xf0,
+ 0x1, 0x78, 0xa, 0x7e, 0xb3, 0x2, 0xeb, 0x44, 0x4, 0x7a, 0xb3, 0x2, 0xeb,
+ 0x7e, 0xb3, 0x2, 0xeb, 0x44, 0x1, 0x7a, 0xb3, 0x2, 0xeb, 0xda, 0xf8, 0x22,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xe0, 0xf4, 0x1f, 0xeb,
+ 0x43, 0x14, 0xbc, 0xcd, 0xe3, 0x32, 0x1c, 0xff, 0x0, 0xff, 0x0, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x7c, 0x6b, 0xc2, 0x2, 0x7e, 0xb3, 0x2, 0x39, 0x14, 0x78, 0x3,
+ 0x2, 0x3, 0x6e, 0x1b, 0xb1, 0x78, 0x3, 0x2, 0x2, 0x56, 0x1b, 0xb1, 0x78,
+ 0x3, 0x2, 0x3, 0x6e, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x14, 0x78, 0x3, 0x2,
+ 0x2, 0xa6, 0x1b, 0xb1, 0x78, 0x3, 0x2, 0x2, 0xcd, 0x24, 0xf9, 0x78, 0x3,
+ 0x2, 0x2, 0xe4, 0x24, 0xaf, 0x78, 0x3, 0x2, 0x3, 0x52, 0x24, 0xfd, 0x68,
+ 0x41, 0x14, 0x78, 0x3, 0x2, 0x2, 0xe9, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e,
+ 0x1b, 0xb2, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x24, 0xda, 0x68, 0x2d, 0x24, 0xe6,
+ 0x68, 0x26, 0x24, 0xeb, 0x68, 0x41, 0x24, 0xf3, 0x78, 0x3, 0x2, 0x3, 0x6e,
+ 0x24, 0xe4, 0x78, 0x3, 0x2, 0x3, 0x60, 0x14, 0x78, 0x3, 0x2, 0x3, 0x6e,
+ 0x24, 0xf4, 0x78, 0x3, 0x2, 0x3, 0x6e, 0x24, 0xa0, 0x68, 0x3, 0x2, 0x3,
+ 0x70, 0x2, 0x3, 0x5a, 0xbe, 0x60, 0x4, 0x50, 0xb, 0xe4, 0x7a, 0xb3, 0x2,
+ 0xf1, 0xa, 0x26, 0x19, 0x72, 0x2, 0x3b, 0xa5, 0xbe, 0x0, 0x2, 0x80, 0x3,
+ 0x2, 0x3, 0x70, 0xd2, 0x2, 0x22, 0x7c, 0xb6, 0x24, 0x0, 0x78, 0x3, 0x2, 0x3,
+ 0x70, 0x1b, 0xb1, 0x68, 0x1e, 0x14, 0x68, 0x1e, 0x14, 0x68, 0x1e, 0x14,
+ 0x68, 0x1e, 0xb, 0xb2, 0x78, 0x35, 0x30, 0x1, 0x7, 0x7e, 0x8, 0x0, 0x21,
+ 0x2, 0x2, 0x73, 0x7e, 0x8, 0x1, 0x2d, 0x2, 0x2, 0x73, 0x2, 0x3, 0xf, 0x2,
+ 0x3, 0x16, 0x2, 0x3, 0x2f, 0xa, 0x27, 0x7e, 0xf, 0x2, 0x50, 0xb, 0x16, 0xb,
+ 0xa, 0x30, 0x2d, 0x32, 0x1b, 0xa, 0x30, 0x6d, 0x33, 0x7e, 0xf, 0x2, 0x50,
+ 0x79, 0x30, 0x0, 0x6, 0x22, 0x7c, 0x57, 0x6e, 0x53, 0x2, 0xf1, 0x7a, 0x53,
+ 0x2, 0xf1, 0x7e, 0x2f, 0x2, 0x50, 0x2e, 0x54, 0x0, 0x6, 0xb, 0x2a, 0x20,
+ 0x7d, 0x12, 0xb, 0x14, 0x1b, 0x2a, 0x10, 0x7e, 0xf, 0x2, 0x50, 0x2d, 0x12,
+ 0x39, 0x70, 0x0, 0x8, 0x7e, 0xf, 0x2, 0x50, 0x69, 0x50, 0x0, 0x4, 0x69,
+ 0x20, 0x0, 0x6, 0xbd, 0x25, 0x50, 0x3, 0x2, 0x3, 0x70, 0xb2, 0x1, 0x7a, 0xf,
+ 0x2, 0x4a, 0x7e, 0x34, 0x0, 0x2, 0x2, 0x3, 0x69, 0x7c, 0xb6, 0x1b, 0xb1,
+ 0x68, 0x1e, 0x14, 0x68, 0x1e, 0xb, 0xb1, 0x68, 0x3, 0x2, 0x3, 0x70, 0x30,
+ 0x1, 0x6, 0x7e, 0x8, 0x0, 0x21, 0x80, 0x4, 0x7e, 0x8, 0x1, 0x2d, 0x7a, 0xf,
+ 0x2, 0x50, 0x2, 0x2, 0xfd, 0x2, 0x3, 0xf, 0xa, 0x57, 0x6d, 0x44, 0x7e, 0xf,
+ 0x2, 0x50, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30,
+ 0x0, 0x2, 0x1b, 0xa, 0x20, 0x7e, 0x1f, 0x2, 0x50, 0x7a, 0x1f, 0x2, 0x4a,
+ 0xd2, 0x2, 0x7e, 0x34, 0x0, 0x1, 0x2, 0x3, 0x69, 0x75, 0xe6, 0x0, 0xe4,
+ 0x7e, 0x34, 0x1, 0x4, 0x7e, 0x24, 0x0, 0xff, 0x7a, 0x1b, 0xb0, 0x7e, 0x34,
+ 0x1, 0x5, 0x7a, 0x1b, 0xb0, 0x7e, 0x34, 0x1, 0x8, 0x7a, 0x1b, 0xb0, 0x7e,
+ 0x34, 0x1, 0x9, 0x7a, 0x1b, 0xb0, 0xd2, 0x3, 0x22, 0xa5, 0xbe, 0x1, 0x5,
+ 0x7a, 0x73, 0x2, 0x4e, 0x22, 0xa5, 0xbe, 0x2, 0x2, 0x80, 0x3, 0x2, 0x3,
+ 0x70, 0x7a, 0x73, 0x2, 0x3a, 0x22, 0x7a, 0x73, 0x2, 0x47, 0x22, 0x1b, 0x61,
+ 0x68, 0x22, 0x1b, 0x60, 0x68, 0x25, 0x1b, 0x60, 0x68, 0x3a, 0x1b, 0x60,
+ 0x68, 0x43, 0xb, 0x62, 0x78, 0x73, 0xa, 0x37, 0x7d, 0x3, 0x6d, 0x11, 0x7e,
+ 0x1f, 0x2, 0x50, 0x79, 0x11, 0x0, 0x2, 0x1b, 0x1a, 0x0, 0x22, 0xa, 0x57,
+ 0x7c, 0xab, 0xe4, 0x80, 0x2, 0xa, 0x57, 0x6d, 0x44, 0x7e, 0xf, 0x2, 0x50,
+ 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2f, 0x12, 0x79, 0x30, 0x0, 0x2,
+ 0x1b, 0xa, 0x20, 0x22, 0x7c, 0x67, 0x6c, 0x77, 0x7e, 0xf, 0x2, 0x50, 0x79,
+ 0x30, 0x0, 0x4, 0x22, 0xa, 0x27, 0x7e, 0xf, 0x2, 0x50, 0xb, 0x16, 0xb, 0xa,
+ 0x30, 0x2d, 0x32, 0x1b, 0xa, 0x30, 0x7e, 0x34, 0x0, 0x3, 0x80, 0x17, 0x7e,
+ 0x34, 0x0, 0x4, 0x7a, 0x37, 0x2, 0x45, 0xe4, 0x7a, 0xb3, 0x2, 0xf1, 0x22,
+ 0xe4, 0x7a, 0xb3, 0x2, 0xeb, 0x7e, 0x34, 0x0, 0x5, 0x7a, 0x37, 0x2, 0x45,
+ 0x22, 0xd2, 0x2, 0x22, 0xca, 0x79, 0x7f, 0x50, 0x7f, 0x41, 0x7e, 0x47, 0x2,
+ 0x59, 0x7e, 0x18, 0xc6, 0x0, 0xb, 0x1a, 0x50, 0x54, 0x1f, 0x1b, 0x1a, 0x50,
+ 0x7f, 0x14, 0x5e, 0x34, 0x0, 0x7f, 0x7d, 0x53, 0x7e, 0x74, 0x0, 0x80, 0x9d,
+ 0x75, 0xbd, 0x47, 0x38, 0x2, 0x80, 0x3c, 0x7a, 0x77, 0x2, 0x5b, 0x7f, 0x14,
+ 0x7f, 0x5, 0x12, 0x8, 0xf6, 0x9d, 0x47, 0x7d, 0x37, 0x6d, 0x22, 0x2f, 0x41,
+ 0x2d, 0xb7, 0x80, 0x1b, 0x7e, 0x54, 0x0, 0x80, 0x7a, 0x57, 0x2, 0x5b, 0x7f,
+ 0x14, 0x7f, 0x5, 0x12, 0x8, 0xf6, 0x9e, 0x44, 0x0, 0x80, 0x2e, 0xb4, 0x0,
+ 0x80, 0x2e, 0x48, 0x0, 0x80, 0xbe, 0x44, 0x0, 0x80, 0x50, 0xdf, 0x4d, 0x44,
+ 0x68, 0xb, 0x7a, 0x47, 0x2, 0x5b, 0x7f, 0x14, 0x7f, 0x5, 0x12, 0x8, 0xf6,
+ 0xd3, 0xda, 0x79, 0x22, 0xd2, 0x5, 0x12, 0xb, 0x45, 0xe4, 0x12, 0x0, 0x2e,
+ 0x74, 0x60, 0x12, 0xb, 0x4, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9,
+ 0x40, 0xfb, 0x22, 0xff, 0x56, 0x30, 0x2e, 0x32, 0x44, 0x65, 0x63, 0x20,
+ 0x32, 0x31, 0x20, 0x32, 0x30, 0x31, 0x37, 0x0, 0x46, 0x54, 0x53, 0x38, 0x37,
+ 0x31, 0x39, 0x5f, 0x70, 0x72, 0x61, 0x6d, 0x62, 0x6f, 0x6f, 0x74, 0x0, 0x0,
+ 0x12, 0xb, 0x7b, 0x7e, 0x37, 0x2, 0x45, 0x1b, 0x34, 0x68, 0x65, 0x1b, 0x35,
+ 0x78, 0x3, 0x2, 0x4, 0xc5, 0x1b, 0x34, 0x78, 0x3, 0x2, 0x4, 0xf3, 0x1b,
+ 0x34, 0x78, 0x3, 0x2, 0x5, 0x8b, 0x2e, 0x34, 0x0, 0x3, 0x68, 0x3, 0x2, 0x5,
+ 0xa3, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2, 0x48, 0x30, 0x4,
+ 0x5, 0x12, 0xa, 0xed, 0xc2, 0x4, 0x7e, 0xf, 0x2, 0x4a, 0x69, 0x30, 0x0, 0x4,
+ 0x7a, 0x37, 0x2, 0x59, 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x2e, 0x14,
+ 0x0, 0x8, 0x12, 0x3, 0x71, 0xd2, 0x4, 0x7e, 0x2f, 0x2, 0x4a, 0x69, 0x12,
+ 0x0, 0x4, 0x69, 0x32, 0x0, 0x2, 0xb, 0x2a, 0x20, 0x12, 0x7, 0x85, 0x2e,
+ 0x34, 0x10, 0x0, 0x2, 0x5, 0x85, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7e,
+ 0x34, 0x1, 0x0, 0x7a, 0x37, 0x2, 0xde, 0x7e, 0xf, 0x2, 0x4a, 0x69, 0x30,
+ 0x0, 0x2, 0xb, 0xa, 0x20, 0x2e, 0x14, 0x0, 0x8, 0x12, 0xb, 0x6b, 0x20, 0x0,
+ 0x3, 0x2, 0x5, 0xa3, 0x7e, 0x1f, 0x2, 0x4a, 0x29, 0xb1, 0x0, 0x8, 0xf5,
+ 0x91, 0x2, 0x5, 0xa3, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2,
+ 0x48, 0x7e, 0x18, 0x2, 0xf1, 0x7a, 0x1f, 0x2, 0x57, 0x7e, 0xf, 0x2, 0x4a,
+ 0x69, 0x30, 0x0, 0x2, 0xb, 0xa, 0x20, 0x69, 0x10, 0x0, 0x4, 0x12, 0x5, 0xbd,
+ 0x12, 0xa, 0xed, 0x7e, 0x34, 0xf0, 0x55, 0x2, 0x5, 0x85, 0x6d, 0x33, 0x7a,
+ 0x37, 0x2, 0x45, 0x7a, 0x37, 0x2, 0x48, 0x7e, 0xd3, 0x2, 0x4e, 0xbe, 0xd0,
+ 0xa, 0x78, 0x15, 0xe4, 0x12, 0x8, 0xb0, 0x7e, 0xf0, 0x10, 0x7c, 0xbf, 0x12,
+ 0xa, 0x34, 0xb, 0xf0, 0xbe, 0xf0, 0x17, 0x78, 0xf4, 0x80, 0x63, 0xbe, 0xd0,
+ 0xb, 0x78, 0x11, 0x7e, 0xe0, 0x2, 0x7c, 0xbe, 0x12, 0xa, 0x34, 0xb, 0xe0,
+ 0xbe, 0xe0, 0x17, 0x78, 0xf4, 0x80, 0x4d, 0xbe, 0xd0, 0xc, 0x78, 0x6, 0xe4,
+ 0x12, 0xa, 0x34, 0x80, 0x42, 0xbe, 0xd0, 0xd, 0x78, 0x11, 0x7e, 0xd0, 0x12,
+ 0x7c, 0xbd, 0x12, 0xa, 0x34, 0xb, 0xd0, 0xbe, 0xd0, 0x15, 0x78, 0xf4, 0x80,
+ 0x2c, 0x7e, 0x73, 0x2, 0x4e, 0xa, 0x37, 0x9e, 0x34, 0x0, 0x80, 0x7a, 0x73,
+ 0x2, 0x54, 0x6c, 0xcc, 0x80, 0x12, 0x7e, 0xb3, 0x2, 0x54, 0x12, 0xa, 0x34,
+ 0x7e, 0xb3, 0x2, 0x54, 0x4, 0x7a, 0xb3, 0x2, 0x54, 0xb, 0xc0, 0x7e, 0x73,
+ 0x2, 0x3a, 0xbc, 0x7c, 0x38, 0xe6, 0x12, 0xa, 0xed, 0x7e, 0x34, 0xf0, 0xaa,
+ 0x7a, 0x37, 0x2, 0x48, 0x80, 0x18, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0x45, 0x7a,
+ 0x37, 0x2, 0x48, 0x12, 0x0, 0x46, 0x7e, 0x34, 0xf0, 0xaa, 0x7a, 0x37, 0x2,
+ 0x48, 0x12, 0xa, 0xed, 0x20, 0x3, 0x3, 0x2, 0x4, 0x25, 0x7e, 0x34, 0x13,
+ 0x88, 0x12, 0xa, 0x9a, 0x7e, 0x34, 0x13, 0x88, 0x12, 0xa, 0x9a, 0x75, 0xe9,
+ 0xff, 0x2, 0x4, 0x25, 0xca, 0x3b, 0x7a, 0x17, 0x2, 0x55, 0x7f, 0x31, 0xe4,
+ 0x7a, 0xb3, 0x2, 0x5b, 0x7e, 0x37, 0x2, 0x55, 0xbe, 0x34, 0x0, 0x0, 0x38,
+ 0x5b, 0x7e, 0x34, 0xff, 0xff, 0x7a, 0x37, 0x2, 0x55, 0x74, 0x1, 0x7a, 0xb3,
+ 0x2, 0x5b, 0x80, 0x4b, 0x7e, 0x34, 0x0, 0x80, 0x7a, 0x37, 0x2, 0xde, 0x7f,
+ 0x13, 0x7e, 0x8, 0x2, 0x5c, 0x12, 0xb, 0x6b, 0x7e, 0x37, 0x2, 0x55, 0x9e,
+ 0x34, 0x0, 0x80, 0x7a, 0x37, 0x2, 0x55, 0x2e, 0x38, 0x0, 0x80, 0x6d, 0x33,
+ 0x7a, 0x37, 0x2, 0xdc, 0x7e, 0x37, 0x2, 0xdc, 0x9, 0x63, 0x2, 0x5c, 0x7e,
+ 0xf, 0x2, 0x57, 0x7e, 0xb, 0x70, 0x6c, 0x76, 0x7a, 0xb, 0x70, 0x7e, 0x37,
+ 0x2, 0xdc, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xdc, 0xbe, 0x34, 0x0, 0x80, 0x78,
+ 0xdc, 0x7e, 0x37, 0x2, 0x55, 0xbe, 0x34, 0x0, 0x80, 0x38, 0xab, 0x7e, 0xb3,
+ 0x2, 0x5b, 0x60, 0x6, 0xb, 0x34, 0x7a, 0x37, 0x2, 0x55, 0x7e, 0x37, 0x2,
+ 0x55, 0x7a, 0x37, 0x2, 0xde, 0x7f, 0x13, 0x7e, 0x8, 0x2, 0x5c, 0x12, 0xb,
+ 0x6b, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x37, 0x2, 0xdc, 0x9, 0x63, 0x2, 0x5c,
+ 0x7e, 0xf, 0x2, 0x57, 0x7e, 0xb, 0x70, 0x6c, 0x76, 0x7a, 0xb, 0x70, 0x7e,
+ 0x37, 0x2, 0xdc, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xdc, 0x7e, 0x37, 0x2, 0x55,
+ 0xbe, 0x37, 0x2, 0xdc, 0x38, 0xd8, 0xda, 0x3b, 0x22, 0x7c, 0x7b, 0x7e, 0xa0,
+ 0xef, 0x7e, 0xb3, 0x2, 0x39, 0x24, 0xfd, 0x68, 0x31, 0x1b, 0xb1, 0x68, 0x75,
+ 0x14, 0x68, 0x77, 0x24, 0xa0, 0x68, 0x34, 0x1b, 0xb2, 0x68, 0x36, 0x24,
+ 0x9e, 0x68, 0x2c, 0x24, 0xe3, 0x68, 0x48, 0x24, 0xf4, 0x68, 0x4a, 0x24,
+ 0x65, 0x78, 0x63, 0xa5, 0xbf, 0x0, 0x5, 0x7e, 0xa0, 0x87, 0x80, 0x5a, 0xa5,
+ 0xbf, 0x1, 0x56, 0x7e, 0xa0, 0xa9, 0x80, 0x51, 0xa, 0x17, 0x7e, 0x1f, 0x2,
+ 0x50, 0x2d, 0x31, 0x29, 0xa1, 0x0, 0x8, 0x80, 0x43, 0x7e, 0xa3, 0x2, 0xf1,
+ 0x80, 0x3d, 0xa5, 0xbf, 0x0, 0xa, 0x7e, 0x37, 0x2, 0x48, 0xa, 0x56, 0x7c,
+ 0xab, 0x80, 0x2f, 0xa5, 0xbf, 0x1, 0x2b, 0x7e, 0x57, 0x2, 0x48, 0x7c, 0xab,
+ 0x80, 0x23, 0x7e, 0xa3, 0x2, 0xeb, 0x80, 0x1d, 0xa5, 0xbf, 0x0, 0x5, 0x7e,
+ 0xb3, 0x2, 0xec, 0x22, 0xa5, 0xbf, 0x1, 0x7, 0x7e, 0xb3, 0x2, 0xec, 0x64,
+ 0xff, 0x22, 0x7e, 0xa0, 0x5, 0x80, 0x4, 0x7e, 0xa3, 0x2, 0xf4, 0x7c, 0xba,
+ 0x22, 0x9f, 0x22, 0x7d, 0x23, 0x1b, 0x24, 0x7e, 0x78, 0xc6, 0xa, 0x1b, 0x7a,
+ 0x20, 0x7e, 0x78, 0xc6, 0x0, 0xb, 0x7a, 0x20, 0x4e, 0x50, 0x20, 0x1b, 0x7a,
+ 0x20, 0x6d, 0x22, 0x7e, 0x78, 0xc6, 0x6, 0x1b, 0x7a, 0x20, 0x80, 0x23, 0x7e,
+ 0x78, 0xc6, 0xc, 0xb, 0x7a, 0x20, 0x5e, 0x24, 0x0, 0xff, 0xbe, 0x24, 0x0,
+ 0x0, 0x28, 0x12, 0x7e, 0x78, 0xc6, 0x8, 0xb, 0x7a, 0x20, 0x7d, 0xf5, 0x2d,
+ 0xf1, 0x7d, 0xe0, 0x7a, 0x7b, 0x50, 0xb, 0x2c, 0x7d, 0xf3, 0x6d, 0xee, 0xbf,
+ 0x27, 0x40, 0xd5, 0x7e, 0x14, 0x0, 0x1, 0x7e, 0x18, 0xc6, 0x4, 0x1b, 0x1a,
+ 0x10, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x7e, 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30,
+ 0x5e, 0x70, 0x1f, 0x1b, 0xa, 0x30, 0x22, 0x6d, 0x0, 0x74, 0x10, 0x4d, 0x0,
+ 0x78, 0xb, 0x4d, 0x22, 0x78, 0x27, 0x8d, 0x31, 0x7d, 0x12, 0x6d, 0x22, 0x22,
+ 0x7d, 0x43, 0x7d, 0x32, 0x6d, 0x22, 0x2f, 0x11, 0x2d, 0x44, 0x50, 0x2, 0xa5,
+ 0xf, 0xbf, 0x10, 0x40, 0x4, 0x9f, 0x10, 0xb, 0x90, 0x14, 0x78, 0xed, 0x7f,
+ 0x1, 0x6d, 0x22, 0x7d, 0x34, 0x22, 0x7d, 0x41, 0x7d, 0x13, 0x8d, 0x24, 0x7d,
+ 0x2, 0x2f, 0x0, 0x40, 0x4, 0xbd, 0x4, 0x40, 0x4, 0x9d, 0x4, 0xb, 0x14, 0x14,
+ 0x78, 0xf1, 0x7d, 0x23, 0x7d, 0x31, 0x7d, 0x10, 0x6d, 0x0, 0x22, 0xca, 0x2b,
+ 0xca, 0x1b, 0xca, 0xb, 0xd2, 0x0, 0x30, 0x90, 0x24, 0xc2, 0x90, 0x7e, 0x71,
+ 0x91, 0x7e, 0xb3, 0x2, 0x4f, 0x70, 0x4, 0x7a, 0x73, 0x2, 0x39, 0x12, 0x1,
+ 0x20, 0x7e, 0xb3, 0x2, 0x4f, 0x4, 0x7a, 0xb3, 0x2, 0x4f, 0x30, 0x2, 0x6,
+ 0xe4, 0x12, 0x6, 0x85, 0xf5, 0x91, 0x30, 0x91, 0x10, 0xc2, 0x91, 0x7e, 0xb3,
+ 0x2, 0x4f, 0x4, 0x7a, 0xb3, 0x2, 0x4f, 0x12, 0x6, 0x85, 0xf5, 0x91, 0xda,
+ 0xb, 0xda, 0x1b, 0xda, 0x2b, 0x32, 0xd2, 0x5, 0x12, 0xb, 0x45, 0xe4, 0x12,
+ 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12, 0x0, 0xe, 0x7c, 0xab, 0x74, 0x1,
+ 0x12, 0x0, 0x2e, 0x5e, 0xa0, 0xc3, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x1, 0x12,
+ 0xb, 0x4, 0x7c, 0xba, 0x12, 0xb, 0x4, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa,
+ 0xb9, 0x40, 0xfb, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12,
+ 0x0, 0xe, 0x7a, 0xb3, 0x2, 0xf4, 0x74, 0x1, 0x2, 0x0, 0x2e, 0x75, 0x84, 0x1,
+ 0x7e, 0x44, 0x1f, 0xff, 0xe4, 0x7a, 0x49, 0xb0, 0x1b, 0x44, 0x78, 0xf9,
+ 0x7e, 0xf8, 0x2, 0xf5, 0xd2, 0x4, 0xd2, 0x0, 0xc2, 0x2, 0xc2, 0x3, 0x7e,
+ 0x4, 0x0, 0xff, 0x7e, 0x14, 0xb, 0x97, 0xb, 0xa, 0x40, 0x5d, 0x44, 0x68,
+ 0x1a, 0x69, 0x20, 0x0, 0x2, 0xb, 0xe, 0xb, 0x44, 0x80, 0xa, 0x7e, 0xb, 0xb0,
+ 0x7a, 0x29, 0xb0, 0xb, 0x24, 0xb, 0xc, 0x1b, 0x44, 0x78, 0xf2, 0x80, 0xdf,
+ 0x2, 0x4, 0x22, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xb, 0x45, 0x74, 0xd8, 0xa,
+ 0x3a, 0x7d, 0x23, 0x6d, 0x33, 0x12, 0x9, 0x3a, 0x74, 0x1, 0x12, 0x0, 0x2e,
+ 0x6d, 0x33, 0x7a, 0x37, 0x2, 0xf2, 0x12, 0xa, 0xb9, 0x50, 0xa, 0x7e, 0x37,
+ 0x2, 0xf2, 0xbe, 0x34, 0xf, 0xa0, 0x28, 0xf1, 0x7e, 0x37, 0x2, 0xf2, 0xbe,
+ 0x34, 0xf, 0xa0, 0x28, 0xf, 0xc2, 0x86, 0xc2, 0x87, 0x7e, 0x34, 0x13, 0x88,
+ 0x12, 0xa, 0x9a, 0xd2, 0x86, 0xd2, 0x87, 0x22, 0x7f, 0x70, 0x7f, 0x61, 0xd2,
+ 0x5, 0x12, 0xb, 0x45, 0x74, 0x2, 0x7f, 0x16, 0x12, 0x9, 0x3a, 0x6d, 0x33,
+ 0x80, 0x1d, 0x7f, 0x7, 0x2d, 0x13, 0x7e, 0xb, 0x50, 0xa, 0x25, 0x7e, 0x8,
+ 0xc6, 0x6, 0x1b, 0xa, 0x20, 0x7e, 0x8, 0xc6, 0xe, 0xb, 0xa, 0x20, 0x4d,
+ 0x22, 0x78, 0xf5, 0xb, 0x34, 0x7e, 0x27, 0x2, 0x5b, 0xbd, 0x23, 0x38, 0xdb,
+ 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9, 0x40, 0xfb, 0x22, 0x7c, 0xab,
+ 0x7d, 0x12, 0x7c, 0xb3, 0x7a, 0xb3, 0x2, 0x5f, 0x7c, 0x36, 0x7c, 0x25, 0xa,
+ 0x4, 0x6c, 0x22, 0x7c, 0xb3, 0x7a, 0xb3, 0x2, 0x5e, 0x6d, 0x22, 0x7c, 0xb7,
+ 0x7a, 0xb3, 0x2, 0x5d, 0xe4, 0x12, 0x0, 0x2e, 0x7c, 0xba, 0x12, 0xb, 0x4,
+ 0x7e, 0xb3, 0x2, 0x5f, 0x12, 0xb, 0x4, 0x7e, 0xb3, 0x2, 0x5e, 0x12, 0xb,
+ 0x4, 0x7e, 0xb3, 0x2, 0x5d, 0x2, 0xb, 0x4, 0x7d, 0x12, 0x7a, 0x33, 0x2,
+ 0xe2, 0x7c, 0x36, 0x7c, 0x25, 0xa, 0x4, 0x7a, 0x33, 0x2, 0xe1, 0x7a, 0x73,
+ 0x2, 0xe0, 0x7e, 0x14, 0x0, 0xb, 0x7e, 0x18, 0xc6, 0x0, 0x1b, 0x1a, 0x10,
+ 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x3, 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2, 0xe2,
+ 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2, 0xe1, 0x12, 0xb, 0x30, 0x7e, 0xb3, 0x2,
+ 0xe0, 0x2, 0xb, 0x30, 0xd2, 0x5, 0x7e, 0x14, 0x0, 0x8, 0x7a, 0x17, 0x2,
+ 0xde, 0x7e, 0x8, 0x2, 0xe3, 0x12, 0xb, 0x6b, 0x6c, 0xaa, 0xa, 0x3a, 0x9,
+ 0xb3, 0x2, 0xe3, 0xbe, 0xb0, 0xff, 0x68, 0x4, 0xc2, 0x5, 0x80, 0x7, 0xb,
+ 0xa0, 0xbe, 0xa0, 0x8, 0x40, 0xea, 0xa2, 0x5, 0x22, 0x7a, 0xb3, 0x2, 0xf5,
+ 0x7e, 0x34, 0x0, 0x28, 0x12, 0xa, 0x9a, 0x6c, 0x33, 0x80, 0x14, 0xd2, 0x86,
+ 0x7e, 0x34, 0x0, 0xa, 0x12, 0xa, 0x9a, 0xc2, 0x86, 0x7e, 0x34, 0x0, 0xa,
+ 0x12, 0xa, 0x9a, 0xb, 0x30, 0x7e, 0x23, 0x2, 0xf5, 0xbc, 0x23, 0x38, 0xe4,
+ 0x22, 0x6d, 0x22, 0x80, 0x1d, 0x7f, 0x20, 0xb, 0x14, 0x7e, 0x2b, 0xb0, 0xa,
+ 0xfb, 0x7e, 0x28, 0xc6, 0x6, 0x1b, 0x2a, 0xf0, 0x7e, 0x28, 0xc6, 0xe, 0xb,
+ 0x2a, 0x50, 0x4d, 0x55, 0x78, 0xf5, 0xb, 0x24, 0xbd, 0x32, 0x38, 0xdf, 0xd3,
+ 0x22, 0x7c, 0xab, 0xd2, 0x5, 0x12, 0xb, 0x45, 0x74, 0x20, 0xca, 0xb8, 0xa,
+ 0x3a, 0x6d, 0x22, 0x74, 0xc, 0x2f, 0x11, 0x14, 0x78, 0xfb, 0xda, 0xb8, 0x12,
+ 0x9, 0x3a, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x12, 0xa, 0xb9, 0x40, 0xfb, 0x22,
+ 0xd2, 0xcf, 0x75, 0xcc, 0x0, 0x75, 0xec, 0xff, 0x75, 0xee, 0xff, 0x75, 0xeb,
+ 0x3, 0x75, 0xac, 0xc0, 0xa9, 0xc5, 0xca, 0x75, 0xed, 0xf, 0x75, 0xad, 0xb0,
+ 0xa9, 0xd7, 0x94, 0xa9, 0xd4, 0x94, 0x22, 0xd2, 0xc8, 0x75, 0xb3, 0x3, 0x7e,
+ 0x8, 0xc6, 0x0, 0xb, 0xa, 0x30, 0x5e, 0x34, 0x0, 0xd3, 0x1b, 0xa, 0x30, 0xb,
+ 0xa, 0x30, 0x4e, 0x70, 0x8, 0x1b, 0xa, 0x30, 0x2, 0x8, 0x21, 0x80, 0x14,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x23, 0x1b, 0x34, 0x4d, 0x22, 0x78, 0xe4,
+ 0x22, 0xe4, 0x12, 0x0, 0x2e, 0x74, 0x5, 0x12, 0xb, 0x4, 0x12, 0x0, 0xe,
+ 0x7c, 0xab, 0x74, 0x1, 0x12, 0x0, 0x2e, 0x7c, 0xba, 0x30, 0xe0, 0x2, 0xd3,
+ 0x22, 0xc3, 0x22, 0x6d, 0x33, 0x7a, 0x37, 0x2, 0xf2, 0xc2, 0x8c, 0xc2, 0x8d,
+ 0x43, 0x89, 0x2, 0x75, 0x8c, 0x1, 0x75, 0x8a, 0x0, 0xd2, 0x8c, 0xd2, 0xa9,
+ 0x22, 0x7e, 0xb3, 0x2, 0x47, 0xb4, 0xc, 0xf, 0xc2, 0x86, 0xc2, 0x87, 0x7e,
+ 0x34, 0x0, 0x64, 0x12, 0xa, 0x9a, 0xd2, 0x86, 0xd2, 0x87, 0x22, 0xa, 0x1b,
+ 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10, 0x7e, 0x18, 0xc6, 0xe, 0xb, 0x1a,
+ 0x30, 0x4d, 0x33, 0x78, 0xf5, 0xd3, 0x22, 0x75, 0x91, 0x0, 0xc2, 0x90, 0xc2,
+ 0x91, 0x75, 0x92, 0x70, 0xd2, 0xe8, 0xc2, 0xc0, 0xa9, 0xd5, 0xb7, 0xd2,
+ 0xbd, 0xd2, 0xad, 0x22, 0x1a, 0x1b, 0x7e, 0x18, 0xc6, 0x6, 0x1b, 0x1a, 0x10,
+ 0x7e, 0x18, 0xc6, 0xe, 0xb, 0x1a, 0x30, 0x4d, 0x33, 0x78, 0xf5, 0x22, 0xe4,
+ 0x12, 0x0, 0x2e, 0x30, 0x5, 0x4, 0x74, 0x6, 0x80, 0x2, 0x74, 0x4, 0x12, 0xb,
+ 0x4, 0x74, 0x1, 0x2, 0x0, 0x2e, 0xca, 0x39, 0xc2, 0x8d, 0x7e, 0x37, 0x2,
+ 0xf2, 0xb, 0x34, 0x7a, 0x37, 0x2, 0xf2, 0xda, 0x39, 0x32, 0x7f, 0x70, 0x12,
+ 0x9, 0x78, 0x7f, 0x7, 0x7e, 0x37, 0x2, 0xde, 0x12, 0x7, 0x17, 0xd3, 0x22,
+ 0x12, 0xa, 0x5a, 0x12, 0xa, 0x7b, 0x12, 0xb, 0x1a, 0x12, 0xa, 0xd5, 0xd2,
+ 0xaf, 0x22, 0xca, 0xb8, 0xa9, 0xc0, 0x93, 0xe4, 0x7a, 0xb3, 0x2, 0x4f, 0xda,
+ 0xb8, 0x32, 0x0, 0x1, 0x2, 0xeb, 0x0, 0x0, 0x1, 0x2, 0xf4, 0x0, 0x0, 0x1,
+ 0x2, 0xec, 0x0, 0x0, 0x4, 0x2, 0xed, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x1, 0x2,
+ 0xf1, 0x0, 0x0, 0x2, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x39, 0x0, 0x0,
+ 0x1, 0x2, 0x3a, 0x0, 0x0, 0x2, 0x2, 0x45, 0x0, 0x0, 0x0, 0x1, 0x2, 0x47,
+ 0x0, 0x0, 0x2, 0x2, 0x48, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4e, 0xb, 0x0, 0x1, 0x2,
+ 0x4f, 0x0, 0x0, 0x0,
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/Makefile b/drivers/input/touchscreen/nvt_touch_d2t/Makefile
new file mode 100644
index 000000000000..240d960724e5
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/Makefile
@@ -0,0 +1,7 @@
+#
+# Makefile for the Novatek NT36xxx touchscreen driver.
+#
+
+# Each configuration option enables a list of files.
+
+obj-y += nt36xxx.o nt36xxx_fw_update.o nt36xxx_ext_proc.o nt36xxx_mp_ctrlram.o
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c
new file mode 100644
index 000000000000..8b6264f329f1
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.c
@@ -0,0 +1,2626 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 20544 $
+ * $Date: 2017-12-20 11:08:15 +0800 (週三, 20 å二月 2017) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+#include <linux/proc_fs.h>
+#include <asm/uaccess.h>
+#include <linux/input/mt.h>
+#include <linux/of_gpio.h>
+#include <linux/of_irq.h>
+#include <linux/slab.h>
+#include <linux/regulator/consumer.h>
+
+#ifdef CONFIG_DRM
+#include <drm/drm_notifier.h>
+#include <drm/drm_panel.h>
+#else
+#include <linux/fb.h>
+#endif
+#include <linux/debugfs.h>
+
+#include "nt36xxx.h"
+#if NVT_TOUCH_ESD_PROTECT
+#include <linux/jiffies.h>
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+#ifdef CONFIG_FB
+extern void mdss_panel_reset_skip_enable(bool enable);
+extern bool mdss_panel_is_prim(void *fbinfo);
+#endif
+
+#if NVT_TOUCH_ESD_PROTECT
+static struct delayed_work nvt_esd_check_work;
+static struct workqueue_struct *nvt_esd_check_wq;
+static unsigned long irq_timer;
+uint8_t esd_check;
+uint8_t esd_retry;
+uint8_t esd_retry_max = 5;
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+#if NVT_TOUCH_EXT_PROC
+extern int32_t nvt_extra_proc_init(void);
+#endif
+
+#if NVT_TOUCH_MP
+extern int32_t nvt_mp_proc_init(void);
+#endif
+
+struct nvt_ts_data *ts;
+
+static struct workqueue_struct *nvt_wq;
+
+#if BOOT_UPDATE_FIRMWARE_INWORK
+static struct workqueue_struct *nvt_fwu_wq;
+
+#endif
+extern void Boot_Update_Firmware(void);
+
+static void nvt_resume_work(struct work_struct *work);
+
+#if defined(CONFIG_DRM)
+static int drm_notifier_callback(struct notifier_block *self, unsigned long event, void *data);
+#elif defined(CONFIG_FB)
+static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data);
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+static void nvt_ts_early_suspend(struct early_suspend *h);
+static void nvt_ts_late_resume(struct early_suspend *h);
+#endif
+
+#define INPUT_EVENT_START 0
+#define INPUT_EVENT_SENSITIVE_MODE_OFF 0
+#define INPUT_EVENT_SENSITIVE_MODE_ON 1
+#define INPUT_EVENT_STYLUS_MODE_OFF 2
+#define INPUT_EVENT_STYLUS_MODE_ON 3
+#define INPUT_EVENT_WAKUP_MODE_OFF 4
+#define INPUT_EVENT_WAKUP_MODE_ON 5
+#define INPUT_EVENT_COVER_MODE_OFF 6
+#define INPUT_EVENT_COVER_MODE_ON 7
+#define INPUT_EVENT_SLIDE_FOR_VOLUME 8
+#define INPUT_EVENT_DOUBLE_TAP_FOR_VOLUME 9
+#define INPUT_EVENT_SINGLE_TAP_FOR_VOLUME 10
+#define INPUT_EVENT_LONG_SINGLE_TAP_FOR_VOLUME 11
+#define INPUT_EVENT_PALM_OFF 12
+#define INPUT_EVENT_PALM_ON 13
+#define INPUT_EVENT_END 13
+
+#if TOUCH_KEY_NUM > 0
+const uint16_t touch_key_array[TOUCH_KEY_NUM] = {
+ KEY_BACK,
+ KEY_HOME,
+ KEY_MENU
+};
+#endif
+
+#if WAKEUP_GESTURE
+const uint16_t gesture_key_array[] = {
+ KEY_POWER, /*GESTURE_WORD_C*/
+ KEY_POWER, /*GESTURE_WORD_W*/
+ KEY_POWER, /*GESTURE_WORD_V*/
+ KEY_WAKEUP, /*GESTURE_DOUBLE_CLICK*/
+ KEY_POWER, /*GESTURE_WORD_Z*/
+ KEY_POWER, /*GESTURE_WORD_M*/
+ KEY_POWER, /*GESTURE_WORD_O*/
+ KEY_POWER, /*GESTURE_WORD_e*/
+ KEY_POWER, /*GESTURE_WORD_S*/
+ KEY_POWER, /*GESTURE_SLIDE_UP*/
+ KEY_POWER, /*GESTURE_SLIDE_DOWN*/
+ KEY_POWER, /*GESTURE_SLIDE_LEFT*/
+ KEY_POWER, /*GESTURE_SLIDE_RIGHT*/
+};
+#endif
+
+static uint8_t bTouchIsAwake;
+
+/*******************************************************
+Description:
+ Novatek touchscreen i2c read function.
+
+return:
+ Executive outcomes. 2---succeed. -5---I/O error
+*******************************************************/
+int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len)
+{
+ struct i2c_msg msgs[2];
+ int32_t ret = -1;
+ int32_t retries = 0;
+ msgs[0].flags = !I2C_M_RD;
+ msgs[0].addr = address;
+ msgs[0].len = 1;
+ msgs[0].buf = &buf[0];
+ msgs[1].flags = I2C_M_RD;
+ msgs[1].addr = address;
+ msgs[1].len = len - 1;
+ msgs[1].buf = &buf[1];
+
+ while (retries < 5) {
+ ret = i2c_transfer(client->adapter, msgs, 2);
+
+ if (ret == 2)
+ break;
+
+ retries++;
+ msleep(20);
+ NVT_ERR("error, retry=%d\n", retries);
+ }
+
+ if (unlikely(retries == 5)) {
+ NVT_ERR("error, ret=%d\n", ret);
+ ret = -EIO;
+ }
+
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen i2c write function.
+
+return:
+ Executive outcomes. 1---succeed. -5---I/O error
+*******************************************************/
+int32_t CTP_I2C_WRITE(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len)
+{
+ struct i2c_msg msg;
+ int32_t ret = -1;
+ int32_t retries = 0;
+ msg.flags = !I2C_M_RD;
+ msg.addr = address;
+ msg.len = len;
+ msg.buf = buf;
+
+ while (retries < 5) {
+ ret = i2c_transfer(client->adapter, &msg, 1);
+
+ if (ret == 1)
+ break;
+
+ retries++;
+ msleep(20);
+ NVT_ERR("error, retry=%d\n", retries);
+ }
+
+ if (unlikely(retries == 5)) {
+ NVT_ERR("error, ret=%d\n", ret);
+ ret = -EIO;
+ }
+
+ return ret;
+}
+
+
+/*******************************************************
+Description:
+ Novatek touchscreen reset MCU then into idle mode
+ function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_sw_reset_idle(void)
+{
+ uint8_t buf[4] = {0};
+ /*---write i2c cmds to reset idle---*/
+ buf[0] = 0x00;
+ buf[1] = 0xA5;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+ msleep(15);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen reset MCU (boot) function.
+
+return:
+ n.a.
+*******************************************************/
+int nvt_bootloader_reset(void)
+{
+ int ret = 0;
+
+ uint8_t buf[8] = {0};
+ /*write i2c cmds to reset*/
+ buf[0] = 0x00;
+ buf[1] = 0x69;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ /*need 35ms delay after bootloader reset*/
+ msleep(35);
+
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen clear FW status function.
+
+return:
+ Executive outcomes. 0---succeed. -1---fail.
+*******************************************************/
+int32_t nvt_clear_fw_status(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t i = 0;
+ const int32_t retry = 20;
+
+ for (i = 0; i < retry; i++) {
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---clear fw status---*/
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = 0x00;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+ /*---read fw status---*/
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = 0xFF;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2);
+
+ if (buf[1] == 0x00)
+ break;
+
+ msleep(10);
+ }
+
+ if (i >= retry) {
+ NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]);
+ return -EPERM;
+ } else {
+ return 0;
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check FW status function.
+
+return:
+ Executive outcomes. 0---succeed. -1---failed.
+*******************************************************/
+int32_t nvt_check_fw_status(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t i = 0;
+ const int32_t retry = 50;
+
+ for (i = 0; i < retry; i++) {
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read fw status---*/
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2);
+
+ if ((buf[1] & 0xF0) == 0xA0)
+ break;
+
+ msleep(10);
+ }
+
+ if (i >= retry) {
+ NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]);
+ return -EPERM;
+ } else {
+ return 0;
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check FW reset state function.
+
+return:
+ Executive outcomes. 0---succeed. -1---failed.
+*******************************************************/
+int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state)
+{
+ uint8_t buf[8] = {0};
+ int32_t ret = 0;
+ int32_t retry = 0;
+
+ while (1) {
+ msleep(10);
+ /*---read reset state---*/
+ buf[0] = EVENT_MAP_RESET_COMPLETE;
+ buf[1] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6);
+
+ if ((buf[1] >= check_reset_state) && (buf[1] <= RESET_STATE_MAX)) {
+ ret = 0;
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 100)) {
+ NVT_ERR("error, retry=%d, buf[1]=0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", retry, buf[1], buf[2], buf[3], buf[4], buf[5]);
+ ret = -EPERM;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen get novatek project id information
+ function.
+
+return:
+ Executive outcomes. 0---success. -1---fail.
+*******************************************************/
+int32_t nvt_read_pid(void)
+{
+ uint8_t buf[3] = {0};
+ int32_t ret = 0;
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read project id---*/
+ buf[0] = EVENT_MAP_PROJECTID;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 3);
+ ts->nvt_pid = (buf[2] << 8) + buf[1];
+ NVT_LOG("PID=%04X\n", ts->nvt_pid);
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen get firmware related information
+ function.
+
+return:
+ Executive outcomes. 0---success. -1---fail.
+*******************************************************/
+int32_t nvt_get_fw_info(void)
+{
+ uint8_t buf[64] = {0};
+ uint32_t retry_count = 0;
+ int32_t ret = 0;
+info_retry:
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read fw info---*/
+ buf[0] = EVENT_MAP_FWINFO;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 17);
+ ts->fw_ver = buf[1];
+ ts->x_num = buf[3];
+ ts->y_num = buf[4];
+ ts->max_button_num = buf[11];
+
+ /*---clear x_num, y_num if fw info is broken---*/
+ if ((buf[1] + buf[2]) != 0xFF) {
+ NVT_ERR("FW info is broken! fw_ver=0x%02X, ~fw_ver=0x%02X\n", buf[1], buf[2]);
+ ts->fw_ver = 0;
+ ts->x_num = 18;
+ ts->y_num = 32;
+ ts->max_button_num = TOUCH_KEY_NUM;
+
+ if (retry_count < 3) {
+ retry_count++;
+ NVT_ERR("retry_count=%d\n", retry_count);
+ goto info_retry;
+ } else {
+ NVT_ERR("Set default fw_ver=%d, x_num=%d, y_num=%d, \
+ max_button_num=%d!\n",
+ ts->fw_ver, ts->x_num, ts->y_num, ts->max_button_num);
+ ret = -EPERM;
+ }
+ } else {
+ ret = 0;
+ }
+
+ /*---Get Novatek PID---*/
+ nvt_read_pid();
+ return ret;
+}
+
+/*******************************************************
+ Create Device Node (Proc Entry)
+*******************************************************/
+#if NVT_TOUCH_PROC
+static struct proc_dir_entry *NVT_proc_entry;
+#define DEVICE_NAME "NVTflash"
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/NVTflash read function.
+
+return:
+ Executive outcomes. 2---succeed. -5,-14---failed.
+*******************************************************/
+static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count, loff_t *offp)
+{
+ uint8_t str[68] = {0};
+ int32_t ret = -1;
+ int32_t retries = 0;
+ int8_t i2c_wr = 0;
+
+ if (count > sizeof(str)) {
+ NVT_ERR("error count=%zu\n", count);
+ return -EFAULT;
+ }
+
+ if (copy_from_user(str, buff, count)) {
+ NVT_ERR("copy from user error\n");
+ return -EFAULT;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ cancel_delayed_work_sync(&nvt_esd_check_work);
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ i2c_wr = str[0] >> 7;
+
+ if (i2c_wr == 0) { /*I2C write*/
+ while (retries < 20) {
+ ret = CTP_I2C_WRITE(ts->client, (str[0] & 0x7F), &str[2], str[1]);
+
+ if (ret == 1)
+ break;
+ else
+ NVT_ERR("error, retries=%d, ret=%d\n", retries, ret);
+
+ retries++;
+ }
+
+ if (unlikely(retries == 20)) {
+ NVT_ERR("error, ret = %d\n", ret);
+ return -EIO;
+ }
+
+ return ret;
+ } else if (i2c_wr == 1) { /*I2C read*/
+ while (retries < 20) {
+ ret = CTP_I2C_READ(ts->client, (str[0] & 0x7F), &str[2], str[1]);
+
+ if (ret == 2)
+ break;
+ else
+ NVT_ERR("error, retries=%d, ret=%d\n", retries, ret);
+
+ retries++;
+ }
+
+ /* copy buff to user if i2c transfer */
+ if (retries < 20) {
+ if (copy_to_user(buff, str, count))
+ return -EFAULT;
+ }
+
+ if (unlikely(retries == 20)) {
+ NVT_ERR("error, ret = %d\n", ret);
+ return -EIO;
+ }
+
+ return ret;
+ } else {
+ NVT_ERR("Call error, str[0]=%d\n", str[0]);
+ return -EFAULT;
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/NVTflash open function.
+
+return:
+ Executive outcomes. 0---succeed. -12---failed.
+*******************************************************/
+static int32_t nvt_flash_open(struct inode *inode, struct file *file)
+{
+ struct nvt_flash_data *dev;
+ dev = (struct nvt_flash_data *)kmalloc(sizeof(struct nvt_flash_data), GFP_KERNEL);
+
+ if (dev == NULL) {
+ NVT_ERR("Failed to allocate memory for nvt flash data\n");
+ return -ENOMEM;
+ }
+
+ rwlock_init(&dev->lock);
+ file->private_data = dev;
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/NVTflash close function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_flash_close(struct inode *inode, struct file *file)
+{
+ struct nvt_flash_data *dev = file->private_data;
+
+ if (dev)
+ kfree(dev);
+
+ return 0;
+}
+
+static const struct file_operations nvt_flash_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_flash_open,
+ .release = nvt_flash_close,
+ .read = nvt_flash_read,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/NVTflash initial function.
+
+return:
+ Executive outcomes. 0---succeed. -12---failed.
+*******************************************************/
+static int32_t nvt_flash_proc_init(void)
+{
+ NVT_proc_entry = proc_create(DEVICE_NAME, 0444, NULL, &nvt_flash_fops);
+
+ if (NVT_proc_entry == NULL) {
+ NVT_ERR("Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("Succeeded!\n");
+ }
+
+ NVT_LOG("============================================================\n");
+ NVT_LOG("Create /proc/NVTflash\n");
+ NVT_LOG("============================================================\n");
+ return 0;
+}
+#endif
+
+#if WAKEUP_GESTURE
+#define GESTURE_WORD_C 12
+#define GESTURE_WORD_W 13
+#define GESTURE_WORD_V 14
+#define GESTURE_DOUBLE_CLICK 15
+#define GESTURE_WORD_Z 16
+#define GESTURE_WORD_M 17
+#define GESTURE_WORD_O 18
+#define GESTURE_WORD_e 19
+#define GESTURE_WORD_S 20
+#define GESTURE_SLIDE_UP 21
+#define GESTURE_SLIDE_DOWN 22
+#define GESTURE_SLIDE_LEFT 23
+#define GESTURE_SLIDE_RIGHT 24
+/* customized gesture id */
+#define DATA_PROTOCOL 30
+
+/* function page definition */
+#define FUNCPAGE_GESTURE 1
+
+
+/*******************************************************
+Description:
+ Novatek touchscreen wake up gesture key report function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_ts_wakeup_gesture_report(uint8_t gesture_id, uint8_t *data)
+{
+ uint32_t keycode = 0;
+ uint8_t func_type = data[2];
+ uint8_t func_id = data[3];
+
+ /* support fw specifal data protocol */
+ if ((gesture_id == DATA_PROTOCOL) && (func_type == FUNCPAGE_GESTURE)) {
+ gesture_id = func_id;
+ } else if (gesture_id > DATA_PROTOCOL) {
+ NVT_ERR("gesture_id %d is invalid, func_type=%d, func_id=%d\n", gesture_id, func_type, func_id);
+ return;
+ }
+
+ NVT_LOG("gesture_id = %d\n", gesture_id);
+
+ switch (gesture_id) {
+ case GESTURE_WORD_C:
+ NVT_LOG("Gesture : Word-C.\n");
+ keycode = gesture_key_array[0];
+ break;
+
+ case GESTURE_WORD_W:
+ NVT_LOG("Gesture : Word-W.\n");
+ keycode = gesture_key_array[1];
+ break;
+
+ case GESTURE_WORD_V:
+ NVT_LOG("Gesture : Word-V.\n");
+ keycode = gesture_key_array[2];
+ break;
+
+ case GESTURE_DOUBLE_CLICK:
+ NVT_LOG("Gesture : Double Click.\n");
+ keycode = gesture_key_array[3];
+ ts->dbclick_count++;
+ break;
+
+ case GESTURE_WORD_Z:
+ NVT_LOG("Gesture : Word-Z.\n");
+ keycode = gesture_key_array[4];
+ break;
+
+ case GESTURE_WORD_M:
+ NVT_LOG("Gesture : Word-M.\n");
+ keycode = gesture_key_array[5];
+ break;
+
+ case GESTURE_WORD_O:
+ NVT_LOG("Gesture : Word-O.\n");
+ keycode = gesture_key_array[6];
+ break;
+
+ case GESTURE_WORD_e:
+ NVT_LOG("Gesture : Word-e.\n");
+ keycode = gesture_key_array[7];
+ break;
+
+ case GESTURE_WORD_S:
+ NVT_LOG("Gesture : Word-S.\n");
+ keycode = gesture_key_array[8];
+ break;
+
+ case GESTURE_SLIDE_UP:
+ NVT_LOG("Gesture : Slide UP.\n");
+ keycode = gesture_key_array[9];
+ break;
+
+ case GESTURE_SLIDE_DOWN:
+ NVT_LOG("Gesture : Slide DOWN.\n");
+ keycode = gesture_key_array[10];
+ break;
+
+ case GESTURE_SLIDE_LEFT:
+ NVT_LOG("Gesture : Slide LEFT.\n");
+ keycode = gesture_key_array[11];
+ break;
+
+ case GESTURE_SLIDE_RIGHT:
+ NVT_LOG("Gesture : Slide RIGHT.\n");
+ keycode = gesture_key_array[12];
+ break;
+
+ default:
+ break;
+ }
+
+ if (keycode > 0) {
+ input_report_key(ts->input_dev, keycode, 1);
+ input_sync(ts->input_dev);
+ input_report_key(ts->input_dev, keycode, 0);
+ input_sync(ts->input_dev);
+ }
+}
+#endif
+
+static int nvt_get_dt_coords(struct device *dev, char *name)
+{
+ int ret = 0;
+ u32 coords[NVT_COORDS_ARR_SIZE] = { 0 };
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+ int coords_size;
+
+ prop = of_find_property(np, name, NULL);
+ if (!prop)
+ return -EINVAL;
+ if (!prop->value)
+ return -ENODATA;
+
+ coords_size = prop->length / sizeof(u32);
+ if (coords_size != NVT_COORDS_ARR_SIZE) {
+ NVT_ERR("invalid:%s, size:%d\n", name, coords_size);
+ return -EINVAL;
+ }
+
+ ret = of_property_read_u32_array(np, name, coords, coords_size);
+ if (ret && (ret != -EINVAL)) {
+ NVT_ERR("Unable to read %s\n", name);
+ return -ENODATA;
+ }
+
+ if (!strcmp(name, "novatek,display-coords")) {
+ ts->abs_x_max = coords[0];
+ ts->abs_y_max = coords[1];
+ } else {
+ NVT_ERR("unsupported property %s\n", name);
+ return -EINVAL;
+ }
+
+ NVT_LOG("display x %d y %d\n", ts->abs_x_max, ts->abs_y_max);
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen parse device tree function.
+
+return:
+ n.a.
+*******************************************************/
+#ifdef CONFIG_OF
+static int nvt_parse_dt(struct device *dev)
+{
+ struct device_node *temp, *np = dev->of_node;
+ struct nvt_config_info *config_info;
+ int retval;
+ u32 temp_val;
+ const char *name;
+
+ retval = nvt_get_dt_coords(dev, "novatek,display-coords");
+ if (retval < 0)
+ NVT_ERR("Unable to get display-coords\n");
+
+ ts->irq_gpio = of_get_named_gpio_flags(np, "novatek,irq-gpio", 0, &ts->irq_flags);
+ NVT_LOG("novatek,irq-gpio=%d\n", ts->irq_gpio);
+ ts->reset_gpio = of_get_named_gpio_flags(np, "novatek,reset-gpio", 0, NULL);
+ NVT_LOG("novatek,reset-gpio=%d\n", ts->reset_gpio);
+ ts->tddi_tp_hw_reset = of_property_read_bool(np, "novatek,tddi-tp-hw-reset");
+ ts->reset_tddi = of_get_named_gpio_flags(np, "novatek,reset-tddi", 0, NULL);
+ NVT_LOG("novatek,reset-tddi=%d\n", ts->reset_tddi);
+ retval = of_property_read_string(np, "novatek,vddio-reg-name", &name);
+
+ if (retval == -EINVAL)
+ ts->vddio_reg_name = NULL;
+ else if (retval < 0)
+ return -EINVAL;
+ else {
+ ts->vddio_reg_name = name;
+ NVT_LOG("vddio_reg_name = %s\n", name);
+ }
+
+ retval = of_property_read_string(np, "novatek,lab-reg-name", &name);
+
+ if (retval == -EINVAL)
+ ts->lab_reg_name = NULL;
+ else if (retval < 0)
+ return -EINVAL;
+ else {
+ ts->lab_reg_name = name;
+ NVT_LOG("lab_reg_name = %s\n", name);
+ }
+
+ retval = of_property_read_string(np, "novatek,ibb-reg-name", &name);
+
+ if (retval == -EINVAL)
+ ts->ibb_reg_name = NULL;
+ else if (retval < 0)
+ return -EINVAL;
+ else {
+ ts->ibb_reg_name = name;
+ NVT_LOG("ibb_reg_name = %s\n", name);
+ }
+
+#ifdef NVT_TOUCH_COUNT_DUMP
+ ts->dump_click_count =
+ of_property_read_bool(np, "novatek,dump-click-count");
+#endif
+ retval = of_property_read_u32(np, "novatek,config-array-size",
+ (u32 *)&ts->config_array_size);
+
+ if (retval) {
+ NVT_LOG("Unable to get array size\n");
+ return retval;
+ }
+
+ ts->config_array = devm_kzalloc(dev, ts->config_array_size *
+ sizeof(struct nvt_config_info),
+ GFP_KERNEL);
+
+ if (!ts->config_array) {
+ NVT_LOG("Unable to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ config_info = ts->config_array;
+ for_each_child_of_node(np, temp) {
+ retval = of_property_read_u32(temp, "novatek,tp-vendor", &temp_val);
+
+ if (retval) {
+ NVT_LOG("Unable to read tp vendor\n");
+ } else {
+ config_info->tp_vendor = (u8) temp_val;
+ NVT_LOG("tp vendor: %u", config_info->tp_vendor);
+ }
+
+ retval = of_property_read_string(temp, "novatek,fw-name",
+ &config_info->nvt_cfg_name);
+
+ if (retval && (retval != -EINVAL)) {
+ NVT_LOG("Unable to read cfg name\n");
+ } else {
+ NVT_LOG("fw_name: %s", config_info->nvt_cfg_name);
+ }
+
+ retval = of_property_read_string(temp, "novatek,limit-name",
+ &config_info->nvt_limit_name);
+
+ if (retval && (retval != -EINVAL)) {
+ NVT_LOG("Unable to read limit name\n");
+ } else {
+ NVT_LOG("limit_name: %s", config_info->nvt_limit_name);
+ }
+
+#ifdef NVT_TOUCH_COUNT_DUMP
+
+ if (ts->dump_click_count) {
+ retval =
+ of_property_read_string(temp,
+ "novatek,clicknum-file-name",
+ &config_info->clicknum_file_name);
+
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev,
+ "Unable to read click count file name\n");
+ } else
+ dev_err(dev, "%s\n",
+ config_info->clicknum_file_name);
+ }
+
+#endif
+ config_info++;
+ }
+ return 0;
+}
+#else
+static int nvt_parse_dt(struct device *dev)
+{
+ ts->irq_gpio = NVTTOUCH_INT_PIN;
+ return 0;
+}
+#endif
+
+static const char *nvt_get_config(struct nvt_ts_data *ts)
+{
+ int i;
+
+ for (i = 0; i < ts->config_array_size; i++) {
+ if ((ts->lockdown_info[0] ==
+ ts->config_array[i].tp_vendor))
+ break;
+ }
+
+ if (i >= ts->config_array_size) {
+ NVT_LOG("can't find right config\n");
+ return BOOT_UPDATE_FIRMWARE_NAME;
+ }
+
+ NVT_LOG("Choose config %d: %s", i,
+ ts->config_array[i].nvt_cfg_name);
+ ts->current_index = i;
+#ifdef NVT_TOUCH_COUNT_DUMP
+
+ if (ts->dump_click_count) {
+ ts->current_clicknum_file =
+ kzalloc(TOUCH_COUNT_FILE_MAXSIZE, GFP_KERNEL);
+ strlcpy(ts->current_clicknum_file,
+ ts->config_array[i].clicknum_file_name,
+ TOUCH_COUNT_FILE_MAXSIZE);
+ }
+
+#endif
+ return ts->config_array[i].nvt_cfg_name;
+}
+
+static int nvt_get_reg(struct nvt_ts_data *ts, bool get)
+{
+ int retval;
+
+ if (!get) {
+ retval = 0;
+ goto regulator_put;
+ }
+
+ if ((ts->vddio_reg_name != NULL) && (*ts->vddio_reg_name != 0)) {
+ ts->vddio_reg = regulator_get(&ts->client->dev,
+ ts->vddio_reg_name);
+
+ if (IS_ERR(ts->vddio_reg)) {
+ NVT_ERR("Failed to get power regulator\n");
+ retval = PTR_ERR(ts->vddio_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((ts->lab_reg_name != NULL) && (*ts->lab_reg_name != 0)) {
+ ts->lab_reg = regulator_get(&ts->client->dev,
+ ts->lab_reg_name);
+
+ if (IS_ERR(ts->lab_reg)) {
+ NVT_ERR("Failed to get lab regulator\n");
+ retval = PTR_ERR(ts->lab_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((ts->ibb_reg_name != NULL) && (*ts->ibb_reg_name != 0)) {
+ ts->ibb_reg = regulator_get(&ts->client->dev,
+ ts->ibb_reg_name);
+
+ if (IS_ERR(ts->ibb_reg)) {
+ NVT_ERR("Failed to get ibb regulator\n");
+ retval = PTR_ERR(ts->ibb_reg);
+ goto regulator_put;
+ }
+ }
+
+ return 0;
+regulator_put:
+
+ if (ts->vddio_reg) {
+ regulator_put(ts->vddio_reg);
+ ts->vddio_reg = NULL;
+ }
+
+ if (ts->lab_reg) {
+ regulator_put(ts->lab_reg);
+ ts->lab_reg = NULL;
+ }
+
+ if (ts->ibb_reg) {
+ regulator_put(ts->ibb_reg);
+ ts->ibb_reg = NULL;
+ }
+
+ return retval;
+}
+
+static int nvt_enable_reg(struct nvt_ts_data *ts, bool enable)
+{
+ int retval;
+
+ if (!enable) {
+ retval = 0;
+ goto disable_ibb_reg;
+ }
+
+ if (ts->vddio_reg) {
+ retval = regulator_enable(ts->vddio_reg);
+
+ if (retval < 0) {
+ NVT_ERR("Failed to enable vddio regulator\n");
+ goto exit;
+ }
+ }
+
+ if (ts->lab_reg && ts->lab_reg) {
+ retval = regulator_enable(ts->lab_reg);
+
+ if (retval < 0) {
+ NVT_ERR("Failed to enable lab regulator\n");
+ goto disable_vddio_reg;
+ }
+ }
+
+ if (ts->ibb_reg) {
+ retval = regulator_enable(ts->ibb_reg);
+
+ if (retval < 0) {
+ NVT_ERR("Failed to enable ibb regulator\n");
+ goto disable_lab_reg;
+ }
+ }
+
+ return 0;
+disable_ibb_reg:
+
+ if (ts->ibb_reg)
+ regulator_disable(ts->ibb_reg);
+
+disable_lab_reg:
+
+ if (ts->lab_reg)
+ regulator_disable(ts->lab_reg);
+
+disable_vddio_reg:
+
+ if (ts->vddio_reg)
+ regulator_disable(ts->vddio_reg);
+
+exit:
+ return retval;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen config and request gpio
+
+return:
+ Executive outcomes. 0---succeed. not 0---failed.
+*******************************************************/
+static int nvt_gpio_config(struct nvt_ts_data *ts)
+{
+ int32_t ret = 0;
+
+ /* request INT-pin (Input) */
+ if (gpio_is_valid(ts->irq_gpio)) {
+ ret = gpio_request_one(ts->irq_gpio, GPIOF_IN, "NVT-int");
+
+ if (ret) {
+ NVT_ERR("Failed to request NVT-int GPIO\n");
+ goto err_request_irq_gpio;
+ }
+ }
+
+ if (gpio_is_valid(ts->reset_gpio)) {
+ ret = gpio_request_one(ts->reset_gpio, GPIOF_OUT_INIT_HIGH, "NVT-reset");
+
+ if (ret) {
+ NVT_ERR("Failed to request reset-int GPIO\n");
+ goto err_request_reset_gpio;
+ }
+
+ gpio_direction_output(ts->reset_gpio, 1);
+ }
+
+ return ret;
+err_request_reset_gpio:
+err_request_irq_gpio:
+ return ret;
+}
+
+#if NVT_TOUCH_ESD_PROTECT
+void nvt_esd_check_enable(uint8_t enable)
+{
+ /* enable/disable esd check flag */
+ esd_check = enable;
+ /* update interrupt timer */
+ irq_timer = jiffies;
+ /* clear esd_retry counter, if protect function is enabled */
+ esd_retry = enable ? 0 : esd_retry;
+}
+
+static uint8_t nvt_fw_recovery(uint8_t *point_data)
+{
+ uint8_t i = 0;
+ uint8_t detected = true;
+
+ /* check pattern */
+ for (i = 1; i < 7; i++) {
+ if (point_data[i] != 0x77) {
+ detected = false;
+ break;
+ }
+ }
+
+ return detected;
+}
+
+static void nvt_esd_check_func(struct work_struct *work)
+{
+ unsigned int timer = jiffies_to_msecs(jiffies - irq_timer);
+
+ /*
+ *NVT_ERR("esd_check = %d (retry %d/%d)\n", esd_check, esd_retry, esd_retry_max); //DEBUG
+ */
+ if (esd_retry >= esd_retry_max)
+ nvt_esd_check_enable(false);
+
+ if ((timer > NVT_TOUCH_ESD_CHECK_PERIOD) && esd_check) {
+ NVT_ERR("do ESD recovery, timer = %d, retry = %d\n", timer, esd_retry);
+ /* do esd recovery, bootloader reset */
+ nvt_bootloader_reset();
+ /* update interrupt timer */
+ irq_timer = jiffies;
+ /* update esd_retry counter */
+ esd_retry++;
+ }
+
+ queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work,
+ msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD));
+}
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+static void nvt_switch_mode_work(struct work_struct *work)
+{
+ struct nvt_mode_switch *ms = container_of(work, struct nvt_mode_switch, switch_mode_work);
+ struct nvt_ts_data *data = ms->nvt_data;
+ unsigned char value = ms->mode;
+
+ if (value >= INPUT_EVENT_WAKUP_MODE_OFF && value <= INPUT_EVENT_WAKUP_MODE_ON) {
+ data->gesture_enabled = value - INPUT_EVENT_WAKUP_MODE_OFF;
+ } else {
+ NVT_ERR("Does not support touch mode %d\n", value);
+ }
+
+ if (ms != NULL) {
+ kfree(ms);
+ ms = NULL;
+ }
+}
+
+static int nvt_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ struct nvt_ts_data *data = input_get_drvdata(dev);
+ struct nvt_mode_switch *ms;
+
+ if (type == EV_SYN && code == SYN_CONFIG) {
+ NVT_LOG("set input event value = %d\n", value);
+
+ if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) {
+ ms = (struct nvt_mode_switch *)kmalloc(sizeof(struct nvt_mode_switch), GFP_ATOMIC);
+
+ if (ms != NULL) {
+ ms->nvt_data = data;
+ ms->mode = (unsigned char)value;
+ INIT_WORK(&ms->switch_mode_work, nvt_switch_mode_work);
+ schedule_work(&ms->switch_mode_work);
+ } else {
+ NVT_ERR("failed in allocating memory for switching mode\n");
+ return -ENOMEM;
+ }
+ } else {
+ NVT_ERR("Invalid event value\n");
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+#define POINT_DATA_LEN 65
+/*******************************************************
+Description:
+ Novatek touchscreen work function.
+
+return:
+ n.a.
+*******************************************************/
+static void nvt_ts_work_func(void)
+{
+ int32_t ret = -1;
+ uint8_t point_data[POINT_DATA_LEN + 1] = {0};
+ uint32_t position = 0;
+ uint32_t input_x = 0;
+ uint32_t input_y = 0;
+ uint32_t input_w = 0;
+ uint32_t input_p = 0;
+ uint8_t input_id = 0;
+#if MT_PROTOCOL_B
+ uint8_t press_id[TOUCH_MAX_FINGER_NUM] = {0};
+#endif /* MT_PROTOCOL_B */
+ int32_t i = 0;
+ int32_t finger_cnt = 0;
+ mutex_lock(&ts->lock);
+
+ if (ts->dev_pm_suspend) {
+ ret = wait_for_completion_timeout(&ts->dev_pm_suspend_completion, msecs_to_jiffies(500));
+ if (!ret) {
+ NVT_ERR("system(i2c) can't finished resuming procedure, skip it\n");
+ goto XFER_ERROR;
+ }
+ }
+
+ ret = CTP_I2C_READ(ts->client, I2C_FW_Address, point_data, POINT_DATA_LEN + 1);
+ if (ret < 0) {
+ NVT_ERR("CTP_I2C_READ failed.(%d)\n", ret);
+ goto XFER_ERROR;
+ }
+
+ /*
+ //--- dump I2C buf ---
+ for (i = 0; i < 10; i++) {
+ printk("%02X %02X %02X %02X %02X %02X ", point_data[1+i*6], point_data[2+i*6], point_data[3+i*6], point_data[4+i*6], point_data[5+i*6], point_data[6+i*6]);
+ }
+ printk("\n");
+ */
+#if NVT_TOUCH_ESD_PROTECT
+
+ if (nvt_fw_recovery(point_data)) {
+ nvt_esd_check_enable(true);
+ goto XFER_ERROR;
+ }
+
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+#if WAKEUP_GESTURE
+
+ if (bTouchIsAwake == 0) {
+ input_id = (uint8_t)(point_data[1] >> 3);
+ nvt_ts_wakeup_gesture_report(input_id, point_data);
+ mutex_unlock(&ts->lock);
+ return;
+ }
+
+#endif
+ finger_cnt = 0;
+
+ for (i = 0; i < ts->max_touch_num; i++) {
+ position = 1 + 6 * i;
+ input_id = (uint8_t)(point_data[position + 0] >> 3);
+
+ if ((input_id == 0) || (input_id > ts->max_touch_num))
+ continue;
+
+ if (((point_data[position] & 0x07) == 0x01) || ((point_data[position] & 0x07) == 0x02)) { /*finger down (enter & moving)*/
+#if NVT_TOUCH_ESD_PROTECT
+ /* update interrupt timer */
+ irq_timer = jiffies;
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ input_x = (uint32_t)(point_data[position + 1] << 4) + (uint32_t)(point_data[position + 3] >> 4);
+ input_y = (uint32_t)(point_data[position + 2] << 4) + (uint32_t)(point_data[position + 3] & 0x0F);
+
+ if ((input_x < 0) || (input_y < 0))
+ continue;
+
+ if ((input_x > ts->abs_x_max) || (input_y > ts->abs_y_max))
+ continue;
+
+ input_w = (uint32_t)(point_data[position + 4]);
+
+ if (input_w == 0)
+ input_w = 1;
+
+ if (i < 2) {
+ input_p = (uint32_t)(point_data[position + 5]) + (uint32_t)(point_data[i + 63] << 8);
+
+ if (input_p > TOUCH_FORCE_NUM)
+ input_p = TOUCH_FORCE_NUM;
+ } else {
+ input_p = (uint32_t)(point_data[position + 5]);
+ }
+
+ if (input_p == 0)
+ input_p = 1;
+
+#if MT_PROTOCOL_B
+ press_id[input_id - 1] = 1;
+ input_mt_slot(ts->input_dev, input_id - 1);
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);
+#else /* MT_PROTOCOL_B */
+ input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, input_id - 1);
+ input_report_key(ts->input_dev, BTN_TOUCH, 1);
+#endif /* MT_PROTOCOL_B */
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);
+ input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y);
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, input_w);
+ input_report_abs(ts->input_dev, ABS_MT_PRESSURE, input_p);
+#if MT_PROTOCOL_B
+#else /* MT_PROTOCOL_B */
+ input_mt_sync(ts->input_dev);
+#endif /* MT_PROTOCOL_B */
+ finger_cnt++;
+ }
+ }
+
+#if MT_PROTOCOL_B
+
+ for (i = 0; i < ts->max_touch_num; i++) {
+ if (press_id[i] != 1) {
+ input_mt_slot(ts->input_dev, i);
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);
+ input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 0);
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);
+ }
+ }
+
+ input_report_key(ts->input_dev, BTN_TOUCH, (finger_cnt > 0));
+#else /* MT_PROTOCOL_B */
+
+ if (finger_cnt == 0) {
+ input_report_key(ts->input_dev, BTN_TOUCH, 0);
+ input_mt_sync(ts->input_dev);
+ }
+
+#endif /* MT_PROTOCOL_B */
+#if TOUCH_KEY_NUM > 0
+
+ if (point_data[61] == 0xF8) {
+ for (i = 0; i < ts->max_button_num; i++) {
+ input_report_key(ts->input_dev, touch_key_array[i], ((point_data[62] >> i) & 0x01));
+ }
+ } else {
+ for (i = 0; i < ts->max_button_num; i++) {
+ input_report_key(ts->input_dev, touch_key_array[i], 0);
+ }
+ }
+
+#endif
+ input_sync(ts->input_dev);
+XFER_ERROR:
+ mutex_unlock(&ts->lock);
+}
+
+/*******************************************************
+Description:
+ External interrupt service routine.
+
+return:
+ irq execute status.
+*******************************************************/
+static irqreturn_t nvt_ts_irq_handler(int32_t irq, void *dev_id)
+{
+ if (bTouchIsAwake == 0) {
+ dev_dbg(&ts->client->dev, "%s gesture wakeup\n", __func__);
+ }
+ nvt_ts_work_func();
+
+ return IRQ_HANDLED;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check and stop crc reboot loop.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_stop_crc_reboot(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t retry = 0;
+ /*read dummy buffer to check CRC fail reboot is happening or not*/
+ /*---change I2C index to prevent geting 0xFF, but not 0xFC---*/
+ buf[0] = 0xFF;
+ buf[1] = 0x01;
+ buf[2] = 0xF6;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+ /*---read to check if buf is 0xFC which means IC is in CRC reboot ---*/
+ buf[0] = 0x4E;
+ CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 4);
+
+ if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) ||
+ ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) {
+ /*IC is in CRC fail reboot loop, needs to be stopped!*/
+ for (retry = 5; retry > 0; retry--) {
+ /*---write i2c cmds to reset idle : 1st---*/
+ buf[0] = 0x00;
+ buf[1] = 0xA5;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+ /*---write i2c cmds to reset idle : 2rd---*/
+ buf[0] = 0x00;
+ buf[1] = 0xA5;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+ msleep(1);
+ /*---clear CRC_ERR_FLAG---*/
+ buf[0] = 0xFF;
+ buf[1] = 0x03;
+ buf[2] = 0xF1;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+ buf[0] = 0x35;
+ buf[1] = 0xA5;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 2);
+ /*---check CRC_ERR_FLAG---*/
+ buf[0] = 0xFF;
+ buf[1] = 0x03;
+ buf[2] = 0xF1;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+ buf[0] = 0x35;
+ buf[1] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 2);
+
+ if (buf[1] == 0xA5)
+ break;
+ }
+
+ if (retry == 0)
+ NVT_ERR("CRC auto reboot is not able to be stopped! buf[1]=0x%02X\n", buf[1]);
+ }
+
+ return;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check chip version trim function.
+
+return:
+ Executive outcomes. 0---NVT IC. -1---not NVT IC.
+*******************************************************/
+static int8_t nvt_ts_check_chip_ver_trim(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t retry = 0;
+ int32_t list = 0;
+ int32_t i = 0;
+ int32_t found_nvt_chip = 0;
+ int32_t ret = -1;
+ ret = nvt_bootloader_reset(); /* NOT in retry loop */
+ if (ret < 0) {
+ NVT_ERR("Can't reset the nvt ic\n");
+ goto out;
+ }
+
+ /*---Check for 5 times---*/
+ for (retry = 5; retry > 0; retry--) {
+ nvt_sw_reset_idle();
+ buf[0] = 0x00;
+ buf[1] = 0x35;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+ msleep(10);
+ buf[0] = 0xFF;
+ buf[1] = 0x01;
+ buf[2] = 0xF6;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+ buf[0] = 0x4E;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = 0x00;
+ buf[6] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 7);
+ NVT_LOG("buf[1]=0x%02X, buf[2]=0x%02X, buf[3]=0x%02X, buf[4]=0x%02X, buf[5]=0x%02X, buf[6]=0x%02X\n",
+ buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
+
+ /* compare read chip id on supported list */
+ for (list = 0; list < (sizeof(trim_id_table) / sizeof(struct nvt_ts_trim_id_table)); list++) {
+ found_nvt_chip = 0;
+
+ /* compare each byte */
+ for (i = 0; i < NVT_ID_BYTE_MAX; i++) {
+ if (trim_id_table[list].mask[i]) {
+ if (buf[i + 1] != trim_id_table[list].id[i])
+ break;
+ }
+ }
+
+ if (i == NVT_ID_BYTE_MAX) {
+ found_nvt_chip = 1;
+ }
+
+ if (found_nvt_chip) {
+ NVT_LOG("This is NVT touch IC\n");
+ ts->mmap = trim_id_table[list].mmap;
+ ts->carrier_system = trim_id_table[list].carrier_system;
+ ret = 0;
+ goto out;
+ } else {
+ ts->mmap = NULL;
+ ret = -1;
+ }
+ }
+
+ /*---Stop CRC check to prevent IC auto reboot---*/
+ if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) ||
+ ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) {
+ nvt_stop_crc_reboot();
+ }
+
+ msleep(10);
+ }
+
+out:
+ return ret;
+}
+
+#ifdef NVT_TOUCH_COUNT_DUMP
+static ssize_t nvt_touch_suspend_notify_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n", !bTouchIsAwake);
+}
+static DEVICE_ATTR(touch_suspend_notify, (S_IRUGO | S_IRGRP), nvt_touch_suspend_notify_show, NULL);
+#endif
+static int32_t nvt_ts_suspend(struct device *dev);
+static int32_t nvt_ts_resume(struct device *dev);
+
+static void tpdbg_suspend(struct nvt_ts_data *nvt_data, bool enable)
+{
+ if (enable)
+ nvt_ts_suspend(&nvt_data->client->dev);
+ else
+ nvt_ts_resume(&nvt_data->client->dev);
+}
+
+static int tpdbg_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+
+static ssize_t tpdbg_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
+{
+ const char *str = "cmd support as below:\n \
+ \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \
+ \necho \"tp-sd-en\" of \"tp-sd-off\" to ctrl panel in or off sleep mode\n \
+ \necho \"tp-suspend-en\" or \"tp-suspend-off\" to ctrl panel in or off suspend status\n";
+ loff_t pos = *ppos;
+ int len = strlen(str);
+
+ if (pos < 0)
+ return -EINVAL;
+
+ if (pos >= len)
+ return 0;
+
+ if (copy_to_user(buf, str, len))
+ return -EFAULT;
+
+ *ppos = pos + len;
+ return len;
+}
+
+static ssize_t tpdbg_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos)
+{
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = size;
+
+ if (!cmd)
+ return -ENOMEM;
+
+ if (copy_from_user(cmd, buf, size)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ cmd[size] = '\0';
+
+ if (!strncmp(cmd, "irq-disable", 11))
+ disable_irq_nosync(ts->client->irq);
+ else if (!strncmp(cmd, "irq-enable", 10))
+ enable_irq(ts->client->irq);
+ else if (!strncmp(cmd, "tp-sd-en", 8))
+ tpdbg_suspend(ts, true);
+ else if (!strncmp(cmd, "tp-sd-off", 9))
+ tpdbg_suspend(ts, false);
+ else if (!strncmp(cmd, "tp-suspend-en", 13))
+ tpdbg_suspend(ts, true);
+ else if (!strncmp(cmd, "tp-suspend-off", 14))
+ tpdbg_suspend(ts, false);
+
+out:
+ kfree(cmd);
+ return ret;
+}
+
+static int tpdbg_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ return 0;
+}
+
+static const struct file_operations tpdbg_operations = {
+ .owner = THIS_MODULE,
+ .open = tpdbg_open,
+ .read = tpdbg_read,
+ .write = tpdbg_write,
+ .release = tpdbg_release,
+};
+
+static int nvt_pinctrl_init(struct nvt_ts_data *nvt_data)
+{
+ int retval = 0;
+ /* Get pinctrl if target uses pinctrl */
+ nvt_data->ts_pinctrl = devm_pinctrl_get(&nvt_data->client->dev);
+
+ if (IS_ERR_OR_NULL(nvt_data->ts_pinctrl)) {
+ retval = PTR_ERR(nvt_data->ts_pinctrl);
+ NVT_ERR("Target does not use pinctrl %d\n", retval);
+ goto err_pinctrl_get;
+ }
+
+ nvt_data->pinctrl_state_active
+ = pinctrl_lookup_state(nvt_data->ts_pinctrl, PINCTRL_STATE_ACTIVE);
+
+ if (IS_ERR_OR_NULL(nvt_data->pinctrl_state_active)) {
+ retval = PTR_ERR(nvt_data->pinctrl_state_active);
+ NVT_ERR("Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_ACTIVE, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ nvt_data->pinctrl_state_suspend
+ = pinctrl_lookup_state(nvt_data->ts_pinctrl, PINCTRL_STATE_SUSPEND);
+
+ if (IS_ERR_OR_NULL(nvt_data->pinctrl_state_suspend)) {
+ retval = PTR_ERR(nvt_data->pinctrl_state_suspend);
+ NVT_ERR("Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_SUSPEND, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ return 0;
+err_pinctrl_lookup:
+ devm_pinctrl_put(nvt_data->ts_pinctrl);
+err_pinctrl_get:
+ nvt_data->ts_pinctrl = NULL;
+ return retval;
+}
+
+static ssize_t nvt_panel_color_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[2]);
+}
+
+static ssize_t nvt_panel_vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[6]);
+}
+
+static ssize_t nvt_panel_display_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%c\n", ts->lockdown_info[1]);
+}
+
+
+static ssize_t nt36xxx_grip_area_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ uint8_t tmp[8] = {0};
+ int32_t ret = 0;
+ uint8_t edge_reject_switch;
+
+ NVT_LOG("++\n");
+
+ msleep(35);
+
+ tmp[0] = 0xFF;
+ tmp[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ tmp[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 3);
+ if (ret < 0) {
+ NVT_ERR("Set event buffer index fail!\n");
+ goto nvt_get_edge_reject_switch_out;
+ }
+
+ tmp[0] = 0x5C;
+ tmp[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_FW_Address, tmp, 2);
+ if (ret < 0) {
+ NVT_ERR("Read edge reject switch status fail!\n");
+ goto nvt_get_edge_reject_switch_out;
+ }
+
+ edge_reject_switch = ((tmp[1] >> 5) & 0x03);
+ NVT_LOG("edge_reject_switch = %d\n", edge_reject_switch);
+
+nvt_get_edge_reject_switch_out:
+ NVT_LOG("--\n");
+ return ret;
+}
+
+static ssize_t nt36xxx_grip_area_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int mode;
+ uint8_t tmp[3];
+ int ret = -EIO;
+
+ if (!bTouchIsAwake) {
+ NVT_ERR("tp is suspended, no need to set\n");
+ return ret;
+ }
+ tmp[0] = 0XFF;
+ tmp[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ tmp[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 3);
+ if (ret < 0) {
+ NVT_LOG("%s error\n", __func__);
+ return ret;
+ }
+ sscanf(buf, "%u", &mode);
+ pr_info("%s,mode:%d\n", __func__, mode);
+ tmp[0] = EVENT_MAP_HOST_CMD;
+ if (mode == 90) {
+ tmp[1] = 0xBB;
+ } else if (mode == 270) {
+ tmp[1] = 0xBC;
+ } else {
+ tmp[1] = 0xBA;
+ }
+ ret = CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp, 2);
+ if (ret < 0) {
+ NVT_LOG("%s error\n", __func__);
+ return ret;
+ } else
+ return count;
+}
+
+static DEVICE_ATTR(panel_vendor, (S_IRUGO), nvt_panel_vendor_show, NULL);
+static DEVICE_ATTR(panel_color, (S_IRUGO), nvt_panel_color_show, NULL);
+static DEVICE_ATTR(panel_display, (S_IRUGO), nvt_panel_display_show, NULL);
+static DEVICE_ATTR(grip_area, (S_IRUGO | S_IWUSR | S_IWGRP),
+ nt36xxx_grip_area_show, nt36xxx_grip_area_store);
+
+static struct attribute *nvt_attr_group[] = {
+ &dev_attr_panel_vendor.attr,
+ &dev_attr_panel_color.attr,
+ &dev_attr_panel_display.attr,
+ &dev_attr_grip_area.attr,
+};
+
+static int grip_area_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+
+static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos)
+{
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = -EIO;
+
+ if (!cmd)
+ return ret;
+
+ if (copy_from_user(cmd, buf, size)) {
+ goto out;
+ }
+
+ cmd[size] = '\0';
+ ret = nt36xxx_grip_area_store(&ts->client->dev, NULL, cmd, strlen(cmd));
+out:
+ kfree(cmd);
+ return ret;
+}
+
+static int grip_area_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ return 0;
+}
+
+static const struct file_operations grip_area_operations = {
+ .owner = THIS_MODULE,
+ .open = grip_area_open,
+ .write = grip_area_write,
+ .release = grip_area_release,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen driver probe function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed
+*******************************************************/
+static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+ int32_t ret = 0;
+#if ((TOUCH_KEY_NUM > 0) || WAKEUP_GESTURE)
+ int32_t retry = 0;
+#endif
+ char *tp_maker = NULL;
+ NVT_LOG("start\n");
+ ts = kzalloc(sizeof(struct nvt_ts_data), GFP_KERNEL);
+
+ if (ts == NULL) {
+ NVT_ERR("failed to allocated memory for nvt ts data\n");
+ return -ENOMEM;
+ }
+
+ ts->client = client;
+ i2c_set_clientdata(client, ts);
+ /*---parse dts---*/
+ nvt_parse_dt(&client->dev);
+ ret = nvt_pinctrl_init(ts);
+
+ if (!ret && ts->ts_pinctrl) {
+ ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_active);
+
+ if (ret < 0) {
+ NVT_ERR("Failed to select %s pinstate %d\n",
+ PINCTRL_STATE_ACTIVE, ret);
+ } else
+ NVT_ERR("select %s pinstate\n", PINCTRL_STATE_ACTIVE);
+ } else {
+ NVT_ERR("Failed to init pinctrl\n");
+ }
+
+ /*---request and config GPIOs---*/
+ ret = nvt_gpio_config(ts);
+
+ if (ret) {
+ NVT_ERR("gpio config error!\n");
+ goto err_gpio_config_failed;
+ }
+
+ /*---check i2c func.---*/
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+ NVT_ERR("i2c_check_functionality failed. (no I2C_FUNC_I2C)\n");
+ ret = -ENODEV;
+ goto err_check_functionality_failed;
+ }
+
+ /* need 10ms delay after POR(power on reset) */
+ msleep(10);
+ /*---check chip version trim---*/
+ ret = nvt_ts_check_chip_ver_trim();
+
+ if (ret) {
+ NVT_ERR("chip is not identified\n");
+ ret = -EINVAL;
+ goto err_chipvertrim_failed;
+ }
+
+ mutex_init(&ts->mdata_lock);
+ mutex_init(&ts->lock);
+ mutex_lock(&ts->lock);
+ nvt_bootloader_reset();
+ nvt_check_fw_reset_state(RESET_STATE_INIT);
+ nvt_get_fw_info();
+ mutex_unlock(&ts->lock);
+ /*---create workqueue---*/
+ nvt_wq = create_workqueue("nvt_wq");
+
+ if (!nvt_wq) {
+ NVT_ERR("nvt_wq create workqueue failed\n");
+ ret = -ENOMEM;
+ goto err_create_nvt_wq_failed;
+ }
+
+ /*---allocate input device---*/
+ ts->input_dev = input_allocate_device();
+
+ if (ts->input_dev == NULL) {
+ NVT_ERR("allocate input device failed\n");
+ ret = -ENOMEM;
+ goto err_input_dev_alloc_failed;
+ }
+
+ ts->max_touch_num = TOUCH_MAX_FINGER_NUM;
+#if TOUCH_KEY_NUM > 0
+ ts->max_button_num = TOUCH_KEY_NUM;
+#endif
+ ts->int_trigger_type = INT_TRIGGER_TYPE;
+ /*---set input device info.---*/
+ ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;
+ ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
+ ts->input_dev->propbit[0] = BIT(INPUT_PROP_DIRECT);
+#if MT_PROTOCOL_B
+ input_mt_init_slots(ts->input_dev, ts->max_touch_num, 0);
+#endif
+ input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, TOUCH_FORCE_NUM, 0, 0); /*pressure = TOUCH_FORCE_NUM*/
+#if TOUCH_MAX_FINGER_NUM > 1
+ input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); /*area = 255*/
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max - 1, 0, 0);
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max - 1, 0, 0);
+#if MT_PROTOCOL_B
+ /* no need to set ABS_MT_TRACKING_ID, input_mt_init_slots() already set it */
+#else
+ input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0);
+#endif /*MT_PROTOCOL_B*/
+#endif /*TOUCH_MAX_FINGER_NUM > 1*/
+#if TOUCH_KEY_NUM > 0
+
+ for (retry = 0; retry < ts->max_button_num; retry++) {
+ input_set_capability(ts->input_dev, EV_KEY, touch_key_array[retry]);
+ }
+
+#endif
+#if WAKEUP_GESTURE
+
+ for (retry = 0; retry < (sizeof(gesture_key_array) / sizeof(gesture_key_array[0])); retry++) {
+ input_set_capability(ts->input_dev, EV_KEY, gesture_key_array[retry]);
+ }
+
+#endif
+ snprintf(ts->phys, strlen("input/ts"), "input/ts");
+ ts->input_dev->name = NVT_TS_NAME;
+ ts->input_dev->phys = ts->phys;
+ ts->input_dev->id.bustype = BUS_I2C;
+ ts->input_dev->event = nvt_input_event;
+ input_set_drvdata(ts->input_dev, ts);
+ /*---register input device---*/
+ ret = input_register_device(ts->input_dev);
+
+ if (ret) {
+ NVT_ERR("register input device (%s) failed. ret=%d\n", ts->input_dev->name, ret);
+ goto err_input_register_device_failed;
+ }
+
+ /*--- request regulator---*/
+ nvt_get_reg(ts, true);
+ /* we should enable the reg for lpwg mode */
+ /*nvt_enable_reg(ts, true);*/
+ /*---set int-pin & request irq---*/
+ client->irq = gpio_to_irq(ts->irq_gpio);
+
+ if (client->irq) {
+ NVT_LOG("int_trigger_type=%d\n", ts->int_trigger_type);
+#if WAKEUP_GESTURE
+ ret = request_threaded_irq(client->irq, NULL, nvt_ts_irq_handler, ts->int_trigger_type | IRQF_ONESHOT, client->name, ts);
+#else
+ ret = request_irq(client->irq, nvt_ts_irq_handler, ts->int_trigger_type, client->name, ts);
+#endif
+
+ if (ret != 0) {
+ NVT_ERR("request irq failed. ret=%d\n", ret);
+ goto err_int_request_failed;
+ } else {
+ disable_irq_nosync(client->irq);
+ NVT_LOG("request irq %d succeed\n", client->irq);
+ }
+ }
+
+ ret = nvt_get_lockdown_info(ts->lockdown_info);
+
+ if (ret < 0)
+ NVT_ERR("can't get lockdown info");
+ else {
+ NVT_ERR("Lockdown:0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n",
+ ts->lockdown_info[0], ts->lockdown_info[1], ts->lockdown_info[2], ts->lockdown_info[3],
+ ts->lockdown_info[4], ts->lockdown_info[5], ts->lockdown_info[6], ts->lockdown_info[7]);
+ }
+
+ ts->fw_name = nvt_get_config(ts);
+ tp_maker = kzalloc(20, GFP_KERNEL);
+
+ if (tp_maker == NULL)
+ NVT_ERR("fail to alloc vendor name memory\n");
+ else {
+ kfree(tp_maker);
+ tp_maker = NULL;
+ }
+
+ ts->dbclick_count = 0;
+ device_init_wakeup(&client->dev, 1);
+ ts->dev_pm_suspend = false;
+ init_completion(&ts->dev_pm_suspend_completion);
+#if BOOT_UPDATE_FIRMWARE_INWORK
+ nvt_fwu_wq = create_singlethread_workqueue("nvt_fwu_wq");
+
+ if (!nvt_fwu_wq) {
+ NVT_ERR("nvt_fwu_wq create workqueue failed\n");
+ ret = -ENOMEM;
+ goto err_create_nvt_fwu_wq_failed;
+ }
+
+ INIT_DELAYED_WORK(&ts->nvt_fwu_work, Boot_Update_Firmware);
+ /*please make sure boot update start after display reset(RESX) sequence*/
+ queue_delayed_work(nvt_fwu_wq, &ts->nvt_fwu_work, msecs_to_jiffies(14000));
+#else
+ Boot_Update_Firmware();
+#endif
+#if NVT_TOUCH_ESD_PROTECT
+ INIT_DELAYED_WORK(&nvt_esd_check_work, nvt_esd_check_func);
+ nvt_esd_check_wq = create_workqueue("nvt_esd_check_wq");
+ queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work,
+ msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD));
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ /*---set device node---*/
+#if NVT_TOUCH_PROC
+ ret = nvt_flash_proc_init();
+
+ if (ret != 0) {
+ NVT_ERR("nvt flash proc init failed. ret=%d\n", ret);
+ goto err_init_NVT_ts;
+ }
+
+#endif
+#if NVT_TOUCH_EXT_PROC
+ ret = nvt_extra_proc_init();
+
+ if (ret != 0) {
+ NVT_ERR("nvt extra proc init failed. ret=%d\n", ret);
+ goto err_init_NVT_ts;
+ }
+
+#endif
+#if NVT_TOUCH_MP
+ ret = nvt_mp_proc_init();
+
+ if (ret != 0) {
+ NVT_ERR("nvt mp proc init failed. ret=%d\n", ret);
+ goto err_init_NVT_ts;
+ }
+
+#endif
+#if defined(CONFIG_DRM)
+ ts->notifier.notifier_call = drm_notifier_callback;
+ ret = drm_register_client(&ts->notifier);
+
+ if (ret) {
+ NVT_ERR("register drm_notifier failed. ret=%d\n", ret);
+ goto err_register_drm_notif_failed;
+ }
+#elif defined(CONFIG_FB)
+ ts->notifier.notifier_call = fb_notifier_callback;
+ ret = fb_register_client(&ts->notifier);
+
+ if (ret) {
+ NVT_ERR("register drm_notifier failed. ret=%d\n", ret);
+ goto fb_register_drm_notif_failed;
+ }
+
+
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
+ ts->early_suspend.suspend = nvt_ts_early_suspend;
+ ts->early_suspend.resume = nvt_ts_late_resume;
+ ret = register_early_suspend(&ts->early_suspend);
+
+ if (ret) {
+ NVT_ERR("register early suspend failed. ret=%d\n", ret);
+ goto err_register_early_suspend_failed;
+ }
+
+#endif
+ ts->attrs.attrs = nvt_attr_group;
+ ret = sysfs_create_group(&client->dev.kobj, &ts->attrs);
+
+ if (ret) {
+ NVT_ERR("Cannot create sysfs structure!\n");
+ }
+
+#ifdef NVT_TOUCH_COUNT_DUMP
+
+ if (ts->nvt_tp_class == NULL)
+ ts->nvt_tp_class = class_create(THIS_MODULE, "touch");
+
+ ts->nvt_touch_dev = device_create(ts->nvt_tp_class, NULL, 0x62, ts, "touch_suspend_notify");
+
+ if (IS_ERR(ts->nvt_touch_dev)) {
+ NVT_ERR("ERROR: Failed to create device for the sysfs!\n");
+ goto err_register_tp_class;
+ }
+
+ dev_set_drvdata(ts->nvt_touch_dev, ts);
+ ret = sysfs_create_file(&ts->nvt_touch_dev->kobj, &dev_attr_touch_suspend_notify.attr);
+
+ if (ret) {
+ NVT_ERR("ERROR: Failed to create sysfs group!\n");
+ goto err_register_tp_class;
+ }
+
+#endif
+ ts->event_wq = alloc_workqueue("nvt-event-queue",
+ WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1);
+ if (!ts->event_wq) {
+ NVT_ERR("ERROR: Cannot create work thread\n");
+ goto err_register_tp_class;
+ }
+ INIT_WORK(&ts->resume_work, nvt_resume_work);
+
+ ts->debugfs = debugfs_create_dir("tp_debug", NULL);
+
+ if (ts->debugfs) {
+ debugfs_create_file("switch_state", 0660, ts->debugfs, ts, &tpdbg_operations);
+ debugfs_create_file("grip_area", 0660, ts->debugfs, ts, &grip_area_operations);
+ } else {
+ NVT_ERR("ERROR:Cannot create tp_debug\n");
+ goto err_pm_workqueue;
+ }
+
+ bTouchIsAwake = 1;
+ NVT_LOG("end\n");
+ enable_irq(client->irq);
+ return 0;
+err_pm_workqueue:
+ destroy_workqueue(ts->event_wq);
+#ifdef NVT_TOUCH_COUNT_DUMP
+err_register_tp_class:
+ device_destroy(ts->nvt_tp_class, 0x62);
+ class_destroy(ts->nvt_tp_class);
+ ts->nvt_tp_class = NULL;
+#endif
+#if defined(CONFIG_DRM)
+err_register_drm_notif_failed:
+ drm_unregister_client(&ts->notifier);
+#elif defined(CONFIG_FB)
+fb_register_drm_notif_failed:
+ fb_unregister_client(&ts->notifier);
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+err_register_early_suspend_failed:
+#endif
+#if (NVT_TOUCH_PROC || NVT_TOUCH_EXT_PROC || NVT_TOUCH_MP)
+err_init_NVT_ts:
+#endif
+ free_irq(client->irq, ts);
+#if BOOT_UPDATE_FIRMWARE_INWORK
+err_create_nvt_fwu_wq_failed:
+#endif
+err_int_request_failed:
+err_input_register_device_failed:
+ input_free_device(ts->input_dev);
+err_input_dev_alloc_failed:
+err_create_nvt_wq_failed:
+ mutex_destroy(&ts->lock);
+err_chipvertrim_failed:
+err_check_functionality_failed:
+ gpio_free(ts->irq_gpio);
+
+ if (gpio_is_valid(ts->reset_gpio))
+ gpio_free(ts->reset_gpio);
+
+err_gpio_config_failed:
+ i2c_set_clientdata(client, NULL);
+ kfree(ts);
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen driver release function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_ts_remove(struct i2c_client *client)
+{
+ /*struct nvt_ts_data *ts = i2c_get_clientdata(client);*/
+#if defined(CONFIG_DRM)
+ if (drm_unregister_client(&ts->notifier))
+ NVT_ERR("Error occurred while unregistering drm_notifier.\n");
+#elif defined(CONFIG_FB)
+ if (fb_unregister_client(&ts->notifier))
+ NVT_ERR("Error occurred while unregistering drm_notifier.\n");
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ unregister_early_suspend(&ts->early_suspend);
+#endif
+#ifdef NVT_TOUCH_COUNT_DUMP
+
+ if (ts->dump_click_count && !ts->current_clicknum_file) {
+ kfree(ts->current_clicknum_file);
+ ts->current_clicknum_file = NULL;
+ }
+
+ sysfs_remove_file(&ts->nvt_touch_dev->kobj,
+ &dev_attr_touch_suspend_notify.attr);
+ device_destroy(ts->nvt_tp_class, 0x62);
+ class_destroy(ts->nvt_tp_class);
+ ts->nvt_tp_class = NULL;
+#endif
+ destroy_workqueue(ts->event_wq);
+
+ nvt_get_reg(ts, false);
+ /*nvt_enable_reg(ts, false);*/
+ mutex_destroy(&ts->lock);
+ NVT_LOG("Removing driver...\n");
+ free_irq(client->irq, ts);
+ input_unregister_device(ts->input_dev);
+ i2c_set_clientdata(client, NULL);
+ kfree(ts);
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen driver suspend function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_ts_suspend(struct device *dev)
+{
+ uint8_t buf[4] = {0};
+ int ret = 0;
+#if MT_PROTOCOL_B
+ uint32_t i = 0;
+#endif
+
+ if (!bTouchIsAwake) {
+ NVT_LOG("Touch is already suspend\n");
+ return 0;
+ }
+
+ mutex_lock(&ts->lock);
+ NVT_LOG("start\n");
+ bTouchIsAwake = 0;
+#if NVT_TOUCH_ESD_PROTECT
+ cancel_delayed_work_sync(&nvt_esd_check_work);
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (ts->gesture_enabled) {
+ /*---write i2c command to enter "wakeup gesture mode"---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x13;
+#if 0 /* Do not set 0xFF first, ToDo */
+ buf[2] = 0xFF;
+ buf[3] = 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 4);
+#else
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+#endif
+ NVT_LOG("Enabled touch wakeup gesture\n");
+ } else {
+ disable_irq_nosync(ts->client->irq);
+ /*---write i2c command to enter "deep sleep mode"---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x11;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+
+ if (ts->ts_pinctrl) {
+ ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_suspend);
+
+ if (ret < 0) {
+ NVT_ERR("Failed to select %s pinstate %d\n",
+ PINCTRL_STATE_SUSPEND, ret);
+ } else
+ NVT_ERR("select %s pinstate\n", PINCTRL_STATE_SUSPEND);
+
+ } else {
+ NVT_ERR("Failed to init pinctrl\n");
+ }
+ }
+
+ /* release all touches */
+#if MT_PROTOCOL_B
+
+ for (i = 0; i < ts->max_touch_num; i++) {
+ input_mt_slot(ts->input_dev, i);
+ input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);
+ input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 0);
+ input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
+ }
+
+#endif
+ input_report_key(ts->input_dev, BTN_TOUCH, 0);
+#if !MT_PROTOCOL_B
+ input_mt_sync(ts->input_dev);
+#endif
+ input_sync(ts->input_dev);
+ msleep(50);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("end\n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen driver resume function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_ts_resume(struct device *dev)
+{
+ int ret = 0;
+
+ if (bTouchIsAwake) {
+ NVT_LOG("Touch is already resume\n");
+ return 0;
+ }
+
+ mutex_lock(&ts->lock);
+ NVT_LOG("start\n");
+ /* please make sure display reset(RESX) sequence and mipi dsi cmds sent before this */
+ nvt_bootloader_reset();
+ nvt_check_fw_reset_state(RESET_STATE_REK);
+
+ if ((ts->gesture_enabled && ts->gesture_disabled_when_resume) || !ts->gesture_enabled_when_resume) {
+ enable_irq(ts->client->irq);
+
+ if (ts->ts_pinctrl) {
+ ret = pinctrl_select_state(ts->ts_pinctrl, ts->pinctrl_state_active);
+
+ if (ret < 0) {
+ NVT_ERR("Failed to select %s pinstate %d\n",
+ PINCTRL_STATE_ACTIVE, ret);
+ }
+ } else {
+ NVT_ERR("Failed to init pinctrl\n");
+ }
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work,
+ msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD));
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ bTouchIsAwake = 1;
+ mutex_unlock(&ts->lock);
+ NVT_LOG("end\n");
+ return 0;
+}
+static void nvt_resume_work(struct work_struct *work)
+{
+ struct nvt_ts_data *ts =
+ container_of(work, struct nvt_ts_data, resume_work);
+ nvt_ts_resume(&ts->client->dev);
+ ts->gesture_enabled_when_resume = false;
+ ts->gesture_disabled_when_resume = true;
+}
+
+#if defined(CONFIG_DRM)
+static int drm_notifier_callback(struct notifier_block *self, unsigned long event, void *data)
+{
+ struct fb_event *evdata = data;
+ int *blank;
+ struct nvt_ts_data *ts =
+ container_of(self, struct nvt_ts_data, notifier);
+
+ if (evdata && evdata->data && event == DRM_EARLY_EVENT_BLANK) {
+ blank = evdata->data;
+
+ if (*blank == DRM_BLANK_POWERDOWN) {
+ if (ts->gesture_enabled) {
+ nvt_enable_reg(ts, true);
+ drm_panel_reset_skip_enable(true);
+ /*drm_dsi_ulps_enable(true);*/
+ /*drm_dsi_ulps_suspend_enable(true);*/
+ }
+ nvt_ts_suspend(&ts->client->dev);
+ if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) {
+ NVT_ERR("set tp reset low\n");
+ gpio_direction_output(ts->reset_gpio, 0);
+ }
+
+#ifdef NVT_TOUCH_COUNT_DUMP
+ sysfs_notify(&ts->nvt_touch_dev->kobj, NULL,
+ "touch_suspend_notify");
+#endif
+ } else if (*blank == DRM_BLANK_UNBLANK) {
+ if (ts->gesture_enabled) {
+ if (ts->tddi_tp_hw_reset)
+ gpio_direction_output(ts->reset_gpio, 0);
+ gpio_direction_output(ts->reset_tddi, 0);
+ msleep(15);
+ gpio_direction_output(ts->reset_tddi, 1);
+ if (ts->tddi_tp_hw_reset)
+ gpio_direction_output(ts->reset_gpio, 1);
+ msleep(20);
+ }
+ }
+ } else if (evdata && evdata->data && event == DRM_EVENT_BLANK) {
+ blank = evdata->data;
+
+ if (*blank == DRM_BLANK_UNBLANK) {
+ if (ts->gesture_enabled) {
+ drm_panel_reset_skip_enable(false);
+ /*drm_dsi_ulps_enable(false);*/
+ /*drm_dsi_ulps_suspend_enable(false);*/
+ nvt_enable_reg(ts, false);
+ }
+ if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) {
+ NVT_ERR("set tp reset high\n");
+ gpio_direction_output(ts->reset_gpio, 1);
+ }
+ nvt_ts_resume(&ts->client->dev);
+#ifdef NVT_TOUCH_COUNT_DUMP
+ sysfs_notify(&ts->nvt_touch_dev->kobj, NULL,
+ "touch_suspend_notify");
+#endif
+ }
+ }
+
+ return 0;
+}
+
+#elif defined(CONFIG_FB)
+static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data)
+{
+ struct fb_event *evdata = data;
+ int *blank;
+ struct nvt_ts_data *ts =
+ container_of(self, struct nvt_ts_data, notifier);
+
+ if (evdata && evdata->data && mdss_panel_is_prim(evdata->info)) {
+ blank = evdata->data;
+ if (event == FB_EARLY_EVENT_BLANK) {
+ if (*blank == FB_BLANK_POWERDOWN) {
+ flush_workqueue(ts->event_wq);
+ if (ts->gesture_enabled) {
+ nvt_enable_reg(ts, true);
+ ts->gesture_enabled_when_resume = true;
+ ts->gesture_disabled_when_resume = false;
+ mdss_panel_reset_skip_enable(true);
+ /*drm_dsi_ulps_enable(true);*/
+ /*drm_dsi_ulps_suspend_enable(true);*/
+ }
+ nvt_ts_suspend(&ts->client->dev);
+ if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) {
+ NVT_ERR("set tp reset low\n");
+ gpio_direction_output(ts->reset_gpio, 0);
+ }
+#ifdef NVT_TOUCH_COUNT_DUMP
+ sysfs_notify(&ts->nvt_touch_dev->kobj, NULL,
+ "touch_suspend_notify");
+#endif
+ } else if (*blank == FB_BLANK_UNBLANK) {
+ if ((ts->gesture_enabled || !ts->gesture_disabled_when_resume) && ts->gesture_enabled_when_resume) {
+ if (ts->tddi_tp_hw_reset)
+ gpio_direction_output(ts->reset_gpio, 0);
+ gpio_direction_output(ts->reset_tddi, 0);
+ msleep(15);
+ gpio_direction_output(ts->reset_tddi, 1);
+ if (ts->tddi_tp_hw_reset)
+ gpio_direction_output(ts->reset_gpio, 1);
+ msleep(20);
+ }
+ }
+ } else if (event == FB_EVENT_BLANK) {
+ if (*blank == FB_BLANK_UNBLANK) {
+ if ((ts->gesture_enabled || !ts->gesture_disabled_when_resume) && ts->gesture_enabled_when_resume) {
+ mdss_panel_reset_skip_enable(false);
+ /*drm_dsi_ulps_enable(false);*/
+ /*drm_dsi_ulps_suspend_enable(false);*/
+ nvt_enable_reg(ts, false);
+ }
+ if (ts->tddi_tp_hw_reset && !ts->gesture_enabled) {
+ NVT_ERR("set tp reset high\n");
+ gpio_direction_output(ts->reset_gpio, 1);
+ }
+
+ flush_workqueue(ts->event_wq);
+ queue_work(ts->event_wq, &ts->resume_work);
+#ifdef NVT_TOUCH_COUNT_DUMP
+ sysfs_notify(&ts->nvt_touch_dev->kobj, NULL,
+ "touch_suspend_notify");
+#endif
+ }
+ }
+ }
+
+ return 0;
+}
+
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+/*******************************************************
+Description:
+ Novatek touchscreen driver early suspend function.
+
+return:
+ n.a.
+*******************************************************/
+static void nvt_ts_early_suspend(struct early_suspend *h)
+{
+ nvt_ts_suspend(ts->client, PMSG_SUSPEND);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen driver late resume function.
+
+return:
+ n.a.
+*******************************************************/
+static void nvt_ts_late_resume(struct early_suspend *h)
+{
+ nvt_ts_resume(ts->client);
+}
+#endif
+
+static const struct i2c_device_id nvt_ts_id[] = {
+ { NVT_I2C_NAME, 0 },
+ { }
+};
+
+#ifdef CONFIG_OF
+static struct of_device_id nvt_match_table[] = {
+ { .compatible = "novatek,NVT-ts",},
+ { },
+};
+#endif
+/*
+static struct i2c_board_info __initdata nvt_i2c_boardinfo[] = {
+ {
+ I2C_BOARD_INFO(NVT_I2C_NAME, I2C_FW_Address),
+ },
+};
+*/
+#ifdef CONFIG_PM
+static int nvt_pm_suspend(struct device *dev)
+{
+ if (device_may_wakeup(dev) && ts->gesture_enabled) {
+ NVT_LOG("enable touch irq wake\n");
+ enable_irq_wake(ts->client->irq);
+ }
+ ts->dev_pm_suspend = true;
+ reinit_completion(&ts->dev_pm_suspend_completion);
+
+ return 0;
+
+}
+
+static int nvt_pm_resume(struct device *dev)
+{
+ if (device_may_wakeup(dev) && ts->gesture_enabled) {
+ NVT_LOG("disable touch irq wake\n");
+ disable_irq_wake(ts->client->irq);
+ }
+ ts->dev_pm_suspend = false;
+ complete(&ts->dev_pm_suspend_completion);
+
+ return 0;
+}
+static const struct dev_pm_ops nvt_dev_pm_ops = {
+ .suspend = nvt_pm_suspend,
+ .resume = nvt_pm_resume,
+};
+#endif
+
+static struct i2c_driver nvt_i2c_driver = {
+ .probe = nvt_ts_probe,
+ .remove = nvt_ts_remove,
+ /* .suspend = nvt_ts_suspend, */
+ /* .resume = nvt_ts_resume, */
+ .id_table = nvt_ts_id,
+ .driver = {
+ .name = NVT_I2C_NAME,
+ .owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .pm = &nvt_dev_pm_ops,
+#endif
+#ifdef CONFIG_OF
+ .of_match_table = nvt_match_table,
+#endif
+ },
+};
+
+/*******************************************************
+Description:
+ Driver Install function.
+
+return:
+ Executive Outcomes. 0---succeed. not 0---failed.
+********************************************************/
+static int32_t __init nvt_driver_init(void)
+{
+ int32_t ret = 0;
+ NVT_LOG("start\n");
+ /*---add i2c driver---*/
+ ret = i2c_add_driver(&nvt_i2c_driver);
+
+ if (ret) {
+ pr_err("%s: failed to add i2c driver", __func__);
+ goto err_driver;
+ }
+
+ pr_info("%s: finished\n", __func__);
+err_driver:
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Driver uninstall function.
+
+return:
+ n.a.
+********************************************************/
+static void __exit nvt_driver_exit(void)
+{
+ i2c_del_driver(&nvt_i2c_driver);
+
+ if (nvt_wq)
+ destroy_workqueue(nvt_wq);
+
+#if BOOT_UPDATE_FIRMWARE_INWORK
+
+ if (nvt_fwu_wq)
+ destroy_workqueue(nvt_fwu_wq);
+
+#endif
+#if NVT_TOUCH_ESD_PROTECT
+
+ if (nvt_esd_check_wq)
+ destroy_workqueue(nvt_esd_check_wq);
+
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+}
+
+/*late_initcall(nvt_driver_init);*/
+module_init(nvt_driver_init);
+module_exit(nvt_driver_exit);
+
+MODULE_DESCRIPTION("Novatek Touchscreen Driver");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h
new file mode 100644
index 000000000000..12f7e18b58d4
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx.h
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 21600 $
+ * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+#ifndef _LINUX_NVT_TOUCH_H
+#define _LINUX_NVT_TOUCH_H
+
+#include <linux/i2c.h>
+#include <linux/input.h>
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+
+#include "nt36xxx_mem_map.h"
+
+#define PINCTRL_STATE_ACTIVE "pmx_ts_active"
+#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend"
+#define PINCTRL_STATE_RELEASE "pmx_ts_release"
+#define NVT_COORDS_ARR_SIZE 2
+#define NVT_DEBUG 1
+
+/*---GPIO number---*/
+#define NVTTOUCH_INT_PIN 943
+
+
+/*---INT trigger mode---*/
+/*#define IRQ_TYPE_EDGE_RISING 1*/
+/*#define IRQ_TYPE_EDGE_FALLING 2*/
+#define INT_TRIGGER_TYPE IRQ_TYPE_EDGE_RISING
+
+
+/*---I2C driver info.---*/
+#define NVT_I2C_NAME "NVT-ts"
+#define I2C_BLDR_Address 0x01
+#define I2C_FW_Address 0x01
+#define I2C_HW_Address 0x62
+
+#if NVT_DEBUG
+#define NVT_LOG(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args)
+#else
+#define NVT_LOG(fmt, args...) pr_info("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args)
+#endif
+#define NVT_ERR(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args)
+
+/*---Input device info.---*/
+#define NVT_TS_NAME "NVTCapacitiveTouchScreen"
+
+
+/*---Touch info.---*/
+#define TOUCH_DEFAULT_MAX_WIDTH 1080
+#define TOUCH_DEFAULT_MAX_HEIGHT 2246
+#define TOUCH_MAX_FINGER_NUM 10
+#define TOUCH_KEY_NUM 0
+#if TOUCH_KEY_NUM > 0
+extern const uint16_t touch_key_array[TOUCH_KEY_NUM];
+#endif
+#define TOUCH_FORCE_NUM 1000
+
+/*---Customerized func.---*/
+#define NVT_TOUCH_PROC 1
+#define NVT_TOUCH_EXT_PROC 1
+#define NVT_TOUCH_MP 1
+#define MT_PROTOCOL_B 1
+#define WAKEUP_GESTURE 1
+#if WAKEUP_GESTURE
+extern const uint16_t gesture_key_array[];
+#endif
+#define BOOT_UPDATE_FIRMWARE_INWORK 0
+#define BOOT_UPDATE_FIRMWARE_NAME "novatek_nt36672_d2t.fw"
+
+/*---ESD Protect.---*/
+#define NVT_TOUCH_ESD_PROTECT 0
+#define NVT_TOUCH_ESD_CHECK_PERIOD 1500 /* ms */
+#define NVT_LOCKDOWN_SIZE 8
+
+#define NVT_TOUCH_COUNT_DUMP
+#ifdef NVT_TOUCH_COUNT_DUMP
+#define TOUCH_COUNT_FILE_MAXSIZE 50
+#endif
+
+struct nvt_config_info {
+ u8 tp_vendor;
+ u8 tp_color;
+ u8 tp_hw_version;
+ const char *nvt_cfg_name;
+ const char *nvt_limit_name;
+#ifdef NVT_TOUCH_COUNT_DUMP
+ const char *clicknum_file_name;
+#endif
+};
+
+struct nvt_ts_data {
+ struct i2c_client *client;
+ struct input_dev *input_dev;
+ struct delayed_work nvt_fwu_work;
+ struct regulator *vddio_reg;
+ struct regulator *lab_reg;
+ struct regulator *ibb_reg;
+ struct nvt_config_info *config_array;
+ struct attribute_group attrs;
+ struct proc_dir_entry *tp_selftest_proc;
+ struct dentry *debugfs;
+ struct pinctrl *ts_pinctrl;
+ struct pinctrl_state *pinctrl_state_active;
+ struct pinctrl_state *pinctrl_state_suspend;
+ const char *vddio_reg_name;
+ const char *lab_reg_name;
+ const char *ibb_reg_name;
+ const char *fw_name;
+
+ int result_type;
+ u8 lockdown_info[NVT_LOCKDOWN_SIZE];
+ uint16_t addr;
+ int8_t phys[32];
+#if defined(CONFIG_DRM) || defined(CONFIG_FB)
+ struct notifier_block notifier;
+#elif defined(CONFIG_HAS_EARLYSUSPEND)
+ struct early_suspend early_suspend;
+#endif
+ uint8_t fw_ver;
+ uint8_t x_num;
+ uint8_t y_num;
+ uint16_t abs_x_max;
+ uint16_t abs_y_max;
+ uint8_t max_touch_num;
+ uint8_t max_button_num;
+ uint32_t int_trigger_type;
+ int32_t irq_gpio;
+ uint32_t irq_flags;
+ int32_t reset_gpio;
+ uint32_t reset_flags;
+ int32_t reset_tddi;
+ struct mutex lock;
+ struct mutex mdata_lock;
+ const struct nvt_ts_mem_map *mmap;
+ uint8_t carrier_system;
+ uint16_t nvt_pid;
+
+ int gesture_enabled;
+ int glove_enabled;
+ int charger_enabled;
+ int stylus_enabled;
+ int cover_enabled;
+ int grip_enabled;
+ int dbclick_count;
+ size_t config_array_size;
+ int current_index;
+ bool dev_pm_suspend;
+ struct completion dev_pm_suspend_completion;
+ struct work_struct resume_work;
+ struct workqueue_struct *event_wq;
+#ifdef NVT_TOUCH_COUNT_DUMP
+ struct class *nvt_tp_class;
+ struct device *nvt_touch_dev;
+ bool dump_click_count;
+ char *current_clicknum_file;
+#endif
+ bool tddi_tp_hw_reset;
+ bool gesture_enabled_when_resume;
+ bool gesture_disabled_when_resume;
+};
+
+struct nvt_mode_switch {
+ struct nvt_ts_data *nvt_data;
+ unsigned char mode;
+ struct work_struct switch_mode_work;
+};
+
+#if NVT_TOUCH_PROC
+struct nvt_flash_data {
+ rwlock_t lock;
+ struct i2c_client *client;
+};
+#endif
+
+typedef enum {
+ RESET_STATE_INIT = 0xA0,/* IC reset */
+ RESET_STATE_REK, /* ReK baseline */
+ RESET_STATE_REK_FINISH, /* baseline is ready */
+ RESET_STATE_NORMAL_RUN, /* normal run */
+ RESET_STATE_MAX = 0xAF
+} RST_COMPLETE_STATE;
+
+typedef enum {
+ EVENT_MAP_HOST_CMD = 0x50,
+ EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE = 0x51,
+ EVENT_MAP_RESET_COMPLETE = 0x60,
+ EVENT_MAP_FWINFO = 0x78,
+ EVENT_MAP_PROJECTID = 0x9A,
+} I2C_EVENT_MAP;
+
+/*---extern structures---*/
+extern struct nvt_ts_data *ts;
+
+/*---extern functions---*/
+extern int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len);
+extern int32_t CTP_I2C_WRITE(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len);
+extern int nvt_bootloader_reset(void);
+extern void nvt_sw_reset_idle(void);
+extern int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state);
+extern int32_t nvt_get_fw_info(void);
+extern int32_t nvt_clear_fw_status(void);
+extern int32_t nvt_check_fw_status(void);
+#if NVT_TOUCH_ESD_PROTECT
+extern void nvt_esd_check_enable(uint8_t enable);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+extern void nvt_stop_crc_reboot(void);
+extern int32_t nvt_get_lockdown_info(char *lockdata);
+
+#endif /* _LINUX_NVT_TOUCH_H */
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c
new file mode 100644
index 000000000000..e4fa3eb6c810
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_ext_proc.c
@@ -0,0 +1,1070 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 21600 $
+ * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/delay.h>
+
+#include "nt36xxx.h"
+
+#if NVT_TOUCH_EXT_PROC
+#define NVT_FW_VERSION "nvt_fw_version"
+#define NVT_BASELINE "nvt_baseline"
+#define NVT_RAW "nvt_raw"
+#define NVT_DIFF "nvt_diff"
+#define NVT_TP_DATADUMP "tp_data_dump"
+#define NVT_XIAOMI_CONFIG_INFO "nvt_xiaomi_config_info"
+#define NVT_XIAOMI_LOCKDOWN_INFO "tp_lockdown_info"
+#define TP_FW_VERSION "tp_fw_version"
+#define I2C_TANSFER_LENGTH 64
+
+#define NORMAL_MODE 0x00
+#define TEST_MODE_1 0x21
+#define TEST_MODE_2 0x22
+#define HANDSHAKING_HOST_READY 0xBB
+
+#define XDATA_SECTOR_SIZE 256
+
+extern int32_t Init_BootLoader(void);
+extern int32_t Resume_PD(void);
+
+static uint8_t xdata_tmp[2048] = {0};
+static int32_t xdata[2048] = {0};
+static uint8_t xdata_i[2048] = {0};
+static int32_t xdata_q[2048] = {0};
+
+static struct proc_dir_entry *NVT_tp_fw_version_entry;
+static struct proc_dir_entry *NVT_proc_fw_version_entry;
+static struct proc_dir_entry *NVT_proc_baseline_entry;
+static struct proc_dir_entry *NVT_proc_raw_entry;
+static struct proc_dir_entry *NVT_proc_diff_entry;
+static struct proc_dir_entry *NVT_proc_datadump_entry;
+static struct proc_dir_entry *NVT_proc_xiaomi_config_info_entry;
+static struct proc_dir_entry *NVT_proc_xiaomi_lockdown_info_entry;
+
+/* Xiaomi Config Info. */
+static uint8_t nvt_xiaomi_conf_info_fw_ver;
+static uint8_t nvt_xiaomi_conf_info_fae_id;
+static uint64_t nvt_xiaomi_conf_info_reservation;
+
+/*******************************************************
+Description:
+ Novatek touchscreen change mode function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_change_mode(uint8_t mode)
+{
+ uint8_t buf[8] = {0};
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---set mode---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = mode;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+
+ if (mode == NORMAL_MODE) {
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = HANDSHAKING_HOST_READY;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+ msleep(20);
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen get firmware pipe function.
+
+return:
+ Executive outcomes. 0---pipe 0. 1---pipe 1.
+*******************************************************/
+uint8_t nvt_get_fw_pipe(void)
+{
+ uint8_t buf[8] = {0};
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read fw status---*/
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2);
+ /*NVT_LOG("FW pipe=%d, buf[1]=0x%02X\n", (buf[1]&0x01), buf[1]);*/
+ return (buf[1] & 0x01);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen read meta data function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr)
+{
+ int32_t i = 0;
+ int32_t j = 0;
+ int32_t k = 0;
+ uint8_t buf[I2C_TANSFER_LENGTH + 1] = {0};
+ uint32_t head_addr = 0;
+ int32_t dummy_len = 0;
+ int32_t data_len = 0;
+ int32_t residual_len = 0;
+ /*---set xdata sector address & length---*/
+ head_addr = xdata_addr - (xdata_addr % XDATA_SECTOR_SIZE);
+ dummy_len = xdata_addr - head_addr;
+ data_len = ts->x_num * ts->y_num * 2;
+ residual_len = (head_addr + dummy_len + data_len) % XDATA_SECTOR_SIZE;
+ mutex_lock(&ts->mdata_lock);
+
+ /*printk("head_addr=0x%05X, dummy_len=0x%05X, data_len=0x%05X, residual_len=0x%05X\n", head_addr, dummy_len, data_len, residual_len);*/
+
+ /*read xdata : step 1*/
+ for (i = 0; i < ((dummy_len + data_len) / XDATA_SECTOR_SIZE); i++) {
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 16) & 0xFF;
+ buf[2] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+
+ /*---read xdata by I2C_TANSFER_LENGTH---*/
+ for (j = 0; j < (XDATA_SECTOR_SIZE / I2C_TANSFER_LENGTH); j++) {
+ /*---read data---*/
+ msleep(15);
+ buf[0] = I2C_TANSFER_LENGTH * j;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1);
+
+ /*---copy buf to xdata_tmp---*/
+ for (k = 0; k < I2C_TANSFER_LENGTH; k++) {
+ xdata_tmp[XDATA_SECTOR_SIZE * i + I2C_TANSFER_LENGTH * j + k] = buf[k + 1];
+ /*printk("0x%02X, 0x%04X\n", buf[k+1], (XDATA_SECTOR_SIZE*i + I2C_TANSFER_LENGTH*j + k));*/
+ }
+ }
+
+ /*printk("addr=0x%05X\n", (head_addr+XDATA_SECTOR_SIZE*i));*/
+ }
+
+ /*read xdata : step2*/
+ if (residual_len != 0) {
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = ((xdata_addr + data_len - residual_len) >> 16) & 0xFF;
+ buf[2] = ((xdata_addr + data_len - residual_len) >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+
+ /*---read xdata by I2C_TANSFER_LENGTH---*/
+ for (j = 0; j < (residual_len / I2C_TANSFER_LENGTH + 1); j++) {
+ /*---read data---*/
+ msleep(15);
+ buf[0] = I2C_TANSFER_LENGTH * j;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1);
+
+ /*---copy buf to xdata_tmp---*/
+ for (k = 0; k < I2C_TANSFER_LENGTH; k++) {
+ xdata_tmp[(dummy_len + data_len - residual_len) + I2C_TANSFER_LENGTH * j + k] = buf[k + 1];
+ /*printk("0x%02X, 0x%04x\n", buf[k+1], ((dummy_len+data_len-residual_len) + I2C_TANSFER_LENGTH*j + k));*/
+ }
+ }
+
+ /*printk("addr=0x%05X\n", (xdata_addr+data_len-residual_len));*/
+ }
+
+ /*---remove dummy data and 2bytes-to-1data---*/
+ for (i = 0; i < (data_len / 2); i++) {
+ xdata[i] = (int16_t)(xdata_tmp[dummy_len + i * 2] + 256 * xdata_tmp[dummy_len + i * 2 + 1]);
+ }
+
+#if TOUCH_KEY_NUM > 0
+ /*read button xdata : step3*/
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (xdata_btn_addr >> 16) & 0xFF;
+ buf[2] = ((xdata_btn_addr >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read data---*/
+ buf[0] = (xdata_btn_addr & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, (TOUCH_KEY_NUM * 2 + 1));
+
+ /*---2bytes-to-1data---*/
+ for (i = 0; i < TOUCH_KEY_NUM; i++) {
+ xdata[ts->x_num * ts->y_num + i] = (int16_t)(buf[1 + i * 2] + 256 * buf[1 + i * 2 + 1]);
+ }
+
+#endif
+ mutex_unlock(&ts->mdata_lock);
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen read meta data from IQ to rss function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_read_mdata_rss(uint32_t xdata_i_addr, uint32_t xdata_q_addr, uint32_t xdata_btn_i_addr, uint32_t xdata_btn_q_addr)
+{
+ int i = 0;
+ mutex_lock(&ts->mdata_lock);
+ nvt_read_mdata(xdata_i_addr, xdata_btn_i_addr);
+ memcpy(xdata_i, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t)));
+ nvt_read_mdata(xdata_q_addr, xdata_btn_q_addr);
+ memcpy(xdata_q, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t)));
+
+ for (i = 0; i < (ts->x_num * ts->y_num + TOUCH_KEY_NUM); i++) {
+ xdata[i] = (uint8_t)int_sqrt((unsigned long)(xdata_i[i] * xdata_i[i]) + (unsigned long)(xdata_q[i] * xdata_q[i]));
+ }
+
+ mutex_unlock(&ts->mdata_lock);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen get meta data function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_get_mdata(int32_t *buf, uint8_t *m_x_num, uint8_t *m_y_num)
+{
+ *m_x_num = ts->x_num;
+ *m_y_num = ts->y_num;
+ mutex_lock(&ts->mdata_lock);
+ memcpy(buf, xdata, ((ts->x_num * ts->y_num + TOUCH_KEY_NUM) * sizeof(int32_t)));
+ mutex_unlock(&ts->mdata_lock);
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen firmware version show function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t c_fw_version_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "fw_ver=%d, x_num=%d, y_num=%d, button_num=%d\n", ts->fw_ver, ts->x_num, ts->y_num, ts->max_button_num);
+ return 0;
+}
+static int32_t c_tp_fw_version_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "fw_ver=%d\n", ts->fw_ver);
+ return 0;
+}
+/*******************************************************
+Description:
+ Novatek touchscreen xdata sequence print show
+ function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t c_show(struct seq_file *m, void *v)
+{
+ int32_t i = 0;
+ int32_t j = 0;
+
+ for (i = 0; i < ts->y_num; i++) {
+ for (j = 0; j < ts->x_num; j++) {
+ seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]);
+ }
+
+ seq_puts(m, "\n");
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (i = 0; i < TOUCH_KEY_NUM; i++) {
+ seq_printf(m, "%5d, ", xdata[ts->x_num * ts->y_num + i]);
+ }
+
+ seq_puts(m, "\n");
+#endif
+ seq_printf(m, "\n\n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen xdata sequence print start
+ function.
+
+return:
+ Executive outcomes. 1---call next function.
+ NULL---not call next function and sequence loop
+ stop.
+*******************************************************/
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+ return *pos < 1 ? (void *)1 : NULL;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen xdata sequence print next
+ function.
+
+return:
+ Executive outcomes. NULL---no next and call sequence
+ stop function.
+*******************************************************/
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+ ++*pos;
+ return NULL;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen xdata sequence print stop
+ function.
+
+return:
+ n.a.
+*******************************************************/
+static void c_stop(struct seq_file *m, void *v)
+{
+ return;
+}
+
+const struct seq_operations nvt_fw_version_seq_ops = {
+ .start = c_start,
+ .next = c_next,
+ .stop = c_stop,
+ .show = c_fw_version_show
+};
+const struct seq_operations tp_fw_version_seq_ops = {
+ .start = c_start,
+ .next = c_next,
+ .stop = c_stop,
+ .show = c_tp_fw_version_show
+};
+const struct seq_operations nvt_seq_ops = {
+ .start = c_start,
+ .next = c_next,
+ .stop = c_stop,
+ .show = c_show
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/nvt_fw_version open
+ function.
+
+return:
+ n.a.
+*******************************************************/
+static int32_t nvt_fw_version_open(struct inode *inode, struct file *file)
+{
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return seq_open(file, &nvt_fw_version_seq_ops);
+}
+
+static const struct file_operations nvt_fw_version_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_fw_version_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/tp_fw_version open function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t tp_fw_version_open(struct inode *inode, struct file *file)
+{
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return seq_open(file, &tp_fw_version_seq_ops);
+}
+
+static const struct file_operations tp_fw_version_fops = {
+ .owner = THIS_MODULE,
+ .open = tp_fw_version_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/nvt_baseline open function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_baseline_open(struct inode *inode, struct file *file)
+{
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (ts->carrier_system) {
+ nvt_read_mdata_rss(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_Q_ADDR,
+ ts->mmap->BASELINE_BTN_ADDR, ts->mmap->BASELINE_BTN_Q_ADDR);
+ } else {
+ nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR);
+ }
+
+ nvt_change_mode(NORMAL_MODE);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return seq_open(file, &nvt_seq_ops);
+}
+
+static const struct file_operations nvt_baseline_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_baseline_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/nvt_raw open function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t nvt_raw_open(struct inode *inode, struct file *file)
+{
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (ts->carrier_system) {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata_rss(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_PIPE0_Q_ADDR,
+ ts->mmap->RAW_BTN_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_Q_ADDR);
+ else
+ nvt_read_mdata_rss(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_PIPE1_Q_ADDR,
+ ts->mmap->RAW_BTN_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_Q_ADDR);
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR);
+ }
+
+ nvt_change_mode(NORMAL_MODE);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return seq_open(file, &nvt_seq_ops);
+}
+
+static const struct file_operations nvt_raw_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_raw_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/nvt_diff open function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+static int32_t nvt_diff_open(struct inode *inode, struct file *file)
+{
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (ts->carrier_system) {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata_rss(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_PIPE0_Q_ADDR,
+ ts->mmap->DIFF_BTN_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_Q_ADDR);
+ else
+ nvt_read_mdata_rss(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_PIPE1_Q_ADDR,
+ ts->mmap->DIFF_BTN_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_Q_ADDR);
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR);
+ }
+
+ nvt_change_mode(NORMAL_MODE);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return seq_open(file, &nvt_seq_ops);
+}
+
+static const struct file_operations nvt_diff_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_diff_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+static int nvt_datadump_msg_show(struct seq_file *m, void *v)
+{
+ int i, j;
+ seq_printf(m, "NVT_raw\n");
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (ts->carrier_system) {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata_rss(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_PIPE0_Q_ADDR,
+ ts->mmap->RAW_BTN_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_Q_ADDR);
+ else
+ nvt_read_mdata_rss(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_PIPE1_Q_ADDR,
+ ts->mmap->RAW_BTN_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_Q_ADDR);
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR);
+ }
+
+ nvt_change_mode(NORMAL_MODE);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ for (i = 0; i < ts->y_num; i++) {
+ for (j = 0; j < ts->x_num; j++) {
+ seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]);
+ }
+
+ seq_puts(m, "\n");
+ }
+ NVT_LOG("start geting NVT_diff data\n");
+ seq_printf(m, "NVT_diff\n");
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ return -EAGAIN;
+ }
+
+ if (ts->carrier_system) {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata_rss(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_PIPE0_Q_ADDR,
+ ts->mmap->DIFF_BTN_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_Q_ADDR);
+ else
+ nvt_read_mdata_rss(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_PIPE1_Q_ADDR,
+ ts->mmap->DIFF_BTN_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_Q_ADDR);
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR);
+ }
+
+ nvt_change_mode(NORMAL_MODE);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ for (i = 0; i < ts->y_num; i++) {
+ for (j = 0; j < ts->x_num; j++) {
+ seq_printf(m, "%5d, ", xdata[i * ts->x_num + j]);
+ }
+
+ seq_puts(m, "\n");
+ }
+ return 0;
+}
+
+
+static int32_t nvt_datadump_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, &nvt_datadump_msg_show, NULL);
+}
+
+
+static const struct file_operations nvt_tp_data_dump_ops = {
+ .owner = THIS_MODULE,
+ .open = nvt_datadump_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+static int nvt_xiaomi_config_info_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "FW version/Config version, Debug version: 0x%02X\n", nvt_xiaomi_conf_info_fw_ver);
+ seq_printf(m, "FAE ID: 0x%02X\n", nvt_xiaomi_conf_info_fae_id);
+ seq_printf(m, "Reservation byte: 0x%012llX\n", nvt_xiaomi_conf_info_reservation);
+ return 0;
+}
+
+static int32_t nvt_xiaomi_config_info_open(struct inode *inode, struct file *file)
+{
+ uint8_t buf[16] = {0};
+
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+ NVT_LOG("++\n");
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = 0x9C;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 9);
+ nvt_xiaomi_conf_info_fw_ver = buf[1];
+ nvt_xiaomi_conf_info_fae_id = buf[2];
+ nvt_xiaomi_conf_info_reservation = (((uint64_t)buf[3] << 40) | ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 24) | ((uint64_t)buf[6] << 16) | ((uint64_t)buf[7] << 8) | (uint64_t)buf[8]);
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return single_open(file, nvt_xiaomi_config_info_show, NULL);
+}
+
+static const struct file_operations nvt_xiaomi_config_info_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_xiaomi_config_info_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static int32_t nvt_get_oem_data(uint8_t *data, uint32_t flash_address, int32_t size)
+{
+ uint8_t buf[64] = {0};
+ uint8_t tmp_data[512] = {0};
+ int32_t count_256 = 0;
+ uint32_t cur_flash_addr = 0;
+ uint32_t cur_sram_addr = 0;
+ uint16_t checksum_get = 0;
+ uint16_t checksum_cal = 0;
+ int32_t i = 0;
+ int32_t j = 0;
+ int32_t ret = 0;
+ int32_t retry = 0;
+ NVT_LOG("++\n");
+
+ /* maximum 256 bytes each read */
+ if (size % 256)
+ count_256 = size / 256 + 1;
+ else
+ count_256 = size / 256;
+
+get_oem_data_retry:
+ nvt_sw_reset_idle();
+
+ /* check and stop crc reboot loop*/
+ nvt_stop_crc_reboot();
+
+ /* Step 1: Initial BootLoader */
+ ret = Init_BootLoader();
+
+ if (ret < 0) {
+ goto get_oem_data_out;
+ }
+
+ /* Step 2: Resume PD */
+ ret = Resume_PD();
+
+ if (ret < 0) {
+ goto get_oem_data_out;
+ }
+
+ /* Step 3: Unlock */
+ buf[0] = 0x00;
+ buf[1] = 0x35;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+ msleep(10);
+
+ for (i = 0; i < count_256; i++) {
+ cur_flash_addr = flash_address + i * 256;
+ /* Step 4: Flash Read Command */
+ buf[0] = 0x00;
+ buf[1] = 0x03;
+ buf[2] = ((cur_flash_addr >> 16) & 0xFF);
+ buf[3] = ((cur_flash_addr >> 8) & 0xFF);
+ buf[4] = (cur_flash_addr & 0xFF);
+ buf[5] = 0x00;
+ buf[6] = 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7);
+ msleep(10);
+ /* Check 0xAA (Read Command) */
+ buf[0] = 0x00;
+ buf[2] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (buf[1] != 0xAA) {
+ NVT_ERR("Check 0xAA (Read Command) error!! status=0x%02X\n", buf[1]);
+ ret = -1;
+ goto get_oem_data_out;
+ }
+
+ msleep(10);
+
+ /* Step 5: Read Data and Checksum */
+ for (j = 0; j < ((256 / 32) + 1); j++) {
+ cur_sram_addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR + j * 32;
+ buf[0] = 0xFF;
+ buf[1] = (cur_sram_addr >> 16) & 0xFF;
+ buf[2] = (cur_sram_addr >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+ buf[0] = cur_sram_addr & 0xFF;
+ CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 33);
+ memcpy(tmp_data + j * 32, buf + 1, 32);
+ }
+
+ /* get checksum of the 256 bytes data read */
+ checksum_get = (uint16_t)((tmp_data[1] << 8) | tmp_data[0]);
+ /* calculate checksum of of the 256 bytes data read */
+ checksum_cal = (uint16_t)((cur_flash_addr >> 16) & 0xFF) + (uint16_t)((cur_flash_addr >> 8) & 0xFF) + (cur_flash_addr & 0xFF) + 0x00 + 0xFF;
+
+ for (j = 0; j < 256; j++) {
+ checksum_cal += tmp_data[j + 2];
+ }
+
+ checksum_cal = 65535 - checksum_cal + 1;
+
+ /*NVT_LOG("checksum_get = 0x%04X, checksum_cal = 0x%04X\n", checksum_get, checksum_cal);*/
+ /* compare the checksum got and calculated */
+ if (checksum_get != checksum_cal) {
+ if (retry < 3) {
+ retry++;
+ goto get_oem_data_retry;
+ } else {
+ NVT_ERR("Checksum not match error! checksum_get=0x%04X, checksum_cal=0x%04X, i=%d\n", checksum_get, checksum_cal, i);
+ ret = -2;
+ goto get_oem_data_out;
+ }
+ }
+
+ /* Step 6: Remapping (Remove 2 Bytes Checksum) */
+ if ((i + 1) * 256 > size) {
+ memcpy(data + i * 256, tmp_data + 2, size - i * 256);
+ } else {
+ memcpy(data + i * 256, tmp_data + 2, 256);
+ }
+ }
+
+#if 0 /* for debug */
+
+ for (i = 0; i < size; i++) {
+ if (i % 16 == 0)
+ printk("\n");
+
+ printk("%02X ", data[i]);
+ }
+
+ printk("\n");
+#endif
+get_oem_data_out:
+ nvt_bootloader_reset();
+ nvt_check_fw_reset_state(RESET_STATE_INIT);
+ NVT_LOG("--\n");
+ return ret;
+}
+
+static int nvt_xiaomi_lockdown_info_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n",
+ ts->lockdown_info[0],
+ ts->lockdown_info[1],
+ ts->lockdown_info[2],
+ ts->lockdown_info[3],
+ ts->lockdown_info[4],
+ ts->lockdown_info[5],
+ ts->lockdown_info[6],
+ ts->lockdown_info[7]);
+ return 0;
+}
+
+static int32_t nvt_xiaomi_lockdown_info_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, nvt_xiaomi_lockdown_info_show, NULL);
+}
+
+static const struct file_operations nvt_xiaomi_lockdown_info_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_xiaomi_lockdown_info_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+int32_t nvt_get_lockdown_info(char *lockdata)
+{
+ uint8_t data_buf[NVT_LOCKDOWN_SIZE] = {0};
+ int ret = 0;
+ NVT_LOG("++\n");
+
+ if (!lockdata)
+ return -ENOMEM;
+
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ ret = nvt_get_oem_data(data_buf, 0x1E000, 8);
+
+ if (ret < 0) {
+ NVT_ERR("get oem data failed!\n");
+ ret = -EINVAL;
+ goto end;
+ }
+
+ memcpy(lockdata, data_buf, NVT_LOCKDOWN_SIZE);
+end:
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen extra function proc. file node
+ initial function.
+
+return:
+ Executive outcomes. 0---succeed. -12---failed.
+*******************************************************/
+int32_t nvt_extra_proc_init(void)
+{
+ NVT_proc_fw_version_entry = proc_create(NVT_FW_VERSION, 0444, NULL, &nvt_fw_version_fops);
+
+ if (NVT_proc_fw_version_entry == NULL) {
+ NVT_ERR("create proc/nvt_fw_version Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/nvt_fw_version Succeeded!\n");
+ }
+
+ NVT_tp_fw_version_entry = proc_create(TP_FW_VERSION, 0444, NULL, &tp_fw_version_fops);
+ if (NVT_tp_fw_version_entry == NULL) {
+ NVT_ERR("create proc/tp_fw_version Failed!\n");
+ return -ENOMEM;
+ } else
+ NVT_LOG("create proc/tp_fw_version Succeeded!\n");
+
+ NVT_proc_baseline_entry = proc_create(NVT_BASELINE, 0444, NULL, &nvt_baseline_fops);
+
+ if (NVT_proc_baseline_entry == NULL) {
+ NVT_ERR("create proc/nvt_baseline Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/nvt_baseline Succeeded!\n");
+ }
+
+ NVT_proc_raw_entry = proc_create(NVT_RAW, 0444, NULL, &nvt_raw_fops);
+
+ if (NVT_proc_raw_entry == NULL) {
+ NVT_ERR("create proc/nvt_raw Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/nvt_raw Succeeded!\n");
+ }
+
+ NVT_proc_diff_entry = proc_create(NVT_DIFF, 0444, NULL, &nvt_diff_fops);
+
+ if (NVT_proc_diff_entry == NULL) {
+ NVT_ERR("create proc/nvt_diff Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/nvt_diff Succeeded!\n");
+ }
+
+ NVT_proc_datadump_entry = proc_create(NVT_TP_DATADUMP, 0444, NULL, &nvt_tp_data_dump_ops);
+
+ if (NVT_proc_datadump_entry == NULL) {
+ NVT_ERR("create proc/tp_data_dump Failed!\n");
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/tp_data_dump Succeeded!\n");
+ }
+
+ NVT_proc_xiaomi_config_info_entry = proc_create(NVT_XIAOMI_CONFIG_INFO, 0444, NULL, &nvt_xiaomi_config_info_fops);
+
+ if (NVT_proc_xiaomi_config_info_entry == NULL) {
+ NVT_ERR("create proc/%s Failed!\n", NVT_XIAOMI_CONFIG_INFO);
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/%s Succeeded!\n", NVT_XIAOMI_CONFIG_INFO);
+ }
+
+ NVT_proc_xiaomi_lockdown_info_entry = proc_create(NVT_XIAOMI_LOCKDOWN_INFO, 0444, NULL, &nvt_xiaomi_lockdown_info_fops);
+
+ if (NVT_proc_xiaomi_lockdown_info_entry == NULL) {
+ NVT_ERR("create proc/%s Failed!\n", NVT_XIAOMI_LOCKDOWN_INFO);
+ return -ENOMEM;
+ } else {
+ NVT_LOG("create proc/%s Succeeded!\n", NVT_XIAOMI_LOCKDOWN_INFO);
+ }
+
+ return 0;
+}
+#endif
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c
new file mode 100644
index 000000000000..6779f3f8bc3b
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_fw_update.c
@@ -0,0 +1,1136 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 21600 $
+ * $Date: 2018-01-12 15:21:45 +0800 (週五, 12 一月 2018) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/delay.h>
+#include <linux/firmware.h>
+
+#include "nt36xxx.h"
+
+
+#define FW_BIN_SIZE_116KB 118784
+#define FW_BIN_SIZE FW_BIN_SIZE_116KB
+#define FW_BIN_VER_OFFSET 0x1A000
+#define FW_BIN_VER_BAR_OFFSET 0x1A001
+#define FLASH_SECTOR_SIZE 4096
+#define SIZE_64KB 65536
+#define BLOCK_64KB_NUM 4
+
+const struct firmware *fw_entry;
+
+/*******************************************************
+Description:
+ Novatek touchscreen request update firmware function.
+
+return:
+ Executive outcomes. 0---succeed. -EPERM,-22---failed.
+*******************************************************/
+int32_t update_firmware_request(char *filename)
+{
+ int32_t ret = 0;
+
+ if (NULL == filename) {
+ return -EPERM;
+ }
+
+ NVT_LOG("filename is %s\n", filename);
+ ret = request_firmware(&fw_entry, filename, &ts->client->dev);
+
+ if (ret) {
+ NVT_ERR("firmware load failed, ret=%d\n", ret);
+ return ret;
+ }
+
+ /* check bin file size (116kb) */
+ if (fw_entry->size != FW_BIN_SIZE) {
+ NVT_ERR("bin file size not match. (%zu)\n", fw_entry->size);
+ return -EINVAL;
+ }
+
+ /* check if FW version add FW version bar equals 0xFF */
+ if (*(fw_entry->data + FW_BIN_VER_OFFSET) + *(fw_entry->data + FW_BIN_VER_BAR_OFFSET) != 0xFF) {
+ NVT_ERR("bin file FW_VER + FW_VER_BAR should be 0xFF!\n");
+ NVT_ERR("FW_VER=0x%02X, FW_VER_BAR=0x%02X\n", *(fw_entry->data + FW_BIN_VER_OFFSET), *(fw_entry->data + FW_BIN_VER_BAR_OFFSET));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen release update firmware function.
+
+return:
+ n.a.
+*******************************************************/
+void update_firmware_release(void)
+{
+ if (fw_entry) {
+ release_firmware(fw_entry);
+ }
+
+ fw_entry = NULL;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check firmware version function.
+
+return:
+ Executive outcomes. 0---need update. 1---need not
+ update.
+*******************************************************/
+int32_t Check_FW_Ver(void)
+{
+ uint8_t buf[16] = {0};
+ int32_t ret = 0;
+ /* write i2c index to EVENT BUF ADDR */
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("i2c write error!(%d)\n", ret);
+ return ret;
+ }
+
+ /* read Firmware Version */
+ buf[0] = EVENT_MAP_FWINFO;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("i2c read error!(%d)\n", ret);
+ return ret;
+ }
+
+ NVT_LOG("IC FW Ver = 0x%02X, FW Ver Bar = 0x%02X\n", buf[1], buf[2]);
+ NVT_LOG("Bin FW Ver = 0x%02X, FW ver Bar = 0x%02X\n",
+ fw_entry->data[FW_BIN_VER_OFFSET], fw_entry->data[FW_BIN_VER_BAR_OFFSET]);
+
+ /* check IC FW_VER + FW_VER_BAR equals 0xFF or not, need to update if not */
+ if ((buf[1] + buf[2]) != 0xFF) {
+ NVT_ERR("IC FW_VER + FW_VER_BAR not equals to 0xFF!\n");
+ return 0;
+ }
+
+ /* compare IC and binary FW version */
+ if (buf[1] == fw_entry->data[FW_BIN_VER_OFFSET])
+ return 1;
+ else
+ return 0;
+}
+
+
+/*******************************************************
+Description:
+ Novatek touchscreen resume from deep power down function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Resume_PD(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t ret = 0;
+ int32_t retry = 0;
+ /* Resume Command */
+ buf[0] = 0x00;
+ buf[1] = 0xAB;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Write Enable error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Resume Command) */
+ retry = 0;
+
+ while (1) {
+ msleep(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Resume Command) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Resume Command) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ msleep(10);
+ NVT_LOG("Resume PD OK\n");
+ return 0;
+}
+
+
+/*******************************************************
+Description:
+ Novatek touchscreen check firmware checksum function.
+
+return:
+ Executive outcomes. 0---checksum not match.
+ 1---checksum match. -EPERM--- checksum read failed.
+*******************************************************/
+int32_t Check_CheckSum(void)
+{
+ uint8_t buf[64] = {0};
+ uint32_t XDATA_Addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR;
+ int32_t ret = 0;
+ int32_t i = 0;
+ int32_t k = 0;
+ uint16_t WR_Filechksum[BLOCK_64KB_NUM] = {0};
+ uint16_t RD_Filechksum[BLOCK_64KB_NUM] = {0};
+ size_t fw_bin_size = 0;
+ size_t len_in_blk = 0;
+ int32_t retry = 0;
+
+ if (Resume_PD()) {
+ NVT_ERR("Resume PD error!!\n");
+ return -EPERM;
+ }
+
+ fw_bin_size = fw_entry->size;
+
+ for (i = 0; i < BLOCK_64KB_NUM; i++) {
+ if (fw_bin_size > (i * SIZE_64KB)) {
+ /* Calculate WR_Filechksum of each 64KB block */
+ len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB);
+ WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF);
+
+ for (k = 0; k < len_in_blk; k++) {
+ WR_Filechksum[i] += fw_entry->data[k + i * SIZE_64KB];
+ }
+
+ WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1;
+ /* Fast Read Command */
+ buf[0] = 0x00;
+ buf[1] = 0x07;
+ buf[2] = i;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = ((len_in_blk - 1) >> 8) & 0xFF;
+ buf[6] = (len_in_blk - 1) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7);
+
+ if (ret < 0) {
+ NVT_ERR("Fast Read Command error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Fast Read Command) */
+ retry = 0;
+
+ while (1) {
+ msleep(80);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Fast Read Command) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 5)) {
+ NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry);
+ return -EPERM;
+ }
+ }
+
+ /* Read Checksum (write addr high byte & middle byte) */
+ buf[0] = 0xFF;
+ buf[1] = XDATA_Addr >> 16;
+ buf[2] = (XDATA_Addr >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Read Checksum */
+ buf[0] = (XDATA_Addr) & 0xFF;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Read Checksum error!!(%d)\n", ret);
+ return ret;
+ }
+
+ RD_Filechksum[i] = (uint16_t)((buf[2] << 8) | buf[1]);
+
+ if (WR_Filechksum[i] != RD_Filechksum[i]) {
+ NVT_ERR("RD_Filechksum[%d]=0x%04X, WR_Filechksum[%d]=0x%04X\n", i, RD_Filechksum[i], i, WR_Filechksum[i]);
+ NVT_ERR("firmware checksum not match!!\n");
+ return 0;
+ }
+ }
+ }
+
+ NVT_LOG("firmware checksum match\n");
+ return 1;
+}
+
+
+/*******************************************************
+Description:
+ Novatek touchscreen initial bootloader and flash
+ block function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Init_BootLoader(void)
+{
+ uint8_t buf[64] = {0};
+ int32_t ret = 0;
+ int32_t retry = 0;
+ /* SW Reset & Idle */
+ nvt_sw_reset_idle();
+ /* Initiate Flash Block */
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ buf[2] = I2C_FW_Address;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Inittial Flash Block error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Initiate Flash Block) */
+ retry = 0;
+
+ while (1) {
+ msleep(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Inittial Flash Block) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Inittial Flash Block) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ NVT_LOG("Init OK \n");
+ msleep(20);
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen erase flash sectors function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Erase_Flash(void)
+{
+ uint8_t buf[64] = {0};
+ int32_t ret = 0;
+ int32_t count = 0;
+ int32_t i = 0;
+ int32_t Flash_Address = 0;
+ int32_t retry = 0;
+ /* Write Enable */
+ buf[0] = 0x00;
+ buf[1] = 0x06;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Write Enable (for Write Status Register) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Write Enable) */
+ retry = 0;
+
+ while (1) {
+ mdelay(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Write Enable for Write Status Register) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Write Enable for Write Status Register) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ /* Write Status Register */
+ buf[0] = 0x00;
+ buf[1] = 0x01;
+ buf[2] = 0x00;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Write Status Register error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Write Status Register) */
+ retry = 0;
+
+ while (1) {
+ mdelay(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Write Status Register) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Write Status Register) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ /* Read Status */
+ retry = 0;
+
+ while (1) {
+ mdelay(5);
+ buf[0] = 0x00;
+ buf[1] = 0x05;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Read Status (for Write Status Register) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Read Status) */
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Read Status for Write Status Register) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if ((buf[1] == 0xAA) && (buf[2] == 0x00)) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 100)) {
+ NVT_ERR("Check 0xAA (Read Status for Write Status Register) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry);
+ return -EPERM;
+ }
+ }
+
+ if (fw_entry->size % FLASH_SECTOR_SIZE)
+ count = fw_entry->size / FLASH_SECTOR_SIZE + 1;
+ else
+ count = fw_entry->size / FLASH_SECTOR_SIZE;
+
+ for (i = 0; i < count; i++) {
+ /* Write Enable */
+ buf[0] = 0x00;
+ buf[1] = 0x06;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Write Enable error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ /* Check 0xAA (Write Enable) */
+ retry = 0;
+
+ while (1) {
+ mdelay(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Write Enable) error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ Flash_Address = i * FLASH_SECTOR_SIZE;
+ /* Sector Erase */
+ buf[0] = 0x00;
+ buf[1] = 0x20; /* Command : Sector Erase */
+ buf[2] = ((Flash_Address >> 16) & 0xFF);
+ buf[3] = ((Flash_Address >> 8) & 0xFF);
+ buf[4] = (Flash_Address & 0xFF);
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 5);
+
+ if (ret < 0) {
+ NVT_ERR("Sector Erase error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ /* Check 0xAA (Sector Erase) */
+ retry = 0;
+
+ while (1) {
+ mdelay(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Sector Erase) error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Sector Erase) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry);
+ return -EPERM;
+ }
+ }
+
+ /* Read Status */
+ retry = 0;
+
+ while (1) {
+ mdelay(5);
+ buf[0] = 0x00;
+ buf[1] = 0x05;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Read Status error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ /* Check 0xAA (Read Status) */
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Read Status) error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ if ((buf[1] == 0xAA) && (buf[2] == 0x00)) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 100)) {
+ NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry);
+ return -EPERM;
+ }
+ }
+ }
+
+ NVT_LOG("Erase OK \n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen write flash sectors function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Write_Flash(void)
+{
+ uint8_t buf[64] = {0};
+ uint32_t XDATA_Addr = ts->mmap->RW_FLASH_DATA_ADDR;
+ uint32_t Flash_Address = 0;
+ int32_t i = 0, j = 0, k = 0;
+ uint8_t tmpvalue = 0;
+ int32_t count = 0;
+ int32_t ret = 0;
+ int32_t retry = 0;
+ /* change I2C buffer index */
+ buf[0] = 0xFF;
+ buf[1] = XDATA_Addr >> 16;
+ buf[2] = (XDATA_Addr >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("change I2C buffer index error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (fw_entry->size % 256)
+ count = fw_entry->size / 256 + 1;
+ else
+ count = fw_entry->size / 256;
+
+ for (i = 0; i < count; i++) {
+ Flash_Address = i * 256;
+ /* Write Enable */
+ buf[0] = 0x00;
+ buf[1] = 0x06;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Write Enable error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Write Enable) */
+ retry = 0;
+
+ while (1) {
+ udelay(100);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Write Enable) error!!(%d,%d)\n", ret, i);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+ }
+
+ /* Write Page : 256 bytes */
+ for (j = 0; j < min(fw_entry->size - i * 256, (size_t)256); j += 32) {
+ buf[0] = (XDATA_Addr + j) & 0xFF;
+
+ for (k = 0; k < 32; k++) {
+ buf[1 + k] = fw_entry->data[Flash_Address + j + k];
+ }
+
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 33);
+
+ if (ret < 0) {
+ NVT_ERR("Write Page error!!(%d), j=%d\n", ret, j);
+ return ret;
+ }
+ }
+
+ if (fw_entry->size - Flash_Address >= 256)
+ tmpvalue = (Flash_Address >> 16) + ((Flash_Address >> 8) & 0xFF) + (Flash_Address & 0xFF) + 0x00 + (255);
+ else
+ tmpvalue = (Flash_Address >> 16) + ((Flash_Address >> 8) & 0xFF) + (Flash_Address & 0xFF) + 0x00 + (fw_entry->size - Flash_Address - 1);
+
+ for (k = 0; k < min(fw_entry->size - Flash_Address, (size_t)256); k++)
+ tmpvalue += fw_entry->data[Flash_Address + k];
+
+ tmpvalue = 255 - tmpvalue + 1;
+ /* Page Program */
+ buf[0] = 0x00;
+ buf[1] = 0x02;
+ buf[2] = ((Flash_Address >> 16) & 0xFF);
+ buf[3] = ((Flash_Address >> 8) & 0xFF);
+ buf[4] = (Flash_Address & 0xFF);
+ buf[5] = 0x00;
+ buf[6] = min(fw_entry->size - Flash_Address, (size_t)256) - 1;
+ buf[7] = tmpvalue;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 8);
+
+ if (ret < 0) {
+ NVT_ERR("Page Program error!!(%d), i=%d\n", ret, i);
+ return ret;
+ }
+
+ /* Check 0xAA (Page Program) */
+ retry = 0;
+
+ while (1) {
+ mdelay(1);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Page Program error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA || buf[1] == 0xEA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 20)) {
+ NVT_ERR("Check 0xAA (Page Program) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry);
+ return -EPERM;
+ }
+ }
+
+ if (buf[1] == 0xEA) {
+ NVT_ERR("Page Program error!! i=%d\n", i);
+ return -ESRCH;
+ }
+
+ /* Read Status */
+ retry = 0;
+
+ while (1) {
+ mdelay(5);
+ buf[0] = 0x00;
+ buf[1] = 0x05;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Read Status error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Read Status) */
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Read Status) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (((buf[1] == 0xAA) && (buf[2] == 0x00)) || (buf[1] == 0xEA)) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 100)) {
+ NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry);
+ return -EPERM;
+ }
+ }
+
+ if (buf[1] == 0xEA) {
+ NVT_ERR("Page Program error!! i=%d\n", i);
+ return -EINTR;
+ }
+
+ NVT_LOG("Programming...%2d%%\n", ((i * 100) / count));
+ }
+
+ NVT_LOG("Programming...%2d%%\n", 100);
+ NVT_LOG("Program OK \n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen verify checksum of written
+ flash function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Verify_Flash(void)
+{
+ uint8_t buf[64] = {0};
+ uint32_t XDATA_Addr = ts->mmap->READ_FLASH_CHECKSUM_ADDR;
+ int32_t ret = 0;
+ int32_t i = 0;
+ int32_t k = 0;
+ uint16_t WR_Filechksum[BLOCK_64KB_NUM] = {0};
+ uint16_t RD_Filechksum[BLOCK_64KB_NUM] = {0};
+ size_t fw_bin_size = 0;
+ size_t len_in_blk = 0;
+ int32_t retry = 0;
+ fw_bin_size = fw_entry->size;
+
+ for (i = 0; i < BLOCK_64KB_NUM; i++) {
+ if (fw_bin_size > (i * SIZE_64KB)) {
+ /* Calculate WR_Filechksum of each 64KB block */
+ len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB);
+ WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF);
+
+ for (k = 0; k < len_in_blk; k++) {
+ WR_Filechksum[i] += fw_entry->data[k + i * SIZE_64KB];
+ }
+
+ WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1;
+ /* Fast Read Command */
+ buf[0] = 0x00;
+ buf[1] = 0x07;
+ buf[2] = i;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = ((len_in_blk - 1) >> 8) & 0xFF;
+ buf[6] = (len_in_blk - 1) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7);
+
+ if (ret < 0) {
+ NVT_ERR("Fast Read Command error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Check 0xAA (Fast Read Command) */
+ retry = 0;
+
+ while (1) {
+ msleep(80);
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Fast Read Command) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] == 0xAA) {
+ break;
+ }
+
+ retry++;
+
+ if (unlikely(retry > 5)) {
+ NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry);
+ return -EPERM;
+ }
+ }
+
+ /* Read Checksum (write addr high byte & middle byte) */
+ buf[0] = 0xFF;
+ buf[1] = XDATA_Addr >> 16;
+ buf[2] = (XDATA_Addr >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ /* Read Checksum */
+ buf[0] = (XDATA_Addr) & 0xFF;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("Read Checksum error!!(%d)\n", ret);
+ return ret;
+ }
+
+ RD_Filechksum[i] = (uint16_t)((buf[2] << 8) | buf[1]);
+
+ if (WR_Filechksum[i] != RD_Filechksum[i]) {
+ NVT_ERR("Verify Fail%d!!\n", i);
+ NVT_ERR("RD_Filechksum[%d]=0x%04X, WR_Filechksum[%d]=0x%04X\n", i, RD_Filechksum[i], i, WR_Filechksum[i]);
+ return -EPERM;
+ }
+ }
+ }
+
+ NVT_LOG("Verify OK \n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen update firmware function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+int32_t Update_Firmware(void)
+{
+ int32_t ret = 0;
+ /*---Stop CRC check to prevent IC auto reboot---*/
+ nvt_stop_crc_reboot();
+ /* Step 1 : initial bootloader */
+ ret = Init_BootLoader();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 2 : Resume PD */
+ ret = Resume_PD();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 3 : Erase */
+ ret = Erase_Flash();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 4 : Program */
+ ret = Write_Flash();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 5 : Verify */
+ ret = Verify_Flash();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 6 : Bootloader Reset */
+ nvt_bootloader_reset();
+ nvt_check_fw_reset_state(RESET_STATE_INIT);
+ return ret;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen check flash end flag function.
+
+return:
+ Executive outcomes. 0---succeed. 1,negative---failed.
+*******************************************************/
+#define NVT_FLASH_END_FLAG_LEN 3
+#define NVT_FLASH_END_FLAG_ADDR 0x1AFFD
+int32_t nvt_check_flash_end_flag(void)
+{
+ uint8_t buf[8] = {0};
+ uint8_t nvt_end_flag[NVT_FLASH_END_FLAG_LEN + 1] = {0};
+ int32_t ret = 0;
+ /* Step 1 : initial bootloader */
+ ret = Init_BootLoader();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 2 : Resume PD */
+ ret = Resume_PD();
+
+ if (ret) {
+ return ret;
+ }
+
+ /* Step 3 : unlock */
+ buf[0] = 0x00;
+ buf[1] = 0x35;
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("write unlock error!!(%d)\n", ret);
+ return ret;
+ }
+
+ msleep(10);
+ /* Step 4 : Flash Read Command */
+ buf[0] = 0x00;
+ buf[1] = 0x03;
+ buf[2] = (NVT_FLASH_END_FLAG_ADDR >> 16) & 0xFF; /*Addr_H*/
+ buf[3] = (NVT_FLASH_END_FLAG_ADDR >> 8) & 0xFF; /*Addr_M*/
+ buf[4] = NVT_FLASH_END_FLAG_ADDR & 0xFF; /*Addr_L*/
+ buf[5] = (NVT_FLASH_END_FLAG_LEN >> 8) & 0xFF; /*Len_H*/
+ buf[6] = NVT_FLASH_END_FLAG_LEN & 0xFF; /*Len_L*/
+ ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7);
+
+ if (ret < 0) {
+ NVT_ERR("write Read Command error!!(%d)\n", ret);
+ return ret;
+ }
+
+ msleep(10);
+ /* Check 0xAA (Read Command) */
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2);
+
+ if (ret < 0) {
+ NVT_ERR("Check 0xAA (Read Command) error!!(%d)\n", ret);
+ return ret;
+ }
+
+ if (buf[1] != 0xAA) {
+ NVT_ERR("Check 0xAA (Read Command) error!! status=0x%02X\n", buf[1]);
+ return -EPERM;
+ }
+
+ msleep(10);
+ /* Step 5 : Read Flash Data*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 8) & 0xFF;
+ ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3);
+
+ if (ret < 0) {
+ NVT_ERR("change index error!! (%d)\n", ret);
+ return ret;
+ }
+
+ msleep(10);
+ /* Read Back */
+ buf[0] = ts->mmap->READ_FLASH_CHECKSUM_ADDR & 0xFF;
+ ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 6);
+
+ if (ret < 0) {
+ NVT_ERR("Read Back error!! (%d)\n", ret);
+ return ret;
+ }
+
+ /* buf[3:5] => NVT End Flag */
+ strlcpy(nvt_end_flag, &buf[3], NVT_FLASH_END_FLAG_LEN + 1);
+ NVT_LOG("nvt_end_flag=%s (%02X %02X %02X)\n", nvt_end_flag, buf[3], buf[4], buf[5]);
+
+ if (strncmp(nvt_end_flag, "NVT", 3) == 0) {
+ return 0;
+ } else {
+ NVT_ERR("\"NVT\" end flag not found!\n");
+ return 1;
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen update firmware when booting
+ function.
+
+return:
+ n.a.
+*******************************************************/
+void Boot_Update_Firmware(void)
+{
+ int32_t ret = 0;
+ char firmware_name[256] = "";
+
+ if (ts->fw_name)
+ snprintf(firmware_name, strlen(ts->fw_name) + 1, ts->fw_name);
+ else
+ snprintf(firmware_name, strlen(BOOT_UPDATE_FIRMWARE_NAME), BOOT_UPDATE_FIRMWARE_NAME);
+
+ /* request bin file in "/etc/firmware" */
+ ret = update_firmware_request(firmware_name);
+
+ if (ret) {
+ NVT_ERR("update_firmware_request failed. (%d)\n", ret);
+ return;
+ }
+
+ mutex_lock(&ts->lock);
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+ nvt_sw_reset_idle();
+ ret = Check_CheckSum();
+
+ if (ret < 0) { /* read firmware checksum failed */
+ NVT_ERR("read firmware checksum failed\n");
+ Update_Firmware();
+ } else if ((ret == 0) && (Check_FW_Ver() == 0)) { /* (fw checksum not match) && (bin fw version >= ic fw version) */
+ NVT_LOG("firmware version not match\n");
+ Update_Firmware();
+ } else if (nvt_check_flash_end_flag()) {
+ NVT_LOG("check flash end flag failed\n");
+ Update_Firmware();
+ } else {
+ /* Bootloader Reset */
+ nvt_bootloader_reset();
+ ret = nvt_check_fw_reset_state(RESET_STATE_INIT);
+
+ if (ret) {
+ NVT_LOG("check fw reset state failed\n");
+ Update_Firmware();
+ }
+ }
+
+ mutex_unlock(&ts->lock);
+ update_firmware_release();
+}
+
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h
new file mode 100644
index 000000000000..afdf30cf9ddc
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mem_map.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 20544 $
+ * $Date: 2017-12-20 11:08:15 +0800 (週三, 20 å二月 2017) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+struct nvt_ts_mem_map {
+ uint32_t EVENT_BUF_ADDR;
+ uint32_t RAW_PIPE0_ADDR;
+ uint32_t RAW_PIPE0_Q_ADDR;
+ uint32_t RAW_PIPE1_ADDR;
+ uint32_t RAW_PIPE1_Q_ADDR;
+ uint32_t BASELINE_ADDR;
+ uint32_t BASELINE_Q_ADDR;
+ uint32_t BASELINE_BTN_ADDR;
+ uint32_t BASELINE_BTN_Q_ADDR;
+ uint32_t DIFF_PIPE0_ADDR;
+ uint32_t DIFF_PIPE0_Q_ADDR;
+ uint32_t DIFF_PIPE1_ADDR;
+ uint32_t DIFF_PIPE1_Q_ADDR;
+ uint32_t RAW_BTN_PIPE0_ADDR;
+ uint32_t RAW_BTN_PIPE0_Q_ADDR;
+ uint32_t RAW_BTN_PIPE1_ADDR;
+ uint32_t RAW_BTN_PIPE1_Q_ADDR;
+ uint32_t DIFF_BTN_PIPE0_ADDR;
+ uint32_t DIFF_BTN_PIPE0_Q_ADDR;
+ uint32_t DIFF_BTN_PIPE1_ADDR;
+ uint32_t DIFF_BTN_PIPE1_Q_ADDR;
+ uint32_t READ_FLASH_CHECKSUM_ADDR;
+ uint32_t RW_FLASH_DATA_ADDR;
+};
+
+static const struct nvt_ts_mem_map NT36672A_memory_map = {
+ .EVENT_BUF_ADDR = 0x21C00,
+ .RAW_PIPE0_ADDR = 0x20000,
+ .RAW_PIPE0_Q_ADDR = 0,
+ .RAW_PIPE1_ADDR = 0x23000,
+ .RAW_PIPE1_Q_ADDR = 0,
+ .BASELINE_ADDR = 0x20BFC,
+ .BASELINE_Q_ADDR = 0,
+ .BASELINE_BTN_ADDR = 0x23BFC,
+ .BASELINE_BTN_Q_ADDR = 0,
+ .DIFF_PIPE0_ADDR = 0x206DC,
+ .DIFF_PIPE0_Q_ADDR = 0,
+ .DIFF_PIPE1_ADDR = 0x236DC,
+ .DIFF_PIPE1_Q_ADDR = 0,
+ .RAW_BTN_PIPE0_ADDR = 0x20510,
+ .RAW_BTN_PIPE0_Q_ADDR = 0,
+ .RAW_BTN_PIPE1_ADDR = 0x23510,
+ .RAW_BTN_PIPE1_Q_ADDR = 0,
+ .DIFF_BTN_PIPE0_ADDR = 0x20BF0,
+ .DIFF_BTN_PIPE0_Q_ADDR = 0,
+ .DIFF_BTN_PIPE1_ADDR = 0x23BF0,
+ .DIFF_BTN_PIPE1_Q_ADDR = 0,
+ .READ_FLASH_CHECKSUM_ADDR = 0x24000,
+ .RW_FLASH_DATA_ADDR = 0x24002,
+};
+
+static const struct nvt_ts_mem_map NT36772_memory_map = {
+ .EVENT_BUF_ADDR = 0x11E00,
+ .RAW_PIPE0_ADDR = 0x10000,
+ .RAW_PIPE0_Q_ADDR = 0,
+ .RAW_PIPE1_ADDR = 0x12000,
+ .RAW_PIPE1_Q_ADDR = 0,
+ .BASELINE_ADDR = 0x10E70,
+ .BASELINE_Q_ADDR = 0,
+ .BASELINE_BTN_ADDR = 0x12E70,
+ .BASELINE_BTN_Q_ADDR = 0,
+ .DIFF_PIPE0_ADDR = 0x10830,
+ .DIFF_PIPE0_Q_ADDR = 0,
+ .DIFF_PIPE1_ADDR = 0x12830,
+ .DIFF_PIPE1_Q_ADDR = 0,
+ .RAW_BTN_PIPE0_ADDR = 0x10E60,
+ .RAW_BTN_PIPE0_Q_ADDR = 0,
+ .RAW_BTN_PIPE1_ADDR = 0x12E60,
+ .RAW_BTN_PIPE1_Q_ADDR = 0,
+ .DIFF_BTN_PIPE0_ADDR = 0x10E68,
+ .DIFF_BTN_PIPE0_Q_ADDR = 0,
+ .DIFF_BTN_PIPE1_ADDR = 0x12E68,
+ .DIFF_BTN_PIPE1_Q_ADDR = 0,
+ .READ_FLASH_CHECKSUM_ADDR = 0x14000,
+ .RW_FLASH_DATA_ADDR = 0x14002,
+};
+
+static const struct nvt_ts_mem_map NT36525_memory_map = {
+ .EVENT_BUF_ADDR = 0x11A00,
+ .RAW_PIPE0_ADDR = 0x10000,
+ .RAW_PIPE0_Q_ADDR = 0,
+ .RAW_PIPE1_ADDR = 0x12000,
+ .RAW_PIPE1_Q_ADDR = 0,
+ .BASELINE_ADDR = 0x10B08,
+ .BASELINE_Q_ADDR = 0,
+ .BASELINE_BTN_ADDR = 0x12B08,
+ .BASELINE_BTN_Q_ADDR = 0,
+ .DIFF_PIPE0_ADDR = 0x1064C,
+ .DIFF_PIPE0_Q_ADDR = 0,
+ .DIFF_PIPE1_ADDR = 0x1264C,
+ .DIFF_PIPE1_Q_ADDR = 0,
+ .RAW_BTN_PIPE0_ADDR = 0x10634,
+ .RAW_BTN_PIPE0_Q_ADDR = 0,
+ .RAW_BTN_PIPE1_ADDR = 0x12634,
+ .RAW_BTN_PIPE1_Q_ADDR = 0,
+ .DIFF_BTN_PIPE0_ADDR = 0x10AFC,
+ .DIFF_BTN_PIPE0_Q_ADDR = 0,
+ .DIFF_BTN_PIPE1_ADDR = 0x12AFC,
+ .DIFF_BTN_PIPE1_Q_ADDR = 0,
+ .READ_FLASH_CHECKSUM_ADDR = 0x14000,
+ .RW_FLASH_DATA_ADDR = 0x14002,
+};
+
+static const struct nvt_ts_mem_map NT36870_memory_map = {
+ .EVENT_BUF_ADDR = 0x25000,
+ .RAW_PIPE0_ADDR = 0x20000,
+ .RAW_PIPE0_Q_ADDR = 0x204C8,
+ .RAW_PIPE1_ADDR = 0x23000,
+ .RAW_PIPE1_Q_ADDR = 0x234C8,
+ .BASELINE_ADDR = 0x21350,
+ .BASELINE_Q_ADDR = 0x21818,
+ .BASELINE_BTN_ADDR = 0x24350,
+ .BASELINE_BTN_Q_ADDR = 0x24358,
+ .DIFF_PIPE0_ADDR = 0x209B0,
+ .DIFF_PIPE0_Q_ADDR = 0x20E78,
+ .DIFF_PIPE1_ADDR = 0x239B0,
+ .DIFF_PIPE1_Q_ADDR = 0x23E78,
+ .RAW_BTN_PIPE0_ADDR = 0x20990,
+ .RAW_BTN_PIPE0_Q_ADDR = 0x20998,
+ .RAW_BTN_PIPE1_ADDR = 0x23990,
+ .RAW_BTN_PIPE1_Q_ADDR = 0x23998,
+ .DIFF_BTN_PIPE0_ADDR = 0x21340,
+ .DIFF_BTN_PIPE0_Q_ADDR = 0x21348,
+ .DIFF_BTN_PIPE1_ADDR = 0x24340,
+ .DIFF_BTN_PIPE1_Q_ADDR = 0x24348,
+ .READ_FLASH_CHECKSUM_ADDR = 0x24000,
+ .RW_FLASH_DATA_ADDR = 0x24002,
+};
+
+static const struct nvt_ts_mem_map NT36676F_memory_map = {
+ .EVENT_BUF_ADDR = 0x11A00,
+ .RAW_PIPE0_ADDR = 0x10000,
+ .RAW_PIPE0_Q_ADDR = 0,
+ .RAW_PIPE1_ADDR = 0x12000,
+ .RAW_PIPE1_Q_ADDR = 0,
+ .BASELINE_ADDR = 0x10B08,
+ .BASELINE_Q_ADDR = 0,
+ .BASELINE_BTN_ADDR = 0x12B08,
+ .BASELINE_BTN_Q_ADDR = 0,
+ .DIFF_PIPE0_ADDR = 0x1064C,
+ .DIFF_PIPE0_Q_ADDR = 0,
+ .DIFF_PIPE1_ADDR = 0x1264C,
+ .DIFF_PIPE1_Q_ADDR = 0,
+ .RAW_BTN_PIPE0_ADDR = 0x10634,
+ .RAW_BTN_PIPE0_Q_ADDR = 0,
+ .RAW_BTN_PIPE1_ADDR = 0x12634,
+ .RAW_BTN_PIPE1_Q_ADDR = 0,
+ .DIFF_BTN_PIPE0_ADDR = 0x10AFC,
+ .DIFF_BTN_PIPE0_Q_ADDR = 0,
+ .DIFF_BTN_PIPE1_ADDR = 0x12AFC,
+ .DIFF_BTN_PIPE1_Q_ADDR = 0,
+ .READ_FLASH_CHECKSUM_ADDR = 0x14000,
+ .RW_FLASH_DATA_ADDR = 0x14002,
+};
+
+#define NVT_ID_BYTE_MAX 6
+struct nvt_ts_trim_id_table {
+ uint8_t id[NVT_ID_BYTE_MAX];
+ uint8_t mask[NVT_ID_BYTE_MAX];
+ const struct nvt_ts_mem_map *mmap;
+ uint8_t carrier_system;
+};
+
+static const struct nvt_ts_trim_id_table trim_id_table[] = {
+ {
+ .id = {0x0A, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1},
+ .mmap = &NT36672A_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0x55, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0x55, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xAA, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xAA, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x72, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x70, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36772_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x25, 0x65, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36525_memory_map, .carrier_system = 0
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x70, 0x68, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36870_memory_map, .carrier_system = 1
+ },
+ {
+ .id = {0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1},
+ .mmap = &NT36676F_memory_map, .carrier_system = 0
+ }
+};
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c
new file mode 100644
index 000000000000..65f023e73e44
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.c
@@ -0,0 +1,1882 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 21288 $
+ * $Date: 2018-01-05 11:38:47 +0800 (週五, 05 一月 2018) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <asm/uaccess.h>
+
+#include "nt36xxx.h"
+#include "nt36xxx_mp_ctrlram.h"
+
+#if NVT_TOUCH_MP
+
+#define NORMAL_MODE 0x00
+#define TEST_MODE_1 0x21
+#define TEST_MODE_2 0x22
+#define MP_MODE_CC 0x41
+#define FREQ_HOP_DISABLE 0x66
+#define FREQ_HOP_ENABLE 0x65
+
+#define SHORT_TEST_CSV_FILE "/data/local/tmp/ShortTest.csv"
+#define OPEN_TEST_CSV_FILE "/data/local/tmp/OpenTest.csv"
+#define FW_RAWDATA_CSV_FILE "/data/local/tmp/FWMutualTest.csv"
+#define FW_CC_CSV_FILE "/data/local/tmp/FWCCTest.csv"
+#define NOISE_TEST_CSV_FILE "/data/local/tmp/NoiseTest.csv"
+
+#define nvt_mp_seq_printf(m, fmt, args...) do { \
+ seq_printf(m, fmt, ##args); \
+ if (!nvt_mp_test_result_printed) \
+ printk(fmt, ##args); \
+} while (0)
+
+static uint8_t *RecordResult_Short;
+static uint8_t *RecordResult_Short_Diff;
+static uint8_t *RecordResult_Short_Base;
+static uint8_t *RecordResult_Open;
+static uint8_t *RecordResult_FWMutual;
+static uint8_t *RecordResult_FW_CC;
+static uint8_t *RecordResult_FW_CC_I;
+static uint8_t *RecordResult_FW_CC_Q;
+static uint8_t *RecordResult_FW_DiffMax;
+static uint8_t *RecordResult_FW_DiffMin;
+
+static int32_t TestResult_Short;
+static int32_t TestResult_Short_Diff;
+static int32_t TestResult_Short_Base;
+static int32_t TestResult_Open;
+static int32_t TestResult_FW_Rawdata;
+static int32_t TestResult_FWMutual;
+static int32_t TestResult_FW_CC;
+static int32_t TestResult_FW_CC_I;
+static int32_t TestResult_FW_CC_Q;
+static int32_t TestResult_Noise;
+static int32_t TestResult_FW_DiffMax;
+static int32_t TestResult_FW_DiffMin;
+
+static int32_t *RawData_Short;
+static int32_t *RawData_Short_Diff;
+static int32_t *RawData_Short_Base;
+static int32_t *RawData_Open;
+static int32_t *RawData_Diff;
+static int32_t *RawData_Diff_Min;
+static int32_t *RawData_Diff_Max;
+static int32_t *RawData_FWMutual;
+static int32_t *RawData_FW_CC;
+static int32_t *RawData_FW_CC_I;
+static int32_t *RawData_FW_CC_Q;
+
+static struct proc_dir_entry *NVT_proc_selftest_entry;
+static int8_t nvt_mp_test_result_printed;
+
+extern void nvt_change_mode(uint8_t mode);
+extern uint8_t nvt_get_fw_pipe(void);
+extern void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr);
+extern void nvt_get_mdata(int32_t *buf, uint8_t *m_x_num, uint8_t *m_y_num);
+void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible);
+
+/*******************************************************
+Description:
+ Novatek touchscreen allocate buffer for mp selftest.
+
+return:
+ Executive outcomes. 0---succeed. -12---Out of memory
+*******************************************************/
+static int nvt_mp_buffer_init(void)
+{
+ size_t RecordResult_BufSize = IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE;
+ size_t RawData_BufSize = (IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE) * sizeof(int32_t);
+ RecordResult_Short = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_Short) {
+ NVT_ERR("kzalloc for RecordResult_Short failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_Short_Diff = RecordResult_Short;
+ RecordResult_Short_Base = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_Short_Base) {
+ NVT_ERR("kzalloc for RecordResult_Short_Base failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_Open = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_Open) {
+ NVT_ERR("kzalloc for RecordResult_Open failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_FWMutual = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_FWMutual) {
+ NVT_ERR("kzalloc for RecordResult_FWMutual failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_FW_CC = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_FW_CC) {
+ NVT_ERR("kzalloc for RecordResult_FW_CC failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_FW_CC_I = RecordResult_FW_CC;
+ RecordResult_FW_CC_Q = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_FW_CC_Q) {
+ NVT_ERR("kzalloc for RecordResult_FW_CC_Q failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_FW_DiffMax = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_FW_DiffMax) {
+ NVT_ERR("kzalloc for RecordResult_FW_DiffMax failed!\n");
+ return -ENOMEM;
+ }
+
+ RecordResult_FW_DiffMin = (uint8_t *)kzalloc(RecordResult_BufSize, GFP_KERNEL);
+
+ if (!RecordResult_FW_DiffMin) {
+ NVT_ERR("kzalloc for RecordResult_FW_DiffMin failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Short = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Short) {
+ NVT_ERR("kzalloc for RawData_Short failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Short_Diff = RawData_Short;
+ RawData_Short_Base = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Short_Base) {
+ NVT_ERR("kzalloc for RawData_Short_Base failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Open = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Open) {
+ NVT_ERR("kzalloc for RawData_Open failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Diff = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Diff) {
+ NVT_ERR("kzalloc for RawData_Diff failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Diff_Min = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Diff_Min) {
+ NVT_ERR("kzalloc for RawData_Diff_Min failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_Diff_Max = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_Diff_Max) {
+ NVT_ERR("kzalloc for RawData_Diff_Max failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_FWMutual = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_FWMutual) {
+ NVT_ERR("kzalloc for RawData_FWMutual failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_FW_CC = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_FW_CC) {
+ NVT_ERR("kzalloc for RawData_FW_CC failed!\n");
+ return -ENOMEM;
+ }
+
+ RawData_FW_CC_I = RawData_FW_CC;
+ RawData_FW_CC_Q = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+
+ if (!RawData_FW_CC_Q) {
+ NVT_ERR("kzalloc for RawData_FW_CC_Q failed!\n");
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen self-test criteria print function.
+
+return:
+ n.a.
+*******************************************************/
+static void nvt_print_lmt_array(int32_t *array, int32_t x_ch, int32_t y_ch)
+{
+ int32_t i = 0;
+ int32_t j = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ char *buf = NULL;
+ ssize_t ret = 0;
+ buf = (char *)kzalloc(PAGE_SIZE * 2, GFP_KERNEL);
+
+ if (!buf) {
+ NVT_ERR("kzalloc for temp buffer failed!\n");
+ return;
+ }
+
+ for (j = 0; j < y_ch; j++) {
+ ret = 0;
+
+ for (i = 0; i < x_ch; i++) {
+ ret += snprintf(buf + ret, 8, "%5d, ", array[j * x_ch + i]);
+ }
+
+ buf[ret] = '\0';
+ printk("%s\n", buf);
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ printk("%5d, ", array[y_ch * x_ch + k]);
+ }
+
+ printk("\n");
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ if (buf) {
+ kfree(buf);
+ buf = NULL;
+ }
+}
+
+static void nvt_print_criteria(void)
+{
+ NVT_LOG("++\n");
+
+ if (ts->carrier_system) {
+ /*---PS_Config_Lmt_Short_Diff---*/
+ printk("PS_Config_Lmt_Short_Diff_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_Short_Diff_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_N, X_Channel, Y_Channel);
+ /*---PS_Config_Lmt_Short_Base---*/
+ printk("PS_Config_Lmt_Short_Base_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Base_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_Short_Base_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Base_N, X_Channel, Y_Channel);
+ } else {
+ /*---PS_Config_Lmt_Short_Rawdata---*/
+ printk("PS_Config_Lmt_Short_Rawdata_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_Short_Rawdata_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_N, X_Channel, Y_Channel);
+ }
+
+ /*---PS_Config_Lmt_Open_Rawdata---*/
+ printk("PS_Config_Lmt_Open_Rawdata_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_Open_Rawdata_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_N, X_Channel, Y_Channel);
+ /*---PS_Config_Lmt_FW_Rawdata---*/
+ printk("PS_Config_Lmt_FW_Rawdata_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_FW_Rawdata_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_N, X_Channel, Y_Channel);
+
+ if (ts->carrier_system) {
+ /*---PS_Config_Lmt_FW_CC_I---*/
+ printk("PS_Config_Lmt_FW_CC_I_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_FW_CC_I_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_N, X_Channel, Y_Channel);
+ /*---PS_Config_Lmt_FW_CC_Q---*/
+ printk("PS_Config_Lmt_FW_CC_Q_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_FW_CC_Q_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_N, X_Channel, Y_Channel);
+ } else {
+ /*---PS_Config_Lmt_FW_CC---*/
+ printk("PS_Config_Lmt_FW_CC_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_FW_CC_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_CC_N, X_Channel, Y_Channel);
+ }
+
+ /*---PS_Config_Lmt_FW_Diff---*/
+ printk("PS_Config_Lmt_FW_Diff_P:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_P, X_Channel, Y_Channel);
+ printk("PS_Config_Lmt_FW_Diff_N:\n");
+ nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_N, X_Channel, Y_Channel);
+ NVT_LOG("--\n");
+}
+
+static int32_t nvt_polling_hand_shake_status(void)
+{
+ uint8_t buf[8] = {0};
+ int32_t i = 0;
+ const int32_t retry = 50;
+
+ for (i = 0; i < retry; i++) {
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---read fw status---*/
+ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE;
+ buf[1] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2);
+
+ if ((buf[1] == 0xA0) || (buf[1] == 0xA1))
+ break;
+
+ msleep(10);
+ }
+
+ if (i >= retry) {
+ NVT_ERR("polling hand shake status failed, buf[1]=0x%02X\n", buf[1]);
+ /* Read back 5 bytes from offset EVENT_MAP_HOST_CMD for debug check */
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x00;
+ buf[2] = 0x00;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = 0x00;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6);
+ NVT_ERR("Read back 5 bytes from offset EVENT_MAP_HOST_CMD: 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", buf[1], buf[2], buf[3], buf[4], buf[5]);
+ return -EPERM;
+ } else {
+ return 0;
+ }
+}
+
+static int8_t nvt_switch_FreqHopEnDis(uint8_t FreqHopEnDis)
+{
+ uint8_t buf[8] = {0};
+ uint8_t retry = 0;
+ int8_t ret = 0;
+ NVT_LOG("++\n");
+
+ for (retry = 0; retry < 20; retry++) {
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---switch FreqHopEnDis---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = FreqHopEnDis;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2);
+ msleep(35);
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0xFF;
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2);
+
+ if (buf[1] == 0x00)
+ break;
+ }
+
+ if (unlikely(retry == 20)) {
+ NVT_ERR("switch FreqHopEnDis 0x%02X failed, buf[1]=0x%02X\n", FreqHopEnDis, buf[1]);
+ ret = -EPERM;
+ }
+
+ NVT_LOG("--\n");
+ return ret;
+}
+
+static int32_t nvt_read_baseline(int32_t *xdata)
+{
+ uint8_t x_num = 0;
+ uint8_t y_num = 0;
+ uint32_t x = 0;
+ uint32_t y = 0;
+ int32_t iArrayIndex = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ NVT_LOG("++\n");
+ nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR);
+ nvt_get_mdata(xdata, &x_num, &y_num);
+
+ for (y = 0; y < y_num; y++) {
+ for (x = 0; x < x_num; x++) {
+ iArrayIndex = y * x_num + x;
+
+ if (ts->carrier_system) {
+ xdata[iArrayIndex] = (uint16_t)xdata[iArrayIndex];
+ } else {
+ xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex];
+ }
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = Y_Channel * X_Channel + k;
+
+ if (ts->carrier_system) {
+ xdata[iArrayIndex] = (uint16_t)xdata[iArrayIndex];
+ } else {
+ xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex];
+ }
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ printk("%s:\n", __func__);
+
+ NVT_LOG("--\n");
+ return 0;
+}
+
+static int32_t nvt_read_CC(int32_t *xdata)
+{
+ uint8_t x_num = 0;
+ uint8_t y_num = 0;
+ uint32_t x = 0;
+ uint32_t y = 0;
+ int32_t iArrayIndex = 0;
+ int32_t xdata_tmp = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ uint32_t rawdata_cc_q_offset = 0;
+ NVT_LOG("++\n");
+
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR);
+
+ nvt_get_mdata(xdata, &x_num, &y_num);
+
+ for (y = 0; y < y_num; y++) {
+ for (x = 0; x < x_num; x++) {
+ iArrayIndex = y * x_num + x;
+
+ if (ts->carrier_system) {
+ xdata_tmp = xdata[iArrayIndex];
+ RawData_FW_CC_I[iArrayIndex] = (uint8_t)(xdata_tmp & 0xFF);
+ RawData_FW_CC_Q[iArrayIndex] = (uint8_t)((xdata_tmp >> 8) & 0xFF);
+ } else {
+ xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex];
+ }
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = Y_Channel * X_Channel + k;
+
+ if (ts->carrier_system) {
+ xdata_tmp = xdata[iArrayIndex];
+ RawData_FW_CC_I[iArrayIndex] = (uint8_t)(xdata_tmp & 0xFF);
+ RawData_FW_CC_Q[iArrayIndex] = (uint8_t)((xdata_tmp >> 8) & 0xFF);
+ } else {
+ xdata[iArrayIndex] = (int16_t)xdata[iArrayIndex];
+ }
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ printk("%s:\n", __func__);
+
+ if (ts->carrier_system) {
+ printk("%s:RawData_CC_I:\n", __func__);
+
+#if TOUCH_KEY_NUM > 0
+ rawdata_cc_q_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2;
+#else
+ rawdata_cc_q_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ }
+
+ NVT_LOG("--\n");
+ return 0;
+}
+
+static void nvt_enable_noise_collect(int32_t frame_num)
+{
+ uint8_t buf[8] = {0};
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---enable noise collect---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x47;
+ buf[2] = 0xAA;
+ buf[3] = frame_num;
+ buf[4] = 0x00;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5);
+}
+
+static int32_t nvt_read_fw_noise(int32_t *xdata)
+{
+ uint8_t x_num = 0;
+ uint8_t y_num = 0;
+ uint32_t x = 0;
+ uint32_t y = 0;
+ int32_t iArrayIndex = 0;
+ int32_t frame_num = 0;
+ uint32_t rawdata_diff_min_offset = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ NVT_LOG("++\n");
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ return -EAGAIN;
+ }
+
+ frame_num = PS_Config_Diff_Test_Frame / 10;
+
+ if (frame_num <= 0)
+ frame_num = 1;
+
+ printk("%s: frame_num=%d\n", __func__, frame_num);
+ nvt_enable_noise_collect(frame_num);
+ /* need wait PS_Config_Diff_Test_Frame * 8.3ms */
+ msleep(frame_num * 83);
+
+ if (nvt_polling_hand_shake_status()) {
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_info()) {
+ return -EAGAIN;
+ }
+
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR);
+
+ nvt_get_mdata(xdata, &x_num, &y_num);
+
+ for (y = 0; y < y_num; y++) {
+ for (x = 0; x < x_num; x++) {
+ iArrayIndex = y * x_num + x;
+
+ if (ts->carrier_system) {
+ RawData_Diff_Max[iArrayIndex] = (uint16_t)xdata[iArrayIndex];
+ RawData_Diff_Min[iArrayIndex] = 0;
+ } else {
+ RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF);
+ RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF);
+ }
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = Y_Channel * X_Channel + k;
+
+ if (ts->carrier_system) {
+ RawData_Diff_Max[iArrayIndex] = (uint16_t)xdata[iArrayIndex];
+ RawData_Diff_Min[iArrayIndex] = 0;
+ } else {
+ RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF);
+ RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF);
+ }
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+ printk("%s:RawData_Diff_Max:\n", __func__);
+
+ if (!ts->carrier_system) {
+#if TOUCH_KEY_NUM > 0
+ rawdata_diff_min_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2;
+#else
+ rawdata_diff_min_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ printk("%s:RawData_Diff_Min:\n", __func__);
+
+ }
+
+ NVT_LOG("--\n");
+ return 0;
+}
+
+static void nvt_enable_open_test(void)
+{
+ uint8_t buf[8] = {0};
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---enable open test---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x45;
+ buf[2] = 0xAA;
+ buf[3] = 0x02;
+ buf[4] = 0x00;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5);
+}
+
+static void nvt_enable_short_test(void)
+{
+ uint8_t buf[8] = {0};
+ /*---set xdata index to EVENT BUF ADDR---*/
+ buf[0] = 0xFF;
+ buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF;
+ buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ /*---enable short test---*/
+ buf[0] = EVENT_MAP_HOST_CMD;
+ buf[1] = 0x43;
+ buf[2] = 0xAA;
+ buf[3] = 0x02;
+ buf[4] = 0x00;
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 5);
+}
+
+static int32_t nvt_read_fw_open(int32_t *xdata)
+{
+ uint32_t raw_pipe_addr = 0;
+ uint8_t *rawdata_buf = NULL;
+ uint32_t x = 0;
+ uint32_t y = 0;
+ uint8_t buf[128] = {0};
+#if TOUCH_KEY_NUM > 0
+ uint32_t raw_btn_pipe_addr = 0;
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ NVT_LOG("++\n");
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ return -EAGAIN;
+ }
+
+ nvt_enable_open_test();
+
+ if (nvt_polling_hand_shake_status()) {
+ return -EAGAIN;
+ }
+
+#if TOUCH_KEY_NUM > 0
+ rawdata_buf = (uint8_t *)kzalloc((IC_X_CFG_SIZE * IC_Y_CFG_SIZE + IC_KEY_CFG_SIZE) * 2, GFP_KERNEL);
+#else
+ rawdata_buf = (uint8_t *)kzalloc(IC_X_CFG_SIZE * IC_Y_CFG_SIZE * 2, GFP_KERNEL);
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ if (!rawdata_buf) {
+ NVT_ERR("kzalloc for rawdata_buf failed!\n");
+ return -ENOMEM;
+ }
+
+ if (nvt_get_fw_pipe() == 0)
+ raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR;
+ else
+ raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR;
+
+ for (y = 0; y < IC_Y_CFG_SIZE; y++) {
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 16) & 0xFF);
+ buf[2] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, IC_X_CFG_SIZE * 2 + 1);
+ memcpy(rawdata_buf + y * IC_X_CFG_SIZE * 2, buf + 1, IC_X_CFG_SIZE * 2);
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ if (nvt_get_fw_pipe() == 0)
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR;
+ else
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR;
+
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF);
+ buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, IC_KEY_CFG_SIZE * 2 + 1);
+ memcpy(rawdata_buf + IC_Y_CFG_SIZE * IC_X_CFG_SIZE * 2, buf + 1, IC_KEY_CFG_SIZE * 2);
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ for (y = 0; y < IC_Y_CFG_SIZE; y++) {
+ for (x = 0; x < IC_X_CFG_SIZE; x++) {
+ if ((AIN_Y[y] != 0xFF) && (AIN_X[x] != 0xFF)) {
+ xdata[AIN_Y[y] * X_Channel + AIN_X[x]] = (int16_t)((rawdata_buf[(y * IC_X_CFG_SIZE + x) * 2] + 256 * rawdata_buf[(y * IC_X_CFG_SIZE + x) * 2 + 1]));
+ }
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < IC_KEY_CFG_SIZE; k++) {
+ if (AIN_KEY[k] != 0xFF)
+ xdata[Y_Channel * X_Channel + AIN_KEY[k]] = (int16_t)(rawdata_buf[(IC_Y_CFG_SIZE * IC_X_CFG_SIZE + k) * 2] + 256 * rawdata_buf[(IC_Y_CFG_SIZE * IC_X_CFG_SIZE + k) * 2 + 1]);
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ if (rawdata_buf) {
+ kfree(rawdata_buf);
+ rawdata_buf = NULL;
+ }
+
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+ printk("%s:RawData_Open\n", __func__);
+
+ NVT_LOG("--\n");
+ return 0;
+}
+
+static int32_t nvt_read_fw_short(int32_t *xdata)
+{
+ uint32_t raw_pipe_addr = 0;
+ uint8_t *rawdata_buf = NULL;
+ uint32_t x = 0;
+ uint32_t y = 0;
+ uint8_t buf[128] = {0};
+ int32_t iArrayIndex = 0;
+#if TOUCH_KEY_NUM > 0
+ uint32_t raw_btn_pipe_addr = 0;
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ uint32_t rawdata_short_base_offset = 0;
+ NVT_LOG("++\n");
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ return -EAGAIN;
+ }
+
+ nvt_enable_short_test();
+
+ if (nvt_polling_hand_shake_status()) {
+ return -EAGAIN;
+ }
+
+#if TOUCH_KEY_NUM > 0
+ rawdata_buf = (uint8_t *)kzalloc((X_Channel * Y_Channel + Key_Channel) * 2, GFP_KERNEL);
+#else
+ rawdata_buf = (uint8_t *)kzalloc(X_Channel * Y_Channel * 2, GFP_KERNEL);
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ if (!rawdata_buf) {
+ NVT_ERR("kzalloc for rawdata_buf failed!\n");
+ return -ENOMEM;
+ }
+
+ if (ts->carrier_system) {
+ /* to get short diff rawdata at pipe0 */
+ raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR;
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR;
+ else
+ raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR;
+ }
+
+ for (y = 0; y < Y_Channel; y++) {
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF);
+ buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)((raw_pipe_addr + y * X_Channel * 2) & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, X_Channel * 2 + 1);
+ memcpy(rawdata_buf + y * X_Channel * 2, buf + 1, X_Channel * 2);
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ if (ts->carrier_system) {
+ /* to get button short diff rawdata at pipe0 */
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR;
+ } else {
+ if (nvt_get_fw_pipe() == 0)
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR;
+ else
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR;
+ }
+
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF);
+ buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, Key_Channel * 2 + 1);
+ memcpy(rawdata_buf + Y_Channel * X_Channel * 2, buf + 1, Key_Channel * 2);
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ for (y = 0; y < Y_Channel; y++) {
+ for (x = 0; x < X_Channel; x++) {
+ iArrayIndex = y * X_Channel + x;
+ xdata[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]);
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = Y_Channel * X_Channel + k;
+ xdata[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]);
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ /* for carrier sensing system to get short baseline rawdata */
+ if (ts->carrier_system) {
+ /* to get short baseline rawdata at pipe1 */
+ raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR;
+
+ for (y = 0; y < Y_Channel; y++) {
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF);
+ buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)((raw_pipe_addr + y * X_Channel * 2) & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, X_Channel * 2 + 1);
+ memcpy(rawdata_buf + y * X_Channel * 2, buf + 1, X_Channel * 2);
+ }
+
+#if TOUCH_KEY_NUM > 0
+ /* to get button short baseline rawdata at pipe1 */
+ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR;
+ /*---change xdata index---*/
+ buf[0] = 0xFF;
+ buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF);
+ buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF);
+ CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3);
+ buf[0] = (uint8_t)(raw_btn_pipe_addr & 0xFF);
+ CTP_I2C_READ(ts->client, I2C_FW_Address, buf, Key_Channel * 2 + 1);
+ memcpy(rawdata_buf + Y_Channel * X_Channel * 2, buf + 1, Key_Channel * 2);
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ for (y = 0; y < Y_Channel; y++) {
+ for (x = 0; x < X_Channel; x++) {
+ iArrayIndex = y * X_Channel + x;
+ RawData_Short_Base[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]);
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = Y_Channel * X_Channel + k;
+ RawData_Short_Base[iArrayIndex] = (int16_t)(rawdata_buf[iArrayIndex * 2] + 256 * rawdata_buf[iArrayIndex * 2 + 1]);
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ }
+
+ if (rawdata_buf) {
+ kfree(rawdata_buf);
+ rawdata_buf = NULL;
+ }
+
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+
+ if (ts->carrier_system)
+ printk("%s:RawData_Short_Diff:\n", __func__);
+ else
+ printk("%s:RawData_Short\n", __func__);
+
+ if (ts->carrier_system) {
+#if TOUCH_KEY_NUM > 0
+ rawdata_short_base_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2 + Key_Channel * 7 + 2;
+#else
+ rawdata_short_base_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ printk("%s:RawData_Short_Base:\n", __func__);
+
+ }
+
+ NVT_LOG("--\n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen raw data test for each single point function.
+
+return:
+ Executive outcomes. 0---passed. negative---failed.
+*******************************************************/
+static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResult[], uint8_t x_ch, uint8_t y_ch, int32_t Rawdata_Limit_Postive[], int32_t Rawdata_Limit_Negative[])
+{
+ int32_t i = 0;
+ int32_t j = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ int32_t iArrayIndex = 0;
+ bool isPass = true;
+
+ for (j = 0; j < y_ch; j++) {
+ for (i = 0; i < x_ch; i++) {
+ iArrayIndex = j * x_ch + i;
+ RecordResult[iArrayIndex] = 0x00; /* default value for PASS */
+
+ if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex])
+ RecordResult[iArrayIndex] |= 0x01;
+
+ if (rawdata[iArrayIndex] < Rawdata_Limit_Negative[iArrayIndex])
+ RecordResult[iArrayIndex] |= 0x02;
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = y_ch * x_ch + k;
+ RecordResult[iArrayIndex] = 0x00; /* default value for PASS */
+
+ if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex])
+ RecordResult[iArrayIndex] |= 0x01;
+
+ if (rawdata[iArrayIndex] < Rawdata_Limit_Negative[iArrayIndex])
+ RecordResult[iArrayIndex] |= 0x02;
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ /*---Check RecordResult---*/
+ for (j = 0; j < y_ch; j++) {
+ for (i = 0; i < x_ch; i++) {
+ if (RecordResult[j * x_ch + i] != 0) {
+ isPass = false;
+ break;
+ }
+ }
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = y_ch * x_ch + k;
+
+ if (RecordResult[iArrayIndex] != 0) {
+ isPass = false;
+ break;
+ }
+ }
+
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ if (isPass == false) {
+ return -EPERM; /* FAIL */
+ } else {
+ return 0; /* PASS */
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen print self-test result function.
+
+return:
+ n.a.
+*******************************************************/
+void print_selftest_result(struct seq_file *m, int32_t TestResult, uint8_t RecordResult[], int32_t rawdata[], uint8_t x_len, uint8_t y_len)
+{
+ int32_t i = 0;
+ int32_t j = 0;
+ int32_t iArrayIndex = 0;
+#if TOUCH_KEY_NUM > 0
+ int32_t k = 0;
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+ switch (TestResult) {
+ case 0:
+ nvt_mp_seq_printf(m, " PASS!\n");
+ break;
+
+ case 1:
+ nvt_mp_seq_printf(m, " ERROR! Read Data FAIL!\n");
+ break;
+
+ case -EPERM:
+ nvt_mp_seq_printf(m, " FAIL!\n");
+ nvt_mp_seq_printf(m, "RecordResult:\n");
+
+ for (i = 0; i < y_len; i++) {
+ for (j = 0; j < x_len; j++) {
+ iArrayIndex = i * x_len + j;
+ nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]);
+ }
+
+ nvt_mp_seq_printf(m, "\n");
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = y_len * x_len + k;
+ nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]);
+ }
+
+ nvt_mp_seq_printf(m, "\n");
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ nvt_mp_seq_printf(m, "ReadData:\n");
+
+ for (i = 0; i < y_len; i++) {
+ for (j = 0; j < x_len; j++) {
+ iArrayIndex = i * x_len + j;
+ nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]);
+ }
+
+ nvt_mp_seq_printf(m, "\n");
+ }
+
+#if TOUCH_KEY_NUM > 0
+
+ for (k = 0; k < Key_Channel; k++) {
+ iArrayIndex = y_len * x_len + k;
+ nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]);
+ }
+
+ nvt_mp_seq_printf(m, "\n");
+#endif /* #if TOUCH_KEY_NUM > 0 */
+ break;
+ }
+
+ nvt_mp_seq_printf(m, "\n");
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen self-test sequence print show
+ function.
+
+return:
+ Executive outcomes. 0---succeed.
+*******************************************************/
+static int32_t c_show_selftest(struct seq_file *m, void *v)
+{
+ NVT_LOG("++\n");
+ nvt_mp_seq_printf(m, "FW Version: %d\n", ts->fw_ver);
+ nvt_mp_seq_printf(m, "Short Test");
+
+ if ((TestResult_Short == 0) || (TestResult_Short == 1)) {
+ print_selftest_result(m, TestResult_Short, RecordResult_Short, RawData_Short, X_Channel, Y_Channel);
+ } else { /* TestResult_Short is -EPERM */
+ if (ts->carrier_system) {
+ nvt_mp_seq_printf(m, " FAIL!\n");
+
+ if (TestResult_Short_Diff == -EPERM) {
+ nvt_mp_seq_printf(m, "Short Diff");
+ print_selftest_result(m, TestResult_Short_Diff, RecordResult_Short_Diff, RawData_Short_Diff, X_Channel, Y_Channel);
+ }
+
+ if (TestResult_Short_Base == -EPERM) {
+ nvt_mp_seq_printf(m, "Short Base");
+ print_selftest_result(m, TestResult_Short_Base, RecordResult_Short_Base, RawData_Short_Base, X_Channel, Y_Channel);
+ }
+ } else {
+ print_selftest_result(m, TestResult_Short, RecordResult_Short, RawData_Short, X_Channel, Y_Channel);
+ }
+ }
+
+ nvt_mp_seq_printf(m, "Open Test");
+ print_selftest_result(m, TestResult_Open, RecordResult_Open, RawData_Open, X_Channel, Y_Channel);
+ nvt_mp_seq_printf(m, "FW Rawdata Test");
+
+ if ((TestResult_FW_Rawdata == 0) || (TestResult_FW_Rawdata == 1)) {
+ print_selftest_result(m, TestResult_FWMutual, RecordResult_FWMutual, RawData_FWMutual, X_Channel, Y_Channel);
+ } else { /* TestResult_FW_Rawdata is -EPERM */
+ nvt_mp_seq_printf(m, " FAIL!\n");
+
+ if (TestResult_FWMutual == -EPERM) {
+ nvt_mp_seq_printf(m, "FW Mutual");
+ print_selftest_result(m, TestResult_FWMutual, RecordResult_FWMutual, RawData_FWMutual, X_Channel, Y_Channel);
+ }
+
+ if (TestResult_FW_CC == -EPERM) {
+ if (ts->carrier_system) {
+ if (TestResult_FW_CC_I == -EPERM) {
+ nvt_mp_seq_printf(m, "FW CC_I");
+ print_selftest_result(m, TestResult_FW_CC_I, RecordResult_FW_CC_I, RawData_FW_CC_I, X_Channel, Y_Channel);
+ }
+
+ if (TestResult_FW_CC_Q == -EPERM) {
+ nvt_mp_seq_printf(m, "FW CC_Q");
+ print_selftest_result(m, TestResult_FW_CC_Q, RecordResult_FW_CC_Q, RawData_FW_CC_Q, X_Channel, Y_Channel);
+ }
+ } else {
+ nvt_mp_seq_printf(m, "FW CC");
+ print_selftest_result(m, TestResult_FW_CC, RecordResult_FW_CC, RawData_FW_CC, X_Channel, Y_Channel);
+ }
+ }
+ }
+
+ nvt_mp_seq_printf(m, "Noise Test");
+
+ if ((TestResult_Noise == 0) || (TestResult_Noise == 1)) {
+ print_selftest_result(m, TestResult_FW_DiffMax, RecordResult_FW_DiffMax, RawData_Diff_Max, X_Channel, Y_Channel);
+ } else { /* TestResult_Noise is -EPERM */
+ nvt_mp_seq_printf(m, " FAIL!\n");
+
+ if (TestResult_FW_DiffMax == -EPERM) {
+ nvt_mp_seq_printf(m, "FW Diff Max");
+ print_selftest_result(m, TestResult_FW_DiffMax, RecordResult_FW_DiffMax, RawData_Diff_Max, X_Channel, Y_Channel);
+ }
+
+ if (TestResult_FW_DiffMin == -EPERM) {
+ nvt_mp_seq_printf(m, "FW Diff Min");
+ print_selftest_result(m, TestResult_FW_DiffMin, RecordResult_FW_DiffMin, RawData_Diff_Min, X_Channel, Y_Channel);
+ }
+ }
+
+ nvt_mp_test_result_printed = 1;
+ NVT_LOG("--\n");
+ return 0;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen self-test sequence print start
+ function.
+
+return:
+ Executive outcomes. 1---call next function.
+ NULL---not call next function and sequence loop
+ stop.
+*******************************************************/
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+ return *pos < 1 ? (void *)1 : NULL;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen self-test sequence print next
+ function.
+
+return:
+ Executive outcomes. NULL---no next and call sequence
+ stop function.
+*******************************************************/
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+ ++*pos;
+ return NULL;
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen self-test sequence print stop
+ function.
+
+return:
+ n.a.
+*******************************************************/
+static void c_stop(struct seq_file *m, void *v)
+{
+ return;
+}
+
+const struct seq_operations nvt_selftest_seq_ops = {
+ .start = c_start,
+ .next = c_next,
+ .stop = c_stop,
+ .show = c_show_selftest
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen /proc/nvt_selftest open function.
+
+return:
+ Executive outcomes. 0---succeed. negative---failed.
+*******************************************************/
+static int32_t nvt_selftest_open(struct inode *inode, struct file *file)
+{
+ struct device_node *np = ts->client->dev.of_node;
+ unsigned char mpcriteria[32] = {0}; /*novatek-mp-criteria-default*/
+ TestResult_Short = 0;
+ TestResult_Short_Diff = 0;
+ TestResult_Short_Base = 0;
+ TestResult_Open = 0;
+ TestResult_FW_Rawdata = 0;
+ TestResult_FWMutual = 0;
+ TestResult_FW_CC = 0;
+ TestResult_FW_CC_I = 0;
+ TestResult_FW_CC_Q = 0;
+ TestResult_Noise = 0;
+ TestResult_FW_DiffMax = 0;
+ TestResult_FW_DiffMin = 0;
+ NVT_LOG("++\n");
+
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("get fw info failed!\n");
+ return -EAGAIN;
+ }
+
+ /* Parsing criteria from dts */
+ if (of_property_read_bool(np, "novatek,mp-support-dt")) {
+ /*
+ * Parsing Criteria by Novatek PID
+ * The string rule is "novatek-mp-criteria-<nvt_pid>"
+ * nvt_pid is 2 bytes (show hex).
+ *
+ * Ex. nvt_pid = 500A
+ * mpcriteria = "novatek-mp-criteria-500A"
+ */
+ snprintf(mpcriteria, PAGE_SIZE, "novatek-mp-criteria-%04X", ts->nvt_pid);
+ nvt_mp_parse_dt(np, mpcriteria);
+ } else {
+ NVT_LOG("Not found novatek,mp-support-dt, use default setting\n");
+ /*---Print Test Criteria---*/
+ nvt_print_criteria();
+ }
+
+ if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("switch frequency hopping disable failed!\n");
+ return -EAGAIN;
+ }
+
+ if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw reset state failed!\n");
+ return -EAGAIN;
+ }
+
+ msleep(100);
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("clear fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(MP_MODE_CC);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ /*---FW Rawdata Test---*/
+ if (nvt_read_baseline(RawData_FWMutual) != 0) {
+ TestResult_FWMutual = 1;
+ } else {
+ TestResult_FWMutual = RawDataTest_SinglePoint_Sub(RawData_FWMutual, RecordResult_FWMutual, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_Rawdata_P, PS_Config_Lmt_FW_Rawdata_N);
+ }
+
+ if (nvt_read_CC(RawData_FW_CC) != 0) {
+ TestResult_FW_CC = 1;
+
+ if (ts->carrier_system) {
+ TestResult_FW_CC_I = 1;
+ TestResult_FW_CC_Q = 1;
+ }
+ } else {
+ if (ts->carrier_system) {
+ TestResult_FW_CC_I = RawDataTest_SinglePoint_Sub(RawData_FW_CC_I, RecordResult_FW_CC_I, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_CC_I_P, PS_Config_Lmt_FW_CC_I_N);
+ TestResult_FW_CC_Q = RawDataTest_SinglePoint_Sub(RawData_FW_CC_Q, RecordResult_FW_CC_Q, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_CC_Q_P, PS_Config_Lmt_FW_CC_Q_N);
+
+ if ((TestResult_FW_CC_I == -EPERM) || (TestResult_FW_CC_Q == -EPERM))
+ TestResult_FW_CC = -EPERM;
+ else
+ TestResult_FW_CC = 0;
+ } else {
+ TestResult_FW_CC = RawDataTest_SinglePoint_Sub(RawData_FW_CC, RecordResult_FW_CC, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_CC_P, PS_Config_Lmt_FW_CC_N);
+ }
+ }
+
+ if ((TestResult_FWMutual == 1) || (TestResult_FW_CC == 1)) {
+ TestResult_FW_Rawdata = 1;
+ } else {
+ if ((TestResult_FWMutual == -EPERM) || (TestResult_FW_CC == -EPERM))
+ TestResult_FW_Rawdata = -EPERM;
+ else
+ TestResult_FW_Rawdata = 0;
+ }
+
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+
+ /*---Noise Test---*/
+ if (nvt_read_fw_noise(RawData_Diff) != 0) {
+ TestResult_Noise = 1; /* 1: ERROR */
+ TestResult_FW_DiffMax = 1;
+ TestResult_FW_DiffMin = 1;
+ } else {
+ TestResult_FW_DiffMax = RawDataTest_SinglePoint_Sub(RawData_Diff_Max, RecordResult_FW_DiffMax, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N);
+
+ /* for carrier sensing system, only positive noise data */
+ if (ts->carrier_system) {
+ TestResult_FW_DiffMin = 0;
+ } else {
+ TestResult_FW_DiffMin = RawDataTest_SinglePoint_Sub(RawData_Diff_Min, RecordResult_FW_DiffMin, X_Channel, Y_Channel,
+ PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N);
+ }
+
+ if ((TestResult_FW_DiffMax == -EPERM) || (TestResult_FW_DiffMin == -EPERM))
+ TestResult_Noise = -EPERM;
+ else
+ TestResult_Noise = 0;
+ }
+
+ /*--Short Test---*/
+ if (nvt_read_fw_short(RawData_Short) != 0) {
+ TestResult_Short = 1; /* 1:ERROR */
+
+ if (ts->carrier_system) {
+ TestResult_Short_Diff = 1;
+ TestResult_Short_Base = 1;
+ }
+ } else {
+ /*---Self Test Check --- 0:PASS, -EPERM:FAIL*/
+ if (ts->carrier_system) {
+ TestResult_Short_Diff = RawDataTest_SinglePoint_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N);
+ TestResult_Short_Base = RawDataTest_SinglePoint_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N);
+
+ if ((TestResult_Short_Diff == -EPERM) || (TestResult_Short_Base == -EPERM))
+ TestResult_Short = -EPERM;
+ else
+ TestResult_Short = 0;
+ } else {
+ TestResult_Short = RawDataTest_SinglePoint_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N);
+ }
+ }
+
+ /*---Open Test---*/
+ if (nvt_read_fw_open(RawData_Open) != 0) {
+ TestResult_Open = 1; /* 1:ERROR */
+ } else {
+ /*---Self Test Check --- 0:PASS, -EPERM:FAIL */
+ TestResult_Open = RawDataTest_SinglePoint_Sub(RawData_Open, RecordResult_Open, X_Channel, Y_Channel,
+ PS_Config_Lmt_Open_Rawdata_P, PS_Config_Lmt_Open_Rawdata_N);
+ }
+
+ /*---Reset IC---*/
+ nvt_bootloader_reset();
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ nvt_mp_test_result_printed = 0;
+ return seq_open(file, &nvt_selftest_seq_ops);
+}
+
+static const struct file_operations nvt_selftest_fops = {
+ .owner = THIS_MODULE,
+ .open = nvt_selftest_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+#ifdef CONFIG_OF
+/*******************************************************
+Description:
+ Novatek touchscreen parse AIN setting for array type.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, int32_t size)
+{
+ struct property *data;
+ int32_t len, ret;
+ int32_t tmp[40];
+ int32_t i;
+ data = of_find_property(np, name, &len);
+ len /= sizeof(u32);
+
+ if ((!data) || (!len) || (len != size)) {
+ NVT_ERR("error find %s. len=%d\n", name, len);
+ } else {
+ NVT_LOG("%s. len=%d\n", name, len);
+ ret = of_property_read_u32_array(np, name, tmp, len);
+
+ if (ret) {
+ NVT_ERR("error reading %s. ret=%d\n", name, ret);
+ return;
+ }
+
+ for (i = 0; i < len; i++)
+ array[i] = tmp[i];
+
+#if NVT_DEBUG
+ printk("[NVT-ts] %s = ", name);
+
+ for (i = 0; i < len; i++) {
+ printk("%02d ", array[i]);
+ }
+
+ printk("\n");
+#endif
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen parse criterion for u32 type.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_mp_parse_u32(struct device_node *np, const char *name, int32_t *para)
+{
+ int32_t ret;
+ ret = of_property_read_u32(np, name, para);
+
+ if (ret)
+ NVT_ERR("error reading %s. ret=%d\n", name, ret);
+ else {
+#if NVT_DEBUG
+ NVT_LOG("%s=%d\n", name, *para);
+#endif
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen parse criterion for array type.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_mp_parse_array(struct device_node *np, const char *name, int32_t *array,
+ int32_t size)
+{
+ struct property *data;
+ int32_t len, ret;
+#if NVT_DEBUG
+ int32_t i, j, iArrayIndex = 0;
+#endif
+ data = of_find_property(np, name, &len);
+ len /= sizeof(u32);
+
+ if ((!data) || (!len) || (len < size)) {
+ NVT_ERR("error find %s. len=%d\n", name, len);
+ } else {
+ NVT_LOG("%s. len=%d\n", name, len);
+ ret = of_property_read_u32_array(np, name, array, len);
+
+ if (ret) {
+ NVT_ERR("error reading %s. ret=%d\n", name, ret);
+ return;
+ }
+
+#if NVT_DEBUG
+ NVT_LOG("%s =\n", name);
+
+ for (j = 0; j < Y_Channel; j++) {
+ printk("[NVT-ts] ");
+
+ for (i = 0; i < X_Channel; i++) {
+ iArrayIndex = j * X_Channel + i;
+ printk("%5d, ", array[iArrayIndex]);
+ }
+
+ printk("\n");
+ }
+
+#if TOUCH_KEY_NUM > 0
+ printk("[NVT-ts] ");
+
+ for (i = 0; i < Key_Channel; i++) {
+ iArrayIndex++;
+ printk("%5d, ", array[iArrayIndex]);
+ }
+
+ printk("\n");
+#endif
+#endif
+ }
+}
+
+/*******************************************************
+Description:
+ Novatek touchscreen parse device tree mp function.
+
+return:
+ n.a.
+*******************************************************/
+void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible)
+{
+ struct device_node *np = root;
+ struct device_node *child = NULL;
+ NVT_LOG("Parse mp criteria for node %s\n", node_compatible);
+ /* find each MP sub-nodes */
+ for_each_child_of_node(root, child) {
+ /* find the specified node */
+ if (of_device_is_compatible(child, node_compatible)) {
+ NVT_LOG("found child node %s\n", node_compatible);
+ np = child;
+ break;
+ }
+ }
+
+ if (child == NULL) {
+ NVT_ERR("Not found compatible node %s, use default setting!\n", node_compatible);
+ return;
+ }
+
+ /* MP Config*/
+ nvt_mp_parse_u32(np, "IC_X_CFG_SIZE", &IC_X_CFG_SIZE);
+ nvt_mp_parse_u32(np, "IC_Y_CFG_SIZE", &IC_Y_CFG_SIZE);
+#if TOUCH_KEY_NUM > 0
+ nvt_mp_parse_u32(np, "IC_KEY_CFG_SIZE", &IC_KEY_CFG_SIZE);
+#endif
+ nvt_mp_parse_u32(np, "X_Channel", &X_Channel);
+ nvt_mp_parse_u32(np, "Y_Channel", &Y_Channel);
+ nvt_mp_parse_ain(np, "AIN_X", AIN_X, IC_X_CFG_SIZE);
+ nvt_mp_parse_ain(np, "AIN_Y", AIN_Y, IC_Y_CFG_SIZE);
+#if TOUCH_KEY_NUM > 0
+ nvt_mp_parse_ain(np, "AIN_KEY", AIN_KEY, IC_KEY_CFG_SIZE);
+#endif
+
+ /* MP Criteria */
+ if (ts->carrier_system) {
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_P", PS_Config_Lmt_Short_Diff_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_N", PS_Config_Lmt_Short_Diff_N,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_P", PS_Config_Lmt_Short_Base_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_N", PS_Config_Lmt_Short_Base_N,
+ X_Channel * Y_Channel + Key_Channel);
+ } else {
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_P", PS_Config_Lmt_Short_Rawdata_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_N", PS_Config_Lmt_Short_Rawdata_N,
+ X_Channel * Y_Channel + Key_Channel);
+ }
+
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_P", PS_Config_Lmt_Open_Rawdata_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_N", PS_Config_Lmt_Open_Rawdata_N,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_P", PS_Config_Lmt_FW_Rawdata_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_N", PS_Config_Lmt_FW_Rawdata_N,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_P", PS_Config_Lmt_FW_CC_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_N", PS_Config_Lmt_FW_CC_N,
+ X_Channel * Y_Channel + Key_Channel);
+
+ if (ts->carrier_system) {
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_P", PS_Config_Lmt_FW_CC_I_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_N", PS_Config_Lmt_FW_CC_I_N,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_P", PS_Config_Lmt_FW_CC_Q_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_N", PS_Config_Lmt_FW_CC_Q_N,
+ X_Channel * Y_Channel + Key_Channel);
+ }
+
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_P", PS_Config_Lmt_FW_Diff_P,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_N", PS_Config_Lmt_FW_Diff_N,
+ X_Channel * Y_Channel + Key_Channel);
+ nvt_mp_parse_u32(np, "PS_Config_Diff_Test_Frame", &PS_Config_Diff_Test_Frame);
+ NVT_LOG("Parse mp criteria done!\n");
+}
+#endif /* #ifdef CONFIG_OF */
+
+#define NVT_RESULT_INVALID 0
+#define NVT_RESULT_PASS 2
+#define NVT_RESULT_FAIL 1
+
+static int nvt_short_test(void)
+{
+ TestResult_Short = 0;
+ NVT_LOG("++\n");
+
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("get fw info failed!\n");
+ return -EAGAIN;
+ }
+
+ if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("switch frequency hopping disable failed!\n");
+ return -EAGAIN;
+ }
+
+ if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw reset state failed!\n");
+ return -EAGAIN;
+ }
+
+ msleep(100);
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("clear fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(MP_MODE_CC);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+
+ /*--Short Test---*/
+ if (nvt_read_fw_short(RawData_Short) != 0) {
+ TestResult_Short = 1; /* 1:ERROR */
+
+ if (ts->carrier_system) {
+ TestResult_Short_Diff = 1;
+ TestResult_Short_Base = 1;
+ }
+ } else {
+ /*---Self Test Check --- 0:PASS, -EPERM:FAIL*/
+ if (ts->carrier_system) {
+ TestResult_Short_Diff = RawDataTest_SinglePoint_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N);
+ TestResult_Short_Base = RawDataTest_SinglePoint_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N);
+
+ if ((TestResult_Short_Diff == -EPERM) || (TestResult_Short_Base == -EPERM))
+ TestResult_Short = -EPERM;
+ else
+ TestResult_Short = 0;
+ } else {
+ TestResult_Short = RawDataTest_SinglePoint_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel,
+ PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N);
+ }
+ }
+
+ /*---Reset IC---*/
+ nvt_bootloader_reset();
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return TestResult_Short;
+}
+
+static int nvt_open_test(void)
+{
+ TestResult_Open = 0;
+ NVT_LOG("++\n");
+
+ if (mutex_lock_interruptible(&ts->lock)) {
+ return -ERESTARTSYS;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_get_fw_info()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("get fw info failed!\n");
+ return -EAGAIN;
+ }
+
+ if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("switch frequency hopping disable failed!\n");
+ return -EAGAIN;
+ }
+
+ if (nvt_check_fw_reset_state(RESET_STATE_NORMAL_RUN)) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw reset state failed!\n");
+ return -EAGAIN;
+ }
+
+ msleep(100);
+
+ /*---Enter Test Mode---*/
+ if (nvt_clear_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("clear fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ nvt_change_mode(MP_MODE_CC);
+
+ if (nvt_check_fw_status()) {
+ mutex_unlock(&ts->lock);
+ NVT_ERR("check fw status failed!\n");
+ return -EAGAIN;
+ }
+
+ /*---Leave Test Mode---*/
+ nvt_change_mode(NORMAL_MODE);
+
+ /*---Open Test---*/
+ if (nvt_read_fw_open(RawData_Open) != 0) {
+ TestResult_Open = 1; /* 1:ERROR */
+ } else {
+ /*---Self Test Check --- 0:PASS, -EPERM:FAIL */
+ TestResult_Open = RawDataTest_SinglePoint_Sub(RawData_Open, RecordResult_Open, X_Channel, Y_Channel,
+ PS_Config_Lmt_Open_Rawdata_P, PS_Config_Lmt_Open_Rawdata_N);
+ }
+
+ /*---Reset IC---*/
+ nvt_bootloader_reset();
+ mutex_unlock(&ts->lock);
+ NVT_LOG("--\n");
+ return TestResult_Open;
+}
+
+static ssize_t nvt_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ char tmp[5] = {0};
+ int cnt;
+
+ if (*pos != 0)
+ return 0;
+
+ cnt = snprintf(tmp, sizeof(ts->result_type), "%d\n", ts->result_type);
+
+ if (copy_to_user(buf, tmp, strlen(tmp))) {
+ return -EFAULT;
+ }
+
+ *pos += cnt;
+ return cnt;
+}
+
+static ssize_t nvt_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
+{
+ int retval = 0;
+ char tmp[6];
+
+ if (copy_from_user(tmp, buf, count)) {
+ retval = -EFAULT;
+ goto out;
+ }
+
+ if (!strncmp("short", tmp, 5)) {
+ retval = nvt_short_test();
+ } else if (!strncmp("open", tmp, 4)) {
+ retval = nvt_open_test();
+ } else if (!strncmp("i2c", tmp, 3))
+ retval = nvt_get_fw_info();
+
+ if (retval < 0)
+ ts->result_type = NVT_RESULT_INVALID;
+ else if (retval == 0)
+ ts->result_type = NVT_RESULT_PASS;
+ else
+ ts->result_type = NVT_RESULT_FAIL;
+
+out:
+
+ if (retval >= 0)
+ retval = count;
+
+ return retval;
+}
+
+static const struct file_operations nvt_selftest_ops = {
+ .read = nvt_selftest_read,
+ .write = nvt_selftest_write,
+};
+
+/*******************************************************
+Description:
+ Novatek touchscreen MP function proc. file node
+ initial function.
+
+return:
+ Executive outcomes. 0---succeed. -EPERM---failed.
+*******************************************************/
+int32_t nvt_mp_proc_init(void)
+{
+ NVT_proc_selftest_entry = proc_create("nvt_selftest", 0444, NULL, &nvt_selftest_fops);
+
+ if (NVT_proc_selftest_entry == NULL) {
+ NVT_ERR("create /proc/nvt_selftest Failed!\n");
+ return -EPERM;
+ } else {
+ if (nvt_mp_buffer_init()) {
+ NVT_ERR("Allocate mp memory failed\n");
+ return -EPERM;
+ } else {
+ NVT_LOG("create /proc/nvt_selftest Succeeded!\n");
+ }
+ }
+
+ ts->tp_selftest_proc = proc_create("tp_selftest", 0644, NULL, &nvt_selftest_ops);
+ return 0;
+}
+
+#endif /* #if NVT_TOUCH_MP */
diff --git a/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h
new file mode 100644
index 000000000000..bc1fdba9952c
--- /dev/null
+++ b/drivers/input/touchscreen/nvt_touch_d2t/nt36xxx_mp_ctrlram.h
@@ -0,0 +1,1154 @@
+/*
+ * Copyright (C) 2010 - 2017 Novatek, Inc.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * $Revision: 28670 $
+ * $Date: 2018-05-25 15:59:17 +0800 (週五, 25 五月 2018) $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#if NVT_TOUCH_MP
+
+static uint32_t IC_X_CFG_SIZE = 18;
+static uint32_t IC_Y_CFG_SIZE = 36;
+static uint32_t IC_KEY_CFG_SIZE = 4;
+static uint32_t X_Channel = 18;
+static uint32_t Y_Channel = 36;
+static uint32_t Key_Channel = TOUCH_KEY_NUM;
+
+static uint8_t AIN_X[40] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
+};
+
+static uint8_t AIN_Y[40] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
+};
+
+#if TOUCH_KEY_NUM > 0
+static uint8_t AIN_KEY[8] = {
+ 0, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+#endif /* #if TOUCH_KEY_NUM > 0 */
+
+static int32_t PS_Config_Lmt_Short_Rawdata_P[40 * 40] = {
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+ 14000, 14000, 14000, 14000, 14000, 14000, 14000,
+#if TOUCH_KEY_NUM > 0
+ 20000, 20000, 20000,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Short_Rawdata_N[40 * 40] = {
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+ 11000, 11000, 11000, 11000, 11000, 11000, 11000,
+#if TOUCH_KEY_NUM > 0
+ 11550, 11550, 11550,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Short_Diff_P[40 * 40] = {
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300,
+ 6300, 6300, 6300, 6300, 6300, 6300,
+#if TOUCH_KEY_NUM > 0
+ 6300, 6300, 6300,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Short_Diff_N[40 * 40] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#if TOUCH_KEY_NUM > 0
+ 0, 0, 0,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Short_Base_P[40 * 40] = {
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000,
+#if TOUCH_KEY_NUM > 0
+ 2000, 2000, 2000,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Short_Base_N[40 * 40] = {
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+ -2000, -2000, -2000, -2000, -2000, -2000, -2000,
+#if TOUCH_KEY_NUM > 0
+ -2000, -2000, -2000,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Open_Rawdata_P[40 * 40] = {
+ 2857, 3296, 3307, 3308, 3294, 3532, 5120, 5120, 5120, 5120, 5120, 5120,
+ 3262, 3071, 3081, 3095, 3102, 2936,
+ 3030, 3023, 3011, 3018, 3017, 3008, 2978, 2566, 2531, 2552, 2585, 3008,
+ 3347, 3352, 3349, 3321, 3311, 3299,
+ 2948, 2935, 2924, 2929, 2927, 2923, 2923, 2906, 2892, 2936, 2942, 2965,
+ 2965, 2968, 2977, 2993, 2999, 3022,
+ 2954, 2940, 2931, 2934, 2933, 2928, 2928, 2908, 2897, 2934, 2941, 2960,
+ 2965, 2965, 2978, 2990, 2997, 3016,
+ 2969, 2958, 2950, 2954, 2948, 2943, 2943, 2925, 2912, 2950, 2957, 2975,
+ 2982, 2981, 2996, 3006, 3013, 3027,
+ 2958, 2946, 2940, 2942, 2936, 2931, 2930, 2909, 2901, 2933, 2940, 2957,
+ 2966, 2964, 2980, 2989, 2998, 3007,
+ 2959, 2947, 2940, 2940, 2936, 2932, 2930, 2908, 2904, 2944, 2949, 2965,
+ 2976, 2976, 2988, 2997, 3005, 3017,
+ 2964, 2951, 2946, 2945, 2942, 2936, 2933, 2911, 2908, 2949, 2955, 2970,
+ 2981, 2983, 2993, 3001, 3011, 3021,
+ 2961, 2950, 2944, 2943, 2940, 2935, 2932, 2908, 2906, 2951, 2957, 2971,
+ 2985, 2986, 2995, 3004, 3011, 3020,
+ 2960, 2950, 2945, 2942, 2939, 2934, 2930, 2910, 2905, 2935, 2940, 2947,
+ 2955, 2965, 2974, 2981, 2990, 2996,
+ 2969, 2962, 2960, 2954, 2951, 2947, 2942, 2921, 2916, 2953, 2957, 2966,
+ 2974, 2983, 2994, 3000, 3007, 3013,
+ 2982, 2977, 2975, 2970, 2967, 2963, 2955, 2935, 2932, 2944, 2946, 2955,
+ 2964, 2972, 2982, 2988, 2995, 2999,
+ 2944, 2941, 2938, 2933, 2931, 2926, 2918, 2898, 2896, 2953, 2950, 2961,
+ 2972, 2981, 2988, 2994, 3001, 3005,
+ 2975, 2971, 2969, 2963, 2961, 2956, 2947, 2933, 2928, 2962, 2959, 2970,
+ 2982, 2990, 2996, 3001, 3008, 3010,
+ 2963, 2956, 2959, 2953, 2950, 2945, 2938, 2927, 2919, 2971, 2968, 2980,
+ 2989, 2997, 3004, 3010, 3013, 3016,
+ 2958, 2952, 2955, 2948, 2946, 2940, 2936, 2923, 2916, 2971, 2967, 2980,
+ 2989, 2997, 3003, 3009, 3010, 3014,
+ 2939, 2933, 2936, 2928, 2927, 2921, 2917, 2911, 2895, 2931, 2928, 2942,
+ 2951, 2958, 2965, 2970, 2970, 2970,
+ 2949, 2946, 2949, 2943, 2939, 2933, 2930, 2922, 2910, 2961, 2957, 2972,
+ 2980, 2989, 2993, 2999, 2999, 3000,
+ 2932, 2929, 2929, 2922, 2921, 2915, 2910, 2903, 2894, 2932, 2926, 2941,
+ 2952, 2959, 2962, 2968, 2968, 2969,
+ 2924, 2919, 2921, 2915, 2911, 2906, 2904, 2895, 2889, 2937, 2935, 2948,
+ 2957, 2963, 2965, 2971, 2971, 2976,
+ 2935, 2930, 2932, 2924, 2922, 2917, 2913, 2904, 2904, 2927, 2923, 2941,
+ 2943, 2950, 2954, 2960, 2957, 2965,
+ 2912, 2907, 2908, 2901, 2897, 2893, 2891, 2880, 2878, 2918, 2914, 2933,
+ 2934, 2941, 2942, 2950, 2946, 2955,
+ 2903, 2896, 2897, 2889, 2886, 2881, 2880, 2872, 2869, 2914, 2909, 2927,
+ 2929, 2935, 2936, 2943, 2943, 2950,
+ 2653, 2648, 2652, 2647, 2640, 2633, 2636, 2631, 2626, 2659, 2654, 2666,
+ 2671, 2680, 2683, 2689, 2684, 2693,
+ 2663, 2658, 2663, 2659, 2653, 2647, 2651, 2645, 2639, 2644, 2640, 2655,
+ 2658, 2666, 2670, 2672, 2668, 2676,
+ 2645, 2639, 2644, 2640, 2635, 2628, 2633, 2627, 2622, 2653, 2652, 2668,
+ 2670, 2678, 2679, 2683, 2680, 2689,
+ 2656, 2650, 2652, 2647, 2642, 2637, 2642, 2638, 2632, 2635, 2635, 2652,
+ 2653, 2660, 2664, 2666, 2666, 2673,
+ 2641, 2633, 2635, 2630, 2626, 2623, 2627, 2622, 2616, 2637, 2637, 2655,
+ 2654, 2661, 2665, 2668, 2668, 2677,
+ 2625, 2618, 2619, 2614, 2609, 2607, 2612, 2605, 2599, 2624, 2624, 2642,
+ 2641, 2649, 2652, 2656, 2656, 2664,
+ 2628, 2618, 2620, 2615, 2610, 2608, 2613, 2606, 2600, 2618, 2618, 2637,
+ 2636, 2643, 2646, 2649, 2651, 2660,
+ 2624, 2615, 2614, 2609, 2606, 2603, 2607, 2600, 2595, 2592, 2593, 2611,
+ 2610, 2616, 2619, 2623, 2625, 2635,
+ 2598, 2588, 2587, 2582, 2579, 2575, 2581, 2573, 2569, 2598, 2599, 2616,
+ 2615, 2623, 2625, 2630, 2632, 2642,
+ 2583, 2573, 2572, 2568, 2564, 2560, 2568, 2560, 2554, 2578, 2581, 2596,
+ 2596, 2602, 2604, 2609, 2612, 2622,
+ 2555, 2544, 2544, 2541, 2538, 2534, 2543, 2533, 2528, 2576, 2577, 2592,
+ 2593, 2602, 2602, 2606, 2610, 2620,
+ 2652, 2654, 2654, 2653, 2651, 2645, 2657, 2643, 2637, 2652, 2654, 2669,
+ 2672, 2681, 2681, 2683, 2687, 2698,
+ 2436, 2635, 2630, 2630, 2631, 2621, 2624, 2615, 2610, 2656, 2665, 2686,
+ 2664, 2674, 2670, 2674, 2678, 2260,
+#if TOUCH_KEY_NUM > 0
+ 13000, 13000, 13000,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_Open_Rawdata_N[40 * 40] = {
+ 1642, 1894, 1901, 1901, 1893, 2030, 50, 50, 50, 50, 50, 50, 1875, 1765,
+ 1771, 1779, 1783, 1688,
+ 1741, 1738, 1731, 1735, 1734, 1729, 1712, 1475, 1455, 1467, 1486, 1729,
+ 1924, 1927, 1925, 1909, 1903, 1896,
+ 1694, 1687, 1681, 1683, 1682, 1680, 1680, 1670, 1662, 1688, 1691, 1704,
+ 1704, 1706, 1711, 1720, 1724, 1737,
+ 1698, 1690, 1685, 1686, 1686, 1683, 1683, 1672, 1665, 1686, 1691, 1701,
+ 1704, 1704, 1712, 1718, 1723, 1733,
+ 1707, 1700, 1696, 1698, 1694, 1692, 1692, 1681, 1674, 1696, 1699, 1710,
+ 1714, 1713, 1722, 1728, 1732, 1740,
+ 1700, 1693, 1690, 1691, 1688, 1685, 1684, 1672, 1667, 1686, 1690, 1700,
+ 1705, 1704, 1713, 1718, 1723, 1729,
+ 1701, 1694, 1690, 1690, 1688, 1685, 1684, 1672, 1669, 1692, 1695, 1704,
+ 1710, 1710, 1717, 1723, 1727, 1734,
+ 1704, 1696, 1693, 1693, 1691, 1688, 1686, 1673, 1672, 1695, 1699, 1707,
+ 1714, 1715, 1720, 1725, 1731, 1737,
+ 1702, 1696, 1692, 1691, 1690, 1687, 1685, 1671, 1670, 1696, 1699, 1708,
+ 1716, 1716, 1722, 1727, 1731, 1736,
+ 1701, 1696, 1693, 1691, 1689, 1687, 1684, 1673, 1670, 1687, 1690, 1694,
+ 1699, 1704, 1709, 1713, 1718, 1722,
+ 1707, 1703, 1702, 1698, 1696, 1694, 1691, 1679, 1676, 1697, 1699, 1705,
+ 1710, 1715, 1721, 1724, 1729, 1732,
+ 1714, 1711, 1710, 1707, 1705, 1703, 1699, 1687, 1685, 1692, 1693, 1699,
+ 1704, 1709, 1714, 1717, 1722, 1724,
+ 1692, 1690, 1689, 1686, 1685, 1682, 1677, 1666, 1664, 1697, 1696, 1702,
+ 1708, 1714, 1717, 1721, 1725, 1727,
+ 1710, 1708, 1706, 1703, 1702, 1699, 1694, 1686, 1683, 1703, 1701, 1707,
+ 1714, 1718, 1722, 1725, 1729, 1730,
+ 1703, 1699, 1701, 1697, 1696, 1693, 1689, 1682, 1678, 1708, 1706, 1713,
+ 1718, 1723, 1727, 1730, 1732, 1734,
+ 1700, 1697, 1698, 1695, 1693, 1690, 1688, 1680, 1676, 1708, 1706, 1713,
+ 1718, 1723, 1726, 1729, 1730, 1732,
+ 1689, 1686, 1688, 1683, 1682, 1679, 1677, 1673, 1664, 1685, 1683, 1691,
+ 1696, 1700, 1704, 1707, 1707, 1707,
+ 1695, 1694, 1695, 1691, 1689, 1686, 1684, 1679, 1673, 1702, 1700, 1708,
+ 1713, 1718, 1720, 1724, 1724, 1724,
+ 1685, 1683, 1684, 1680, 1679, 1676, 1673, 1668, 1664, 1685, 1682, 1691,
+ 1697, 1701, 1703, 1706, 1706, 1706,
+ 1680, 1678, 1679, 1676, 1673, 1670, 1669, 1664, 1661, 1688, 1687, 1695,
+ 1700, 1703, 1704, 1708, 1708, 1711,
+ 1687, 1684, 1686, 1681, 1680, 1676, 1675, 1669, 1669, 1682, 1680, 1690,
+ 1691, 1696, 1698, 1702, 1700, 1704,
+ 1674, 1671, 1672, 1668, 1665, 1663, 1662, 1656, 1655, 1677, 1675, 1686,
+ 1686, 1690, 1691, 1695, 1694, 1699,
+ 1669, 1665, 1665, 1661, 1659, 1656, 1656, 1651, 1649, 1675, 1672, 1683,
+ 1684, 1687, 1688, 1692, 1692, 1696,
+ 1525, 1522, 1525, 1521, 1517, 1514, 1515, 1512, 1510, 1528, 1525, 1533,
+ 1535, 1540, 1542, 1546, 1543, 1548,
+ 1531, 1528, 1531, 1529, 1525, 1521, 1524, 1520, 1517, 1520, 1518, 1526,
+ 1528, 1532, 1535, 1536, 1533, 1538,
+ 1521, 1517, 1520, 1517, 1514, 1510, 1514, 1510, 1507, 1525, 1524, 1533,
+ 1534, 1539, 1540, 1542, 1540, 1546,
+ 1527, 1523, 1524, 1522, 1519, 1516, 1519, 1516, 1513, 1515, 1515, 1525,
+ 1525, 1529, 1531, 1532, 1532, 1536,
+ 1518, 1514, 1515, 1512, 1509, 1508, 1510, 1507, 1504, 1515, 1516, 1526,
+ 1526, 1530, 1532, 1533, 1534, 1539,
+ 1509, 1505, 1505, 1503, 1500, 1498, 1501, 1497, 1494, 1508, 1508, 1519,
+ 1518, 1522, 1525, 1527, 1527, 1531,
+ 1510, 1505, 1506, 1503, 1500, 1499, 1502, 1498, 1495, 1505, 1505, 1516,
+ 1515, 1519, 1521, 1523, 1524, 1529,
+ 1509, 1503, 1502, 1500, 1498, 1496, 1498, 1495, 1492, 1490, 1490, 1501,
+ 1500, 1504, 1505, 1508, 1509, 1514,
+ 1494, 1488, 1487, 1484, 1482, 1480, 1484, 1479, 1477, 1493, 1494, 1504,
+ 1503, 1508, 1509, 1512, 1513, 1519,
+ 1485, 1479, 1478, 1476, 1474, 1472, 1476, 1472, 1468, 1482, 1483, 1492,
+ 1492, 1496, 1497, 1499, 1502, 1507,
+ 1469, 1462, 1462, 1460, 1459, 1456, 1462, 1456, 1453, 1481, 1481, 1490,
+ 1490, 1496, 1496, 1498, 1500, 1506,
+ 1524, 1526, 1526, 1525, 1524, 1520, 1527, 1519, 1516, 1524, 1526, 1534,
+ 1536, 1541, 1541, 1542, 1545, 1551,
+ 1400, 1515, 1512, 1512, 1512, 1507, 1508, 1503, 1501, 1527, 1532, 1544,
+ 1531, 1537, 1535, 1537, 1539, 1299,
+#if TOUCH_KEY_NUM > 0
+ 6500, 6500, 6500,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_Rawdata_P[40 * 40] = {
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750,
+#if TOUCH_KEY_NUM > 0
+ 2000, 2000, 2000,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_Rawdata_N[40 * 40] = {
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650,
+#if TOUCH_KEY_NUM > 0
+ 400, 400, 400,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_P[40 * 40] = {
+ 116, 113, 112, 112, 112, 114, 512, 512, 512, 512, 512, 512, 112, 110, 111,
+ 110, 112, 113,
+ 121, 113, 112, 111, 111, 111, 110, 110, 109, 111, 116, 116, 111, 112, 112,
+ 113, 115, 124,
+ 119, 112, 111, 110, 109, 109, 108, 108, 107, 108, 112, 112, 110, 110, 110,
+ 110, 111, 114,
+ 119, 113, 111, 110, 110, 110, 109, 109, 108, 110, 114, 113, 112, 112, 112,
+ 112, 113, 116,
+ 118, 112, 111, 110, 110, 109, 108, 108, 108, 108, 112, 111, 111, 110, 111,
+ 111, 111, 115,
+ 119, 112, 111, 111, 110, 110, 109, 108, 108, 109, 113, 112, 111, 111, 111,
+ 112, 113, 116,
+ 117, 111, 109, 109, 108, 108, 107, 106, 106, 108, 111, 111, 111, 110, 111,
+ 111, 111, 114,
+ 119, 113, 112, 111, 111, 110, 110, 109, 109, 109, 112, 111, 111, 111, 111,
+ 111, 111, 115,
+ 117, 112, 110, 110, 109, 109, 109, 107, 107, 110, 114, 113, 113, 112, 113,
+ 113, 113, 116,
+ 120, 114, 113, 113, 112, 112, 112, 111, 110, 113, 114, 113, 113, 112, 113,
+ 113, 113, 117,
+ 117, 111, 110, 110, 110, 109, 109, 108, 108, 115, 112, 112, 111, 111, 111,
+ 112, 112, 115,
+ 117, 112, 111, 111, 110, 110, 109, 109, 109, 115, 111, 111, 111, 110, 111,
+ 111, 111, 115,
+ 117, 112, 111, 111, 110, 110, 110, 109, 108, 117, 110, 112, 111, 110, 112,
+ 112, 112, 115,
+ 119, 114, 113, 113, 112, 112, 112, 112, 110, 121, 114, 114, 114, 114, 115,
+ 115, 115, 119,
+ 116, 111, 111, 110, 110, 110, 109, 111, 108, 117, 111, 111, 111, 111, 111,
+ 112, 112, 116,
+ 116, 112, 112, 111, 110, 110, 111, 112, 109, 119, 112, 112, 112, 112, 113,
+ 113, 113, 117,
+ 118, 113, 113, 113, 112, 112, 112, 113, 110, 117, 111, 111, 111, 111, 112,
+ 112, 112, 116,
+ 119, 114, 114, 114, 113, 112, 113, 113, 111, 119, 114, 113, 113, 113, 114,
+ 114, 114, 119,
+ 115, 111, 110, 110, 110, 110, 109, 110, 107, 115, 110, 110, 110, 110, 111,
+ 111, 111, 115,
+ 115, 111, 111, 111, 110, 110, 110, 110, 110, 117, 113, 112, 112, 111, 112,
+ 112, 113, 117,
+ 116, 112, 111, 111, 111, 111, 111, 110, 109, 117, 113, 111, 111, 111, 113,
+ 113, 113, 117,
+ 117, 114, 113, 113, 112, 113, 112, 112, 111, 118, 113, 113, 113, 113, 114,
+ 114, 115, 120,
+ 115, 112, 111, 111, 110, 111, 110, 110, 108, 117, 113, 112, 112, 112, 113,
+ 113, 113, 118,
+ 115, 112, 111, 111, 110, 111, 111, 111, 109, 116, 111, 111, 111, 112, 112,
+ 112, 113, 118,
+ 116, 113, 112, 112, 111, 112, 112, 112, 110, 115, 111, 112, 112, 112, 113,
+ 113, 113, 119,
+ 117, 114, 114, 113, 113, 113, 113, 114, 111, 115, 112, 113, 113, 114, 114,
+ 115, 115, 121,
+ 115, 112, 112, 111, 111, 112, 112, 112, 109, 112, 109, 111, 111, 111, 112,
+ 112, 113, 118,
+ 116, 113, 113, 112, 112, 112, 112, 115, 110, 113, 111, 112, 112, 113, 113,
+ 114, 115, 120,
+ 115, 113, 112, 112, 111, 112, 112, 113, 109, 112, 111, 112, 112, 112, 114,
+ 114, 115, 121,
+ 117, 114, 114, 114, 114, 114, 114, 115, 112, 113, 112, 113, 114, 114, 115,
+ 115, 117, 123,
+ 116, 113, 112, 112, 112, 112, 112, 113, 109, 110, 109, 110, 111, 112, 112,
+ 113, 114, 120,
+ 116, 113, 113, 113, 112, 113, 113, 113, 110, 112, 110, 111, 112, 113, 114,
+ 114, 116, 122,
+ 115, 113, 112, 112, 112, 112, 113, 113, 110, 111, 111, 112, 112, 113, 114,
+ 114, 116, 122,
+ 117, 114, 114, 114, 115, 114, 116, 115, 112, 114, 114, 114, 115, 116, 116,
+ 117, 118, 125,
+ 118, 112, 112, 112, 112, 112, 115, 113, 110, 111, 110, 110, 112, 113, 113,
+ 115, 115, 122,
+ 113, 112, 109, 108, 109, 108, 107, 108, 106, 108, 113, 114, 114, 114, 115,
+ 115, 115, 116,
+#if TOUCH_KEY_NUM > 0
+ 38, 38, 38,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_N[40 * 40] = {
+ 71, 69, 69, 69, 68, 70, 10, 10, 10, 10, 10, 10, 69, 68, 68, 68, 68, 69,
+ 74, 70, 68, 68, 68, 68, 67, 67, 67, 68, 71, 71, 68, 69, 69, 69, 71, 76,
+ 73, 69, 68, 67, 67, 67, 66, 66, 66, 66, 69, 69, 67, 67, 68, 68, 68, 70,
+ 73, 69, 68, 68, 68, 68, 67, 67, 66, 67, 70, 69, 68, 68, 69, 69, 69, 71,
+ 72, 69, 68, 68, 67, 67, 66, 66, 66, 66, 69, 68, 68, 68, 68, 68, 68, 70,
+ 73, 69, 68, 68, 67, 67, 67, 66, 66, 67, 69, 69, 68, 68, 68, 69, 69, 71,
+ 71, 68, 67, 67, 66, 66, 66, 65, 65, 66, 68, 68, 68, 68, 68, 68, 68, 70,
+ 73, 69, 68, 68, 68, 67, 67, 67, 67, 67, 69, 68, 68, 68, 68, 68, 68, 70,
+ 72, 68, 67, 67, 67, 67, 67, 66, 66, 68, 70, 69, 69, 69, 69, 69, 69, 71,
+ 73, 70, 69, 69, 69, 68, 68, 68, 68, 70, 70, 69, 69, 69, 69, 69, 70, 72,
+ 72, 68, 68, 68, 67, 67, 67, 66, 66, 70, 69, 68, 68, 68, 68, 69, 69, 71,
+ 72, 69, 68, 68, 68, 67, 67, 67, 67, 71, 68, 68, 68, 68, 68, 68, 68, 71,
+ 72, 69, 68, 68, 68, 67, 67, 67, 66, 71, 68, 68, 68, 68, 68, 69, 69, 71,
+ 73, 70, 69, 69, 69, 69, 69, 69, 68, 74, 70, 70, 70, 70, 70, 70, 71, 73,
+ 71, 68, 68, 68, 67, 67, 67, 68, 66, 72, 68, 68, 68, 68, 68, 69, 69, 71,
+ 71, 69, 68, 68, 68, 68, 68, 68, 67, 73, 69, 69, 69, 69, 69, 69, 69, 72,
+ 72, 69, 69, 69, 69, 69, 69, 69, 68, 72, 68, 68, 68, 68, 68, 69, 69, 71,
+ 73, 70, 70, 70, 69, 69, 69, 69, 68, 73, 70, 69, 69, 69, 70, 70, 70, 73,
+ 70, 68, 68, 67, 67, 67, 67, 67, 66, 71, 68, 67, 67, 67, 68, 68, 68, 71,
+ 71, 68, 68, 68, 68, 68, 67, 68, 67, 72, 69, 68, 68, 68, 69, 69, 69, 72,
+ 71, 69, 68, 68, 68, 68, 68, 68, 67, 72, 69, 68, 68, 68, 69, 69, 69, 72,
+ 72, 70, 69, 69, 69, 69, 69, 69, 68, 72, 70, 69, 69, 69, 70, 70, 70, 73,
+ 70, 68, 68, 68, 67, 68, 67, 67, 66, 72, 69, 69, 69, 69, 69, 69, 69, 72,
+ 71, 68, 68, 68, 68, 68, 68, 68, 67, 71, 68, 68, 68, 69, 69, 69, 69, 72,
+ 71, 69, 69, 69, 68, 69, 69, 69, 67, 71, 68, 68, 68, 69, 69, 69, 70, 73,
+ 72, 70, 70, 69, 69, 69, 69, 70, 68, 71, 69, 69, 69, 70, 70, 70, 70, 74,
+ 70, 69, 68, 68, 68, 68, 68, 69, 67, 69, 67, 68, 68, 68, 69, 69, 69, 72,
+ 71, 69, 69, 69, 69, 69, 69, 70, 68, 69, 68, 69, 69, 69, 69, 70, 70, 74,
+ 71, 69, 68, 68, 68, 68, 69, 69, 67, 69, 68, 69, 69, 69, 70, 70, 70, 74,
+ 72, 70, 70, 70, 70, 70, 70, 70, 68, 69, 69, 69, 70, 70, 70, 71, 72, 75,
+ 71, 69, 69, 69, 69, 69, 69, 69, 67, 67, 67, 67, 68, 68, 69, 69, 70, 74,
+ 71, 69, 69, 69, 69, 69, 69, 69, 68, 69, 68, 68, 69, 69, 70, 70, 71, 75,
+ 71, 69, 69, 69, 69, 69, 69, 69, 67, 68, 68, 69, 69, 69, 70, 70, 71, 75,
+ 72, 70, 70, 70, 70, 70, 71, 71, 69, 70, 70, 70, 70, 71, 71, 72, 72, 76,
+ 73, 69, 69, 69, 69, 69, 71, 69, 67, 68, 68, 68, 69, 69, 69, 70, 71, 75,
+ 69, 68, 67, 66, 67, 66, 66, 66, 65, 66, 69, 70, 70, 70, 70, 70, 71, 71,
+#if TOUCH_KEY_NUM > 0
+ 9, 9, 9,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_I_P[40 * 40] = {
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+#if TOUCH_KEY_NUM > 0
+ 25, 25, 25,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_I_N[40 * 40] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#if TOUCH_KEY_NUM > 0
+ 0, 0, 0,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_Q_P[40 * 40] = {
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+#if TOUCH_KEY_NUM > 0
+ 25, 25, 25,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_CC_Q_N[40 * 40] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#if TOUCH_KEY_NUM > 0
+ 0, 0, 0,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_Diff_P[40 * 40] = {
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+#if TOUCH_KEY_NUM > 0
+ 35, 35, 35,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_Diff_N[40 * 40] = {
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50,
+#if TOUCH_KEY_NUM > 0
+ -35, -35, -35,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Diff_Test_Frame = 50;
+
+#endif /* #if NVT_TOUCH_MP */
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig b/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig
new file mode 100644
index 000000000000..4fdc8da19f93
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/Kconfig
@@ -0,0 +1,113 @@
+#
+# Synaptics TCM touchscreen driver configuration
+#
+menuconfig TOUCHSCREEN_SYNAPTICS_TCM
+ bool "Synaptics TCM touchscreen"
+ default y
+ help
+ Say Y here if you have a Synaptics TCM touchscreen connected
+ to your system.
+
+ If unsure, say N.
+
+if TOUCHSCREEN_SYNAPTICS_TCM
+
+choice
+ default TOUCHSCREEN_SYNAPTICS_TCM_I2C
+ prompt "Synaptics TCM bus module"
+config TOUCHSCREEN_SYNAPTICS_TCM_I2C
+ bool "I2C"
+ depends on I2C
+config TOUCHSCREEN_SYNAPTICS_TCM_SPI
+ bool "SPI"
+ depends on SPI_MASTER
+endchoice
+
+config TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ tristate "Synaptics TCM core module"
+ depends on I2C || SPI_MASTER
+ help
+ Say Y here to enable core functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_core.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_TOUCH
+ tristate "Synaptics TCM touch module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for touch reporting.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_touch.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_DEVICE
+ tristate "Synaptics TCM device module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for TCM device functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_device.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_TESTING
+ tristate "Synaptics TCM testing module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for testing functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_testing.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_REFLASH
+ tristate "Synaptics TCM reflash module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for reflash functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_reflash.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY
+ tristate "Synaptics TCM recovery module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for recovery functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_recovery.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_ZEROFLASH
+ tristate "Synaptics TCM zeroflash module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for ZeroFlash functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_zeroflash.
+
+config TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS
+ tristate "Synaptics TCM diagnostics module"
+ depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
+ help
+ Say Y here to enable support for diagnostics functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_tcm_diagnostics.
+endif
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile b/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile
new file mode 100644
index 000000000000..de2953771690
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/Makefile
@@ -0,0 +1,17 @@
+#
+# Makefile for the Synaptics TCM touchscreen driver.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_SPI) += synaptics_tcm_spi.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_I2C) += synaptics_tcm_i2c.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_CORE) += synaptics_tcm_core.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_TOUCH) += synaptics_tcm_touch.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DEVICE) += synaptics_tcm_device.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_TESTING) += synaptics_tcm_testing.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_REFLASH) += synaptics_tcm_reflash.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY) += synaptics_tcm_recovery.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_ZEROFLASH) += synaptics_tcm_zeroflash.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS) += synaptics_tcm_diagnostics.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS) += synaptics_tcm_interface.o
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c
new file mode 100644
index 000000000000..23cbb59938ff
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.c
@@ -0,0 +1,3878 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/gpio.h>
+#include <linux/kthread.h>
+#include <linux/interrupt.h>
+#include <linux/regulator/consumer.h>
+#include <linux/pinctrl/consumer.h>
+#include "synaptics_tcm_core.h"
+#include <linux/uaccess.h>
+#include <linux/debugfs.h>
+/*#define RESET_ON_RESUME*/
+#define RESET_ON_RESUME_DELAY_MS 20
+
+#define PREDICTIVE_READING
+
+#define MIN_READ_LENGTH 9
+
+#define KEEP_DRIVER_ON_ERROR
+
+/*#define FORCE_RUN_APPLICATION_FIRMWARE*/
+
+#define NOTIFIER_PRIORITY 2
+
+#define NOTIFIER_TIMEOUT_MS 500
+
+#define RESPONSE_TIMEOUT_MS 3000
+
+#define APP_STATUS_POLL_TIMEOUT_MS 1000
+
+#define APP_STATUS_POLL_MS 100
+
+#define ENABLE_IRQ_DELAY_MS 20
+
+#define FALL_BACK_ON_POLLING
+
+#define POLLING_DELAY_MS 5
+
+#define RUN_WATCHDOG true
+
+#define WATCHDOG_TRIGGER_COUNT 2
+
+#define WATCHDOG_DELAY_MS 1000
+
+#define MODE_SWITCH_DELAY_MS 100
+
+#define READ_RETRY_US_MIN 5000
+
+#define READ_RETRY_US_MAX 10000
+
+#define WRITE_DELAY_US_MIN 500
+
+#define WRITE_DELAY_US_MAX 1000
+
+#define HOST_DOWNLOAD_WAIT_MS 100
+
+#define HOST_DOWNLOAD_TIMEOUT_MS 1000
+
+#define DYNAMIC_CONFIG_SYSFS_DIR_NAME "dynamic_config"
+
+#define dynamic_config_sysfs(c_name, id) \
+static ssize_t syna_tcm_sysfs_##c_name##_show(struct device *dev, \
+ struct device_attribute *attr, char *buf) \
+{ \
+ int retval; \
+ unsigned short value; \
+ struct device *p_dev; \
+ struct kobject *p_kobj; \
+ struct syna_tcm_hcd *tcm_hcd; \
+\
+ p_kobj = sysfs_dir->parent; \
+ p_dev = container_of(p_kobj, struct device, kobj); \
+ tcm_hcd = dev_get_drvdata(p_dev); \
+\
+ mutex_lock(&tcm_hcd->extif_mutex); \
+\
+ retval = tcm_hcd->get_dynamic_config(tcm_hcd, id, &value); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to get dynamic config\n"); \
+ goto exit; \
+ } \
+\
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", value); \
+\
+exit: \
+ mutex_unlock(&tcm_hcd->extif_mutex); \
+\
+ return retval; \
+} \
+\
+static ssize_t syna_tcm_sysfs_##c_name##_store(struct device *dev, \
+ struct device_attribute *attr, const char *buf, size_t count) \
+{ \
+ int retval; \
+ unsigned int input; \
+ struct device *p_dev; \
+ struct kobject *p_kobj; \
+ struct syna_tcm_hcd *tcm_hcd; \
+\
+ p_kobj = sysfs_dir->parent; \
+ p_dev = container_of(p_kobj, struct device, kobj); \
+ tcm_hcd = dev_get_drvdata(p_dev); \
+\
+ if (sscanf(buf, "%u", &input) != 1) \
+ return -EINVAL; \
+\
+ mutex_lock(&tcm_hcd->extif_mutex); \
+\
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd, id, input); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to set dynamic config\n"); \
+ goto exit; \
+ } \
+\
+ retval = count; \
+\
+exit: \
+ mutex_unlock(&tcm_hcd->extif_mutex); \
+\
+ return retval; \
+}
+
+DECLARE_COMPLETION(response_complete);
+
+static struct kobject *sysfs_dir;
+struct syna_tcm_hcd *tcm_hcd;
+static struct syna_tcm_module_pool mod_pool;
+extern void mdss_panel_reset_skip_enable(bool enable);
+extern bool mdss_panel_is_prim(void *fbinfo);
+
+static void syna_tcm_resume_work(struct work_struct *work);
+
+SHOW_PROTOTYPE(syna_tcm, info)
+STORE_PROTOTYPE(syna_tcm, irq_en)
+STORE_PROTOTYPE(syna_tcm, reset)
+STORE_PROTOTYPE(syna_tcm, watchdog)
+SHOW_STORE_PROTOTYPE(syna_tcm, no_doze)
+SHOW_STORE_PROTOTYPE(syna_tcm, disable_noise_mitigation)
+SHOW_STORE_PROTOTYPE(syna_tcm, inhibit_frequency_shift)
+SHOW_STORE_PROTOTYPE(syna_tcm, requested_frequency)
+SHOW_STORE_PROTOTYPE(syna_tcm, disable_hsync)
+SHOW_STORE_PROTOTYPE(syna_tcm, rezero_on_exit_deep_sleep)
+SHOW_STORE_PROTOTYPE(syna_tcm, charger_connected)
+SHOW_STORE_PROTOTYPE(syna_tcm, no_baseline_relaxation)
+SHOW_STORE_PROTOTYPE(syna_tcm, in_wakeup_gesture_mode)
+SHOW_STORE_PROTOTYPE(syna_tcm, stimulus_fingers)
+SHOW_STORE_PROTOTYPE(syna_tcm, grip_suppression_enabled)
+SHOW_STORE_PROTOTYPE(syna_tcm, enable_thick_glove)
+SHOW_STORE_PROTOTYPE(syna_tcm, enable_glove)
+SHOW_STORE_PROTOTYPE(syna_tcm, grip_enable)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(info),
+ ATTRIFY(irq_en),
+ ATTRIFY(reset),
+ ATTRIFY(watchdog),
+};
+
+static struct device_attribute *dynamic_config_attrs[] = {
+ ATTRIFY(no_doze),
+ ATTRIFY(disable_noise_mitigation),
+ ATTRIFY(inhibit_frequency_shift),
+ ATTRIFY(requested_frequency),
+ ATTRIFY(disable_hsync),
+ ATTRIFY(rezero_on_exit_deep_sleep),
+ ATTRIFY(charger_connected),
+ ATTRIFY(no_baseline_relaxation),
+ ATTRIFY(in_wakeup_gesture_mode),
+ ATTRIFY(stimulus_fingers),
+ ATTRIFY(grip_suppression_enabled),
+ ATTRIFY(enable_thick_glove),
+ ATTRIFY(enable_glove),
+ ATTRIFY(grip_enable),
+};
+
+static ssize_t syna_tcm_sysfs_panel_color_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+
+ if (tcm_hcd == NULL)
+ return 0;
+ return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[2]);
+}
+
+static ssize_t syna_tcm_sysfs_panel_vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+
+ if (tcm_hcd == NULL)
+ return 0;
+ return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[0]);
+}
+
+static ssize_t syna_tcm_sysfs_panel_display_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+
+ if (tcm_hcd == NULL)
+ return 0;
+ return snprintf(buf, PAGE_SIZE, "%c\n", tcm_hcd->lockdown[1]);
+}
+
+static DEVICE_ATTR(panel_color, S_IRUSR, syna_tcm_sysfs_panel_color_show, NULL);
+static DEVICE_ATTR(panel_vendor, S_IRUSR, syna_tcm_sysfs_panel_vendor_show, NULL);
+static DEVICE_ATTR(panel_display, S_IRUSR, syna_tcm_sysfs_panel_display_show, NULL);
+
+static ssize_t syna_tcm_sysfs_info_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned int count;
+ struct device *p_dev;
+ struct kobject *p_kobj;
+ struct syna_tcm_hcd *tcm_hcd;
+
+ p_kobj = sysfs_dir->parent;
+ p_dev = container_of(p_kobj, struct device, kobj);
+ tcm_hcd = dev_get_drvdata(p_dev);
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = tcm_hcd->identify(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto exit;
+ }
+
+ count = 0;
+
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "TouchComm version: %d\n",
+ tcm_hcd->id_info.version);
+ if (retval < 0)
+ goto exit;
+
+ buf += retval;
+ count += retval;
+
+ if (SYNAPTICS_TCM_ID_SUBVERSION == 0) {
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Driver version: %d.%d\n",
+ (unsigned char)(SYNAPTICS_TCM_ID_VERSION >> 8),
+ (unsigned char)SYNAPTICS_TCM_ID_VERSION);
+ } else {
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Driver version: %d.%d.%d\n",
+ (unsigned char)(SYNAPTICS_TCM_ID_VERSION >> 8),
+ (unsigned char)SYNAPTICS_TCM_ID_VERSION,
+ SYNAPTICS_TCM_ID_SUBVERSION);
+ }
+ if (retval < 0)
+ goto exit;
+
+ buf += retval;
+ count += retval;
+
+ switch (tcm_hcd->id_info.mode) {
+ case MODE_APPLICATION:
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Firmware mode: Application\n");
+ if (retval < 0)
+ goto exit;
+ break;
+ case MODE_HOST_DOWNLOAD:
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Firmware mode: Host Download\n");
+ if (retval < 0)
+ goto exit;
+ break;
+ case MODE_BOOTLOADER:
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Firmware mode: Bootloader\n");
+ if (retval < 0)
+ goto exit;
+ break;
+ case MODE_TDDI_BOOTLOADER:
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Firmware mode: TDDI Bootloader\n");
+ if (retval < 0)
+ goto exit;
+ break;
+ default:
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Firmware mode: Unknown (%d)\n",
+ tcm_hcd->id_info.mode);
+ if (retval < 0)
+ goto exit;
+ break;
+ }
+ buf += retval;
+ count += retval;
+
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Part number: ");
+ if (retval < 0)
+ goto exit;
+
+ buf += retval;
+ count += retval;
+
+ retval = secure_memcpy(buf,
+ PAGE_SIZE - count,
+ tcm_hcd->id_info.part_number,
+ sizeof(tcm_hcd->id_info.part_number),
+ sizeof(tcm_hcd->id_info.part_number));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy part number string\n");
+ goto exit;
+ }
+ buf += sizeof(tcm_hcd->id_info.part_number);
+ count += sizeof(tcm_hcd->id_info.part_number);
+
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "\n");
+ if (retval < 0)
+ goto exit;
+
+ buf += retval;
+ count += retval;
+
+ retval = snprintf(buf, PAGE_SIZE - count,
+ "Packrat number: %d\n",
+ tcm_hcd->packrat_number);
+ if (retval < 0)
+ goto exit;
+
+ count += retval;
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t syna_tcm_sysfs_irq_en_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct device *p_dev;
+ struct kobject *p_kobj;
+ struct syna_tcm_hcd *tcm_hcd;
+
+ p_kobj = sysfs_dir->parent;
+ p_dev = container_of(p_kobj, struct device, kobj);
+ tcm_hcd = dev_get_drvdata(p_dev);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (input == 0) {
+ retval = tcm_hcd->enable_irq(tcm_hcd, false, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable interrupt\n");
+ goto exit;
+ }
+ } else if (input == 1) {
+ retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable interrupt\n");
+ goto exit;
+ }
+ } else {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t syna_tcm_sysfs_reset_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ bool hw_reset;
+ unsigned int input;
+ struct device *p_dev;
+ struct kobject *p_kobj;
+ struct syna_tcm_hcd *tcm_hcd;
+
+ p_kobj = sysfs_dir->parent;
+ p_dev = container_of(p_kobj, struct device, kobj);
+ tcm_hcd = dev_get_drvdata(p_dev);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ hw_reset = false;
+ else if (input == 2)
+ hw_reset = true;
+ else
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = tcm_hcd->reset(tcm_hcd, hw_reset, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t syna_tcm_sysfs_watchdog_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct device *p_dev;
+ struct kobject *p_kobj;
+ struct syna_tcm_hcd *tcm_hcd;
+
+ p_kobj = sysfs_dir->parent;
+ p_dev = container_of(p_kobj, struct device, kobj);
+ tcm_hcd = dev_get_drvdata(p_dev);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 0 && input != 1)
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ tcm_hcd->watchdog.run = input;
+ tcm_hcd->update_watchdog(tcm_hcd, input);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return count;
+}
+
+dynamic_config_sysfs(no_doze, DC_NO_DOZE)
+
+dynamic_config_sysfs(disable_noise_mitigation, DC_DISABLE_NOISE_MITIGATION)
+
+dynamic_config_sysfs(inhibit_frequency_shift, DC_INHIBIT_FREQUENCY_SHIFT)
+
+dynamic_config_sysfs(requested_frequency, DC_REQUESTED_FREQUENCY)
+
+dynamic_config_sysfs(disable_hsync, DC_DISABLE_HSYNC)
+
+dynamic_config_sysfs(rezero_on_exit_deep_sleep, DC_REZERO_ON_EXIT_DEEP_SLEEP)
+
+dynamic_config_sysfs(charger_connected, DC_CHARGER_CONNECTED)
+
+dynamic_config_sysfs(no_baseline_relaxation, DC_NO_BASELINE_RELAXATION)
+
+dynamic_config_sysfs(in_wakeup_gesture_mode, DC_IN_WAKEUP_GESTURE_MODE)
+
+dynamic_config_sysfs(stimulus_fingers, DC_STIMULUS_FINGERS)
+
+dynamic_config_sysfs(grip_suppression_enabled, DC_GRIP_SUPPRESSION_ENABLED)
+
+dynamic_config_sysfs(enable_thick_glove, DC_ENABLE_THICK_GLOVE)
+
+dynamic_config_sysfs(enable_glove, DC_ENABLE_GLOVE)
+
+dynamic_config_sysfs(grip_enable, DC_DYNAMIC_GRIP)
+
+int syna_tcm_add_module(struct syna_tcm_module_cb *mod_cb, bool insert)
+{
+ struct syna_tcm_module_handler *mod_handler;
+
+ if (!mod_pool.initialized) {
+ mutex_init(&mod_pool.mutex);
+ INIT_LIST_HEAD(&mod_pool.list);
+ mod_pool.initialized = true;
+ }
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (insert) {
+ mod_handler = kzalloc(sizeof(*mod_handler), GFP_KERNEL);
+ if (!mod_handler) {
+ pr_err("%s: Failed to allocate memory for mod_handler\n",
+ __func__);
+ mutex_unlock(&mod_pool.mutex);
+ return -ENOMEM;
+ }
+ mod_handler->mod_cb = mod_cb;
+ mod_handler->insert = true;
+ mod_handler->detach = false;
+ list_add_tail(&mod_handler->link, &mod_pool.list);
+ } else if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (mod_handler->mod_cb->type == mod_cb->type) {
+ mod_handler->insert = false;
+ mod_handler->detach = true;
+ goto exit;
+ }
+ }
+ }
+
+exit:
+ mutex_unlock(&mod_pool.mutex);
+
+ if (mod_pool.queue_work)
+ queue_work(mod_pool.workqueue, &mod_pool.work);
+
+ return 0;
+}
+EXPORT_SYMBOL(syna_tcm_add_module);
+
+static void syna_tcm_module_work(struct work_struct *work)
+{
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_module_handler *tmp_handler;
+ struct syna_tcm_hcd *tcm_hcd = mod_pool.tcm_hcd;
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry_safe(mod_handler,
+ tmp_handler,
+ &mod_pool.list,
+ link) {
+ if (mod_handler->insert) {
+ if (mod_handler->mod_cb->init)
+ mod_handler->mod_cb->init(tcm_hcd);
+ mod_handler->insert = false;
+ }
+ if (mod_handler->detach) {
+ if (mod_handler->mod_cb->remove)
+ mod_handler->mod_cb->remove(tcm_hcd);
+ list_del(&mod_handler->link);
+ kfree(mod_handler);
+ }
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ return;
+}
+
+/**
+ * syna_tcm_report_notifier() - notify occurrence of report received from device
+ *
+ * @data: handle of core module
+ *
+ * The occurrence of the report generated by the device is forwarded to the
+ * asynchronous inbox of each registered application module.
+ */
+static int syna_tcm_report_notifier(void *data)
+{
+ struct sched_param param = { .sched_priority = NOTIFIER_PRIORITY };
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_hcd *tcm_hcd = data;
+
+ sched_setscheduler(current, SCHED_RR, &param);
+
+ set_current_state(TASK_INTERRUPTIBLE);
+
+ while (!kthread_should_stop()) {
+ schedule();
+
+ if (kthread_should_stop())
+ break;
+
+ set_current_state(TASK_RUNNING);
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->asyncbox))
+ mod_handler->mod_cb->asyncbox(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ set_current_state(TASK_INTERRUPTIBLE);
+ };
+
+ return 0;
+}
+
+/**
+ * syna_tcm_dispatch_report() - dispatch report received from device
+ *
+ * @tcm_hcd: handle of core module
+ *
+ * The report generated by the device is forwarded to the synchronous inbox of
+ * each registered application module for further processing. In addition, the
+ * report notifier thread is woken up for asynchronous notification of the
+ * report occurrence.
+ */
+static void syna_tcm_dispatch_report(struct syna_tcm_hcd *tcm_hcd)
+{
+ struct syna_tcm_module_handler *mod_handler;
+
+ LOCK_BUFFER(tcm_hcd->in);
+ LOCK_BUFFER(tcm_hcd->report.buffer);
+
+ tcm_hcd->report.buffer.buf = &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE];
+
+ tcm_hcd->report.buffer.buf_size = tcm_hcd->in.buf_size;
+ tcm_hcd->report.buffer.buf_size -= MESSAGE_HEADER_SIZE;
+
+ tcm_hcd->report.buffer.data_length = tcm_hcd->payload_length;
+
+ tcm_hcd->report.id = tcm_hcd->status_report_code;
+
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->syncbox))
+ mod_handler->mod_cb->syncbox(tcm_hcd);
+ }
+ }
+
+
+ tcm_hcd->async_report_id = tcm_hcd->status_report_code;
+
+
+ UNLOCK_BUFFER(tcm_hcd->report.buffer);
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+ wake_up_process(tcm_hcd->notifier_thread);
+
+ return;
+}
+
+/**
+ * syna_tcm_dispatch_response() - dispatch response received from device
+ *
+ * @tcm_hcd: handle of core module
+ *
+ * The response to a command is forwarded to the sender of the command.
+ */
+static void syna_tcm_dispatch_response(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (atomic_read(&tcm_hcd->command_status) != CMD_BUSY)
+ return;
+
+ tcm_hcd->response_code = tcm_hcd->status_report_code;
+
+ if (tcm_hcd->payload_length == 0) {
+ atomic_set(&tcm_hcd->command_status, CMD_IDLE);
+ goto exit;
+ }
+
+ LOCK_BUFFER(tcm_hcd->resp);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->resp,
+ tcm_hcd->payload_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->resp.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->resp);
+ atomic_set(&tcm_hcd->command_status, CMD_ERROR);
+ goto exit;
+ }
+
+ LOCK_BUFFER(tcm_hcd->in);
+
+ retval = secure_memcpy(tcm_hcd->resp.buf,
+ tcm_hcd->resp.buf_size,
+ &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE],
+ tcm_hcd->in.buf_size - MESSAGE_HEADER_SIZE,
+ tcm_hcd->payload_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy payload\n");
+ UNLOCK_BUFFER(tcm_hcd->in);
+ UNLOCK_BUFFER(tcm_hcd->resp);
+ atomic_set(&tcm_hcd->command_status, CMD_ERROR);
+ goto exit;
+ }
+
+ tcm_hcd->resp.data_length = tcm_hcd->payload_length;
+
+ UNLOCK_BUFFER(tcm_hcd->in);
+ UNLOCK_BUFFER(tcm_hcd->resp);
+
+ atomic_set(&tcm_hcd->command_status, CMD_IDLE);
+
+exit:
+ complete(&response_complete);
+
+ return;
+}
+
+/**
+ * syna_tcm_dispatch_message() - dispatch message received from device
+ *
+ * @tcm_hcd: handle of core module
+ *
+ * The information received in the message read in from the device is dispatched
+ * to the appropriate destination based on whether the information represents a
+ * report or a response to a command.
+ */
+static void syna_tcm_dispatch_message(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *build_id;
+ unsigned int payload_length;
+ unsigned int max_write_size;
+
+ if (tcm_hcd->status_report_code == REPORT_IDENTIFY) {
+ payload_length = tcm_hcd->payload_length;
+
+ LOCK_BUFFER(tcm_hcd->in);
+
+ retval = secure_memcpy((unsigned char *)&tcm_hcd->id_info,
+ sizeof(tcm_hcd->id_info),
+ &tcm_hcd->in.buf[MESSAGE_HEADER_SIZE],
+ tcm_hcd->in.buf_size - MESSAGE_HEADER_SIZE,
+ MIN(sizeof(tcm_hcd->id_info), payload_length));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy identification info\n");
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+ build_id = tcm_hcd->id_info.build_id;
+ tcm_hcd->packrat_number = le4_to_uint(build_id);
+
+ max_write_size = le2_to_uint(tcm_hcd->id_info.max_write_size);
+ tcm_hcd->wr_chunk_size = MIN(max_write_size, WR_CHUNK_SIZE);
+ if (tcm_hcd->wr_chunk_size == 0)
+ tcm_hcd->wr_chunk_size = max_write_size;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Received identify report (firmware mode = 0x%02x)\n",
+ tcm_hcd->id_info.mode);
+
+ if (atomic_read(&tcm_hcd->command_status) == CMD_BUSY) {
+ switch (tcm_hcd->command) {
+ case CMD_RESET:
+ case CMD_RUN_BOOTLOADER_FIRMWARE:
+ case CMD_RUN_APPLICATION_FIRMWARE:
+ case CMD_ENTER_PRODUCTION_TEST_MODE:
+ tcm_hcd->response_code = STATUS_OK;
+ atomic_set(&tcm_hcd->command_status, CMD_IDLE);
+ complete(&response_complete);
+ break;
+ default:
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Device has been reset\n");
+ atomic_set(&tcm_hcd->command_status, CMD_ERROR);
+ complete(&response_complete);
+ break;
+ }
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_HOST_DOWNLOAD) {
+ tcm_hcd->host_download_mode = true;
+ return;
+ }
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s:No force run applications modet\n", __func__);
+
+#ifdef FORCE_RUN_APPLICATION_FIRMWARE
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION &&
+ !mutex_is_locked(&tcm_hcd->reset_mutex)) {
+ if (atomic_read(&tcm_hcd->helper.task) == HELP_NONE) {
+ atomic_set(&tcm_hcd->helper.task,
+ HELP_RUN_APPLICATION_FIRMWARE);
+ queue_work(tcm_hcd->helper.workqueue,
+ &tcm_hcd->helper.work);
+ return;
+ }
+ }
+#endif
+ }
+
+
+ if (tcm_hcd->status_report_code >= REPORT_IDENTIFY)
+ syna_tcm_dispatch_report(tcm_hcd);
+ else
+ syna_tcm_dispatch_response(tcm_hcd);
+
+ return;
+}
+
+/**
+ * syna_tcm_continued_read() - retrieve entire payload from device
+ *
+ * @tcm_hcd: handle of core module
+ *
+ * Read transactions are carried out until the entire payload is retrieved from
+ * the device and stored in the handle of the core module.
+ */
+static int syna_tcm_continued_read(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char marker;
+ unsigned char code;
+ unsigned int idx;
+ unsigned int offset;
+ unsigned int chunks;
+ unsigned int chunk_space;
+ unsigned int xfer_length;
+ unsigned int total_length;
+ unsigned int remaining_length;
+
+ total_length = MESSAGE_HEADER_SIZE + tcm_hcd->payload_length + 1;
+
+ remaining_length = total_length - tcm_hcd->read_length;
+
+ LOCK_BUFFER(tcm_hcd->in);
+
+ retval = syna_tcm_realloc_mem(tcm_hcd,
+ &tcm_hcd->in,
+ total_length + 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reallocate memory for tcm_hcd->in.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return retval;
+ }
+
+ /* available chunk space for payload = total chunk size minus header
+ * marker byte and header code byte */
+ if (tcm_hcd->rd_chunk_size == 0)
+ chunk_space = remaining_length;
+ else
+ chunk_space = tcm_hcd->rd_chunk_size - 2;
+
+ chunks = ceil_div(remaining_length, chunk_space);
+
+ chunks = chunks == 0 ? 1 : chunks;
+
+ offset = tcm_hcd->read_length;
+
+ LOCK_BUFFER(tcm_hcd->temp);
+
+ for (idx = 0; idx < chunks; idx++) {
+ if (remaining_length > chunk_space)
+ xfer_length = chunk_space;
+ else
+ xfer_length = remaining_length;
+
+ if (xfer_length == 1) {
+ tcm_hcd->in.buf[offset] = MESSAGE_PADDING;
+ offset += xfer_length;
+ remaining_length -= xfer_length;
+ continue;
+ }
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->temp,
+ xfer_length + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->temp.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return retval;
+ }
+
+ retval = syna_tcm_read(tcm_hcd,
+ tcm_hcd->temp.buf,
+ xfer_length + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read from device\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return retval;
+ }
+
+ marker = tcm_hcd->temp.buf[0];
+ code = tcm_hcd->temp.buf[1];
+
+ if (marker != MESSAGE_MARKER) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect header marker (0x%02x)\n",
+ marker);
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return -EIO;
+ }
+
+ if (code != STATUS_CONTINUED_READ) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect header code (0x%02x)\n",
+ code);
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return -EIO;
+ }
+
+ retval = secure_memcpy(&tcm_hcd->in.buf[offset],
+ tcm_hcd->in.buf_size - offset,
+ &tcm_hcd->temp.buf[2],
+ tcm_hcd->temp.buf_size - 2,
+ xfer_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy payload\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ return retval;
+ }
+
+ offset += xfer_length;
+
+ remaining_length -= xfer_length;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+ return 0;
+}
+
+/**
+ * syna_tcm_raw_read() - retrieve specific number of data bytes from device
+ *
+ * @tcm_hcd: handle of core module
+ * @in_buf: buffer for storing data retrieved from device
+ * @length: number of bytes to retrieve from device
+ *
+ * Read transactions are carried out until the specific number of data bytes are
+ * retrieved from the device and stored in in_buf.
+ */
+static int syna_tcm_raw_read(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char *in_buf, unsigned int length)
+{
+ int retval;
+ unsigned char code;
+ unsigned int idx;
+ unsigned int offset;
+ unsigned int chunks;
+ unsigned int chunk_space;
+ unsigned int xfer_length;
+ unsigned int remaining_length;
+
+ if (length < 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid length information\n");
+ return -EINVAL;
+ }
+
+ /* minus header marker byte and header code byte */
+ remaining_length = length - 2;
+
+ /* available chunk space for data = total chunk size minus header marker
+ * byte and header code byte */
+ if (tcm_hcd->rd_chunk_size == 0)
+ chunk_space = remaining_length;
+ else
+ chunk_space = tcm_hcd->rd_chunk_size - 2;
+
+ chunks = ceil_div(remaining_length, chunk_space);
+
+ chunks = chunks == 0 ? 1 : chunks;
+
+ offset = 0;
+
+ LOCK_BUFFER(tcm_hcd->temp);
+
+ for (idx = 0; idx < chunks; idx++) {
+ if (remaining_length > chunk_space)
+ xfer_length = chunk_space;
+ else
+ xfer_length = remaining_length;
+
+ if (xfer_length == 1) {
+ in_buf[offset] = MESSAGE_PADDING;
+ offset += xfer_length;
+ remaining_length -= xfer_length;
+ continue;
+ }
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->temp,
+ xfer_length + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->temp.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ return retval;
+ }
+
+ retval = syna_tcm_read(tcm_hcd,
+ tcm_hcd->temp.buf,
+ xfer_length + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read from device\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ return retval;
+ }
+
+ code = tcm_hcd->temp.buf[1];
+
+ if (idx == 0) {
+ retval = secure_memcpy(&in_buf[0],
+ length,
+ &tcm_hcd->temp.buf[0],
+ tcm_hcd->temp.buf_size,
+ xfer_length + 2);
+ } else {
+ if (code != STATUS_CONTINUED_READ) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect header code (0x%02x)\n",
+ code);
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ return -EIO;
+ }
+
+ retval = secure_memcpy(&in_buf[offset],
+ length - offset,
+ &tcm_hcd->temp.buf[2],
+ tcm_hcd->temp.buf_size - 2,
+ xfer_length);
+ }
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy data\n");
+ UNLOCK_BUFFER(tcm_hcd->temp);
+ return retval;
+ }
+
+ if (idx == 0)
+ offset += (xfer_length + 2);
+ else
+ offset += xfer_length;
+
+ remaining_length -= xfer_length;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->temp);
+
+ return 0;
+}
+
+/**
+ * syna_tcm_raw_write() - write command/data to device without receiving
+ * response
+ *
+ * @tcm_hcd: handle of core module
+ * @command: command to send to device
+ * @data: data to send to device
+ * @length: length of data in bytes
+ *
+ * A command and its data, if any, are sent to the device.
+ */
+static int syna_tcm_raw_write(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char command, unsigned char *data, unsigned int length)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int chunks;
+ unsigned int chunk_space;
+ unsigned int xfer_length;
+ unsigned int remaining_length;
+
+ remaining_length = length;
+
+ /* available chunk space for data = total chunk size minus command
+ * byte */
+ if (tcm_hcd->wr_chunk_size == 0)
+ chunk_space = remaining_length;
+ else
+ chunk_space = tcm_hcd->wr_chunk_size - 1;
+
+ chunks = ceil_div(remaining_length, chunk_space);
+
+ chunks = chunks == 0 ? 1 : chunks;
+
+ LOCK_BUFFER(tcm_hcd->out);
+
+ for (idx = 0; idx < chunks; idx++) {
+ if (remaining_length > chunk_space)
+ xfer_length = chunk_space;
+ else
+ xfer_length = remaining_length;
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->out,
+ xfer_length + 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->out.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ return retval;
+ }
+
+ if (idx == 0)
+ tcm_hcd->out.buf[0] = command;
+ else
+ tcm_hcd->out.buf[0] = CMD_CONTINUE_WRITE;
+
+ if (xfer_length) {
+ retval = secure_memcpy(&tcm_hcd->out.buf[1],
+ tcm_hcd->out.buf_size - 1,
+ &data[idx * chunk_space],
+ remaining_length,
+ xfer_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy data\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ return retval;
+ }
+ }
+
+ retval = syna_tcm_write(tcm_hcd,
+ tcm_hcd->out.buf,
+ xfer_length + 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to device\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ return retval;
+ }
+
+ remaining_length -= xfer_length;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->out);
+
+ return 0;
+}
+
+/**
+ * syna_tcm_read_message() - read message from device
+ *
+ * @tcm_hcd: handle of core module
+ * @in_buf: buffer for storing data in raw read mode
+ * @length: length of data in bytes in raw read mode
+ *
+ * If in_buf is not NULL, raw read mode is used and syna_tcm_raw_read() is
+ * called. Otherwise, a message including its entire payload is retrieved from
+ * the device and dispatched to the appropriate destination.
+ */
+static int syna_tcm_read_message(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char *in_buf, unsigned int length)
+{
+ int retval;
+ bool retry;
+ unsigned int total_length;
+ struct syna_tcm_message_header *header;
+
+ mutex_lock(&tcm_hcd->rw_ctrl_mutex);
+
+ if (in_buf != NULL) {
+ retval = syna_tcm_raw_read(tcm_hcd, in_buf, length);
+ goto exit;
+ }
+
+ retry = true;
+
+retry:
+ LOCK_BUFFER(tcm_hcd->in);
+
+ retval = syna_tcm_read(tcm_hcd,
+ tcm_hcd->in.buf,
+ tcm_hcd->read_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read from device\n");
+ UNLOCK_BUFFER(tcm_hcd->in);
+ if (retry) {
+ usleep_range(READ_RETRY_US_MIN, READ_RETRY_US_MAX);
+ retry = false;
+ goto retry;
+ }
+ goto exit;
+ }
+
+ header = (struct syna_tcm_message_header *)tcm_hcd->in.buf;
+
+ if (header->marker != MESSAGE_MARKER) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect header marker (0x%02x)\n",
+ header->marker);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ retval = -ENXIO;
+ if (retry) {
+ usleep_range(READ_RETRY_US_MIN, READ_RETRY_US_MAX);
+ retry = false;
+ goto retry;
+ }
+ goto exit;
+ }
+
+ tcm_hcd->status_report_code = header->code;
+
+ tcm_hcd->payload_length = le2_to_uint(header->length);
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Header code = 0x%02x\n",
+ tcm_hcd->status_report_code);
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Payload length = %d\n",
+ tcm_hcd->payload_length);
+
+ if (tcm_hcd->status_report_code <= STATUS_ERROR ||
+ tcm_hcd->status_report_code == STATUS_INVALID) {
+ switch (tcm_hcd->status_report_code) {
+ case STATUS_OK:
+ break;
+ case STATUS_CONTINUED_READ:
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Out-of-sync continued read\n");
+ case STATUS_IDLE:
+ case STATUS_BUSY:
+ tcm_hcd->payload_length = 0;
+ UNLOCK_BUFFER(tcm_hcd->in);
+ retval = 0;
+ goto exit;
+ default:
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect header code (0x%02x)\n",
+ tcm_hcd->status_report_code);
+ if (tcm_hcd->status_report_code == STATUS_INVALID) {
+ if (retry) {
+ usleep_range(READ_RETRY_US_MIN,
+ READ_RETRY_US_MAX);
+ retry = false;
+ goto retry;
+ } else {
+ tcm_hcd->payload_length = 0;
+ }
+ }
+ }
+ }
+
+ total_length = MESSAGE_HEADER_SIZE + tcm_hcd->payload_length + 1;
+
+#ifdef PREDICTIVE_READING
+ if (total_length <= tcm_hcd->read_length) {
+ goto check_padding;
+ } else if (total_length - 1 == tcm_hcd->read_length) {
+ tcm_hcd->in.buf[total_length - 1] = MESSAGE_PADDING;
+ goto check_padding;
+ }
+#else
+ if (tcm_hcd->payload_length == 0) {
+ tcm_hcd->in.buf[total_length - 1] = MESSAGE_PADDING;
+ goto check_padding;
+ }
+#endif
+
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+ retval = syna_tcm_continued_read(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do continued read\n");
+ goto exit;
+ };
+
+ LOCK_BUFFER(tcm_hcd->in);
+
+ tcm_hcd->in.buf[0] = MESSAGE_MARKER;
+ tcm_hcd->in.buf[1] = tcm_hcd->status_report_code;
+ tcm_hcd->in.buf[2] = (unsigned char)tcm_hcd->payload_length;
+ tcm_hcd->in.buf[3] = (unsigned char)(tcm_hcd->payload_length >> 8);
+
+check_padding:
+ if (tcm_hcd->in.buf[total_length - 1] != MESSAGE_PADDING) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incorrect message padding byte (0x%02x)\n",
+ tcm_hcd->in.buf[total_length - 1]);
+ UNLOCK_BUFFER(tcm_hcd->in);
+ retval = -EIO;
+ goto exit;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+#ifdef PREDICTIVE_READING
+ total_length = MAX(total_length, MIN_READ_LENGTH);
+ tcm_hcd->read_length = MIN(total_length, tcm_hcd->rd_chunk_size);
+ if (tcm_hcd->rd_chunk_size == 0)
+ tcm_hcd->read_length = total_length;
+#endif
+
+ syna_tcm_dispatch_message(tcm_hcd);
+
+ retval = 0;
+
+exit:
+ if (retval < 0) {
+ if (atomic_read(&tcm_hcd->command_status) == CMD_BUSY) {
+ atomic_set(&tcm_hcd->command_status, CMD_ERROR);
+ complete(&response_complete);
+ }
+ }
+
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+
+ return retval;
+}
+
+/**
+ * syna_tcm_write_message() - write message to device and receive response
+ *
+ * @tcm_hcd: handle of core module
+ * @command: command to send to device
+ * @payload: payload of command
+ * @length: length of payload in bytes
+ * @resp_buf: buffer for storing command response
+ * @resp_buf_size: size of response buffer in bytes
+ * @resp_length: length of command response in bytes
+ * @response_code: status code returned in command response
+ * @polling_delay_ms: delay time after sending command before resuming polling
+ *
+ * If resp_buf is NULL, raw write mode is used and syna_tcm_raw_write() is
+ * called. Otherwise, a command and its payload, if any, are sent to the device
+ * and the response to the command generated by the device is read in.
+ */
+static int syna_tcm_write_message(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char command, unsigned char *payload,
+ unsigned int length, unsigned char **resp_buf,
+ unsigned int *resp_buf_size, unsigned int *resp_length,
+ unsigned char *response_code, unsigned int polling_delay_ms)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int chunks;
+ unsigned int chunk_space;
+ unsigned int xfer_length;
+ unsigned int remaining_length;
+ unsigned int command_status;
+
+ if (response_code != NULL)
+ *response_code = STATUS_INVALID;
+
+ if (!tcm_hcd->do_polling && current->pid == tcm_hcd->isr_pid) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid execution context\n");
+ return -EINVAL;
+ }
+
+ mutex_lock(&tcm_hcd->command_mutex);
+
+ mutex_lock(&tcm_hcd->rw_ctrl_mutex);
+
+ if (resp_buf == NULL) {
+ retval = syna_tcm_raw_write(tcm_hcd, command, payload, length);
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+ goto exit;
+ }
+
+ if (tcm_hcd->do_polling && polling_delay_ms) {
+ cancel_delayed_work_sync(&tcm_hcd->polling_work);
+ flush_workqueue(tcm_hcd->polling_workqueue);
+ }
+
+ atomic_set(&tcm_hcd->command_status, CMD_BUSY);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
+ reinit_completion(&response_complete);
+#else
+ INIT_COMPLETION(response_complete);
+#endif
+
+ tcm_hcd->command = command;
+
+ LOCK_BUFFER(tcm_hcd->resp);
+
+ tcm_hcd->resp.buf = *resp_buf;
+ tcm_hcd->resp.buf_size = *resp_buf_size;
+ tcm_hcd->resp.data_length = 0;
+
+ UNLOCK_BUFFER(tcm_hcd->resp);
+
+ /* adding two length bytes as part of payload */
+ remaining_length = length + 2;
+
+ /* available chunk space for payload = total chunk size minus command
+ * byte */
+ if (tcm_hcd->wr_chunk_size == 0)
+ chunk_space = remaining_length;
+ else
+ chunk_space = tcm_hcd->wr_chunk_size - 1;
+
+ chunks = ceil_div(remaining_length, chunk_space);
+
+ chunks = chunks == 0 ? 1 : chunks;
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Command = 0x%02x\n",
+ command);
+
+ LOCK_BUFFER(tcm_hcd->out);
+
+ for (idx = 0; idx < chunks; idx++) {
+ if (remaining_length > chunk_space)
+ xfer_length = chunk_space;
+ else
+ xfer_length = remaining_length;
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->out,
+ xfer_length + 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->out.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+ goto exit;
+ }
+
+ if (idx == 0) {
+ tcm_hcd->out.buf[0] = command;
+ tcm_hcd->out.buf[1] = (unsigned char)length;
+ tcm_hcd->out.buf[2] = (unsigned char)(length >> 8);
+
+ if (xfer_length > 2) {
+ retval = secure_memcpy(&tcm_hcd->out.buf[3],
+ tcm_hcd->out.buf_size - 3,
+ payload,
+ remaining_length - 2,
+ xfer_length - 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy payload\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+ goto exit;
+ }
+ }
+ } else {
+ tcm_hcd->out.buf[0] = CMD_CONTINUE_WRITE;
+
+ retval = secure_memcpy(&tcm_hcd->out.buf[1],
+ tcm_hcd->out.buf_size - 1,
+ &payload[idx * chunk_space - 2],
+ remaining_length,
+ xfer_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy payload\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+ goto exit;
+ }
+ }
+
+ retval = syna_tcm_write(tcm_hcd,
+ tcm_hcd->out.buf,
+ xfer_length + 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to device\n");
+ UNLOCK_BUFFER(tcm_hcd->out);
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+ goto exit;
+ }
+
+ remaining_length -= xfer_length;
+
+ if (chunks > 1)
+ usleep_range(WRITE_DELAY_US_MIN, WRITE_DELAY_US_MAX);
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->out);
+
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+
+ if (tcm_hcd->do_polling && polling_delay_ms) {
+ queue_delayed_work(tcm_hcd->polling_workqueue,
+ &tcm_hcd->polling_work,
+ msecs_to_jiffies(polling_delay_ms));
+ }
+
+ retval = wait_for_completion_timeout(&response_complete,
+ msecs_to_jiffies(RESPONSE_TIMEOUT_MS));
+ if (retval == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Timed out waiting for response (command 0x%02x)\n",
+ tcm_hcd->command);
+ retval = -EIO;
+ goto exit;
+ }
+
+ command_status = atomic_read(&tcm_hcd->command_status);
+ if (command_status != CMD_IDLE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get valid response (command 0x%02x)\n",
+ tcm_hcd->command);
+ retval = -EIO;
+ goto exit;
+ }
+
+ LOCK_BUFFER(tcm_hcd->resp);
+
+ if (tcm_hcd->response_code != STATUS_OK) {
+ if (tcm_hcd->resp.data_length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Error code = 0x%02x (command 0x%02x)\n",
+ tcm_hcd->resp.buf[0], tcm_hcd->command);
+ }
+ retval = -EIO;
+ } else {
+ retval = 0;
+ }
+
+ *resp_buf = tcm_hcd->resp.buf;
+ *resp_buf_size = tcm_hcd->resp.buf_size;
+ *resp_length = tcm_hcd->resp.data_length;
+
+ if (response_code != NULL)
+ *response_code = tcm_hcd->response_code;
+
+ UNLOCK_BUFFER(tcm_hcd->resp);
+
+exit:
+ tcm_hcd->command = CMD_NONE;
+
+ atomic_set(&tcm_hcd->command_status, CMD_IDLE);
+
+ mutex_unlock(&tcm_hcd->command_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_wait_hdl(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ msleep(HOST_DOWNLOAD_WAIT_MS);
+
+ if (!atomic_read(&tcm_hcd->host_downloading))
+ return 0;
+
+ retval = wait_event_interruptible_timeout(tcm_hcd->hdl_wq,
+ !atomic_read(&tcm_hcd->host_downloading),
+ msecs_to_jiffies(HOST_DOWNLOAD_TIMEOUT_MS));
+ if (retval == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Timed out waiting for completion of host download\n");
+ atomic_set(&tcm_hcd->host_downloading, 0);
+ retval = -EIO;
+ } else {
+ retval = 0;
+ }
+
+ return retval;
+}
+
+static void syna_tcm_check_hdl(struct syna_tcm_hcd *tcm_hcd)
+{
+ struct syna_tcm_module_handler *mod_handler;
+
+ LOCK_BUFFER(tcm_hcd->report.buffer);
+
+ tcm_hcd->report.buffer.buf = NULL;
+ tcm_hcd->report.buffer.buf_size = 0;
+ tcm_hcd->report.buffer.data_length = 0;
+ tcm_hcd->report.id = REPORT_HDL;
+
+ UNLOCK_BUFFER(tcm_hcd->report.buffer);
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->syncbox))
+ mod_handler->mod_cb->syncbox(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ return;
+}
+
+static void syna_tcm_update_watchdog(struct syna_tcm_hcd *tcm_hcd, bool en)
+{
+ cancel_delayed_work_sync(&tcm_hcd->watchdog.work);
+ flush_workqueue(tcm_hcd->watchdog.workqueue);
+
+ if (!tcm_hcd->watchdog.run) {
+ tcm_hcd->watchdog.count = 0;
+ return;
+ }
+
+ if (en) {
+ queue_delayed_work(tcm_hcd->watchdog.workqueue,
+ &tcm_hcd->watchdog.work,
+ msecs_to_jiffies(WATCHDOG_DELAY_MS));
+ } else {
+ tcm_hcd->watchdog.count = 0;
+ }
+
+ return;
+}
+
+static void syna_tcm_watchdog_work(struct work_struct *work)
+{
+ int retval;
+ unsigned char marker;
+ struct delayed_work *delayed_work =
+ container_of(work, struct delayed_work, work);
+ struct syna_tcm_watchdog *watchdog =
+ container_of(delayed_work, struct syna_tcm_watchdog,
+ work);
+ struct syna_tcm_hcd *tcm_hcd =
+ container_of(watchdog, struct syna_tcm_hcd, watchdog);
+
+ if (mutex_is_locked(&tcm_hcd->rw_ctrl_mutex))
+ goto exit;
+
+ mutex_lock(&tcm_hcd->rw_ctrl_mutex);
+
+ retval = syna_tcm_read(tcm_hcd,
+ &marker,
+ 1);
+
+ mutex_unlock(&tcm_hcd->rw_ctrl_mutex);
+
+ if (retval < 0 || marker != MESSAGE_MARKER) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read from device\n");
+
+ tcm_hcd->watchdog.count++;
+
+ if (tcm_hcd->watchdog.count >= WATCHDOG_TRIGGER_COUNT) {
+ retval = tcm_hcd->reset(tcm_hcd, true, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ tcm_hcd->watchdog.count = 0;
+ }
+ }
+
+exit:
+ queue_delayed_work(tcm_hcd->watchdog.workqueue,
+ &tcm_hcd->watchdog.work,
+ msecs_to_jiffies(WATCHDOG_DELAY_MS));
+
+ return;
+}
+
+static void syna_tcm_polling_work(struct work_struct *work)
+{
+ int retval;
+ struct delayed_work *delayed_work =
+ container_of(work, struct delayed_work, work);
+ struct syna_tcm_hcd *tcm_hcd =
+ container_of(delayed_work, struct syna_tcm_hcd,
+ polling_work);
+
+ if (!tcm_hcd->do_polling)
+ return;
+
+ retval = tcm_hcd->read_message(tcm_hcd,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read message\n");
+ if (retval == -ENXIO && tcm_hcd->hw_if->bus_io->type == BUS_SPI)
+ syna_tcm_check_hdl(tcm_hcd);
+ }
+
+ if (!(tcm_hcd->in_suspend && retval < 0)) {
+ queue_delayed_work(tcm_hcd->polling_workqueue,
+ &tcm_hcd->polling_work,
+ msecs_to_jiffies(POLLING_DELAY_MS));
+ }
+
+ return;
+}
+
+static irqreturn_t syna_tcm_isr(int irq, void *data)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = data;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ if (unlikely(gpio_get_value(bdata->irq_gpio) != bdata->irq_on_state))
+ goto exit;
+
+ tcm_hcd->isr_pid = current->pid;
+
+ retval = tcm_hcd->read_message(tcm_hcd,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read message\n");
+ if (retval == -ENXIO && tcm_hcd->hw_if->bus_io->type == BUS_SPI)
+ syna_tcm_check_hdl(tcm_hcd);
+ }
+
+exit:
+ return IRQ_HANDLED;
+}
+
+static int syna_tcm_enable_irq(struct syna_tcm_hcd *tcm_hcd, bool en, bool ns)
+{
+ int retval;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+ static bool irq_freed = true;
+
+ mutex_lock(&tcm_hcd->irq_en_mutex);
+
+ if (en) {
+ if (tcm_hcd->irq_enabled) {
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Interrupt already enabled\n");
+ retval = 0;
+ goto exit;
+ }
+
+ if (bdata->irq_gpio < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid IRQ GPIO\n");
+ retval = -EINVAL;
+ goto queue_polling_work;
+ }
+
+ if (irq_freed) {
+ retval = request_threaded_irq(tcm_hcd->irq, NULL,
+ syna_tcm_isr, bdata->irq_flags,
+ PLATFORM_DRIVER_NAME, tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create interrupt thread\n");
+ }
+ } else {
+ enable_irq(tcm_hcd->irq);
+ retval = 0;
+ }
+
+queue_polling_work:
+ if (retval < 0) {
+#ifdef FALL_BACK_ON_POLLING
+ queue_delayed_work(tcm_hcd->polling_workqueue,
+ &tcm_hcd->polling_work,
+ msecs_to_jiffies(POLLING_DELAY_MS));
+ tcm_hcd->do_polling = true;
+ retval = 0;
+#endif
+ }
+
+ if (retval < 0)
+ goto exit;
+ else
+ msleep(ENABLE_IRQ_DELAY_MS);
+ } else {
+ if (!tcm_hcd->irq_enabled) {
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Interrupt already disabled\n");
+ retval = 0;
+ goto exit;
+ }
+
+ if (bdata->irq_gpio >= 0) {
+ if (ns) {
+ disable_irq_nosync(tcm_hcd->irq);
+ } else {
+ disable_irq(tcm_hcd->irq);
+ free_irq(tcm_hcd->irq, tcm_hcd);
+ }
+ irq_freed = !ns;
+ }
+
+ if (ns) {
+ cancel_delayed_work(&tcm_hcd->polling_work);
+ } else {
+ cancel_delayed_work_sync(&tcm_hcd->polling_work);
+ flush_workqueue(tcm_hcd->polling_workqueue);
+ }
+
+ tcm_hcd->do_polling = false;
+ }
+
+ retval = 0;
+
+exit:
+ if (retval == 0)
+ tcm_hcd->irq_enabled = en;
+
+ mutex_unlock(&tcm_hcd->irq_en_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_set_gpio(struct syna_tcm_hcd *tcm_hcd, int gpio,
+ bool config, int dir, int state)
+{
+ int retval;
+ char label[16];
+
+ if (config) {
+ retval = snprintf(label, 16, "tcm_gpio_%d\n", gpio);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set GPIO label\n");
+ return retval;
+ }
+
+ retval = gpio_request(gpio, label);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to request GPIO %d\n",
+ gpio);
+ return retval;
+ }
+
+ if (dir == 0)
+ retval = gpio_direction_input(gpio);
+ else
+ retval = gpio_direction_output(gpio, state);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set GPIO %d direction\n",
+ gpio);
+ return retval;
+ }
+ } else {
+ gpio_free(gpio);
+ }
+
+ return 0;
+}
+
+static int syna_tcm_config_gpio(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ if (bdata->irq_gpio >= 0) {
+ retval = syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio,
+ true, 0, 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to configure interrupt GPIO\n");
+ goto err_set_gpio_irq;
+ }
+ }
+
+ if (bdata->power_gpio >= 0) {
+ retval = syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio,
+ true, 1, !bdata->power_on_state);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to configure power GPIO\n");
+ goto err_set_gpio_power;
+ }
+ }
+
+ if (bdata->reset_gpio >= 0) {
+ retval = syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio,
+ true, 1, !bdata->reset_on_state);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to configure reset GPIO\n");
+ goto err_set_gpio_reset;
+ }
+ }
+
+ if (bdata->power_gpio >= 0) {
+ gpio_set_value(bdata->power_gpio, bdata->power_on_state);
+ msleep(bdata->power_delay_ms);
+ }
+
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ msleep(bdata->reset_delay_ms);
+ }
+
+ return 0;
+
+err_set_gpio_reset:
+ if (bdata->power_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0);
+
+err_set_gpio_power:
+ if (bdata->irq_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0);
+
+err_set_gpio_irq:
+ return retval;
+}
+
+static int syna_tcm_enable_regulator(struct syna_tcm_hcd *tcm_hcd, bool en)
+{
+ int retval;
+
+ if (!en) {
+ retval = 0;
+ goto disable_ibb_reg;
+ }
+
+ if (tcm_hcd->bus_reg) {
+ retval = regulator_enable(tcm_hcd->bus_reg);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable bus regulator\n");
+ goto exit;
+ }
+ }
+
+ if (tcm_hcd->lab_reg) {
+ retval = regulator_enable(tcm_hcd->lab_reg);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable lab regulator\n");
+ goto disable_bus_reg;
+ }
+ }
+
+ if (tcm_hcd->ibb_reg) {
+ retval = regulator_enable(tcm_hcd->ibb_reg);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable ibb regulator\n");
+ goto disable_lab_reg;
+ }
+ }
+
+ return 0;
+
+disable_ibb_reg:
+ if (tcm_hcd->ibb_reg)
+ regulator_disable(tcm_hcd->ibb_reg);
+
+disable_lab_reg:
+ if (tcm_hcd->lab_reg)
+ regulator_disable(tcm_hcd->lab_reg);
+
+disable_bus_reg:
+ if (tcm_hcd->bus_reg)
+ regulator_disable(tcm_hcd->bus_reg);
+
+exit:
+ return retval;
+}
+
+static int syna_tcm_get_regulator(struct syna_tcm_hcd *tcm_hcd, bool get)
+{
+ int retval;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ if (!get) {
+ retval = 0;
+ goto regulator_put;
+ }
+
+ if (bdata->bus_reg_name != NULL && *bdata->bus_reg_name != 0) {
+ tcm_hcd->bus_reg = regulator_get(tcm_hcd->pdev->dev.parent,
+ bdata->bus_reg_name);
+ if (IS_ERR(tcm_hcd->bus_reg)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get bus regulator\n");
+ retval = PTR_ERR(tcm_hcd->bus_reg);
+ goto regulator_put;
+ }
+ }
+
+ if (bdata->i2c_reg_name != NULL && *bdata->i2c_reg_name != 0) {
+ tcm_hcd->i2c_reg = regulator_get(tcm_hcd->pdev->dev.parent,
+ bdata->i2c_reg_name);
+ if (IS_ERR(tcm_hcd->i2c_reg)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get bus regulator\n");
+ retval = PTR_ERR(tcm_hcd->i2c_reg);
+ goto regulator_put;
+ }
+ }
+
+ if (bdata->pwr_reg_name != NULL && *bdata->pwr_reg_name != 0) {
+ tcm_hcd->pwr_reg = regulator_get(tcm_hcd->pdev->dev.parent,
+ bdata->pwr_reg_name);
+ if (IS_ERR(tcm_hcd->pwr_reg)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get power regulator\n");
+ retval = PTR_ERR(tcm_hcd->pwr_reg);
+ goto regulator_put;
+ }
+ }
+
+ if (bdata->lab_reg_name != NULL && *bdata->lab_reg_name != 0) {
+ tcm_hcd->lab_reg = regulator_get(tcm_hcd->pdev->dev.parent,
+ bdata->lab_reg_name);
+ if (IS_ERR(tcm_hcd->lab_reg)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get lab regulator\n");
+ retval = PTR_ERR(tcm_hcd->lab_reg);
+ goto regulator_put;
+ }
+ }
+
+ if (bdata->ibb_reg_name != NULL && *bdata->ibb_reg_name != 0) {
+ tcm_hcd->ibb_reg = regulator_get(tcm_hcd->pdev->dev.parent,
+ bdata->ibb_reg_name);
+ if (IS_ERR(tcm_hcd->ibb_reg)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get ibb regulator\n");
+ retval = PTR_ERR(tcm_hcd->ibb_reg);
+ goto regulator_put;
+ }
+ }
+
+ return 0;
+
+regulator_put:
+ if (tcm_hcd->bus_reg) {
+ regulator_put(tcm_hcd->bus_reg);
+ tcm_hcd->bus_reg = NULL;
+ }
+
+ if (tcm_hcd->i2c_reg) {
+ regulator_put(tcm_hcd->i2c_reg);
+ tcm_hcd->i2c_reg = NULL;
+ }
+
+ if (tcm_hcd->pwr_reg) {
+ regulator_put(tcm_hcd->pwr_reg);
+ tcm_hcd->pwr_reg = NULL;
+ }
+
+ if (tcm_hcd->lab_reg) {
+ regulator_put(tcm_hcd->lab_reg);
+ tcm_hcd->lab_reg = NULL;
+ }
+
+ if (tcm_hcd->ibb_reg) {
+ regulator_put(tcm_hcd->ibb_reg);
+ tcm_hcd->ibb_reg = NULL;
+ }
+
+ return retval;
+}
+
+static int syna_tcm_get_app_info(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+ unsigned int timeout;
+
+ timeout = APP_STATUS_POLL_TIMEOUT_MS;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+get_app_info:
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_APPLICATION_INFO,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_APPLICATION_INFO));
+ goto exit;
+ }
+
+ retval = secure_memcpy((unsigned char *)&tcm_hcd->app_info,
+ sizeof(tcm_hcd->app_info),
+ resp_buf,
+ resp_buf_size,
+ MIN(sizeof(tcm_hcd->app_info), resp_length));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy application info\n");
+ goto exit;
+ }
+
+ tcm_hcd->app_status = le2_to_uint(tcm_hcd->app_info.status);
+
+ if (tcm_hcd->app_status == APP_STATUS_BOOTING ||
+ tcm_hcd->app_status == APP_STATUS_UPDATING) {
+ if (timeout > 0) {
+ msleep(APP_STATUS_POLL_MS);
+ timeout -= APP_STATUS_POLL_MS;
+ goto get_app_info;
+ }
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_get_boot_info(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_BOOT_INFO,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_BOOT_INFO));
+ goto exit;
+ }
+
+ retval = secure_memcpy((unsigned char *)&tcm_hcd->boot_info,
+ sizeof(tcm_hcd->boot_info),
+ resp_buf,
+ resp_buf_size,
+ MIN(sizeof(tcm_hcd->boot_info), resp_length));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy boot info\n");
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_identify(struct syna_tcm_hcd *tcm_hcd, bool id)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+ unsigned int max_write_size;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ mutex_lock(&tcm_hcd->identify_mutex);
+
+ if (!id)
+ goto get_info;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_IDENTIFY,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_IDENTIFY));
+ goto exit;
+ }
+
+ retval = secure_memcpy((unsigned char *)&tcm_hcd->id_info,
+ sizeof(tcm_hcd->id_info),
+ resp_buf,
+ resp_buf_size,
+ MIN(sizeof(tcm_hcd->id_info), resp_length));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy identification info\n");
+ goto exit;
+ }
+
+ tcm_hcd->packrat_number = le4_to_uint(tcm_hcd->id_info.build_id);
+
+ max_write_size = le2_to_uint(tcm_hcd->id_info.max_write_size);
+ tcm_hcd->wr_chunk_size = MIN(max_write_size, WR_CHUNK_SIZE);
+ if (tcm_hcd->wr_chunk_size == 0)
+ tcm_hcd->wr_chunk_size = max_write_size;
+
+get_info:
+ switch (tcm_hcd->id_info.mode) {
+ case MODE_APPLICATION:
+ retval = syna_tcm_get_app_info(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get application info\n");
+ goto exit;
+ }
+ break;
+ case MODE_BOOTLOADER:
+ case MODE_TDDI_BOOTLOADER:
+ retval = syna_tcm_get_boot_info(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get boot info\n");
+ goto exit;
+ }
+ break;
+ default:
+ break;
+ }
+
+ retval = 0;
+
+exit:
+ mutex_unlock(&tcm_hcd->identify_mutex);
+
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_run_production_test_firmware(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ bool retry;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ retry = true;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+retry:
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_ENTER_PRODUCTION_TEST_MODE,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ MODE_SWITCH_DELAY_MS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_ENTER_PRODUCTION_TEST_MODE));
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_PRODUCTION_TEST) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run production test firmware\n");
+ if (retry) {
+ retry = false;
+ goto retry;
+ }
+ retval = -EINVAL;
+ goto exit;
+ } else if (tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application status = 0x%02x\n",
+ tcm_hcd->app_status);
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_run_application_firmware(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ bool retry;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ retry = true;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+retry:
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_RUN_APPLICATION_FIRMWARE,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ MODE_SWITCH_DELAY_MS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_RUN_APPLICATION_FIRMWARE));
+ goto exit;
+ }
+
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware (boot status = 0x%02x)\n",
+ tcm_hcd->boot_info.status);
+ if (retry) {
+ retry = false;
+ goto retry;
+ }
+ retval = -EINVAL;
+ goto exit;
+ } else if (tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application status = 0x%02x\n",
+ tcm_hcd->app_status);
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_run_bootloader_firmware(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_RUN_BOOTLOADER_FIRMWARE,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ MODE_SWITCH_DELAY_MS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_RUN_BOOTLOADER_FIRMWARE));
+ goto exit;
+ }
+
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enter bootloader mode\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_switch_mode(struct syna_tcm_hcd *tcm_hcd,
+ enum firmware_mode mode)
+{
+ int retval;
+
+ mutex_lock(&tcm_hcd->reset_mutex);
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ switch (mode) {
+ case FW_MODE_BOOTLOADER:
+ retval = syna_tcm_run_bootloader_firmware(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to switch to bootloader mode\n");
+ goto exit;
+ }
+ break;
+ case FW_MODE_APPLICATION:
+ retval = syna_tcm_run_application_firmware(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to switch to application mode\n");
+ goto exit;
+ }
+ break;
+ case FW_MODE_PRODUCTION_TEST:
+ retval = syna_tcm_run_production_test_firmware(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to switch to production test mode\n");
+ goto exit;
+ }
+ break;
+ default:
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid firmware mode\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ mutex_unlock(&tcm_hcd->reset_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_get_dynamic_config(struct syna_tcm_hcd *tcm_hcd,
+ enum dynamic_config_id id, unsigned short *value)
+{
+ int retval;
+ unsigned char out_buf;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ out_buf = (unsigned char)id;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_DYNAMIC_CONFIG,
+ &out_buf,
+ sizeof(out_buf),
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_DYNAMIC_CONFIG));
+ goto exit;
+ }
+
+ if (resp_length < 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data length\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ *value = (unsigned short)le2_to_uint(resp_buf);
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_set_dynamic_config(struct syna_tcm_hcd *tcm_hcd,
+ enum dynamic_config_id id, unsigned short value)
+{
+ int retval;
+ unsigned char out_buf[3];
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ out_buf[0] = (unsigned char)id;
+ out_buf[1] = (unsigned char)value;
+ out_buf[2] = (unsigned char)(value >> 8);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_SET_DYNAMIC_CONFIG,
+ out_buf,
+ sizeof(out_buf),
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_SET_DYNAMIC_CONFIG));
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_get_data_location(struct syna_tcm_hcd *tcm_hcd,
+ enum flash_area area, unsigned int *addr, unsigned int *length)
+{
+ int retval;
+ unsigned char out_buf;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ switch (area) {
+ case CUSTOM_LCM:
+ out_buf = LCM_DATA;
+ break;
+ case CUSTOM_OEM:
+ out_buf = OEM_DATA;
+ break;
+ case PPDT:
+ out_buf = PPDT_DATA;
+ break;
+ default:
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid flash area\n");
+ return -EINVAL;
+ }
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_DATA_LOCATION,
+ &out_buf,
+ sizeof(out_buf),
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_DATA_LOCATION));
+ goto exit;
+ }
+
+ if (resp_length != 4) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data length\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ *addr = le2_to_uint(&resp_buf[0]);
+ *length = le2_to_uint(&resp_buf[2]);
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_sleep(struct syna_tcm_hcd *tcm_hcd, bool en)
+{
+ int retval;
+ unsigned char command;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ command = en ? CMD_ENTER_DEEP_SLEEP : CMD_EXIT_DEEP_SLEEP;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ command,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ en ?
+ STR(CMD_ENTER_DEEP_SLEEP) :
+ STR(CMD_EXIT_DEEP_SLEEP));
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_reset(struct syna_tcm_hcd *tcm_hcd, bool hw, bool update_wd)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+ struct syna_tcm_module_handler *mod_handler;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ mutex_lock(&tcm_hcd->reset_mutex);
+
+ if (update_wd)
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ if (hw) {
+ if (bdata->reset_gpio < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Hardware reset unavailable\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ } else {
+
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_RESET,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ bdata->reset_delay_ms);
+
+ if (retval < 0 && !tcm_hcd->host_download_mode) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_RESET));
+ goto exit;
+ }
+ }
+
+ if (tcm_hcd->host_download_mode) {
+ mutex_unlock(&tcm_hcd->reset_mutex);
+ kfree(resp_buf);
+ retval = syna_tcm_wait_hdl(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to wait for completion of host download\n");
+ return retval;
+ }
+ if (update_wd)
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+ return 0;
+ }
+
+ msleep(bdata->reset_delay_ms);
+
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION)
+ goto get_features;
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Write command CMD_RUN_APPLICATION_FIRMWARE",
+ __func__);
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_RUN_APPLICATION_FIRMWARE,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ MODE_SWITCH_DELAY_MS);
+ if (retval < 0) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_RUN_APPLICATION_FIRMWARE));
+ }
+
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto exit;
+ }
+
+get_features:
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Firmware mode = 0x%02x\n",
+ tcm_hcd->id_info.mode);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Boot status = 0x%02x\n",
+ tcm_hcd->boot_info.status);
+ } else if (tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application status = 0x%02x\n",
+ tcm_hcd->app_status);
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION)
+ goto dispatch_reset;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_FEATURES,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_FEATURES));
+ } else {
+ retval = secure_memcpy((unsigned char *)&tcm_hcd->features,
+ sizeof(tcm_hcd->features),
+ resp_buf,
+ resp_buf_size,
+ MIN(sizeof(tcm_hcd->features), resp_length));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy feature description\n");
+ }
+ }
+
+dispatch_reset:
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->reset))
+ mod_handler->mod_cb->reset(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ retval = 0;
+
+exit:
+ if (update_wd)
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ mutex_unlock(&tcm_hcd->reset_mutex);
+
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static int syna_tcm_rezero(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *resp_buf;
+ unsigned int resp_buf_size;
+ unsigned int resp_length;
+
+ resp_buf = NULL;
+ resp_buf_size = 0;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_REZERO,
+ NULL,
+ 0,
+ &resp_buf,
+ &resp_buf_size,
+ &resp_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_REZERO));
+ goto exit;
+ }
+
+ retval = 0;
+
+exit:
+ kfree(resp_buf);
+
+ return retval;
+}
+
+static void syna_tcm_helper_work(struct work_struct *work)
+{
+ int retval;
+ unsigned char task;
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_helper *helper =
+ container_of(work, struct syna_tcm_helper, work);
+ struct syna_tcm_hcd *tcm_hcd =
+ container_of(helper, struct syna_tcm_hcd, helper);
+
+ task = atomic_read(&helper->task);
+
+ switch (task) {
+ case HELP_RUN_APPLICATION_FIRMWARE:
+ mutex_lock(&tcm_hcd->reset_mutex);
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+ retval = syna_tcm_run_application_firmware(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to switch to application mode\n");
+ }
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+ mutex_unlock(&tcm_hcd->reset_mutex);
+ break;
+ case HELP_SEND_RESET_NOTIFICATION:
+ mutex_lock(&tcm_hcd->reset_mutex);
+ retval = tcm_hcd->identify(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ mutex_unlock(&tcm_hcd->reset_mutex);
+ break;
+ }
+ mutex_lock(&mod_pool.mutex);
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->reset))
+ mod_handler->mod_cb->reset(tcm_hcd);
+ }
+ }
+ mutex_unlock(&mod_pool.mutex);
+ mutex_unlock(&tcm_hcd->reset_mutex);
+ break;
+ default:
+ break;
+ }
+
+ atomic_set(&helper->task, HELP_NONE);
+
+ return;
+}
+
+#if defined(CONFIG_PM) || defined(CONFIG_FB)
+static int syna_tcm_resume(struct device *dev)
+{
+ int retval;
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+ if (!tcm_hcd->in_suspend)
+ return 0;
+ tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+
+ if (tcm_hcd->host_download_mode) {
+ retval = syna_tcm_wait_hdl(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to wait for completion of host download\n");
+ goto exit;
+ }
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+#ifdef RESET_ON_RESUME
+ msleep(RESET_ON_RESUME_DELAY_MS);
+
+ goto do_reset;
+#endif
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application firmware not running\n");
+ goto do_reset;
+ }
+
+ retval = tcm_hcd->sleep(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to exit deep sleep\n");
+ goto exit;
+ }
+
+ retval = syna_tcm_rezero(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to rezero\n");
+ goto exit;
+ }
+
+ goto mod_resume;
+
+do_reset:
+
+ retval = tcm_hcd->reset(tcm_hcd, false, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ goto exit;
+ }
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application firmware not running\n");
+ retval = 0;
+ goto exit;
+ }
+
+mod_resume:
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->resume))
+ mod_handler->mod_cb->resume(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ retval = 0;
+
+exit:
+ tcm_hcd->in_suspend = false;
+
+ return retval;
+}
+
+static int syna_tcm_suspend(struct device *dev)
+{
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+
+ if (tcm_hcd->in_suspend)
+ return 0;
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->suspend))
+ mod_handler->mod_cb->suspend(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ tcm_hcd->in_suspend = true;
+
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_FB
+
+static int syna_tcm_early_suspend(struct device *dev)
+{
+#ifndef WAKEUP_GESTURE
+ int retval;
+#endif
+
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
+
+ if (tcm_hcd->in_suspend)
+ return 0;
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application firmware not running\n");
+ return 0;
+ }
+
+#ifndef WAKEUP_GESTURE
+ if (!tcm_hcd->gesture_enabled) {
+ retval = tcm_hcd->sleep(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enter deep sleep\n");
+ return retval;
+ }
+ }
+#endif
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (!mod_handler->insert &&
+ !mod_handler->detach &&
+ (mod_handler->mod_cb->early_suspend))
+ mod_handler->mod_cb->early_suspend(tcm_hcd);
+ }
+ }
+
+ mutex_unlock(&mod_pool.mutex);
+
+ return 0;
+}
+
+/*
+ * add struct tpdbg_operations
+ */
+static void tpdbg_suspend(struct syna_tcm_hcd *tcm_hcd, bool enable)
+{
+ LOGE(tcm_hcd->pdev->dev.parent, "syna tp switch state");
+ if (enable) {
+ syna_tcm_early_suspend(&tcm_hcd->pdev->dev);
+ syna_tcm_suspend(&tcm_hcd->pdev->dev);
+ } else
+ syna_tcm_resume(&tcm_hcd->pdev->dev);
+}
+static int tpdbg_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+static ssize_t tpdbg_read(struct file *file, char __user *buf,
+ size_t size, loff_t *ppos)
+{
+ const char *str = "cmd support as below:\n \
+ \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \
+ \necho \"tp-sd-en\" of \"tp-sd-off\" to in or off sleep mode\n \
+ \necho \"tp-suspend-en\" or \"tp-suspend-off\" to in or off suspend \n";
+ loff_t pos = *ppos;
+ int len = strlen(str);
+
+ if (pos < 0)
+ return -EINVAL;
+
+ if (pos >= len)
+ return 0;
+
+ if (copy_to_user(buf, str, len))
+ return -EFAULT;
+
+ *ppos = pos + len;
+ return len;
+}
+static ssize_t tpdbg_write(struct file *file, const char __user *buf,
+ size_t size, loff_t *ppos)
+{
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = size;
+
+ if (!cmd)
+ return -ENOMEM;
+
+ if (copy_from_user(cmd, buf, size)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ cmd[size] = '\0';
+
+ if (!strncmp(cmd, "irq-disable", 11))
+ disable_irq(tcm_hcd->irq);
+ else if (!strncmp(cmd, "irq-enable", 10))
+ enable_irq(tcm_hcd->irq);
+ else if (!strncmp(cmd, "tp-sd-en", 8))
+ tpdbg_suspend(tcm_hcd, true);
+ else if (!strncmp(cmd, "tp-sd-off", 9))
+ tpdbg_suspend(tcm_hcd, false);
+ else if (!strncmp(cmd, "tp-suspend-en", 13))
+ tpdbg_suspend(tcm_hcd, true);
+ else if (!strncmp(cmd, "tp-suspend-off", 14))
+ tpdbg_suspend(tcm_hcd, false);
+
+out:
+ kfree(cmd);
+ return ret;
+}
+static int tpdbg_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ return 0;
+}
+static const struct file_operations tpdbg_operations = {
+ .owner = THIS_MODULE,
+ .open = tpdbg_open,
+ .read = tpdbg_read,
+ .write = tpdbg_write,
+ .release = tpdbg_release,
+};
+
+
+static void syna_tcm_resume_work(struct work_struct *work)
+{
+ struct syna_tcm_hcd *tcm_hcd = container_of(work, struct syna_tcm_hcd, resume_work);
+ int retval;
+ if (tcm_hcd->reflash_okay) {
+ if (tcm_hcd->ts_pinctrl) {
+ retval = pinctrl_select_state(tcm_hcd->ts_pinctrl,
+ tcm_hcd->pinctrl_state_active);
+ if (retval < 0)
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to select %s pinstate\n",
+ __func__, PINCTRL_STATE_ACTIVE);
+ else
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s:select %s pinstate\n",
+ __func__, PINCTRL_STATE_ACTIVE);
+ }
+ if (tcm_hcd->in_suspend)
+ syna_tcm_resume(&tcm_hcd->pdev->dev);
+ }
+}
+
+static int syna_tcm_fb_notifier_cb(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ int retval = 0;
+ int *transition;
+ struct fb_event *evdata = data;
+ struct syna_tcm_hcd *tcm_hcd =
+ container_of(nb, struct syna_tcm_hcd, fb_notifier);
+
+
+ if (evdata && evdata->data && tcm_hcd && mdss_panel_is_prim(evdata->info)) {
+ transition = evdata->data;
+ flush_workqueue(tcm_hcd->event_wq);
+ if (action == FB_EARLY_EVENT_BLANK) {
+ if (*transition == FB_BLANK_POWERDOWN) {
+ retval = syna_tcm_early_suspend(&tcm_hcd->pdev->dev);
+#ifdef WAKEUP_GESTURE
+ if (!tcm_hcd->gesture_enabled)
+ tcm_hcd->enable_irq(tcm_hcd, false, true);
+ if (tcm_hcd->gesture_enabled) {
+ syna_tcm_enable_regulator(tcm_hcd, true);
+ mdss_panel_reset_skip_enable(true);
+ tcm_hcd->gesture_enabled_when_resume = true;
+ tcm_hcd->gesture_disabled_when_resume = false;
+ }
+ } else if (*transition == FB_BLANK_UNBLANK) {
+ if ((tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume)
+ && tcm_hcd->gesture_enabled_when_resume && tcm_hcd->reflash_okay)
+ retval = syna_tcm_resume(&tcm_hcd->pdev->dev);
+ }
+#endif
+ } else if (action == FB_EVENT_BLANK) {
+ if (*transition == FB_BLANK_POWERDOWN) {
+#ifdef WAKEUP_GESTURE
+ /* need delay 4 frams after 28 10 cmd*/
+ if (tcm_hcd->gesture_enabled)
+ msleep(32);
+#endif
+ retval = syna_tcm_suspend(&tcm_hcd->pdev->dev);
+ if (!tcm_hcd->gesture_enabled && tcm_hcd->ts_pinctrl) {
+ retval = pinctrl_select_state(tcm_hcd->ts_pinctrl,
+ tcm_hcd->pinctrl_state_suspend);
+ if (retval < 0)
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to select %s pinstate\n",
+ __func__, PINCTRL_STATE_SUSPEND);
+ else
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s:select %s pinstate\n",
+ __func__, PINCTRL_STATE_SUSPEND);
+ }
+ tcm_hcd->fb_ready = 0;
+ } else if (*transition == FB_BLANK_UNBLANK) {
+ if (!(tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume)
+ || !tcm_hcd->gesture_enabled_when_resume)
+ queue_work(tcm_hcd->event_wq, &tcm_hcd->resume_work);
+#ifdef WAKEUP_GESTURE
+ if ((tcm_hcd->gesture_enabled || !tcm_hcd->gesture_disabled_when_resume)
+ && tcm_hcd->gesture_enabled_when_resume) {
+ mdss_panel_reset_skip_enable(false);
+ syna_tcm_enable_regulator(tcm_hcd, false);
+ tcm_hcd->gesture_enabled_when_resume = false;
+ tcm_hcd->gesture_disabled_when_resume = true;
+ }
+#endif
+ tcm_hcd->fb_ready++;
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+static int syna_tcm_pinctrl_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ /* Get pinctrl if target uses pinctrl */
+ tcm_hcd->ts_pinctrl = devm_pinctrl_get((tcm_hcd->pdev->dev.parent));
+ if (IS_ERR_OR_NULL(tcm_hcd->ts_pinctrl)) {
+ retval = PTR_ERR(tcm_hcd->ts_pinctrl);
+ dev_dbg(tcm_hcd->pdev->dev.parent,
+ "Target does not use pinctrl %d\n", retval);
+ goto err_pinctrl_get;
+ }
+
+ tcm_hcd->pinctrl_state_active
+ = pinctrl_lookup_state(tcm_hcd->ts_pinctrl, PINCTRL_STATE_ACTIVE);
+ if (IS_ERR_OR_NULL(tcm_hcd->pinctrl_state_active)) {
+ retval = PTR_ERR(tcm_hcd->pinctrl_state_active);
+ dev_err(tcm_hcd->pdev->dev.parent,
+ "Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_ACTIVE, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ tcm_hcd->pinctrl_state_suspend
+ = pinctrl_lookup_state(tcm_hcd->ts_pinctrl, PINCTRL_STATE_SUSPEND);
+ if (IS_ERR_OR_NULL(tcm_hcd->pinctrl_state_suspend)) {
+ retval = PTR_ERR(tcm_hcd->pinctrl_state_suspend);
+ dev_dbg(tcm_hcd->pdev->dev.parent,
+ "Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_SUSPEND, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ return 0;
+
+err_pinctrl_lookup:
+ devm_pinctrl_put(tcm_hcd->ts_pinctrl);
+err_pinctrl_get:
+ tcm_hcd->ts_pinctrl = NULL;
+ return retval;
+}
+
+static int grip_area_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+
+static ssize_t grip_area_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos)
+{
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = -EIO;
+ int input = 0;
+ char tmp[2];
+ char result[2];
+
+ if (!tcm_hcd || !cmd)
+ return ret;
+
+ if (tcm_hcd->in_suspend) {
+ dev_err(tcm_hcd->pdev->dev.parent, "tp is suspended, no need to set\n");
+ return ret;
+ }
+
+ if (copy_from_user(cmd, buf, size)) {
+ goto out;
+ }
+
+ cmd[size] = '\0';
+ tmp[1] = '\0';
+ result[1] = '\0';
+ if (sscanf(cmd, "%d", &input) != 1)
+ goto out;
+ if (input == 90 || input == 270)
+ tmp[0] = '1';
+ else
+ tmp[0] = '0';
+
+ ret = syna_tcm_sysfs_grip_enable_store(NULL, NULL, tmp, 2);
+ ret = syna_tcm_sysfs_grip_enable_show(NULL, NULL, result);
+ if (strncmp(tmp, result, 1)) {
+ dev_err(tcm_hcd->pdev->dev.parent, "error grip area set:%s, actuly:%s\n", tmp, result);
+ ret = -EIO;
+ } else {
+ dev_info(tcm_hcd->pdev->dev.parent, "grip area set:%s\n", tmp);
+ ret = size;
+ }
+out:
+ kfree(cmd);
+ cmd = NULL;
+ return ret;
+}
+
+static int grip_area_release(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ return 0;
+}
+
+static const struct file_operations grip_area_operations = {
+ .owner = THIS_MODULE,
+ .open = grip_area_open,
+ .write = grip_area_write,
+ .release = grip_area_release,
+};
+
+static int syna_tcm_probe(struct platform_device *pdev)
+{
+ int retval;
+ int idx;
+ const struct syna_tcm_board_data *bdata;
+ const struct syna_tcm_hw_interface *hw_if;
+
+ hw_if = pdev->dev.platform_data;
+ if (!hw_if) {
+ LOGE(&pdev->dev,
+ "Hardware interface not found\n");
+ return -ENODEV;
+ }
+
+ bdata = hw_if->bdata;
+ if (!bdata) {
+ LOGE(&pdev->dev,
+ "Board data not found\n");
+ return -ENODEV;
+ }
+
+ tcm_hcd = kzalloc(sizeof(*tcm_hcd), GFP_KERNEL);
+ if (!tcm_hcd) {
+ LOGE(&pdev->dev,
+ "Failed to allocate memory for tcm_hcd\n");
+ return -ENOMEM;
+ }
+
+ platform_set_drvdata(pdev, tcm_hcd);
+
+ tcm_hcd->pdev = pdev;
+ tcm_hcd->hw_if = hw_if;
+ tcm_hcd->reset = syna_tcm_reset;
+ tcm_hcd->sleep = syna_tcm_sleep;
+ tcm_hcd->identify = syna_tcm_identify;
+ tcm_hcd->enable_irq = syna_tcm_enable_irq;
+ tcm_hcd->switch_mode = syna_tcm_switch_mode;
+ tcm_hcd->read_message = syna_tcm_read_message;
+ tcm_hcd->write_message = syna_tcm_write_message;
+ tcm_hcd->get_dynamic_config = syna_tcm_get_dynamic_config;
+ tcm_hcd->set_dynamic_config = syna_tcm_set_dynamic_config;
+ tcm_hcd->get_data_location = syna_tcm_get_data_location;
+ tcm_hcd->rd_chunk_size = RD_CHUNK_SIZE;
+ tcm_hcd->wr_chunk_size = WR_CHUNK_SIZE;
+ tcm_hcd->reflash_okay = false;
+#ifdef PREDICTIVE_READING
+ tcm_hcd->read_length = MIN_READ_LENGTH;
+#else
+ tcm_hcd->read_length = MESSAGE_HEADER_SIZE;
+#endif
+
+ tcm_hcd->watchdog.run = RUN_WATCHDOG;
+ tcm_hcd->update_watchdog = syna_tcm_update_watchdog;
+
+ if (bdata->irq_gpio >= 0)
+ tcm_hcd->irq = gpio_to_irq(bdata->irq_gpio);
+ else
+ tcm_hcd->irq = bdata->irq_gpio;
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Synaptics tp driver probe startsss\n", __func__);
+ mutex_init(&tcm_hcd->extif_mutex);
+ mutex_init(&tcm_hcd->reset_mutex);
+ mutex_init(&tcm_hcd->irq_en_mutex);
+ mutex_init(&tcm_hcd->io_ctrl_mutex);
+ mutex_init(&tcm_hcd->rw_ctrl_mutex);
+ mutex_init(&tcm_hcd->command_mutex);
+ mutex_init(&tcm_hcd->identify_mutex);
+
+ INIT_BUFFER(tcm_hcd->in, false);
+ INIT_BUFFER(tcm_hcd->out, false);
+ INIT_BUFFER(tcm_hcd->resp, true);
+ INIT_BUFFER(tcm_hcd->temp, false);
+ INIT_BUFFER(tcm_hcd->config, false);
+ INIT_BUFFER(tcm_hcd->report.buffer, true);
+
+ LOCK_BUFFER(tcm_hcd->in);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->in,
+ tcm_hcd->read_length + 1);
+ if (retval < 0) {
+ LOGE(&pdev->dev,
+ "Failed to allocate memory for tcm_hcd->in.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->in);
+ goto err_alloc_mem;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->in);
+
+ atomic_set(&tcm_hcd->command_status, CMD_IDLE);
+
+ atomic_set(&tcm_hcd->helper.task, HELP_NONE);
+
+ device_init_wakeup(&pdev->dev, 1);
+
+ init_waitqueue_head(&tcm_hcd->hdl_wq);
+
+ if (!mod_pool.initialized) {
+ mutex_init(&mod_pool.mutex);
+ INIT_LIST_HEAD(&mod_pool.list);
+ mod_pool.initialized = true;
+ }
+
+ retval = syna_tcm_get_regulator(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get regulators\n");
+ goto err_get_regulator;
+ }
+/*
+ retval = syna_tcm_enable_regulator(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable regulators\n");
+ goto err_enable_regulator;
+ }
+*/
+ if (tcm_hcd->i2c_reg) {
+ retval = regulator_enable(tcm_hcd->i2c_reg);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable i2c regulator\n");
+ }
+ }
+ retval = syna_tcm_pinctrl_init(tcm_hcd);
+
+ if (!retval && tcm_hcd->ts_pinctrl) {
+ retval = pinctrl_select_state(tcm_hcd->ts_pinctrl,
+ tcm_hcd->pinctrl_state_active);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to select %s pinstate %d\n",
+ __func__, PINCTRL_STATE_ACTIVE, retval);
+ goto err_pinctrl_init;
+ }
+ }
+ retval = syna_tcm_config_gpio(tcm_hcd);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to configure GPIO's\n");
+ goto err_config_gpio;
+ }
+
+ sysfs_dir = kobject_create_and_add(PLATFORM_DRIVER_NAME,
+ &pdev->dev.kobj);
+ if (!sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dir;
+ }
+
+ tcm_hcd->sysfs_dir = sysfs_dir;
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(tcm_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ tcm_hcd->dynamnic_config_sysfs_dir =
+ kobject_create_and_add(DYNAMIC_CONFIG_SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!tcm_hcd->dynamnic_config_sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create dynamic config sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dynamic_config_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(dynamic_config_attrs); idx++) {
+ retval = sysfs_create_file(tcm_hcd->dynamnic_config_sysfs_dir,
+ &(*dynamic_config_attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create dynamic config sysfs file\n");
+ goto err_sysfs_create_dynamic_config_file;
+ }
+ }
+#ifdef CONFIG_FB
+ tcm_hcd->fb_notifier.notifier_call = syna_tcm_fb_notifier_cb;
+ retval = fb_register_client(&tcm_hcd->fb_notifier);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to register FB notifier client\n");
+ }
+#endif
+
+ tcm_hcd->notifier_thread = kthread_run(syna_tcm_report_notifier,
+ tcm_hcd, "syna_tcm_report_notifier");
+ if (IS_ERR(tcm_hcd->notifier_thread)) {
+ retval = PTR_ERR(tcm_hcd->notifier_thread);
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create and run tcm_hcd->notifier_thread\n");
+ goto err_create_run_kthread;
+ }
+ tcm_hcd->event_wq = alloc_workqueue("syna-tcm-event-queue",
+ WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1);
+ if (!tcm_hcd->event_wq) {
+ LOGE(tcm_hcd->pdev->dev.parent, "ERROR:Cannot create work thread\n");
+ goto err_create_event_wq;
+ }
+ INIT_WORK(&tcm_hcd->resume_work, syna_tcm_resume_work);
+ tcm_hcd->helper.workqueue =
+ create_singlethread_workqueue("syna_tcm_helper");
+ INIT_WORK(&tcm_hcd->helper.work, syna_tcm_helper_work);
+
+ tcm_hcd->watchdog.workqueue =
+ create_singlethread_workqueue("syna_tcm_watchdog");
+ INIT_DELAYED_WORK(&tcm_hcd->watchdog.work, syna_tcm_watchdog_work);
+
+ tcm_hcd->polling_workqueue =
+ create_singlethread_workqueue("syna_tcm_polling");
+ INIT_DELAYED_WORK(&tcm_hcd->polling_work, syna_tcm_polling_work);
+
+ retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable interrupt\n");
+ goto err_enable_irq;
+ }
+#if 0
+ retval = tcm_hcd->reset(tcm_hcd, false, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ tcm_hcd->init_okay = false;
+ tcm_hcd->watchdog.run = false;
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+ tcm_hcd->enable_irq(tcm_hcd, false, false);
+#ifndef KEEP_DRIVER_ON_ERROR
+ goto err_reset;
+#endif
+ } else {
+ tcm_hcd->init_okay = true;
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+ }
+#endif
+ retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_color.attr);
+
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to create panel color attributes\n", __func__);
+ }
+ retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_vendor.attr);
+
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to create panel color attributes\n", __func__);
+ }
+ retval = sysfs_create_file(&pdev->dev.parent->kobj, &dev_attr_panel_display.attr);
+
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to create panel color attributes\n", __func__);
+ }
+ dev_set_drvdata(pdev->dev.parent, tcm_hcd);
+
+ mod_pool.workqueue =
+ create_singlethread_workqueue("syna_tcm_module");
+ INIT_WORK(&mod_pool.work, syna_tcm_module_work);
+ mod_pool.tcm_hcd = tcm_hcd;
+ mod_pool.queue_work = true;
+ queue_work(mod_pool.workqueue, &mod_pool.work);
+ /* add syna_tp_debug interface for power dissipation
+ */
+ tcm_hcd->debugfs = debugfs_create_dir("tp_debug", NULL);
+ if (tcm_hcd->debugfs) {
+ debugfs_create_file("switch_state", 0660,
+ tcm_hcd->debugfs, tcm_hcd, &tpdbg_operations);
+ debugfs_create_file("grip_area", 0660, tcm_hcd->debugfs, tcm_hcd, &grip_area_operations);
+ }
+ return 0;
+#if 0
+#ifndef KEEP_DRIVER_ON_ERROR
+err_reset:
+#endif
+#endif
+err_enable_irq:
+ cancel_delayed_work_sync(&tcm_hcd->polling_work);
+ flush_workqueue(tcm_hcd->polling_workqueue);
+ destroy_workqueue(tcm_hcd->polling_workqueue);
+
+ cancel_delayed_work_sync(&tcm_hcd->watchdog.work);
+ flush_workqueue(tcm_hcd->watchdog.workqueue);
+ destroy_workqueue(tcm_hcd->watchdog.workqueue);
+
+ kthread_stop(tcm_hcd->notifier_thread);
+err_create_event_wq:
+ destroy_workqueue(tcm_hcd->event_wq);
+err_create_run_kthread:
+#ifdef CONFIG_FB
+ fb_unregister_client(&tcm_hcd->fb_notifier);
+#endif
+
+err_sysfs_create_dynamic_config_file:
+ for (idx--; idx >= 0; idx--) {
+ sysfs_remove_file(tcm_hcd->dynamnic_config_sysfs_dir,
+ &(*dynamic_config_attrs[idx]).attr);
+ }
+
+ kobject_put(tcm_hcd->dynamnic_config_sysfs_dir);
+
+ idx = ARRAY_SIZE(attrs);
+
+err_sysfs_create_dynamic_config_dir:
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(tcm_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(tcm_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+ if (bdata->irq_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0);
+
+ if (bdata->power_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0);
+
+ if (bdata->reset_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0);
+
+err_config_gpio:
+ /*
+ syna_tcm_enable_regulator(tcm_hcd, false);
+err_enable_regulator:
+*/
+err_pinctrl_init:
+ if (tcm_hcd->ts_pinctrl) {
+ devm_pinctrl_put(tcm_hcd->ts_pinctrl);
+ tcm_hcd->ts_pinctrl = NULL;
+ }
+ syna_tcm_get_regulator(tcm_hcd, false);
+
+err_get_regulator:
+ device_init_wakeup(&pdev->dev, 0);
+
+err_alloc_mem:
+ RELEASE_BUFFER(tcm_hcd->report.buffer);
+ RELEASE_BUFFER(tcm_hcd->config);
+ RELEASE_BUFFER(tcm_hcd->temp);
+ RELEASE_BUFFER(tcm_hcd->resp);
+ RELEASE_BUFFER(tcm_hcd->out);
+ RELEASE_BUFFER(tcm_hcd->in);
+
+ kfree(tcm_hcd);
+
+ return retval;
+}
+
+static int syna_tcm_remove(struct platform_device *pdev)
+{
+ int idx;
+ struct syna_tcm_module_handler *mod_handler;
+ struct syna_tcm_hcd *tcm_hcd = platform_get_drvdata(pdev);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&mod_pool.mutex);
+
+ if (!list_empty(&mod_pool.list)) {
+ list_for_each_entry(mod_handler, &mod_pool.list, link) {
+ if (mod_handler->mod_cb->remove)
+ mod_handler->mod_cb->remove(tcm_hcd);
+ list_del(&mod_handler->link);
+ kfree(mod_handler);
+ }
+ }
+
+ mod_pool.queue_work = false;
+ cancel_work_sync(&mod_pool.work);
+ flush_workqueue(mod_pool.workqueue);
+ destroy_workqueue(mod_pool.workqueue);
+
+ mutex_unlock(&mod_pool.mutex);
+
+ if (tcm_hcd->irq_enabled && bdata->irq_gpio >= 0) {
+ disable_irq(tcm_hcd->irq);
+ free_irq(tcm_hcd->irq, tcm_hcd);
+ }
+
+ cancel_delayed_work_sync(&tcm_hcd->polling_work);
+ flush_workqueue(tcm_hcd->polling_workqueue);
+ destroy_workqueue(tcm_hcd->polling_workqueue);
+
+ cancel_delayed_work_sync(&tcm_hcd->watchdog.work);
+ flush_workqueue(tcm_hcd->watchdog.workqueue);
+ destroy_workqueue(tcm_hcd->watchdog.workqueue);
+ destroy_workqueue(tcm_hcd->event_wq);
+ kthread_stop(tcm_hcd->notifier_thread);
+
+#ifdef CONFIG_FB
+ fb_unregister_client(&tcm_hcd->fb_notifier);
+#endif
+
+ for (idx = 0; idx < ARRAY_SIZE(dynamic_config_attrs); idx++) {
+ sysfs_remove_file(tcm_hcd->dynamnic_config_sysfs_dir,
+ &(*dynamic_config_attrs[idx]).attr);
+ }
+
+ kobject_put(tcm_hcd->dynamnic_config_sysfs_dir);
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++)
+ sysfs_remove_file(tcm_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(tcm_hcd->sysfs_dir);
+
+ if (bdata->irq_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0);
+
+ if (bdata->power_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0);
+
+ if (bdata->reset_gpio >= 0)
+ syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0);
+/*
+ syna_tcm_enable_regulator(tcm_hcd, false);
+*/
+ syna_tcm_get_regulator(tcm_hcd, false);
+
+ device_init_wakeup(&pdev->dev, 0);
+
+ RELEASE_BUFFER(tcm_hcd->report.buffer);
+ RELEASE_BUFFER(tcm_hcd->config);
+ RELEASE_BUFFER(tcm_hcd->temp);
+ RELEASE_BUFFER(tcm_hcd->resp);
+ RELEASE_BUFFER(tcm_hcd->out);
+ RELEASE_BUFFER(tcm_hcd->in);
+
+ kfree(tcm_hcd);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static const struct dev_pm_ops syna_tcm_dev_pm_ops = {
+#ifndef CONFIG_FB
+ .suspend = syna_tcm_suspend,
+ .resume = syna_tcm_resume,
+#endif
+};
+#endif
+
+static struct platform_driver syna_tcm_driver = {
+ .driver = {
+ .name = PLATFORM_DRIVER_NAME,
+ .owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .pm = &syna_tcm_dev_pm_ops,
+#endif
+ },
+ .probe = syna_tcm_probe,
+ .remove = syna_tcm_remove,
+};
+
+static int __init syna_tcm_module_init(void)
+{
+ int retval;
+
+ retval = syna_tcm_bus_init();
+ if (retval < 0)
+ return retval;
+
+ return platform_driver_register(&syna_tcm_driver);
+}
+
+static void __exit syna_tcm_module_exit(void)
+{
+ platform_driver_unregister(&syna_tcm_driver);
+
+ syna_tcm_bus_exit();
+
+ return;
+}
+
+late_initcall(syna_tcm_module_init);
+module_exit(syna_tcm_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Touch Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h
new file mode 100644
index 000000000000..28d306fc98c7
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_core.h
@@ -0,0 +1,681 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#ifndef _SYNAPTICS_TCM_CORE_H_
+#define _SYNAPTICS_TCM_CORE_H_
+
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/input.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_tcm.h>
+#ifdef CONFIG_FB
+#include <linux/fb.h>
+#include <linux/notifier.h>
+#endif
+#include <linux/proc_fs.h>
+#include <linux/vmalloc.h>
+#include <linux/uaccess.h>
+
+#define SYNAPTICS_TCM_ID_PRODUCT (1 << 0)
+#define SYNAPTICS_TCM_ID_VERSION 0x0100
+#define SYNAPTICS_TCM_ID_SUBVERSION 0
+
+#define PLATFORM_DRIVER_NAME "synaptics_tcm"
+
+#define TOUCH_INPUT_NAME "synaptics_tcm_touch"
+#define TOUCH_INPUT_PHYS_PATH "synaptics_tcm/touch_input"
+#define PINCTRL_STATE_ACTIVE "pmx_ts_active"
+#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend"
+
+
+#define RD_CHUNK_SIZE 0 /* read length limit in bytes, 0 = unlimited */
+#define WR_CHUNK_SIZE 0 /* write length limit in bytes, 0 = unlimited */
+
+#define MESSAGE_HEADER_SIZE 4
+#define MESSAGE_MARKER 0xa5
+#define MESSAGE_PADDING 0x5a
+#define LOCKDOWN_SIZE 8
+
+#define LOGx(func, dev, log, ...) \
+ func(dev, "%s: " log, __func__, ##__VA_ARGS__)
+
+#define LOGy(func, dev, log, ...) \
+ func(dev, "%s (line %d): " log, __func__, __LINE__, ##__VA_ARGS__)
+
+#define LOGD(dev, log, ...) LOGx(dev_dbg, dev, log, ##__VA_ARGS__)
+#define LOGI(dev, log, ...) LOGx(dev_info, dev, log, ##__VA_ARGS__)
+#define LOGN(dev, log, ...) LOGx(dev_notice, dev, log, ##__VA_ARGS__)
+#define LOGW(dev, log, ...) LOGy(dev_warn, dev, log, ##__VA_ARGS__)
+#define LOGE(dev, log, ...) LOGy(dev_err, dev, log, ##__VA_ARGS__)
+
+#define INIT_BUFFER(buffer, is_clone) \
+ mutex_init(&buffer.buf_mutex); \
+ buffer.clone = is_clone
+
+#define LOCK_BUFFER(buffer) \
+ mutex_lock(&buffer.buf_mutex)
+
+#define UNLOCK_BUFFER(buffer) \
+ mutex_unlock(&buffer.buf_mutex)
+
+#define RELEASE_BUFFER(buffer) \
+ do { \
+ if (buffer.clone == false) { \
+ kfree(buffer.buf); \
+ buffer.buf_size = 0; \
+ buffer.data_length = 0; \
+ } \
+ } while (0)
+
+#define MAX(a, b) \
+ ({__typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ _a > _b ? _a : _b; })
+
+#define MIN(a, b) \
+ ({__typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ _a < _b ? _a : _b; })
+
+#define STR(x) #x
+
+#define CONCAT(a, b) a##b
+
+#define SHOW_PROTOTYPE(m_name, a_name) \
+static ssize_t CONCAT(m_name##_sysfs, _##a_name##_show)(struct device *dev, \
+ struct device_attribute *attr, char *buf); \
+\
+static struct device_attribute dev_attr_##a_name = \
+ __ATTR(a_name, S_IRUGO, \
+ CONCAT(m_name##_sysfs, _##a_name##_show), \
+ syna_tcm_store_error);
+
+#define STORE_PROTOTYPE(m_name, a_name) \
+static ssize_t CONCAT(m_name##_sysfs, _##a_name##_store)(struct device *dev, \
+ struct device_attribute *attr, const char *buf, size_t count); \
+\
+static struct device_attribute dev_attr_##a_name = \
+ __ATTR(a_name, (S_IWUSR), \
+ syna_tcm_show_error, \
+ CONCAT(m_name##_sysfs, _##a_name##_store));
+
+#define SHOW_STORE_PROTOTYPE(m_name, a_name) \
+static ssize_t CONCAT(m_name##_sysfs, _##a_name##_show)(struct device *dev, \
+ struct device_attribute *attr, char *buf); \
+\
+static ssize_t CONCAT(m_name##_sysfs, _##a_name##_store)(struct device *dev, \
+ struct device_attribute *attr, const char *buf, size_t count); \
+\
+static struct device_attribute dev_attr_##a_name = \
+ __ATTR(a_name, (S_IRUGO | S_IWUSR), \
+ CONCAT(m_name##_sysfs, _##a_name##_show), \
+ CONCAT(m_name##_sysfs, _##a_name##_store));
+
+#define ATTRIFY(a_name) (&dev_attr_##a_name)
+
+enum module_type {
+ TCM_TOUCH = 0,
+ TCM_DEVICE = 1,
+ TCM_TESTING = 2,
+ TCM_REFLASH = 3,
+ TCM_RECOVERY = 4,
+ TCM_ZEROFLASH = 5,
+ TCM_DIAGNOSTICS = 6,
+ TCM_XIAOMI_INTERFACE = 7,
+ TCM_LAST,
+};
+
+enum boot_mode {
+ MODE_APPLICATION = 0x01,
+ MODE_HOST_DOWNLOAD = 0x02,
+ MODE_BOOTLOADER = 0x0b,
+ MODE_TDDI_BOOTLOADER = 0x0c,
+ MODE_PRODUCTION_TEST = 0x0e,
+};
+
+enum boot_status {
+ BOOT_STATUS_OK = 0x00,
+ BOOT_STATUS_BOOTING = 0x01,
+ BOOT_STATUS_APP_BAD_DISPLAY_CRC = 0xfc,
+ BOOT_STATUS_BAD_DISPLAY_CONFIG = 0xfd,
+ BOOT_STATUS_BAD_APP_FIRMWARE = 0xfe,
+ BOOT_STATUS_WARM_BOOT = 0xff,
+};
+
+enum app_status {
+ APP_STATUS_OK = 0x00,
+ APP_STATUS_BOOTING = 0x01,
+ APP_STATUS_UPDATING = 0x02,
+ APP_STATUS_BAD_APP_CONFIG = 0xff,
+};
+
+enum firmware_mode {
+ FW_MODE_BOOTLOADER = 0,
+ FW_MODE_APPLICATION = 1,
+ FW_MODE_PRODUCTION_TEST = 2,
+};
+#define DC_DYNAMIC_GRIP 208
+enum dynamic_config_id {
+ DC_UNKNOWN = 0x00,
+ DC_NO_DOZE,
+ DC_DISABLE_NOISE_MITIGATION,
+ DC_INHIBIT_FREQUENCY_SHIFT,
+ DC_REQUESTED_FREQUENCY,
+ DC_DISABLE_HSYNC,
+ DC_REZERO_ON_EXIT_DEEP_SLEEP,
+ DC_CHARGER_CONNECTED,
+ DC_NO_BASELINE_RELAXATION,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ DC_STIMULUS_FINGERS,
+ DC_GRIP_SUPPRESSION_ENABLED,
+ DC_ENABLE_THICK_GLOVE,
+ DC_ENABLE_GLOVE,
+};
+
+enum command {
+ CMD_NONE = 0x00,
+ CMD_CONTINUE_WRITE = 0x01,
+ CMD_IDENTIFY = 0x02,
+ CMD_RESET = 0x04,
+ CMD_ENABLE_REPORT = 0x05,
+ CMD_DISABLE_REPORT = 0x06,
+ CMD_GET_BOOT_INFO = 0x10,
+ CMD_ERASE_FLASH = 0x11,
+ CMD_WRITE_FLASH = 0x12,
+ CMD_READ_FLASH = 0x13,
+ CMD_RUN_APPLICATION_FIRMWARE = 0x14,
+ CMD_SPI_MASTER_WRITE_THEN_READ = 0x15,
+ CMD_REBOOT_TO_ROM_BOOTLOADER = 0x16,
+ CMD_RUN_BOOTLOADER_FIRMWARE = 0x1f,
+ CMD_GET_APPLICATION_INFO = 0x20,
+ CMD_GET_STATIC_CONFIG = 0x21,
+ CMD_SET_STATIC_CONFIG = 0x22,
+ CMD_GET_DYNAMIC_CONFIG = 0x23,
+ CMD_SET_DYNAMIC_CONFIG = 0x24,
+ CMD_GET_TOUCH_REPORT_CONFIG = 0x25,
+ CMD_SET_TOUCH_REPORT_CONFIG = 0x26,
+ CMD_REZERO = 0x27,
+ CMD_COMMIT_CONFIG = 0x28,
+ CMD_DESCRIBE_DYNAMIC_CONFIG = 0x29,
+ CMD_PRODUCTION_TEST = 0x2a,
+ CMD_SET_CONFIG_ID = 0x2b,
+ CMD_ENTER_DEEP_SLEEP = 0x2c,
+ CMD_EXIT_DEEP_SLEEP = 0x2d,
+ CMD_GET_TOUCH_INFO = 0x2e,
+ CMD_GET_DATA_LOCATION = 0x2f,
+ CMD_DOWNLOAD_CONFIG = 0x30,
+ CMD_ENTER_PRODUCTION_TEST_MODE = 0x31,
+ CMD_GET_FEATURES = 0x32,
+};
+
+enum status_code {
+ STATUS_IDLE = 0x00,
+ STATUS_OK = 0x01,
+ STATUS_BUSY = 0x02,
+ STATUS_CONTINUED_READ = 0x03,
+ STATUS_NOT_EXECUTED_IN_DEEP_SLEEP = 0x0b,
+ STATUS_RECEIVE_BUFFER_OVERFLOW = 0x0c,
+ STATUS_PREVIOUS_COMMAND_PENDING = 0x0d,
+ STATUS_NOT_IMPLEMENTED = 0x0e,
+ STATUS_ERROR = 0x0f,
+ STATUS_INVALID = 0xff,
+};
+
+enum report_type {
+ REPORT_IDENTIFY = 0x10,
+ REPORT_TOUCH = 0x11,
+ REPORT_DELTA = 0x12,
+ REPORT_RAW = 0x13,
+ REPORT_STATUS = 0x1b,
+ REPORT_PRINTF = 0x82,
+ REPORT_HDL = 0xfe,
+};
+
+enum command_status {
+ CMD_IDLE = 0,
+ CMD_BUSY = 1,
+ CMD_ERROR = -1,
+};
+
+enum flash_area {
+ BOOTLOADER = 0,
+ BOOT_CONFIG,
+ APP_FIRMWARE,
+ APP_CONFIG,
+ DISP_CONFIG,
+ CUSTOM_OTP,
+ CUSTOM_LCM,
+ CUSTOM_OEM,
+ PPDT,
+};
+
+enum flash_data {
+ LCM_DATA = 1,
+ OEM_DATA,
+ PPDT_DATA,
+};
+
+enum helper_task {
+ HELP_NONE = 0,
+ HELP_RUN_APPLICATION_FIRMWARE,
+ HELP_SEND_RESET_NOTIFICATION,
+};
+
+struct syna_tcm_helper {
+ atomic_t task;
+ struct work_struct work;
+ struct workqueue_struct *workqueue;
+};
+
+struct syna_tcm_watchdog {
+ bool run;
+ unsigned char count;
+ struct delayed_work work;
+ struct workqueue_struct *workqueue;
+};
+
+struct syna_tcm_buffer {
+ bool clone;
+ unsigned char *buf;
+ unsigned int buf_size;
+ unsigned int data_length;
+ struct mutex buf_mutex;
+};
+
+struct syna_tcm_report {
+ unsigned char id;
+ struct syna_tcm_buffer buffer;
+};
+
+struct syna_tcm_identification {
+ unsigned char version;
+ unsigned char mode;
+ unsigned char part_number[16];
+ unsigned char build_id[4];
+ unsigned char max_write_size[2];
+};
+
+struct syna_tcm_boot_info {
+ unsigned char version;
+ unsigned char status;
+ unsigned char asic_id[2];
+ unsigned char write_block_size_words;
+ unsigned char erase_page_size_words[2];
+ unsigned char max_write_payload_size[2];
+ unsigned char last_reset_reason;
+ unsigned char pc_at_time_of_last_reset[2];
+ unsigned char boot_config_start_block[2];
+ unsigned char boot_config_size_blocks[2];
+ unsigned char display_config_start_block[4];
+ unsigned char display_config_length_blocks[2];
+ unsigned char backup_display_config_start_block[4];
+ unsigned char backup_display_config_length_blocks[2];
+ unsigned char custom_otp_start_block[2];
+ unsigned char custom_otp_length_blocks[2];
+};
+
+struct syna_tcm_app_info {
+ unsigned char version[2];
+ unsigned char status[2];
+ unsigned char static_config_size[2];
+ unsigned char dynamic_config_size[2];
+ unsigned char app_config_start_write_block[2];
+ unsigned char app_config_size[2];
+ unsigned char max_touch_report_config_size[2];
+ unsigned char max_touch_report_payload_size[2];
+ unsigned char customer_config_id[16];
+ unsigned char max_x[2];
+ unsigned char max_y[2];
+ unsigned char max_objects[2];
+ unsigned char num_of_buttons[2];
+ unsigned char num_of_image_rows[2];
+ unsigned char num_of_image_cols[2];
+ unsigned char has_hybrid_data[2];
+};
+
+struct syna_tcm_touch_info {
+ unsigned char image_2d_scale_factor[4];
+ unsigned char image_0d_scale_factor[4];
+ unsigned char hybrid_x_scale_factor[4];
+ unsigned char hybrid_y_scale_factor[4];
+};
+
+struct syna_tcm_message_header {
+ unsigned char marker;
+ unsigned char code;
+ unsigned char length[2];
+};
+
+struct syna_tcm_features {
+ unsigned char byte_0_reserved;
+ unsigned char byte_1_reserved;
+ unsigned char dual_firmware:1;
+ unsigned char byte_2_reserved:7;
+} __packed;
+
+struct syna_tcm_hcd {
+ pid_t isr_pid;
+ atomic_t command_status;
+ atomic_t host_downloading;
+ wait_queue_head_t hdl_wq;
+ int irq;
+ bool reflash_okay;
+ bool init_okay;
+ bool do_polling;
+ bool in_suspend;
+ bool irq_enabled;
+ bool host_download_mode;
+ unsigned char fb_ready;
+ unsigned char command;
+ unsigned char async_report_id;
+ unsigned char status_report_code;
+ unsigned char response_code;
+ unsigned int read_length;
+ unsigned int payload_length;
+ unsigned int packrat_number;
+ unsigned int rd_chunk_size;
+ unsigned int wr_chunk_size;
+ unsigned int app_status;
+ struct dentry *debugfs;
+ struct platform_device *pdev;
+ struct regulator *pwr_reg;
+ struct regulator *bus_reg;
+ struct regulator *lab_reg;
+ struct regulator *ibb_reg;
+ struct regulator *i2c_reg;
+ struct kobject *sysfs_dir;
+ struct kobject *dynamnic_config_sysfs_dir;
+ struct mutex extif_mutex;
+ struct mutex reset_mutex;
+ struct mutex irq_en_mutex;
+ struct mutex io_ctrl_mutex;
+ struct mutex rw_ctrl_mutex;
+ struct mutex command_mutex;
+ struct mutex identify_mutex;
+ struct delayed_work polling_work;
+ struct workqueue_struct *polling_workqueue;
+ struct work_struct resume_work;
+ struct workqueue_struct *event_wq;
+ struct task_struct *notifier_thread;
+#ifdef CONFIG_FB
+ struct notifier_block fb_notifier;
+#endif
+ struct syna_tcm_buffer in;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_buffer temp;
+ struct syna_tcm_buffer config;
+ struct syna_tcm_report report;
+ struct syna_tcm_app_info app_info;
+ struct syna_tcm_boot_info boot_info;
+ struct syna_tcm_touch_info touch_info;
+ struct syna_tcm_identification id_info;
+ struct syna_tcm_helper helper;
+ struct syna_tcm_watchdog watchdog;
+ struct syna_tcm_features features;
+ const struct syna_tcm_hw_interface *hw_if;
+ int (*reset)(struct syna_tcm_hcd *tcm_hcd, bool hw, bool update_wd);
+ int (*sleep)(struct syna_tcm_hcd *tcm_hcd, bool en);
+ int (*identify)(struct syna_tcm_hcd *tcm_hcd, bool id);
+ int (*enable_irq)(struct syna_tcm_hcd *tcm_hcd, bool en, bool ns);
+ int (*switch_mode)(struct syna_tcm_hcd *tcm_hcd,
+ enum firmware_mode mode);
+ int (*read_message)(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char *in_buf, unsigned int length);
+ int (*write_message)(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char command, unsigned char *payload,
+ unsigned int length, unsigned char **resp_buf,
+ unsigned int *resp_buf_size, unsigned int *resp_length,
+ unsigned char *response_code,
+ unsigned int polling_delay_ms);
+ int (*get_dynamic_config)(struct syna_tcm_hcd *tcm_hcd,
+ enum dynamic_config_id id, unsigned short *value);
+ int (*set_dynamic_config)(struct syna_tcm_hcd *tcm_hcd,
+ enum dynamic_config_id id, unsigned short value);
+ int (*get_data_location)(struct syna_tcm_hcd *tcm_hcd,
+ enum flash_area area, unsigned int *addr,
+ unsigned int *length);
+ int (*read_flash_data)(enum flash_area area, bool run_app_firmware,
+ struct syna_tcm_buffer *output);
+ void (*report_touch)(void);
+ void (*update_watchdog)(struct syna_tcm_hcd *tcm_hcd, bool en);
+ char lockdown[LOCKDOWN_SIZE];
+ bool gesture_enabled;
+ struct pinctrl *ts_pinctrl;
+ struct pinctrl_state *pinctrl_state_active;
+ struct pinctrl_state *pinctrl_state_suspend;
+ bool gesture_enabled_when_resume;
+ bool gesture_disabled_when_resume;
+};
+
+struct syna_tcm_module_cb {
+ enum module_type type;
+ int (*init)(struct syna_tcm_hcd *tcm_hcd);
+ int (*remove)(struct syna_tcm_hcd *tcm_hcd);
+ int (*syncbox)(struct syna_tcm_hcd *tcm_hcd);
+ int (*asyncbox)(struct syna_tcm_hcd *tcm_hcd);
+ int (*reset)(struct syna_tcm_hcd *tcm_hcd);
+ int (*suspend)(struct syna_tcm_hcd *tcm_hcd);
+ int (*resume)(struct syna_tcm_hcd *tcm_hcd);
+ int (*early_suspend)(struct syna_tcm_hcd *tcm_hcd);
+};
+
+struct syna_tcm_module_handler {
+ bool insert;
+ bool detach;
+ struct list_head link;
+ struct syna_tcm_module_cb *mod_cb;
+};
+
+struct syna_tcm_module_pool {
+ bool initialized;
+ bool queue_work;
+ struct mutex mutex;
+ struct list_head list;
+ struct work_struct work;
+ struct workqueue_struct *workqueue;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+struct syna_tcm_bus_io {
+ unsigned char type;
+ int (*rmi_read)(struct syna_tcm_hcd *tcm_hcd, unsigned short addr,
+ unsigned char *data, unsigned int length);
+ int (*rmi_write)(struct syna_tcm_hcd *tcm_hcd, unsigned short addr,
+ unsigned char *data, unsigned int length);
+ int (*read)(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length);
+ int (*write)(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length);
+};
+
+struct syna_tcm_hw_interface {
+ struct syna_tcm_board_data *bdata;
+ const struct syna_tcm_bus_io *bus_io;
+};
+
+int syna_tcm_bus_init(void);
+
+void syna_tcm_bus_exit(void);
+
+int syna_tcm_add_module(struct syna_tcm_module_cb *mod_cb, bool insert);
+
+static inline int syna_tcm_rmi_read(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ return tcm_hcd->hw_if->bus_io->rmi_read(tcm_hcd, addr, data, length);
+}
+
+static inline int syna_tcm_rmi_write(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ return tcm_hcd->hw_if->bus_io->rmi_write(tcm_hcd, addr, data, length);
+}
+
+static inline int syna_tcm_read(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char *data, unsigned int length)
+{
+ return tcm_hcd->hw_if->bus_io->read(tcm_hcd, data, length);
+}
+
+static inline int syna_tcm_write(struct syna_tcm_hcd *tcm_hcd,
+ unsigned char *data, unsigned int length)
+{
+ return tcm_hcd->hw_if->bus_io->write(tcm_hcd, data, length);
+}
+
+static inline ssize_t syna_tcm_show_error(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ pr_err("%s: Attribute not readable\n",
+ __func__);
+
+ return -EPERM;
+}
+
+static inline ssize_t syna_tcm_store_error(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ pr_err("%s: Attribute not writable\n",
+ __func__);
+
+ return -EPERM;
+}
+
+static inline int secure_memcpy(unsigned char *dest, unsigned int dest_size,
+ const unsigned char *src, unsigned int src_size,
+ unsigned int count)
+{
+ if (dest == NULL || src == NULL)
+ return -EINVAL;
+
+ if (count > dest_size || count > src_size) {
+ pr_err("%s: src_size = %d, dest_size = %d, count = %d\n",
+ __func__, src_size, dest_size, count);
+ return -EINVAL;
+ }
+
+ memcpy((void *)dest, (const void *)src, count);
+
+ return 0;
+}
+
+static inline int syna_tcm_realloc_mem(struct syna_tcm_hcd *tcm_hcd,
+ struct syna_tcm_buffer *buffer, unsigned int size)
+{
+ int retval;
+ unsigned char *temp;
+
+ if (size > buffer->buf_size) {
+ temp = buffer->buf;
+
+ buffer->buf = kmalloc(size, GFP_KERNEL);
+ if (!(buffer->buf)) {
+ dev_err(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to allocate memory\n",
+ __func__);
+ kfree(temp);
+ buffer->buf_size = 0;
+ return -ENOMEM;
+ }
+
+ retval = secure_memcpy(buffer->buf,
+ size,
+ temp,
+ buffer->buf_size,
+ buffer->buf_size);
+ if (retval < 0) {
+ dev_err(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ kfree(temp);
+ kfree(buffer->buf);
+ buffer->buf_size = 0;
+ return retval;
+ }
+
+ kfree(temp);
+ buffer->buf_size = size;
+ }
+
+ return 0;
+}
+
+static inline int syna_tcm_alloc_mem(struct syna_tcm_hcd *tcm_hcd,
+ struct syna_tcm_buffer *buffer, unsigned int size)
+{
+ if (size > buffer->buf_size) {
+ kfree(buffer->buf);
+ buffer->buf = kmalloc(size, GFP_KERNEL);
+ if (!(buffer->buf)) {
+ dev_err(tcm_hcd->pdev->dev.parent,
+ "%s: Failed to allocate memory\n",
+ __func__);
+ dev_err(tcm_hcd->pdev->dev.parent,
+ "%s: Allocation size = %d\n",
+ __func__, size);
+ buffer->buf_size = 0;
+ buffer->data_length = 0;
+ return -ENOMEM;
+ }
+ buffer->buf_size = size;
+ }
+
+ memset(buffer->buf, 0x00, buffer->buf_size);
+ buffer->data_length = 0;
+
+ return 0;
+}
+
+static inline unsigned int le2_to_uint(const unsigned char *src)
+{
+ return (unsigned int)src[0] +
+ (unsigned int)src[1] * 0x100;
+}
+
+static inline unsigned int le4_to_uint(const unsigned char *src)
+{
+ return (unsigned int)src[0] +
+ (unsigned int)src[1] * 0x100 +
+ (unsigned int)src[2] * 0x10000 +
+ (unsigned int)src[3] * 0x1000000;
+}
+
+static inline unsigned int ceil_div(unsigned int dividend, unsigned divisor)
+{
+ return (dividend + divisor - 1) / divisor;
+}
+
+#endif
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c
new file mode 100644
index 000000000000..d5e5ebe1dc65
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_device.c
@@ -0,0 +1,708 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/cdev.h>
+#include <linux/gpio.h>
+#include <linux/uaccess.h>
+#include "synaptics_tcm_core.h"
+
+#define CHAR_DEVICE_NAME "tcm"
+
+#define CONCURRENT true
+
+#define DEVICE_IOC_MAGIC 's'
+#define DEVICE_IOC_RESET _IO(DEVICE_IOC_MAGIC, 0) /* 0x00007300 */
+#define DEVICE_IOC_IRQ _IOW(DEVICE_IOC_MAGIC, 1, int) /* 0x40047301 */
+#define DEVICE_IOC_RAW _IOW(DEVICE_IOC_MAGIC, 2, int) /* 0x40047302 */
+#define DEVICE_IOC_CONCURRENT _IOW(DEVICE_IOC_MAGIC, 3, int) /* 0x40047303 */
+
+struct device_hcd {
+ dev_t dev_num;
+ bool raw_mode;
+ bool concurrent;
+ unsigned int ref_count;
+ struct cdev char_dev;
+ struct class *class;
+ struct device *device;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_buffer report;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(device_remove_complete);
+
+static struct device_hcd *device_hcd;
+
+static int rmidev_major_num;
+
+static void device_capture_touch_report(unsigned int count)
+{
+ int retval;
+ unsigned char id;
+ unsigned int idx;
+ unsigned int size;
+ unsigned char *data;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+ static bool report;
+ static unsigned int offset;
+ static unsigned int remaining_size;
+
+ if (count < 2)
+ return;
+
+ data = &device_hcd->resp.buf[0];
+
+ if (data[0] != MESSAGE_MARKER)
+ return;
+
+ id = data[1];
+
+ size = 0;
+
+ LOCK_BUFFER(device_hcd->report);
+
+ switch (id) {
+ case REPORT_TOUCH:
+ if (count >= 4) {
+ remaining_size = le2_to_uint(&data[2]);
+ } else {
+ report = false;
+ goto exit;
+ }
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &device_hcd->report,
+ remaining_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for device_hcd->report.buf\n");
+ report = false;
+ goto exit;
+ }
+ idx = 4;
+ size = count - idx;
+ offset = 0;
+ report = true;
+ break;
+ case STATUS_CONTINUED_READ:
+ if (report == false)
+ goto exit;
+ if (count >= 2) {
+ idx = 2;
+ size = count - idx;
+ }
+ break;
+ default:
+ goto exit;
+ }
+
+ if (size) {
+ size = MIN(size, remaining_size);
+ retval = secure_memcpy(&device_hcd->report.buf[offset],
+ device_hcd->report.buf_size - offset,
+ &data[idx],
+ count - idx,
+ size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy touch report data\n");
+ report = false;
+ goto exit;
+ } else {
+ offset += size;
+ remaining_size -= size;
+ device_hcd->report.data_length += size;
+ }
+ }
+
+ if (remaining_size)
+ goto exit;
+
+ LOCK_BUFFER(tcm_hcd->report.buffer);
+
+ tcm_hcd->report.buffer.buf = device_hcd->report.buf;
+ tcm_hcd->report.buffer.buf_size = device_hcd->report.buf_size;
+ tcm_hcd->report.buffer.data_length = device_hcd->report.data_length;
+
+ tcm_hcd->report_touch();
+
+ UNLOCK_BUFFER(tcm_hcd->report.buffer);
+
+ report = false;
+
+exit:
+ UNLOCK_BUFFER(device_hcd->report);
+
+ return;
+}
+
+static int device_capture_touch_report_config(unsigned int count)
+{
+ int retval;
+ unsigned int size;
+ unsigned int buf_size;
+ unsigned char *data;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ if (device_hcd->raw_mode) {
+ if (count < 3) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid write data\n");
+ return -EINVAL;
+ }
+
+ size = le2_to_uint(&device_hcd->out.buf[1]);
+
+ if (count - 3 < size) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Incomplete write data\n");
+ return -EINVAL;
+ }
+
+ if (!size)
+ return 0;
+
+ data = &device_hcd->out.buf[3];
+ buf_size = device_hcd->out.buf_size - 3;
+ } else {
+ size = count - 1;
+
+ if (!size)
+ return 0;
+
+ data = &device_hcd->out.buf[1];
+ buf_size = device_hcd->out.buf_size - 1;
+ }
+
+ LOCK_BUFFER(tcm_hcd->config);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &tcm_hcd->config,
+ size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for tcm_hcd->config.buf\n");
+ UNLOCK_BUFFER(tcm_hcd->config);
+ return retval;
+ }
+
+ retval = secure_memcpy(tcm_hcd->config.buf,
+ tcm_hcd->config.buf_size,
+ data,
+ buf_size,
+ size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy touch report config data\n");
+ UNLOCK_BUFFER(tcm_hcd->config);
+ return retval;
+ }
+
+ tcm_hcd->config.data_length = size;
+
+ UNLOCK_BUFFER(tcm_hcd->config);
+
+ return 0;
+}
+
+#ifdef HAVE_UNLOCKED_IOCTL
+static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+#else
+static int device_ioctl(struct inode *inp, struct file *filp, unsigned int cmd,
+ unsigned long arg)
+#endif
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = 0;
+
+ switch (cmd) {
+ case DEVICE_IOC_RESET:
+ retval = tcm_hcd->reset(tcm_hcd, false, true);
+ break;
+ case DEVICE_IOC_IRQ:
+ if (arg == 0)
+ retval = tcm_hcd->enable_irq(tcm_hcd, false, false);
+ else if (arg == 1)
+ retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+ break;
+ case DEVICE_IOC_RAW:
+ if (arg == 0)
+ device_hcd->raw_mode = false;
+ else if (arg == 1)
+ device_hcd->raw_mode = true;
+ break;
+ case DEVICE_IOC_CONCURRENT:
+ if (arg == 0)
+ device_hcd->concurrent = false;
+ else if (arg == 1)
+ device_hcd->concurrent = true;
+ break;
+ default:
+ retval = -ENOTTY;
+ break;
+ }
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static loff_t device_llseek(struct file *filp, loff_t off, int whence)
+{
+ return -EINVAL;
+}
+
+static ssize_t device_read(struct file *filp, char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ if (count == 0)
+ return 0;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ LOCK_BUFFER(device_hcd->resp);
+
+ if (device_hcd->raw_mode) {
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &device_hcd->resp,
+ count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for device_hcd->resp.buf\n");
+ UNLOCK_BUFFER(device_hcd->resp);
+ goto exit;
+ }
+
+ retval = tcm_hcd->read_message(tcm_hcd,
+ device_hcd->resp.buf,
+ count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read message\n");
+ UNLOCK_BUFFER(device_hcd->resp);
+ goto exit;
+ }
+ } else {
+ if (count != device_hcd->resp.data_length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid length information\n");
+ UNLOCK_BUFFER(device_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+ }
+
+ if (copy_to_user(buf, device_hcd->resp.buf, count)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy data to user space\n");
+ UNLOCK_BUFFER(device_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!device_hcd->concurrent)
+ goto skip_concurrent;
+
+ if (tcm_hcd->report_touch == NULL) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Unable to report touch\n");
+ device_hcd->concurrent = false;
+ }
+
+ if (device_hcd->raw_mode)
+ device_capture_touch_report(count);
+
+skip_concurrent:
+ UNLOCK_BUFFER(device_hcd->resp);
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t device_write(struct file *filp, const char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ if (count == 0)
+ return 0;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ LOCK_BUFFER(device_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &device_hcd->out,
+ count == 1 ? count + 1 : count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for device_hcd->out.buf\n");
+ UNLOCK_BUFFER(device_hcd->out);
+ goto exit;
+ }
+
+ if (copy_from_user(device_hcd->out.buf, buf, count)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy data from user space\n");
+ UNLOCK_BUFFER(device_hcd->out);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ LOCK_BUFFER(device_hcd->resp);
+
+ if (device_hcd->raw_mode) {
+ retval = tcm_hcd->write_message(tcm_hcd,
+ device_hcd->out.buf[0],
+ &device_hcd->out.buf[1],
+ count - 1,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0);
+ } else {
+ mutex_lock(&tcm_hcd->reset_mutex);
+ retval = tcm_hcd->write_message(tcm_hcd,
+ device_hcd->out.buf[0],
+ &device_hcd->out.buf[1],
+ count - 1,
+ &device_hcd->resp.buf,
+ &device_hcd->resp.buf_size,
+ &device_hcd->resp.data_length,
+ NULL,
+ 0);
+ mutex_unlock(&tcm_hcd->reset_mutex);
+ }
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command 0x%02x\n",
+ device_hcd->out.buf[0]);
+ UNLOCK_BUFFER(device_hcd->resp);
+ UNLOCK_BUFFER(device_hcd->out);
+ goto exit;
+ }
+
+ if (count && device_hcd->out.buf[0] == CMD_SET_TOUCH_REPORT_CONFIG) {
+ retval = device_capture_touch_report_config(count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to capture touch report config\n");
+ }
+ }
+
+ UNLOCK_BUFFER(device_hcd->out);
+
+ if (device_hcd->raw_mode)
+ retval = count;
+ else
+ retval = device_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(device_hcd->resp);
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static int device_open(struct inode *inp, struct file *filp)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (device_hcd->ref_count < 1) {
+ device_hcd->ref_count++;
+ retval = 0;
+ } else {
+ retval = -EACCES;
+ }
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static int device_release(struct inode *inp, struct file *filp)
+{
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (device_hcd->ref_count)
+ device_hcd->ref_count--;
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return 0;
+}
+
+static char *device_devnode(struct device *dev, umode_t *mode)
+{
+ if (!mode)
+ return NULL;
+
+ *mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+
+ return kasprintf(GFP_KERNEL, "%s/%s", PLATFORM_DRIVER_NAME,
+ dev_name(dev));
+}
+
+static int device_create_class(void)
+{
+ struct syna_tcm_hcd *tcm_hcd = device_hcd->tcm_hcd;
+
+ if (device_hcd->class != NULL)
+ return 0;
+
+ device_hcd->class = class_create(THIS_MODULE, PLATFORM_DRIVER_NAME);
+
+ if (IS_ERR(device_hcd->class)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create class\n");
+ return -ENODEV;
+ }
+
+ device_hcd->class->devnode = device_devnode;
+
+ return 0;
+}
+
+static const struct file_operations device_fops = {
+ .owner = THIS_MODULE,
+#ifdef HAVE_UNLOCKED_IOCTL
+ .unlocked_ioctl = device_ioctl,
+#ifdef HAVE_COMPAT_IOCTL
+ .compat_ioctl = device_ioctl,
+#endif
+#else
+ .ioctl = device_ioctl,
+#endif
+ .llseek = device_llseek,
+ .read = device_read,
+ .write = device_write,
+ .open = device_open,
+ .release = device_release,
+};
+
+static int device_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ dev_t dev_num;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ device_hcd = kzalloc(sizeof(*device_hcd), GFP_KERNEL);
+ if (!device_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for device_hcd\n");
+ return -ENOMEM;
+ }
+
+ device_hcd->tcm_hcd = tcm_hcd;
+
+ device_hcd->concurrent = CONCURRENT;
+
+ INIT_BUFFER(device_hcd->out, false);
+ INIT_BUFFER(device_hcd->resp, false);
+ INIT_BUFFER(device_hcd->report, false);
+
+ if (rmidev_major_num) {
+ dev_num = MKDEV(rmidev_major_num, 0);
+ retval = register_chrdev_region(dev_num, 1,
+ PLATFORM_DRIVER_NAME);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to register char device\n");
+ goto err_register_chrdev_region;
+ }
+ } else {
+ retval = alloc_chrdev_region(&dev_num, 0, 1,
+ PLATFORM_DRIVER_NAME);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate char device\n");
+ goto err_alloc_chrdev_region;
+ }
+
+ rmidev_major_num = MAJOR(dev_num);
+ }
+
+ device_hcd->dev_num = dev_num;
+
+ cdev_init(&device_hcd->char_dev, &device_fops);
+
+ retval = cdev_add(&device_hcd->char_dev, dev_num, 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add char device\n");
+ goto err_add_chardev;
+ }
+
+ retval = device_create_class();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create class\n");
+ goto err_create_class;
+ }
+
+ device_hcd->device = device_create(device_hcd->class, NULL,
+ device_hcd->dev_num, NULL, CHAR_DEVICE_NAME"%d",
+ MINOR(device_hcd->dev_num));
+ if (IS_ERR(device_hcd->device)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create device\n");
+ retval = -ENODEV;
+ goto err_create_device;
+ }
+
+ if (bdata->irq_gpio >= 0) {
+ retval = gpio_export(bdata->irq_gpio, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to export GPIO\n");
+ } else {
+ retval = gpio_export_link(&tcm_hcd->pdev->dev,
+ "attn", bdata->irq_gpio);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to export GPIO link\n");
+ }
+ }
+ }
+
+ return 0;
+
+err_create_device:
+ class_destroy(device_hcd->class);
+
+err_create_class:
+ cdev_del(&device_hcd->char_dev);
+
+err_add_chardev:
+ unregister_chrdev_region(dev_num, 1);
+
+err_alloc_chrdev_region:
+err_register_chrdev_region:
+ RELEASE_BUFFER(device_hcd->report);
+ RELEASE_BUFFER(device_hcd->resp);
+ RELEASE_BUFFER(device_hcd->out);
+
+ kfree(device_hcd);
+ device_hcd = NULL;
+
+ return retval;
+}
+
+static int device_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!device_hcd)
+ goto exit;
+
+ device_destroy(device_hcd->class, device_hcd->dev_num);
+
+ class_destroy(device_hcd->class);
+
+ cdev_del(&device_hcd->char_dev);
+
+ unregister_chrdev_region(device_hcd->dev_num, 1);
+
+ RELEASE_BUFFER(device_hcd->report);
+ RELEASE_BUFFER(device_hcd->resp);
+ RELEASE_BUFFER(device_hcd->out);
+
+ kfree(device_hcd);
+ device_hcd = NULL;
+
+exit:
+ complete(&device_remove_complete);
+
+ return 0;
+}
+
+static int device_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!device_hcd) {
+ retval = device_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb device_module = {
+ .type = TCM_DEVICE,
+ .init = device_init,
+ .remove = device_remove,
+ .syncbox = NULL,
+ .asyncbox = NULL,
+ .reset = device_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init device_module_init(void)
+{
+ return syna_tcm_add_module(&device_module, true);
+}
+
+static void __exit device_module_exit(void)
+{
+ syna_tcm_add_module(&device_module, false);
+
+ wait_for_completion(&device_remove_complete);
+
+ return;
+}
+
+late_initcall(device_module_init);
+module_exit(device_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Device Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c
new file mode 100644
index 000000000000..b72dd7587f63
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_diagnostics.c
@@ -0,0 +1,567 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include "synaptics_tcm_core.h"
+
+#define SYSFS_DIR_NAME "diagnostics"
+
+enum pingpong_state {
+ PING = 0,
+ PONG = 1,
+};
+
+struct diag_hcd {
+ pid_t pid;
+ unsigned char report_type;
+ enum pingpong_state state;
+ struct kobject *sysfs_dir;
+ struct siginfo sigio;
+ struct task_struct *task;
+ struct syna_tcm_buffer ping;
+ struct syna_tcm_buffer pong;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(diag_remove_complete);
+
+static struct diag_hcd *diag_hcd;
+
+STORE_PROTOTYPE(diag, pid)
+SHOW_PROTOTYPE(diag, size)
+STORE_PROTOTYPE(diag, type)
+SHOW_PROTOTYPE(diag, rows)
+SHOW_PROTOTYPE(diag, cols)
+SHOW_PROTOTYPE(diag, hybrid)
+SHOW_PROTOTYPE(diag, buttons)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(pid),
+ ATTRIFY(size),
+ ATTRIFY(type),
+ ATTRIFY(rows),
+ ATTRIFY(cols),
+ ATTRIFY(hybrid),
+ ATTRIFY(buttons),
+};
+
+static ssize_t diag_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static struct bin_attribute bin_attr = {
+ .attr = {
+ .name = "data",
+ .mode = S_IRUGO,
+ },
+ .size = 0,
+ .read = diag_sysfs_data_show,
+};
+
+static ssize_t diag_sysfs_pid_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ diag_hcd->pid = input;
+
+ if (diag_hcd->pid) {
+ diag_hcd->task = pid_task(find_vpid(diag_hcd->pid),
+ PIDTYPE_PID);
+ if (!diag_hcd->task) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to locate task\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (diag_hcd->state == PING) {
+ LOCK_BUFFER(diag_hcd->ping);
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%u\n",
+ diag_hcd->ping.data_length);
+
+ UNLOCK_BUFFER(diag_hcd->ping);
+ } else {
+ LOCK_BUFFER(diag_hcd->pong);
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%u\n",
+ diag_hcd->pong.data_length);
+
+ UNLOCK_BUFFER(diag_hcd->pong);
+ }
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_type_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ diag_hcd->report_type = (unsigned char)input;
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return count;
+}
+
+static ssize_t diag_sysfs_rows_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned int rows;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ retval = -ENODEV;
+ goto exit;
+ }
+
+ app_info = &tcm_hcd->app_info;
+ rows = le2_to_uint(app_info->num_of_image_rows);
+
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", rows);
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_cols_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned int cols;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ retval = -ENODEV;
+ goto exit;
+ }
+
+ app_info = &tcm_hcd->app_info;
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", cols);
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_hybrid_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned int hybrid;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ retval = -ENODEV;
+ goto exit;
+ }
+
+ app_info = &tcm_hcd->app_info;
+ hybrid = le2_to_uint(app_info->has_hybrid_data);
+
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", hybrid);
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_buttons_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned int buttons;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ retval = -ENODEV;
+ goto exit;
+ }
+
+ app_info = &tcm_hcd->app_info;
+ buttons = le2_to_uint(app_info->num_of_buttons);
+
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", buttons);
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t diag_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int readlen;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = 0;
+
+ if (diag_hcd->state == PING) {
+ LOCK_BUFFER(diag_hcd->ping);
+
+ if (diag_hcd->ping.data_length == 0) {
+ readlen = 0;
+ goto exit;
+ }
+
+ readlen = MIN(count, diag_hcd->ping.data_length - pos);
+
+ if (diag_hcd->ping.data_length) {
+ retval = secure_memcpy(buf,
+ count,
+ &diag_hcd->ping.buf[pos],
+ diag_hcd->ping.buf_size - pos,
+ readlen);
+ }
+
+ UNLOCK_BUFFER(diag_hcd->ping);
+ } else {
+ LOCK_BUFFER(diag_hcd->pong);
+
+ if (diag_hcd->pong.data_length == 0) {
+ readlen = 0;
+ goto exit;
+ }
+
+ readlen = MIN(count, diag_hcd->pong.data_length - pos);
+
+ if (diag_hcd->pong.data_length) {
+ retval = secure_memcpy(buf,
+ count,
+ &diag_hcd->pong.buf[pos],
+ diag_hcd->pong.buf_size - pos,
+ readlen);
+ }
+
+ UNLOCK_BUFFER(diag_hcd->pong);
+ }
+
+exit:
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy report data\n");
+ } else {
+ retval = readlen;
+ }
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static void diag_report(void)
+{
+ int retval;
+ static enum pingpong_state state = PING;
+ struct syna_tcm_hcd *tcm_hcd = diag_hcd->tcm_hcd;
+
+ if (state == PING) {
+ LOCK_BUFFER(diag_hcd->ping);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &diag_hcd->ping,
+ tcm_hcd->report.buffer.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for diag_hcd->ping.buf\n");
+ UNLOCK_BUFFER(diag_hcd->ping);
+ return;
+ }
+
+ retval = secure_memcpy(diag_hcd->ping.buf,
+ diag_hcd->ping.buf_size,
+ tcm_hcd->report.buffer.buf,
+ tcm_hcd->report.buffer.buf_size,
+ tcm_hcd->report.buffer.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy report data\n");
+ UNLOCK_BUFFER(diag_hcd->ping);
+ return;
+ }
+
+ diag_hcd->ping.data_length = tcm_hcd->report.buffer.data_length;
+
+ UNLOCK_BUFFER(diag_hcd->ping);
+
+ diag_hcd->state = state;
+ state = PONG;
+ } else {
+ LOCK_BUFFER(diag_hcd->pong);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &diag_hcd->pong,
+ tcm_hcd->report.buffer.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for diag_hcd->pong.buf\n");
+ UNLOCK_BUFFER(diag_hcd->pong);
+ return;
+ }
+
+ retval = secure_memcpy(diag_hcd->pong.buf,
+ diag_hcd->pong.buf_size,
+ tcm_hcd->report.buffer.buf,
+ tcm_hcd->report.buffer.buf_size,
+ tcm_hcd->report.buffer.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy report data\n");
+ UNLOCK_BUFFER(diag_hcd->pong);
+ return;
+ }
+
+ diag_hcd->pong.data_length = tcm_hcd->report.buffer.data_length;
+
+ UNLOCK_BUFFER(diag_hcd->pong);
+
+ diag_hcd->state = state;
+ state = PING;
+ }
+
+ if (diag_hcd->pid)
+ send_sig_info(SIGIO, &diag_hcd->sigio, diag_hcd->task);
+
+ return;
+}
+
+static int diag_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ int idx;
+
+ diag_hcd = kzalloc(sizeof(*diag_hcd), GFP_KERNEL);
+ if (!diag_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for diag_hcd\n");
+ return -ENOMEM;
+ }
+
+ diag_hcd->tcm_hcd = tcm_hcd;
+ diag_hcd->state = PING;
+
+ INIT_BUFFER(diag_hcd->ping, false);
+ INIT_BUFFER(diag_hcd->pong, false);
+
+ memset(&diag_hcd->sigio, 0x00, sizeof(diag_hcd->sigio));
+ diag_hcd->sigio.si_signo = SIGIO;
+ diag_hcd->sigio.si_code = SI_USER;
+
+ diag_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!diag_hcd->sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(diag_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ retval = sysfs_create_bin_file(diag_hcd->sysfs_dir, &bin_attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs bin file\n");
+ goto err_sysfs_create_bin_file;
+ }
+
+ return 0;
+
+err_sysfs_create_bin_file:
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(diag_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(diag_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+ RELEASE_BUFFER(diag_hcd->pong);
+ RELEASE_BUFFER(diag_hcd->ping);
+
+ kfree(diag_hcd);
+ diag_hcd = NULL;
+
+ return retval;
+}
+
+static int diag_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ int idx;
+
+ if (!diag_hcd)
+ goto exit;
+
+ sysfs_remove_bin_file(diag_hcd->sysfs_dir, &bin_attr);
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++)
+ sysfs_remove_file(diag_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(diag_hcd->sysfs_dir);
+
+ RELEASE_BUFFER(diag_hcd->pong);
+ RELEASE_BUFFER(diag_hcd->ping);
+
+ kfree(diag_hcd);
+ diag_hcd = NULL;
+
+exit:
+ complete(&diag_remove_complete);
+
+ return 0;
+}
+
+static int diag_syncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!diag_hcd)
+ return 0;
+
+ if (tcm_hcd->report.id == diag_hcd->report_type)
+ diag_report();
+
+ return 0;
+}
+
+static int diag_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!diag_hcd) {
+ retval = diag_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb diag_module = {
+ .type = TCM_DIAGNOSTICS,
+ .init = diag_init,
+ .remove = diag_remove,
+ .syncbox = diag_syncbox,
+ .asyncbox = NULL,
+ .reset = diag_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init diag_module_init(void)
+{
+ return syna_tcm_add_module(&diag_module, true);
+}
+
+static void __exit diag_module_exit(void)
+{
+ syna_tcm_add_module(&diag_module, false);
+
+ wait_for_completion(&diag_remove_complete);
+
+ return;
+}
+
+late_initcall(diag_module_init);
+module_exit(diag_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Diagnostics Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c
new file mode 100644
index 000000000000..e0b662253621
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_i2c.c
@@ -0,0 +1,536 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/i2c.h>
+#include <linux/of_gpio.h>
+#include "synaptics_tcm_core.h"
+
+#define XFER_ATTEMPTS 10
+
+static unsigned char *buf;
+
+static unsigned int buf_size;
+
+static struct syna_tcm_bus_io bus_io;
+
+static struct syna_tcm_hw_interface hw_if;
+
+static struct platform_device *syna_tcm_i2c_device;
+
+#ifdef CONFIG_OF
+static int parse_dt(struct device *dev, struct syna_tcm_board_data *bdata)
+{
+ int retval;
+ u32 value;
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+ const char *name;
+
+ prop = of_find_property(np, "synaptics,irq-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->irq_gpio = of_get_named_gpio_flags(np,
+ "synaptics,irq-gpio", 0,
+ (enum of_gpio_flags *)&bdata->irq_flags);
+ } else {
+ bdata->irq_gpio = -1;
+ }
+
+ retval = of_property_read_u32(np, "synaptics,irq-on-state", &value);
+ if (retval < 0)
+ bdata->irq_on_state = 0;
+ else
+ bdata->irq_on_state = value;
+
+ retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name);
+ if (retval < 0)
+ bdata->pwr_reg_name = NULL;
+ else
+ bdata->pwr_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,bus-reg-name", &name);
+ if (retval < 0)
+ bdata->bus_reg_name = NULL;
+ else
+ bdata->bus_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,lab-reg-name", &name);
+ if (retval < 0)
+ bdata->lab_reg_name = NULL;
+ else
+ bdata->lab_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,ibb-reg-name", &name);
+ if (retval < 0)
+ bdata->ibb_reg_name = NULL;
+ else
+ bdata->ibb_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,i2c-reg-name", &name);
+ if (retval < 0)
+ bdata->i2c_reg_name = NULL;
+ else
+ bdata->i2c_reg_name = name;
+
+ prop = of_find_property(np, "synaptics,power-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->power_gpio = of_get_named_gpio_flags(np,
+ "synaptics,power-gpio", 0, NULL);
+ } else {
+ bdata->power_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,power-on-state", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-on-state",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,power-on-state property\n");
+ return retval;
+ } else {
+ bdata->power_on_state = value;
+ }
+ } else {
+ bdata->power_on_state = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,power-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-delay-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,power-delay-ms property\n");
+ return retval;
+ } else {
+ bdata->power_delay_ms = value;
+ }
+ } else {
+ bdata->power_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->reset_gpio = of_get_named_gpio_flags(np,
+ "synaptics,reset-gpio", 0, NULL);
+ } else {
+ bdata->reset_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,mdss-reset", NULL);
+ if (prop && prop->length) {
+ bdata->mdss_reset = of_get_named_gpio_flags(np,
+ "synaptics,mdss-reset", 0, NULL);
+ } else {
+ bdata->mdss_reset = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-on-state", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-on-state",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,reset-on-state property\n");
+ return retval;
+ } else {
+ bdata->reset_on_state = value;
+ }
+ } else {
+ bdata->reset_on_state = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-active-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-active-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,reset-active-ms property\n");
+ return retval;
+ } else {
+ bdata->reset_active_ms = value;
+ }
+ } else {
+ bdata->reset_active_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-delay-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,reset-delay-ms property\n");
+ return retval;
+ } else {
+ bdata->reset_delay_ms = value;
+ }
+ } else {
+ bdata->reset_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,x-flip", NULL);
+ bdata->x_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,y-flip", NULL);
+ bdata->y_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,swap-axes", NULL);
+ bdata->swap_axes = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,ubl-i2c-addr", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,ubl-i2c-addr",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,ubl-i2c-addr property\n");
+ return retval;
+ } else {
+ bdata->ubl_i2c_addr = value;
+ }
+ } else {
+ bdata->ubl_i2c_addr = 0;
+ }
+
+ return 0;
+}
+#endif
+
+static int syna_tcm_i2c_alloc_mem(struct syna_tcm_hcd *tcm_hcd,
+ unsigned int size)
+{
+ struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent);
+
+ if (size > buf_size) {
+ if (buf_size)
+ kfree(buf);
+ buf = kmalloc(size, GFP_KERNEL);
+ if (!buf) {
+ LOGE(&i2c->dev,
+ "Failed to allocate memory for buf\n");
+ buf_size = 0;
+ return -ENOMEM;
+ }
+ buf_size = size;
+ }
+
+ return 0;
+}
+
+static int syna_tcm_i2c_rmi_read(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ int retval;
+ unsigned char address;
+ unsigned int attempt;
+ struct i2c_msg msg[2];
+ struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ address = (unsigned char)addr;
+
+ msg[0].addr = bdata->ubl_i2c_addr;
+ msg[0].flags = 0;
+ msg[0].len = 1;
+ msg[0].buf = &address;
+
+ msg[1].addr = bdata->ubl_i2c_addr;
+ msg[1].flags = I2C_M_RD;
+ msg[1].len = length;
+ msg[1].buf = data;
+
+ for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) {
+ if (i2c_transfer(i2c->adapter, msg, 2) == 2) {
+ retval = length;
+ goto exit;
+ }
+ LOGE(&i2c->dev,
+ "Transfer attempt %d failed\n",
+ attempt + 1);
+
+ if (attempt + 1 == XFER_ATTEMPTS) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ msleep(20);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_i2c_rmi_write(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ int retval;
+ unsigned int attempt;
+ unsigned int byte_count;
+ struct i2c_msg msg;
+ struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ byte_count = length + 1;
+
+ retval = syna_tcm_i2c_alloc_mem(tcm_hcd, byte_count);
+ if (retval < 0) {
+ LOGE(&i2c->dev,
+ "Failed to allocate memory\n");
+ goto exit;
+ }
+
+ buf[0] = (unsigned char)addr;
+ retval = secure_memcpy(&buf[1],
+ buf_size - 1,
+ data,
+ length,
+ length);
+ if (retval < 0) {
+ LOGE(&i2c->dev,
+ "Failed to copy write data\n");
+ goto exit;
+ }
+
+ msg.addr = bdata->ubl_i2c_addr;
+ msg.flags = 0;
+ msg.len = byte_count;
+ msg.buf = buf;
+
+ for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) {
+ if (i2c_transfer(i2c->adapter, &msg, 1) == 1) {
+ retval = length;
+ goto exit;
+ }
+ LOGE(&i2c->dev,
+ "Transfer attempt %d failed\n",
+ attempt + 1);
+
+ if (attempt + 1 == XFER_ATTEMPTS) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ msleep(20);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_i2c_read(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length)
+{
+ int retval;
+ unsigned int attempt;
+ struct i2c_msg msg;
+ struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent);
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ msg.addr = i2c->addr;
+ msg.flags = I2C_M_RD;
+ msg.len = length;
+ msg.buf = data;
+
+ for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) {
+ if (i2c_transfer(i2c->adapter, &msg, 1) == 1) {
+ retval = length;
+ goto exit;
+ }
+ LOGE(&i2c->dev,
+ "Transfer attempt %d failed\n",
+ attempt + 1);
+
+ if (attempt + 1 == XFER_ATTEMPTS) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ msleep(20);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_i2c_write(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length)
+{
+ int retval;
+ unsigned int attempt;
+ struct i2c_msg msg;
+ struct i2c_client *i2c = to_i2c_client(tcm_hcd->pdev->dev.parent);
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ msg.addr = i2c->addr;
+ msg.flags = 0;
+ msg.len = length;
+ msg.buf = data;
+
+ for (attempt = 0; attempt < XFER_ATTEMPTS; attempt++) {
+ if (i2c_transfer(i2c->adapter, &msg, 1) == 1) {
+ retval = length;
+ goto exit;
+ }
+ LOGE(&i2c->dev,
+ "Transfer attempt %d failed\n",
+ attempt + 1);
+
+ if (attempt + 1 == XFER_ATTEMPTS) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ msleep(20);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *dev_id)
+{
+ int retval;
+
+ syna_tcm_i2c_device = platform_device_alloc(PLATFORM_DRIVER_NAME, 0);
+ if (!syna_tcm_i2c_device) {
+ LOGE(&i2c->dev,
+ "Failed to allocate platform device\n");
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_OF
+ hw_if.bdata = devm_kzalloc(&i2c->dev, sizeof(*hw_if.bdata), GFP_KERNEL);
+ if (!hw_if.bdata) {
+ LOGE(&i2c->dev,
+ "Failed to allocate memory for board data\n");
+ return -ENOMEM;
+ }
+ parse_dt(&i2c->dev, hw_if.bdata);
+#else
+ hw_if.bdata = i2c->dev.platform_data;
+#endif
+
+ bus_io.type = BUS_I2C;
+ bus_io.read = syna_tcm_i2c_read;
+ bus_io.write = syna_tcm_i2c_write;
+ bus_io.rmi_read = syna_tcm_i2c_rmi_read;
+ bus_io.rmi_write = syna_tcm_i2c_rmi_write;
+
+ hw_if.bus_io = &bus_io;
+
+ syna_tcm_i2c_device->dev.parent = &i2c->dev;
+ syna_tcm_i2c_device->dev.platform_data = &hw_if;
+
+ retval = platform_device_add(syna_tcm_i2c_device);
+ if (retval < 0) {
+ LOGE(&i2c->dev,
+ "Failed to add platform device\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int syna_tcm_i2c_remove(struct i2c_client *i2c)
+{
+ syna_tcm_i2c_device->dev.platform_data = NULL;
+
+ platform_device_unregister(syna_tcm_i2c_device);
+
+ return 0;
+}
+
+static const struct i2c_device_id syna_tcm_id_table[] = {
+ {I2C_MODULE_NAME, 0},
+ {},
+};
+MODULE_DEVICE_TABLE(i2c, syna_tcm_id_table);
+
+#ifdef CONFIG_OF
+static struct of_device_id syna_tcm_of_match_table[] = {
+ {
+ .compatible = "synaptics,tcm-i2c",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, syna_tcm_of_match_table);
+#else
+#define syna_tcm_of_match_table NULL
+#endif
+
+static struct i2c_driver syna_tcm_i2c_driver = {
+ .driver = {
+ .name = I2C_MODULE_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = syna_tcm_of_match_table,
+ },
+ .probe = syna_tcm_i2c_probe,
+ .remove = syna_tcm_i2c_remove,
+ .id_table = syna_tcm_id_table,
+};
+
+int syna_tcm_bus_init(void)
+{
+ return i2c_add_driver(&syna_tcm_i2c_driver);
+}
+EXPORT_SYMBOL(syna_tcm_bus_init);
+
+void syna_tcm_bus_exit(void)
+{
+ kfree(buf);
+
+ i2c_del_driver(&syna_tcm_i2c_driver);
+
+ return;
+}
+EXPORT_SYMBOL(syna_tcm_bus_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM I2C Bus Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c
new file mode 100644
index 000000000000..f315a278ae12
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_interface.c
@@ -0,0 +1,603 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017 Synaptics Incorporated. All rights reserved.
+ * Copyright (C) 2020 XiaoMi, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/firmware.h>
+#include "synaptics_tcm_core.h"
+
+#define SYSFS_DIR_NAME "xiaomi_interface"
+
+#define INTF_REPORT_TIMEOUT_100MS 30
+
+
+struct xiaomi_intf_hcd {
+ /* handler for synaptiucs tcm device */
+ struct syna_tcm_hcd *tcm_hcd;
+ /* to create the sysfs */
+ struct kobject *sysfs_dir;
+ /* flag to indicate the error out during the process */
+ bool err_flag;
+
+ /* for report image using */
+ int *report_data;
+ unsigned char report_rows;
+ unsigned char report_cols;
+ unsigned char report_type;
+ bool report_is_ready;
+};
+
+DECLARE_COMPLETION(xiaomi_intf_remove_complete);
+
+static struct xiaomi_intf_hcd *intf_hcd;
+
+SHOW_STORE_PROTOTYPE(intf, get_rawordiff_data)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(get_rawordiff_data),
+};
+
+/*
+ * helper function to set the report type
+ * input:
+ * 0 = raw image
+ * 1 = delta image
+ *
+ * return:
+ * true = valid report ; false = invalid report
+ */
+static bool intf_helper_set_report_type(int input)
+{
+ bool is_valid = false;
+ struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd;
+
+ switch (input) {
+ case 0: /* raw image */
+ intf_hcd->report_type = REPORT_RAW;
+ is_valid = true;
+ break;
+ case 1: /* delta image */
+ intf_hcd->report_type = REPORT_DELTA;
+ is_valid = true;
+ break;
+ default:
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "unknown input [0:raw/1:delta] (input = %d)\n", input);
+ is_valid = false;
+ break;
+ }
+
+ return is_valid;
+}
+/*
+ * helper function to enable/disable the report stream
+ * input:
+ * true = enable / false = disable
+ * return:
+ * 0 = succeed ; otherwise, failure
+ */
+static int intf_helper_enable_report(bool enable)
+{
+ int retval;
+ unsigned char report_touch = REPORT_TOUCH;
+ struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd;
+ unsigned char command;
+
+ /* to disable the touch report if delta/raw report stream is enabled */
+ if (enable) {
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_DISABLE_REPORT,
+ &report_touch,
+ 1,
+ &tcm_hcd->resp.buf,
+ &tcm_hcd->resp.buf_size,
+ &tcm_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to disable touch report\n");
+ return -EINVAL;
+ }
+ }
+ /* otherwise, resume the touch report */
+ else {
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_ENABLE_REPORT,
+ &report_touch,
+ 1,
+ &tcm_hcd->resp.buf,
+ &tcm_hcd->resp.buf_size,
+ &tcm_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to disable touch report\n");
+ return -EINVAL;
+ }
+ }
+
+ if (enable)
+ command = CMD_ENABLE_REPORT;
+ else
+ command = CMD_DISABLE_REPORT;
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ command,
+ &intf_hcd->report_type,
+ 1,
+ &tcm_hcd->resp.buf,
+ &tcm_hcd->resp.buf_size,
+ &tcm_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to write command %s\n", STR(command));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * function to get a raw/delta data image
+ *
+ * input:
+ * which - 0 = raw image
+ * 1 = delta image
+ * *data - an integer array containing (Tx rows * Rx columns)
+ * return:
+ * succeed- 0
+ * fail - (-EINVAL)
+ */
+static int intf_helper_get_rawordiff_data(int which, int *data)
+{
+ int retval = -EINVAL;
+ struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd;
+ unsigned char timeout_count = 0;
+ short *p_data_16;
+ struct syna_tcm_buffer buf;
+ int i, j;
+
+ if (!data) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "invalid parameter, data buffer\n");
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+
+ intf_hcd->err_flag = true;
+
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "invalid app status (id_info.mode = 0x%x) (app_status = 0x%x)\n",
+ tcm_hcd->id_info.mode, tcm_hcd->app_status);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!intf_helper_set_report_type(which)) {
+ retval = -EINVAL;
+ LOGE(tcm_hcd->pdev->dev.parent, "failed to set report type\n");
+ goto exit;
+ }
+
+ intf_hcd->report_is_ready = false;
+
+ intf_hcd->report_rows =
+ le2_to_uint(tcm_hcd->app_info.num_of_image_rows);
+ intf_hcd->report_cols =
+ le2_to_uint(tcm_hcd->app_info.num_of_image_cols);
+
+ INIT_BUFFER(buf, false);
+
+ /* send tcm command - to enable the report */
+ if (intf_helper_enable_report(true) < 0) {
+ retval = -EINVAL;
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to enable the requested report\n");
+ goto exit;
+ }
+
+ /* waiting for the completion of requested report */
+ do {
+ if (timeout_count == INTF_REPORT_TIMEOUT_100MS)
+ break;
+
+ msleep(100);
+ timeout_count++;
+ } while (!intf_hcd->report_is_ready);
+
+ if (timeout_count == INTF_REPORT_TIMEOUT_100MS) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "timeout waiting for a report image\n");
+
+ intf_helper_enable_report(false); /* close the report stream */
+
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ /* clone the request report data */
+ LOCK_BUFFER(buf);
+
+ buf.buf = kzalloc(tcm_hcd->report.buffer.data_length, GFP_KERNEL);
+ if (!buf.buf) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to allocate temporary buffer\n");
+ UNLOCK_BUFFER(buf);
+
+ intf_helper_enable_report(false); /* close the report stream */
+
+ RELEASE_BUFFER(buf);
+ retval = -EINVAL;
+ goto exit;
+ }
+ buf.buf_size = tcm_hcd->report.buffer.data_length;
+ buf.data_length = 0;
+
+ memcpy((void *)buf.buf,
+ (const void *)tcm_hcd->report.buffer.buf,
+ buf.buf_size);
+ buf.data_length = tcm_hcd->report.buffer.data_length;
+
+ UNLOCK_BUFFER(buf);
+
+ /* to disable the report stream */
+ if (intf_helper_enable_report(false) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to disable the report\n");
+ return -EINVAL;
+ }
+
+ /* move data to the output buffer */
+ p_data_16 = (short *)buf.buf;
+ for (i = 0; i < intf_hcd->report_rows; i++) {
+ for (j = 0; j < intf_hcd->report_cols; j++) {
+ data[i*intf_hcd->report_cols + j] = (int)*p_data_16;
+
+ p_data_16++;
+ }
+ }
+
+ retval = 0;
+ RELEASE_BUFFER(buf);
+
+exit:
+ return retval;
+}
+
+
+/*
+ * sysfs name - get_rawordiff_data
+ * description - funciton will call intf_helper_get_rawordiff_data to get
+ * a report image
+ * usage -
+ * $ echo [0/1] > get_rawordiff_data
+ */
+static ssize_t intf_sysfs_get_rawordiff_data_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct syna_tcm_hcd *tcm_hcd = intf_hcd->tcm_hcd;
+ int report_size;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ intf_hcd->err_flag = false;
+
+ intf_hcd->report_rows =
+ le2_to_uint(tcm_hcd->app_info.num_of_image_rows);
+ intf_hcd->report_cols =
+ le2_to_uint(tcm_hcd->app_info.num_of_image_cols);
+ report_size = intf_hcd->report_rows * intf_hcd->report_cols;
+
+ /* allocate the buffer for one report data */
+ intf_hcd->report_data = kzalloc(report_size*sizeof(int), GFP_KERNEL);
+ if (!intf_hcd->report_data) {
+
+ intf_hcd->err_flag = true;
+
+ retval = -ENOMEM;
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to allocate mem for intf_hcd->report_data\n");
+ goto exit;
+ }
+
+ /* to get the requested report */
+ retval = intf_helper_get_rawordiff_data((int)input, intf_hcd->report_data);
+ if (retval < 0) {
+ intf_hcd->err_flag = true;
+
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to get the requested image (type: %x)\n",
+ input);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ return retval;
+}
+/*
+ * sysfs name - get_rawordiff_data
+ * description - funciton will show the image data onto the stdout
+ * usage -
+ * $ cat get_rawordiff_data
+ */
+static ssize_t intf_sysfs_get_rawordiff_data_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int row, col;
+ int i, j;
+ int cnt;
+ int count = 0;
+ int *p_data;
+
+ if (!intf_hcd->report_data)
+ return snprintf(buf, PAGE_SIZE,
+ "\nerror: report data is not allocated\n\n");
+
+ if (intf_hcd->err_flag) {
+ kfree(intf_hcd->report_data);
+ intf_hcd->report_data = NULL;
+
+ return snprintf(buf, PAGE_SIZE,
+ "\nerror: unable to get the requested image\n\n");
+ }
+
+ /* print out the report data */
+ row = intf_hcd->report_rows;
+ col = intf_hcd->report_cols;
+
+ p_data = &intf_hcd->report_data[0];
+ for (i = 0; i < row; i++) {
+ for (j = 0; j < col; j++) {
+ if (intf_hcd->report_type == REPORT_RAW)
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ", *p_data);
+ else
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-3d ", *p_data);
+
+ buf += cnt;
+ count += cnt;
+
+ p_data++;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ /* release the allocated buffer */
+ kfree(intf_hcd->report_data);
+ intf_hcd->report_data = NULL;
+
+ return count;
+}
+
+static ssize_t syna_data_dump_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ int retval;
+ int cnt = 0;
+ u8 *buffer = NULL;
+
+ if (*pos != 0)
+ return -EINVAL;
+ buffer = vmalloc(PAGE_SIZE + PAGE_SIZE / 2);
+ if (!buffer)
+ return -ENOMEM;
+ retval = intf_sysfs_get_rawordiff_data_store(NULL, NULL, "0", 2);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "get differ data error\n");
+ goto out;
+ }
+ retval = intf_sysfs_get_rawordiff_data_show(NULL, NULL, buffer);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "get differ data error\n");
+ goto out;
+ }
+ cnt += strlen(buffer);
+ retval = intf_sysfs_get_rawordiff_data_store(NULL, NULL, "1", 2);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "get raw data error\n");
+ goto out;
+ }
+ retval = intf_sysfs_get_rawordiff_data_show(NULL, NULL, buffer + cnt);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "get raw data error\n");
+ goto out;
+ }
+ cnt = strlen(buffer);
+
+ if (copy_to_user(buf, buffer, strlen(buffer))) {
+ retval = -EFAULT;
+ goto out;
+ }
+out:
+ cnt = strlen(buffer);
+ *pos += cnt;
+ vfree(buffer);
+ buffer = NULL;
+ if (retval < 0)
+ return retval;
+ else
+ return cnt;
+}
+
+
+static const struct file_operations syna_data_dump_ops = {
+ .read = syna_data_dump_read,
+};
+
+
+/*
+ * module initialization
+ * to allocate the struct xiaomi_intf_hcd, then create the sysfs files
+ */
+static int xiaomi_intf_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ int idx;
+
+ LOGN(tcm_hcd->pdev->dev.parent, "+\n");
+
+ intf_hcd = kzalloc(sizeof(struct xiaomi_intf_hcd), GFP_KERNEL);
+ if (!intf_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to allocate memory for xiaomi_intf_hcd\n");
+ return -ENOMEM;
+ }
+
+ intf_hcd->tcm_hcd = tcm_hcd;
+
+ intf_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!intf_hcd->sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to create sysfs directory\n");
+ goto err_sysfs_create_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(intf_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ intf_hcd->err_flag = false;
+ intf_hcd->report_data = NULL;
+ intf_hcd->report_cols = 0;
+ intf_hcd->report_rows = 0;
+ proc_create("tp_data_dump", 0644, NULL, &syna_data_dump_ops);
+
+ return 0;
+
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(intf_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(intf_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+ kfree(intf_hcd);
+ intf_hcd = NULL;
+
+ return retval;
+}
+
+/*
+ * to remove the module and sysfs files as well
+ */
+static int xiaomi_intf_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ int idx;
+
+ LOGN(tcm_hcd->pdev->dev.parent, "+\n");
+
+ if (!intf_hcd)
+ goto exit;
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++)
+ sysfs_remove_file(intf_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(intf_hcd->sysfs_dir);
+
+ kfree(intf_hcd);
+ intf_hcd = NULL;
+
+exit:
+ complete(&xiaomi_intf_remove_complete);
+
+ return 0;
+}
+
+/*
+ * call by synaptics_tcm_core.c when a tcm message is dispatched
+ */
+static int xiaomi_intf_syncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!intf_hcd)
+ return 0;
+
+ /* once to receive a requested report */
+ if (tcm_hcd->report.id == intf_hcd->report_type)
+ intf_hcd->report_is_ready = true;
+
+ return 0;
+}
+
+
+/*
+ * module definition, xiaomi_intf_module
+ */
+
+static struct syna_tcm_module_cb xiaomi_intf_module = {
+ .type = TCM_XIAOMI_INTERFACE,
+ .init = xiaomi_intf_init,
+ .remove = xiaomi_intf_remove,
+ .syncbox = xiaomi_intf_syncbox,
+ .asyncbox = NULL,
+ .reset = NULL,
+ .suspend = NULL,
+ .resume = NULL,
+};
+
+static int __init xiaomi_intf_module_init(void)
+{
+ return syna_tcm_add_module(&xiaomi_intf_module, true);
+}
+
+static void __exit xiaomi_intf_module_exit(void)
+{
+ syna_tcm_add_module(&xiaomi_intf_module, false);
+
+ wait_for_completion(&xiaomi_intf_remove_complete);
+
+ return;
+}
+
+late_initcall(xiaomi_intf_module_init);
+module_exit(xiaomi_intf_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM XIAOMI Interface Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c
new file mode 100644
index 000000000000..cb7c37301d1b
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_recovery.c
@@ -0,0 +1,900 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include "synaptics_tcm_core.h"
+
+#define SET_UP_RECOVERY_MODE true
+
+#define ENABLE_SYSFS_INTERFACE true
+
+#define SYSFS_DIR_NAME "recovery"
+
+#define IHEX_BUF_SIZE (2048 * 1024)
+
+#define DATA_BUF_SIZE (512 * 1024)
+
+#define IHEX_RECORD_SIZE 14
+
+#define PDT_START_ADDR 0x00e9
+
+#define UBL_FN_NUMBER 0x35
+
+#define F35_CHUNK_SIZE 16
+
+#define F35_CHUNK_SIZE_WORDS 8
+
+#define F35_ERASE_ALL_WAIT_MS 5000
+
+#define F35_ERASE_ALL_POLL_MS 100
+
+#define F35_DATA5_OFFSET 5
+
+#define F35_CTRL3_OFFSET 18
+
+#define F35_RESET_COMMAND 16
+
+#define F35_ERASE_ALL_COMMAND 3
+
+#define F35_WRITE_CHUNK_COMMAND 2
+
+#define F35_READ_FLASH_STATUS_COMMAND 1
+
+struct rmi_pdt_entry {
+ unsigned char query_base_addr;
+ unsigned char command_base_addr;
+ unsigned char control_base_addr;
+ unsigned char data_base_addr;
+ unsigned char intr_src_count:3;
+ unsigned char reserved_1:2;
+ unsigned char fn_version:2;
+ unsigned char reserved_2:1;
+ unsigned char fn_number;
+} __packed;
+
+struct rmi_addr {
+ unsigned short query_base;
+ unsigned short command_base;
+ unsigned short control_base;
+ unsigned short data_base;
+};
+
+struct recovery_hcd {
+ bool set_up_recovery_mode;
+ unsigned char chunk_buf[F35_CHUNK_SIZE + 3];
+ unsigned char out_buf[3];
+ unsigned char *ihex_buf;
+ unsigned char *data_buf;
+ unsigned int ihex_size;
+ unsigned int ihex_records;
+ unsigned int data_entries;
+ struct kobject *sysfs_dir;
+ struct rmi_addr f35_addr;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(recovery_remove_complete);
+
+static struct recovery_hcd *recovery_hcd;
+
+static int recovery_do_recovery(void);
+
+STORE_PROTOTYPE(recovery, recovery)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(recovery),
+};
+
+static ssize_t recovery_sysfs_ihex_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static struct bin_attribute bin_attr = {
+ .attr = {
+ .name = "ihex",
+ .mode = (S_IWUSR | S_IWGRP),
+ },
+ .size = 0,
+ .write = recovery_sysfs_ihex_store,
+};
+
+static ssize_t recovery_sysfs_recovery_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ recovery_hcd->set_up_recovery_mode = true;
+ else if (input == 2)
+ recovery_hcd->set_up_recovery_mode = false;
+ else
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ if (recovery_hcd->ihex_size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get ihex data\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (recovery_hcd->ihex_size % IHEX_RECORD_SIZE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid ihex data\n");
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ recovery_hcd->ihex_records = recovery_hcd->ihex_size / IHEX_RECORD_SIZE;
+
+ retval = recovery_do_recovery();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do recovery\n");
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ recovery_hcd->set_up_recovery_mode = SET_UP_RECOVERY_MODE;
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t recovery_sysfs_ihex_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = secure_memcpy(&recovery_hcd->ihex_buf[pos],
+ IHEX_BUF_SIZE - pos,
+ buf,
+ count,
+ count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy ihex data\n");
+ recovery_hcd->ihex_size = 0;
+ goto exit;
+ }
+
+ recovery_hcd->ihex_size = pos + count;
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static int recovery_device_reset(void)
+{
+ int retval;
+ unsigned char command;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ command = F35_RESET_COMMAND;
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ recovery_hcd->f35_addr.control_base + F35_CTRL3_OFFSET,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write F$35 command\n");
+ return retval;
+ }
+
+ msleep(bdata->reset_delay_ms);
+
+ return 0;
+}
+
+static int recovery_add_data_entry(unsigned char data)
+{
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ if (recovery_hcd->data_entries >= DATA_BUF_SIZE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Reached data buffer size limit\n");
+ return -EINVAL;
+ }
+
+ recovery_hcd->data_buf[recovery_hcd->data_entries++] = data;
+
+ return 0;
+}
+
+static int recovery_add_padding(unsigned int *words)
+{
+ int retval;
+ unsigned int padding;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ padding = (F35_CHUNK_SIZE_WORDS - *words % F35_CHUNK_SIZE_WORDS);
+ padding %= F35_CHUNK_SIZE_WORDS;
+
+ while (padding) {
+ retval = recovery_add_data_entry(0xff);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+
+ retval = recovery_add_data_entry(0xff);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+
+ (*words)++;
+ padding--;
+ }
+
+ return 0;
+}
+
+static int recovery_parse_ihex(void)
+{
+ int retval;
+ unsigned char colon;
+ unsigned char *buf;
+ unsigned int addr;
+ unsigned int type;
+ unsigned int addrl;
+ unsigned int addrh;
+ unsigned int data0;
+ unsigned int data1;
+ unsigned int count;
+ unsigned int words;
+ unsigned int offset;
+ unsigned int record;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ words = 0;
+
+ offset = 0;
+
+ buf = recovery_hcd->ihex_buf;
+
+ recovery_hcd->data_entries = 0;
+
+ for (record = 0; record < recovery_hcd->ihex_records; record++) {
+ buf[(record + 1) * IHEX_RECORD_SIZE - 1] = 0x00;
+ retval = sscanf(&buf[record * IHEX_RECORD_SIZE],
+ "%c%02x%02x%02x%02x%02x%02x",
+ &colon,
+ &count,
+ &addrh,
+ &addrl,
+ &type,
+ &data0,
+ &data1);
+ if (retval != 7) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read ihex record\n");
+ return -EINVAL;
+ }
+
+ if (type == 0x00) {
+ if ((words % F35_CHUNK_SIZE_WORDS) == 0) {
+ addr = (addrh << 8) + addrl;
+ addr += offset;
+ addr >>= 4;
+
+ retval = recovery_add_data_entry(addr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+
+ retval = recovery_add_data_entry(addr >> 8);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+ }
+
+ retval = recovery_add_data_entry(data0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+
+ retval = recovery_add_data_entry(data1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add data entry\n");
+ return retval;
+ }
+
+ words++;
+ } else if (type == 0x02) {
+ retval = recovery_add_padding(&words);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add padding\n");
+ return retval;
+ }
+
+ offset = (data0 << 8) + data1;
+ offset <<= 4;
+ }
+ }
+
+ retval = recovery_add_padding(&words);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to add padding\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int recovery_check_status(void)
+{
+ int retval;
+ unsigned char status;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ recovery_hcd->f35_addr.data_base,
+ &status,
+ sizeof(status));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read status\n");
+ return retval;
+ }
+
+ status = status & 0x1f;
+
+ if (status != 0x00) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Recovery mode status = 0x%02x\n",
+ status);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int recovery_write_flash(void)
+{
+ int retval;
+ unsigned char *data_ptr;
+ unsigned int chunk_buf_size;
+ unsigned int chunk_data_size;
+ unsigned int entries_written;
+ unsigned int entries_to_write;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ entries_written = 0;
+
+ data_ptr = recovery_hcd->data_buf;
+
+ chunk_buf_size = sizeof(recovery_hcd->chunk_buf);
+
+ chunk_data_size = chunk_buf_size - 1;
+
+ recovery_hcd->chunk_buf[chunk_buf_size - 1] = F35_WRITE_CHUNK_COMMAND;
+
+ while (entries_written < recovery_hcd->data_entries) {
+ entries_to_write = F35_CHUNK_SIZE + 2;
+
+ retval = secure_memcpy(recovery_hcd->chunk_buf,
+ chunk_buf_size - 1,
+ data_ptr,
+ recovery_hcd->data_entries - entries_written,
+ entries_to_write);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy chunk data\n");
+ return retval;
+ }
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ recovery_hcd->f35_addr.control_base,
+ recovery_hcd->chunk_buf,
+ chunk_buf_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write chunk data\n");
+ return retval;
+ }
+
+ data_ptr += entries_to_write;
+ entries_written += entries_to_write;
+ }
+
+ retval = recovery_check_status();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get no error recovery mode status\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int recovery_poll_erase_completion(void)
+{
+ int retval;
+ unsigned char status;
+ unsigned char command;
+ unsigned char data_base;
+ unsigned int timeout;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ timeout = F35_ERASE_ALL_WAIT_MS;
+
+ data_base = recovery_hcd->f35_addr.data_base;
+
+ do {
+ command = F35_READ_FLASH_STATUS_COMMAND;
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ recovery_hcd->f35_addr.command_base,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write F$35 command\n");
+ return retval;
+ }
+
+ do {
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ recovery_hcd->f35_addr.command_base,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read command status\n");
+ return retval;
+ }
+
+ if (command == 0x00)
+ break;
+
+ if (timeout == 0)
+ break;
+
+ msleep(F35_ERASE_ALL_POLL_MS);
+ timeout -= F35_ERASE_ALL_POLL_MS;
+ } while (true);
+
+ if (command != 0 && timeout == 0) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ data_base + F35_DATA5_OFFSET,
+ &status,
+ sizeof(status));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read flash status\n");
+ return retval;
+ }
+
+ if ((status & 0x01) == 0x00)
+ break;
+
+ if (timeout == 0) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ msleep(F35_ERASE_ALL_POLL_MS);
+ timeout -= F35_ERASE_ALL_POLL_MS;
+ } while (true);
+
+ retval = 0;
+
+exit:
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get erase completion\n");
+ }
+
+ return retval;
+}
+
+static int recovery_erase_flash(void)
+{
+ int retval;
+ unsigned char command;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ command = F35_ERASE_ALL_COMMAND;
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ recovery_hcd->f35_addr.control_base + F35_CTRL3_OFFSET,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write F$35 command\n");
+ return retval;
+ }
+
+ if (recovery_hcd->f35_addr.command_base) {
+ retval = recovery_poll_erase_completion();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to wait for erase completion\n");
+ return retval;
+ }
+ } else {
+ msleep(F35_ERASE_ALL_WAIT_MS);
+ }
+
+ retval = recovery_check_status();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get no error recovery mode status\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int recovery_set_up_recovery_mode(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ retval = tcm_hcd->identify(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ return retval;
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enter bootloader mode\n");
+ return retval;
+ }
+ }
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ recovery_hcd->out_buf[0],
+ &recovery_hcd->out_buf[1],
+ 2,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_REBOOT_TO_ROM_BOOTLOADER));
+ return retval;
+ }
+
+ msleep(bdata->reset_delay_ms);
+
+ return 0;
+}
+
+static int recovery_do_recovery(void)
+{
+ int retval;
+ struct rmi_pdt_entry p_entry;
+ struct syna_tcm_hcd *tcm_hcd = recovery_hcd->tcm_hcd;
+
+ retval = recovery_parse_ihex();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to parse ihex data\n");
+ return retval;
+ }
+
+ if (recovery_hcd->set_up_recovery_mode) {
+ retval = recovery_set_up_recovery_mode();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up recovery mode\n");
+ return retval;
+ }
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ PDT_START_ADDR,
+ (unsigned char *)&p_entry,
+ sizeof(p_entry));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read PDT entry\n");
+ return retval;
+ }
+
+ if (p_entry.fn_number != UBL_FN_NUMBER) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to find F$35\n");
+ return -ENODEV;
+ }
+
+ recovery_hcd->f35_addr.query_base = p_entry.query_base_addr;
+ recovery_hcd->f35_addr.command_base = p_entry.command_base_addr;
+ recovery_hcd->f35_addr.control_base = p_entry.control_base_addr;
+ recovery_hcd->f35_addr.data_base = p_entry.data_base_addr;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Start of recovery\n");
+
+ retval = recovery_erase_flash();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to erase flash\n");
+ return retval;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Flash erased\n");
+
+ retval = recovery_write_flash();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to flash\n");
+ return retval;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Flash written\n");
+
+ retval = recovery_device_reset();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ return retval;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "End of recovery\n");
+
+ if (recovery_hcd->set_up_recovery_mode)
+ return 0;
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable interrupt\n");
+ return retval;
+ }
+
+ retval = tcm_hcd->identify(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ return retval;
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION) {
+ retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ return retval;
+ }
+ }
+
+ return 0;
+}
+
+static int recovery_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ int idx;
+
+ recovery_hcd = kzalloc(sizeof(*recovery_hcd), GFP_KERNEL);
+ if (!recovery_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for recovery_hcd\n");
+ return -ENOMEM;
+ }
+
+ recovery_hcd->ihex_buf = kzalloc(IHEX_BUF_SIZE, GFP_KERNEL);
+ if (!recovery_hcd->ihex_buf) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for recovery_hcd->ihex_buf\n");
+ goto err_allocate_ihex_buf;
+ }
+
+ recovery_hcd->data_buf = kzalloc(DATA_BUF_SIZE, GFP_KERNEL);
+ if (!recovery_hcd->data_buf) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for recovery_hcd->data_buf\n");
+ goto err_allocate_data_buf;
+ }
+
+ recovery_hcd->tcm_hcd = tcm_hcd;
+
+ recovery_hcd->set_up_recovery_mode = SET_UP_RECOVERY_MODE;
+
+ recovery_hcd->out_buf[0] = CMD_REBOOT_TO_ROM_BOOTLOADER;
+ recovery_hcd->out_buf[1] = 0;
+ recovery_hcd->out_buf[2] = 0;
+
+ if (ENABLE_SYSFS_INTERFACE == false)
+ return 0;
+
+ recovery_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!recovery_hcd->sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(recovery_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ retval = sysfs_create_bin_file(recovery_hcd->sysfs_dir, &bin_attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs bin file\n");
+ goto err_sysfs_create_bin_file;
+ }
+
+ return 0;
+
+err_sysfs_create_bin_file:
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(recovery_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(recovery_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+ kfree(recovery_hcd->data_buf);
+err_allocate_data_buf:
+ kfree(recovery_hcd->ihex_buf);
+err_allocate_ihex_buf:
+ kfree(recovery_hcd);
+ recovery_hcd = NULL;
+
+ return retval;
+}
+
+static int recovery_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ int idx;
+
+ if (!recovery_hcd)
+ goto exit;
+
+ if (ENABLE_SYSFS_INTERFACE == true) {
+ sysfs_remove_bin_file(recovery_hcd->sysfs_dir, &bin_attr);
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ sysfs_remove_file(recovery_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ }
+
+ kobject_put(recovery_hcd->sysfs_dir);
+ }
+
+ kfree(recovery_hcd->data_buf);
+ kfree(recovery_hcd->ihex_buf);
+ kfree(recovery_hcd);
+ recovery_hcd = NULL;
+
+exit:
+ complete(&recovery_remove_complete);
+
+ return 0;
+}
+
+static int recovery_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!recovery_hcd) {
+ retval = recovery_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb recovery_module = {
+ .type = TCM_RECOVERY,
+ .init = recovery_init,
+ .remove = recovery_remove,
+ .syncbox = NULL,
+ .asyncbox = NULL,
+ .reset = recovery_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init recovery_module_init(void)
+{
+ return syna_tcm_add_module(&recovery_module, true);
+}
+
+static void __exit recovery_module_exit(void)
+{
+ syna_tcm_add_module(&recovery_module, false);
+
+ wait_for_completion(&recovery_remove_complete);
+
+ return;
+}
+
+late_initcall(recovery_module_init);
+module_exit(recovery_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Recovery Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c
new file mode 100644
index 000000000000..698916c1af34
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_reflash.c
@@ -0,0 +1,2262 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/crc32.h>
+#include <linux/firmware.h>
+#include "synaptics_tcm_core.h"
+
+#define STARTUP_REFLASH
+#define FORCE_REFLASH false
+
+#define DISPLAY_REFLASH true
+
+#define ENABLE_SYSFS_INTERFACE true
+
+#define SYSFS_DIR_NAME "reflash"
+
+#define CUSTOM_DIR_NAME "custom"
+
+#define FW_IMAGE_NAME "synaptics_boe_4320.fw"
+
+#define BOOT_CONFIG_ID "BOOT_CONFIG"
+
+#define APP_CODE_ID "APP_CODE"
+
+#define PROD_TEST_ID "APP_PROD_TEST"
+
+#define APP_CONFIG_ID "APP_CONFIG"
+
+#define DISP_CONFIG_ID "DISPLAY"
+
+#define FB_READY_COUNT 1
+
+#define FB_READY_WAIT_MS 100
+
+#define FB_READY_TIMEOUT_S 130
+
+#define IMAGE_FILE_MAGIC_VALUE 0x4818472b
+
+#define FLASH_AREA_MAGIC_VALUE 0x7c05e516
+
+#define BOOT_CONFIG_SIZE 8
+
+#define BOOT_CONFIG_SLOTS 16
+
+#define IMAGE_BUF_SIZE (512 * 1024)
+
+#define ERASE_FLASH_DELAY_MS 500
+
+#define WRITE_FLASH_DELAY_MS 20
+
+#define REFLASH (1 << 0)
+
+#define FORCE_UPDATE (1 << 1)
+
+#define APP_CFG_UPDATE (1 << 2)
+
+#define DISP_CFG_UPDATE (1 << 3)
+
+#define BOOT_CFG_UPDATE (1 << 4)
+
+#define BOOT_CFG_LOCKDOWN (1 << 5)
+
+#define reflash_write(p_name) \
+static int reflash_write_##p_name(void) \
+{ \
+ int retval; \
+ unsigned int size; \
+ unsigned int flash_addr; \
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \
+ const unsigned char *data; \
+\
+ data = reflash_hcd->image_info.p_name.data; \
+ size = reflash_hcd->image_info.p_name.size; \
+ flash_addr = reflash_hcd->image_info.p_name.flash_addr; \
+\
+ retval = reflash_write_flash(flash_addr, data, size); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to write to flash\n"); \
+ return retval; \
+ } \
+\
+ return 0; \
+}
+
+#define reflash_erase(p_name) \
+static int reflash_erase_##p_name(void) \
+{ \
+ int retval; \
+ unsigned int size; \
+ unsigned int flash_addr; \
+ unsigned int page_start; \
+ unsigned int page_count; \
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \
+\
+ flash_addr = reflash_hcd->image_info.p_name.flash_addr; \
+\
+ page_start = flash_addr / reflash_hcd->page_size; \
+\
+ size = reflash_hcd->image_info.p_name.size; \
+ page_count = ceil_div(size, reflash_hcd->page_size); \
+\
+ LOGD(tcm_hcd->pdev->dev.parent, \
+ "Page start = %d\n", \
+ page_start); \
+\
+ LOGD(tcm_hcd->pdev->dev.parent, \
+ "Page count = %d\n", \
+ page_count); \
+\
+ retval = reflash_erase_flash(page_start, page_count); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to erase flash pages\n"); \
+ return retval; \
+ } \
+\
+ return 0; \
+}
+
+#define reflash_update(p_name) \
+static int reflash_update_##p_name(bool reset) \
+{ \
+ int retval; \
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd; \
+\
+ retval = reflash_set_up_flash_access(); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to set up flash access\n"); \
+ return retval; \
+ } \
+\
+ tcm_hcd->update_watchdog(tcm_hcd, false); \
+\
+ retval = reflash_check_##p_name(); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed "#p_name" partition check\n"); \
+ reset = true; \
+ goto reset; \
+ } \
+\
+ retval = reflash_erase_##p_name(); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to erase "#p_name" partition\n"); \
+ reset = true; \
+ goto reset; \
+ } \
+\
+ LOGN(tcm_hcd->pdev->dev.parent, \
+ "Partition erased ("#p_name")\n"); \
+\
+ retval = reflash_write_##p_name(); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to write "#p_name" partition\n"); \
+ reset = true; \
+ goto reset; \
+ } \
+\
+ LOGN(tcm_hcd->pdev->dev.parent, \
+ "Partition written ("#p_name")\n"); \
+\
+ retval = 0; \
+\
+reset: \
+ if (!reset) \
+ goto exit; \
+\
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to do reset\n"); \
+ } \
+\
+exit: \
+ tcm_hcd->update_watchdog(tcm_hcd, true); \
+\
+ return retval; \
+}
+
+#define reflash_show_data() \
+{ \
+ LOCK_BUFFER(reflash_hcd->read); \
+\
+ readlen = MIN(count, reflash_hcd->read.data_length - pos); \
+\
+ retval = secure_memcpy(buf, \
+ count, \
+ &reflash_hcd->read.buf[pos], \
+ reflash_hcd->read.buf_size - pos, \
+ readlen); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to copy read data\n"); \
+ } else { \
+ retval = readlen; \
+ } \
+\
+ UNLOCK_BUFFER(reflash_hcd->read); \
+}
+
+enum update_area {
+ NONE = 0,
+ FIRMWARE_CONFIG,
+ CONFIG_ONLY,
+};
+
+struct app_config_header {
+ unsigned short magic_value[4];
+ unsigned char checksum[4];
+ unsigned char length[2];
+ unsigned char build_id[4];
+ unsigned char customer_config_id[16];
+};
+
+struct area_descriptor {
+ unsigned char magic_value[4];
+ unsigned char id_string[16];
+ unsigned char flags[4];
+ unsigned char flash_addr_words[4];
+ unsigned char length[4];
+ unsigned char checksum[4];
+};
+
+struct block_data {
+ const unsigned char *data;
+ unsigned int size;
+ unsigned int flash_addr;
+};
+
+struct image_info {
+ struct block_data boot_config;
+ struct block_data app_firmware;
+ struct block_data prod_test_firmware;
+ struct block_data app_config;
+ struct block_data disp_config;
+};
+
+struct image_header {
+ unsigned char magic_value[4];
+ unsigned char num_of_areas[4];
+};
+
+struct boot_config {
+ union {
+ unsigned char i2c_address;
+ struct {
+ unsigned char cpha:1;
+ unsigned char cpol:1;
+ unsigned char word0_b2__7:6;
+ } __packed;
+ };
+ unsigned char attn_polarity:1;
+ unsigned char attn_drive:2;
+ unsigned char attn_pullup:1;
+ unsigned char word0_b12__14:3;
+ unsigned char used:1;
+ unsigned short customer_part_id;
+ unsigned short boot_timeout;
+ unsigned short continue_on_reset:1;
+ unsigned short word3_b1__15:15;
+} __packed;
+
+struct reflash_hcd {
+ bool force_update;
+ bool disp_cfg_update;
+ const unsigned char *image;
+ unsigned char *image_buf;
+ unsigned int image_size;
+ unsigned int page_size;
+ unsigned int write_block_size;
+ unsigned int max_write_payload_size;
+ const struct firmware *fw_entry;
+ struct mutex reflash_mutex;
+ struct kobject *sysfs_dir;
+ struct kobject *custom_dir;
+ struct work_struct work;
+ struct workqueue_struct *workqueue;
+ struct image_info image_info;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_buffer read;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(reflash_remove_complete);
+
+static struct reflash_hcd *reflash_hcd;
+
+static int reflash_get_fw_image(void);
+
+static int reflash_read_data(enum flash_area area, bool run_app_firmware,
+ struct syna_tcm_buffer *output);
+
+static int reflash_update_custom_otp(const unsigned char *data,
+ unsigned int offset, unsigned int datalen);
+
+static int reflash_update_custom_lcm(const unsigned char *data,
+ unsigned int offset, unsigned int datalen);
+
+static int reflash_update_custom_oem(const unsigned char *data,
+ unsigned int offset, unsigned int datalen);
+
+static int reflash_update_boot_config(bool lock);
+
+static int reflash_update_app_config(bool reset);
+
+static int reflash_update_disp_config(bool reset);
+
+static int reflash_do_reflash(void);
+
+STORE_PROTOTYPE(reflash, reflash)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(reflash),
+};
+
+static ssize_t reflash_sysfs_image_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_lockdown_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_lockdown_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_lcm_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_lcm_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_oem_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t reflash_sysfs_oem_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static struct bin_attribute bin_attrs[] = {
+ {
+ .attr = {
+ .name = "image",
+ .mode = (S_IWUSR | S_IWGRP),
+ },
+ .size = 0,
+ .write = reflash_sysfs_image_store,
+ },
+ {
+ .attr = {
+ .name = "lockdown",
+ .mode = (S_IRUGO | S_IWUSR | S_IWGRP),
+ },
+ .size = 0,
+ .read = reflash_sysfs_lockdown_show,
+ .write = reflash_sysfs_lockdown_store,
+ },
+ {
+ .attr = {
+ .name = "lcm",
+ .mode = (S_IRUGO | S_IWUSR | S_IWGRP),
+ },
+ .size = 0,
+ .read = reflash_sysfs_lcm_show,
+ .write = reflash_sysfs_lcm_store,
+ },
+ {
+ .attr = {
+ .name = "oem",
+ .mode = (S_IRUGO | S_IWUSR | S_IWGRP),
+ },
+ .size = 0,
+ .read = reflash_sysfs_oem_show,
+ .write = reflash_sysfs_oem_store,
+ },
+};
+
+static ssize_t reflash_sysfs_reflash_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ pm_stay_awake(&tcm_hcd->pdev->dev);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ if (reflash_hcd->image_size != 0)
+ reflash_hcd->image = reflash_hcd->image_buf;
+
+ reflash_hcd->force_update = input & FORCE_UPDATE ? true : false;
+
+ if (input & REFLASH || input & FORCE_UPDATE) {
+ retval = reflash_do_reflash();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reflash\n");
+ goto exit;
+ }
+ }
+
+ if ((input & ~(REFLASH | FORCE_UPDATE)) == 0) {
+ retval = count;
+ goto exit;
+ }
+
+ retval = reflash_get_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get firmware image\n");
+ goto exit;
+ }
+
+ if (input & BOOT_CFG_LOCKDOWN) {
+ retval = reflash_update_boot_config(true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to lockdown boot config\n");
+ goto exit;
+ }
+ } else if (input & BOOT_CFG_UPDATE) {
+ retval = reflash_update_boot_config(false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to update boot config\n");
+ goto exit;
+ }
+ }
+
+ if (input & REFLASH || input & FORCE_UPDATE) {
+ retval = count;
+ goto exit;
+ }
+
+ if (input & DISP_CFG_UPDATE) {
+ if (input & APP_CFG_UPDATE)
+ retval = reflash_update_disp_config(false);
+ else
+ retval = reflash_update_disp_config(true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash display config\n");
+ goto exit;
+ }
+ }
+
+ if (input & APP_CFG_UPDATE) {
+ retval = reflash_update_app_config(true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash application config\n");
+ goto exit;
+ }
+ }
+
+ retval = count;
+
+exit:
+ if (reflash_hcd->fw_entry) {
+ release_firmware(reflash_hcd->fw_entry);
+ reflash_hcd->fw_entry = NULL;
+ }
+
+ reflash_hcd->image = NULL;
+ reflash_hcd->image_size = 0;
+ reflash_hcd->force_update = FORCE_REFLASH;
+
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ pm_relax(&tcm_hcd->pdev->dev);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_image_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = secure_memcpy(&reflash_hcd->image_buf[pos],
+ IMAGE_BUF_SIZE - pos,
+ buf,
+ count,
+ count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy firmware image data\n");
+ reflash_hcd->image_size = 0;
+ goto exit;
+ }
+
+ reflash_hcd->image_size = pos + count;
+
+ retval = count;
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+static ssize_t reflash_sysfs_lockdown_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int readlen;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+ int i = 0;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_read_data(CUSTOM_OTP, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read lockdown data\n");
+ goto exit;
+ }
+ for (i = 0; i < LOCKDOWN_SIZE; i++)
+ pr_info("%x ", reflash_hcd->read.buf[i]);
+
+ reflash_show_data();
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_lockdown_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ pm_stay_awake(&tcm_hcd->pdev->dev);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_update_custom_otp(buf, pos, count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to update custom OTP data\n");
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ pm_relax(&tcm_hcd->pdev->dev);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_lcm_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int readlen;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_read_data(CUSTOM_LCM, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read LCM data\n");
+ goto exit;
+ }
+
+ reflash_show_data();
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_lcm_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ pm_stay_awake(&tcm_hcd->pdev->dev);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_update_custom_lcm(buf, pos, count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to update custom LCM data\n");
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ pm_relax(&tcm_hcd->pdev->dev);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_oem_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int readlen;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_read_data(CUSTOM_OEM, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read OEM data\n");
+ goto exit;
+ }
+
+ reflash_show_data();
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t reflash_sysfs_oem_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ pm_stay_awake(&tcm_hcd->pdev->dev);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_update_custom_oem(buf, pos, count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to update custom OEM data\n");
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ pm_relax(&tcm_hcd->pdev->dev);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static int reflash_set_up_flash_access(void)
+{
+ int retval;
+ unsigned int temp;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ retval = tcm_hcd->identify(tcm_hcd, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ return retval;
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enter bootloader mode\n");
+ return retval;
+ }
+ }
+
+ temp = tcm_hcd->boot_info.write_block_size_words;
+ reflash_hcd->write_block_size = temp * 2;
+
+ temp = le2_to_uint(tcm_hcd->boot_info.erase_page_size_words);
+ reflash_hcd->page_size = temp * 2;
+
+ temp = le2_to_uint(tcm_hcd->boot_info.max_write_payload_size);
+ reflash_hcd->max_write_payload_size = temp;
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Write block size = %d\n",
+ reflash_hcd->write_block_size);
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Page size = %d\n",
+ reflash_hcd->page_size);
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Max write payload size = %d\n",
+ reflash_hcd->max_write_payload_size);
+
+ if (reflash_hcd->write_block_size > (tcm_hcd->wr_chunk_size - 5)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Write block size greater than available chunk space\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_parse_fw_image(void)
+{
+ unsigned int idx;
+ unsigned int addr;
+ unsigned int offset;
+ unsigned int length;
+ unsigned int checksum;
+ unsigned int flash_addr;
+ unsigned int magic_value;
+ unsigned int num_of_areas;
+ struct image_header *header;
+ struct image_info *image_info;
+ struct area_descriptor *descriptor;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+ const unsigned char *image;
+ const unsigned char *content;
+
+ image = reflash_hcd->image;
+ image_info = &reflash_hcd->image_info;
+ header = (struct image_header *)image;
+
+ magic_value = le4_to_uint(header->magic_value);
+ if (magic_value != IMAGE_FILE_MAGIC_VALUE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid image file magic value\n");
+ return -EINVAL;
+ }
+
+ memset(image_info, 0x00, sizeof(*image_info));
+
+ offset = sizeof(*header);
+ num_of_areas = le4_to_uint(header->num_of_areas);
+
+ for (idx = 0; idx < num_of_areas; idx++) {
+ addr = le4_to_uint(image + offset);
+ descriptor = (struct area_descriptor *)(image + addr);
+ offset += 4;
+
+ magic_value = le4_to_uint(descriptor->magic_value);
+ if (magic_value != FLASH_AREA_MAGIC_VALUE)
+ continue;
+
+ length = le4_to_uint(descriptor->length);
+ content = (unsigned char *)descriptor + sizeof(*descriptor);
+ flash_addr = le4_to_uint(descriptor->flash_addr_words) * 2;
+ checksum = le4_to_uint(descriptor->checksum);
+
+ if (0 == strncmp((char *)descriptor->id_string,
+ BOOT_CONFIG_ID,
+ strlen(BOOT_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Boot config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->boot_config.size = length;
+ image_info->boot_config.data = content;
+ image_info->boot_config.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Boot config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Boot config flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ APP_CODE_ID,
+ strlen(APP_CODE_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application firmware checksum error\n");
+ return -EINVAL;
+ }
+ image_info->app_firmware.size = length;
+ image_info->app_firmware.data = content;
+ image_info->app_firmware.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application firmware size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application firmware flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ PROD_TEST_ID,
+ strlen(PROD_TEST_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Production test firmware checksum error\n");
+ return -EINVAL;
+ }
+ image_info->prod_test_firmware.size = length;
+ image_info->prod_test_firmware.data = content;
+ image_info->prod_test_firmware.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Production test firmware size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Production test firmware flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ APP_CONFIG_ID,
+ strlen(APP_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->app_config.size = length;
+ image_info->app_config.data = content;
+ image_info->app_config.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application config flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ DISP_CONFIG_ID,
+ strlen(DISP_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Display config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->disp_config.size = length;
+ image_info->disp_config.data = content;
+ image_info->disp_config.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Display config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Display config flash address = 0x%08x\n",
+ flash_addr);
+ }
+ }
+
+ return 0;
+}
+
+static int reflash_get_fw_image(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image == NULL) {
+ retval = request_firmware(&reflash_hcd->fw_entry, FW_IMAGE_NAME,
+ tcm_hcd->pdev->dev.parent);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to request %s\n",
+ FW_IMAGE_NAME);
+ return retval;
+ }
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Firmware image size = %d\n",
+ (unsigned int)reflash_hcd->fw_entry->size);
+
+ reflash_hcd->image = reflash_hcd->fw_entry->data;
+ reflash_hcd->image_size = reflash_hcd->fw_entry->size;
+ }
+
+ retval = reflash_parse_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to parse firmware image\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static enum update_area reflash_compare_id_info(void)
+{
+ enum update_area update_area;
+ unsigned int device_fw_id;
+ unsigned int image_fw_id;
+ unsigned int idx;
+ unsigned char *image_config_id;
+ unsigned char *device_config_id;
+ struct app_config_header *header;
+ const unsigned char *app_config_data;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+ update_area = NONE;
+
+ if (reflash_hcd->image_info.app_config.size < sizeof(*header)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid application config in image file\n");
+ goto exit;
+ }
+
+ app_config_data = reflash_hcd->image_info.app_config.data;
+ header = (struct app_config_header *)app_config_data;
+
+ if (reflash_hcd->force_update) {
+ update_area = FIRMWARE_CONFIG;
+ goto exit;
+ }
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION) {
+ update_area = FIRMWARE_CONFIG;
+ goto exit;
+ }
+
+ image_fw_id = le4_to_uint(header->build_id);
+ device_fw_id = tcm_hcd->packrat_number;
+
+ if (image_fw_id != device_fw_id) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Image firmware ID %d is not equal device firmware ID %d\n", image_fw_id, device_fw_id);
+ update_area = FIRMWARE_CONFIG;
+ goto exit;
+ } else {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Image firmware ID is equal device firmware ID %d\n", device_fw_id);
+ update_area = NONE;
+ }
+
+ image_config_id = header->customer_config_id;
+ device_config_id = tcm_hcd->app_info.customer_config_id;
+ for (idx = 0; idx < 16; idx++) {
+ if (image_config_id[idx] != device_config_id[idx]) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Image config ID[] is not equal device config ID\n");
+ update_area = CONFIG_ONLY;
+ goto exit;
+ } else if (image_config_id[idx] < device_config_id[idx]) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Image config ID older than device config ID\n");
+ update_area = NONE;
+ goto exit;
+ }
+ }
+
+ update_area = NONE;
+
+exit:
+ if (update_area == NONE) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "No need to do reflash\n");
+ } else {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Updating %s\n",
+ update_area == FIRMWARE_CONFIG ?
+ "firmware and config" :
+ "config only");
+ }
+
+ return update_area;
+}
+
+static int reflash_read_flash(unsigned int address, unsigned char *data,
+ unsigned int datalen)
+{
+ int retval;
+ unsigned int length_words;
+ unsigned int flash_addr_words;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ LOCK_BUFFER(reflash_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &reflash_hcd->out,
+ 6);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for reflash_hcd->out.buf\n");
+ UNLOCK_BUFFER(reflash_hcd->out);
+ return retval;
+ }
+
+ length_words = datalen / 2;
+ flash_addr_words = address / 2;
+
+ reflash_hcd->out.buf[0] = (unsigned char)flash_addr_words;
+ reflash_hcd->out.buf[1] = (unsigned char)(flash_addr_words >> 8);
+ reflash_hcd->out.buf[2] = (unsigned char)(flash_addr_words >> 16);
+ reflash_hcd->out.buf[3] = (unsigned char)(flash_addr_words >> 24);
+ reflash_hcd->out.buf[4] = (unsigned char)length_words;
+ reflash_hcd->out.buf[5] = (unsigned char)(length_words >> 8);
+
+ LOCK_BUFFER(reflash_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_READ_FLASH,
+ reflash_hcd->out.buf,
+ 6,
+ &reflash_hcd->resp.buf,
+ &reflash_hcd->resp.buf_size,
+ &reflash_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_READ_FLASH));
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ UNLOCK_BUFFER(reflash_hcd->out);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->out);
+
+ if (reflash_hcd->resp.data_length != datalen) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read requested length\n");
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ return -EIO;
+ }
+
+ retval = secure_memcpy(data,
+ datalen,
+ reflash_hcd->resp.buf,
+ reflash_hcd->resp.buf_size,
+ datalen);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy read data\n");
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->resp);
+
+ return 0;
+}
+
+static int reflash_read_data(enum flash_area area, bool run_app_firmware,
+ struct syna_tcm_buffer *output)
+{
+ int retval;
+ unsigned int temp;
+ unsigned int addr;
+ unsigned int length;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_boot_info *boot_info;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ switch (area) {
+ case CUSTOM_LCM:
+ case CUSTOM_OEM:
+ case PPDT:
+ retval = tcm_hcd->get_data_location(tcm_hcd,
+ area,
+ &addr,
+ &length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get data location\n");
+ return retval;
+ }
+ break;
+ default:
+ break;
+ }
+
+ retval = reflash_set_up_flash_access();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up flash access\n");
+ return retval;
+ }
+
+ app_info = &tcm_hcd->app_info;
+ boot_info = &tcm_hcd->boot_info;
+
+ switch (area) {
+ case BOOT_CONFIG:
+ temp = le2_to_uint(boot_info->boot_config_start_block);
+ addr = temp * reflash_hcd->write_block_size;
+ length = BOOT_CONFIG_SIZE * BOOT_CONFIG_SLOTS;
+ break;
+ case APP_CONFIG:
+ temp = le2_to_uint(app_info->app_config_start_write_block);
+ addr = temp * reflash_hcd->write_block_size;
+ length = le2_to_uint(app_info->app_config_size);
+ break;
+ case DISP_CONFIG:
+ temp = le4_to_uint(boot_info->display_config_start_block);
+ addr = temp * reflash_hcd->write_block_size;
+ temp = le2_to_uint(boot_info->display_config_length_blocks);
+ length = temp * reflash_hcd->write_block_size;
+ break;
+ case CUSTOM_OTP:
+ temp = le2_to_uint(boot_info->custom_otp_start_block);
+ addr = temp * reflash_hcd->write_block_size;
+ temp = le2_to_uint(boot_info->custom_otp_length_blocks);
+ length = temp * reflash_hcd->write_block_size;
+ break;
+ case CUSTOM_LCM:
+ case CUSTOM_OEM:
+ case PPDT:
+ addr *= reflash_hcd->write_block_size;
+ length *= reflash_hcd->write_block_size;
+ break;
+ default:
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data area\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (addr == 0 || length == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data area unavailable\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ LOCK_BUFFER(reflash_hcd->read);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &reflash_hcd->read,
+ length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for reflash_hcd->read.buf\n");
+ UNLOCK_BUFFER(reflash_hcd->read);
+ goto run_app_firmware;
+ }
+
+ retval = reflash_read_flash(addr, reflash_hcd->read.buf, length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read from flash\n");
+ UNLOCK_BUFFER(reflash_hcd->read);
+ goto run_app_firmware;
+ }
+
+ reflash_hcd->read.data_length = length;
+
+ if (output != NULL) {
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ output,
+ length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for output->buf\n");
+ UNLOCK_BUFFER(reflash_hcd->read);
+ goto run_app_firmware;
+ }
+
+ retval = secure_memcpy(output->buf,
+ output->buf_size,
+ reflash_hcd->read.buf,
+ reflash_hcd->read.buf_size,
+ length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy read data\n");
+ UNLOCK_BUFFER(reflash_hcd->read);
+ goto run_app_firmware;
+ }
+
+ output->data_length = length;
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->read);
+
+ retval = 0;
+
+run_app_firmware:
+ if (!run_app_firmware)
+ goto exit;
+
+ if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ }
+
+exit:
+ return retval;
+}
+
+static int reflash_check_boot_config(void)
+{
+ unsigned int temp;
+ unsigned int image_addr;
+ unsigned int device_addr;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image_info.boot_config.size < BOOT_CONFIG_SIZE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No valid boot config in image file\n");
+ return -EINVAL;
+ }
+
+ image_addr = reflash_hcd->image_info.boot_config.flash_addr;
+
+ temp = le2_to_uint(tcm_hcd->boot_info.boot_config_start_block);
+ device_addr = temp * reflash_hcd->write_block_size;
+
+ if (image_addr != device_addr) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Flash address mismatch\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_check_app_config(void)
+{
+ unsigned int temp;
+ unsigned int image_addr;
+ unsigned int image_size;
+ unsigned int device_addr;
+ unsigned int device_size;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image_info.app_config.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No application config in image file\n");
+ return -EINVAL;
+ }
+
+ image_addr = reflash_hcd->image_info.app_config.flash_addr;
+ image_size = reflash_hcd->image_info.app_config.size;
+
+ temp = le2_to_uint(tcm_hcd->app_info.app_config_start_write_block);
+ device_addr = temp * reflash_hcd->write_block_size;
+ device_size = le2_to_uint(tcm_hcd->app_info.app_config_size);
+
+ if (device_addr == 0 && device_size == 0)
+ return 0;
+
+ if (image_addr != device_addr) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Flash address mismatch\n");
+ return -EINVAL;
+ }
+
+ if (image_size != device_size) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Config size mismatch\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_check_disp_config(void)
+{
+ unsigned int temp;
+ unsigned int image_addr;
+ unsigned int image_size;
+ unsigned int device_addr;
+ unsigned int device_size;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image_info.disp_config.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No display config in image file\n");
+ return -EINVAL;
+ }
+
+ image_addr = reflash_hcd->image_info.disp_config.flash_addr;
+ image_size = reflash_hcd->image_info.disp_config.size;
+
+ temp = le4_to_uint(tcm_hcd->boot_info.display_config_start_block);
+ device_addr = temp * reflash_hcd->write_block_size;
+
+ temp = le2_to_uint(tcm_hcd->boot_info.display_config_length_blocks);
+ device_size = temp * reflash_hcd->write_block_size;
+
+ if (image_addr != device_addr) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Flash address mismatch\n");
+ return -EINVAL;
+ }
+
+ if (image_size != device_size) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Config size mismatch\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_check_prod_test_firmware(void)
+{
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image_info.prod_test_firmware.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No production test firmware in image file\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_check_app_firmware(void)
+{
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (reflash_hcd->image_info.app_firmware.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No application firmware in image file\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int reflash_write_flash(unsigned int address, const unsigned char *data,
+ unsigned int datalen)
+{
+ int retval;
+ unsigned int offset;
+ unsigned int w_length;
+ unsigned int xfer_length;
+ unsigned int remaining_length;
+ unsigned int flash_address;
+ unsigned int block_address;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ w_length = tcm_hcd->wr_chunk_size - 5;
+
+ w_length = w_length - (w_length % reflash_hcd->write_block_size);
+
+ w_length = MIN(w_length, reflash_hcd->max_write_payload_size);
+
+ offset = 0;
+
+ remaining_length = datalen;
+
+ LOCK_BUFFER(reflash_hcd->out);
+ LOCK_BUFFER(reflash_hcd->resp);
+
+ while (remaining_length) {
+ if (remaining_length > w_length)
+ xfer_length = w_length;
+ else
+ xfer_length = remaining_length;
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &reflash_hcd->out,
+ xfer_length + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for reflash_hcd->out.buf\n");
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ UNLOCK_BUFFER(reflash_hcd->out);
+ return retval;
+ }
+
+ flash_address = address + offset;
+ block_address = flash_address / reflash_hcd->write_block_size;
+ reflash_hcd->out.buf[0] = (unsigned char)block_address;
+ reflash_hcd->out.buf[1] = (unsigned char)(block_address >> 8);
+
+ retval = secure_memcpy(&reflash_hcd->out.buf[2],
+ reflash_hcd->out.buf_size - 2,
+ &data[offset],
+ datalen - offset,
+ xfer_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy write data\n");
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ UNLOCK_BUFFER(reflash_hcd->out);
+ return retval;
+ }
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_WRITE_FLASH,
+ reflash_hcd->out.buf,
+ xfer_length + 2,
+ &reflash_hcd->resp.buf,
+ &reflash_hcd->resp.buf_size,
+ &reflash_hcd->resp.data_length,
+ NULL,
+ WRITE_FLASH_DELAY_MS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_WRITE_FLASH));
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Flash address = 0x%08x\n",
+ flash_address);
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data length = %d\n",
+ xfer_length);
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ UNLOCK_BUFFER(reflash_hcd->out);
+ return retval;
+ }
+
+ offset += xfer_length;
+ remaining_length -= xfer_length;
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ UNLOCK_BUFFER(reflash_hcd->out);
+
+ return 0;
+}
+
+reflash_write(app_config)
+
+reflash_write(disp_config)
+
+reflash_write(prod_test_firmware)
+
+reflash_write(app_firmware)
+
+static int reflash_erase_flash(unsigned int page_start, unsigned int page_count)
+{
+ int retval;
+ unsigned char out_buf[2];
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ out_buf[0] = (unsigned char)page_start;
+ out_buf[1] = (unsigned char)page_count;
+
+ LOCK_BUFFER(reflash_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_ERASE_FLASH,
+ out_buf,
+ sizeof(out_buf),
+ &reflash_hcd->resp.buf,
+ &reflash_hcd->resp.buf_size,
+ &reflash_hcd->resp.data_length,
+ NULL,
+ ERASE_FLASH_DELAY_MS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_ERASE_FLASH));
+ UNLOCK_BUFFER(reflash_hcd->resp);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->resp);
+
+ return 0;
+}
+
+reflash_erase(app_config)
+
+reflash_erase(disp_config)
+
+reflash_erase(prod_test_firmware)
+
+reflash_erase(app_firmware)
+
+static int reflash_update_custom_otp(const unsigned char *data,
+ unsigned int offset, unsigned int datalen)
+{
+ int retval;
+ unsigned int temp;
+ unsigned int addr;
+ unsigned int length;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ retval = reflash_set_up_flash_access();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up flash access\n");
+ return retval;
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ temp = le2_to_uint(tcm_hcd->boot_info.custom_otp_start_block);
+ addr = temp * reflash_hcd->write_block_size;
+
+ temp = le2_to_uint(tcm_hcd->boot_info.custom_otp_length_blocks);
+ length = temp * reflash_hcd->write_block_size;
+
+ if (addr == 0 || length == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data area unavailable\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (datalen + offset > length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data length\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ retval = reflash_write_flash(addr + offset,
+ data,
+ datalen);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to flash\n");
+ goto run_app_firmware;
+ }
+
+ retval = 0;
+
+run_app_firmware:
+ if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ return retval;
+}
+
+static int reflash_update_custom_lcm(const unsigned char *data,
+ unsigned int offset, unsigned int datalen)
+{
+ int retval;
+ unsigned int addr;
+ unsigned int length;
+ unsigned int page_start;
+ unsigned int page_count;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ retval = tcm_hcd->get_data_location(tcm_hcd,
+ CUSTOM_LCM,
+ &addr,
+ &length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get data location\n");
+ return retval;
+ }
+
+ retval = reflash_set_up_flash_access();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up flash access\n");
+ return retval;
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ addr *= reflash_hcd->write_block_size;
+ length *= reflash_hcd->write_block_size;
+
+ if (addr == 0 || length == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data area unavailable\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (datalen + offset > length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data length\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (offset == 0) {
+ page_start = addr / reflash_hcd->page_size;
+
+ page_count = ceil_div(length, reflash_hcd->page_size);
+
+ retval = reflash_erase_flash(page_start, page_count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to erase flash pages\n");
+ goto run_app_firmware;
+ }
+ }
+
+ retval = reflash_write_flash(addr + offset,
+ data,
+ datalen);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to flash\n");
+ goto run_app_firmware;
+ }
+
+ retval = 0;
+
+run_app_firmware:
+ if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ return retval;
+}
+
+static int reflash_update_custom_oem(const unsigned char *data,
+ unsigned int offset, unsigned int datalen)
+{
+ int retval;
+ unsigned int addr;
+ unsigned int length;
+ unsigned int page_start;
+ unsigned int page_count;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ retval = tcm_hcd->get_data_location(tcm_hcd,
+ CUSTOM_OEM,
+ &addr,
+ &length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get data location\n");
+ return retval;
+ }
+
+ retval = reflash_set_up_flash_access();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up flash access\n");
+ return retval;
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ addr *= reflash_hcd->write_block_size;
+ length *= reflash_hcd->write_block_size;
+
+ if (addr == 0 || length == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data area unavailable\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (datalen + offset > length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid data length\n");
+ retval = -EINVAL;
+ goto run_app_firmware;
+ }
+
+ if (offset == 0) {
+ page_start = addr / reflash_hcd->page_size;
+
+ page_count = ceil_div(length, reflash_hcd->page_size);
+
+ retval = reflash_erase_flash(page_start, page_count);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to erase flash pages\n");
+ goto run_app_firmware;
+ }
+ }
+
+ retval = reflash_write_flash(addr + offset,
+ data,
+ datalen);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to flash\n");
+ goto run_app_firmware;
+ }
+
+ retval = 0;
+
+run_app_firmware:
+ if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ return retval;
+}
+
+static int reflash_update_boot_config(bool lock)
+{
+ int retval;
+ unsigned char slot_used;
+ unsigned int idx;
+ unsigned int addr;
+ struct boot_config *data;
+ struct boot_config *last_slot;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ retval = reflash_set_up_flash_access();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up flash access\n");
+ return retval;
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ retval = reflash_check_boot_config();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed boot_config partition check\n");
+ goto reset;
+ }
+
+ retval = reflash_read_data(BOOT_CONFIG, false, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read boot config\n");
+ goto reset;
+ }
+
+ LOCK_BUFFER(reflash_hcd->read);
+
+ data = (struct boot_config *)reflash_hcd->read.buf;
+ last_slot = data + (BOOT_CONFIG_SLOTS - 1);
+ slot_used = tcm_hcd->id_info.mode == MODE_TDDI_BOOTLOADER ? 0 : 1;
+
+ if (last_slot->used == slot_used) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Boot config already locked down\n");
+ UNLOCK_BUFFER(reflash_hcd->read);
+ goto reset;
+ }
+
+ if (lock) {
+ idx = BOOT_CONFIG_SLOTS - 1;
+ } else {
+ for (idx = 0; idx < BOOT_CONFIG_SLOTS; idx++) {
+ if (data->used == slot_used) {
+ data++;
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+
+ UNLOCK_BUFFER(reflash_hcd->read);
+
+ if (idx == BOOT_CONFIG_SLOTS) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No free boot config slot available\n");
+ goto reset;
+ }
+
+ addr += idx * BOOT_CONFIG_SIZE;
+
+ retval = reflash_write_flash(addr,
+ reflash_hcd->image_info.boot_config.data,
+ BOOT_CONFIG_SIZE);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write to flash\n");
+ goto reset;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Slot %d updated with new boot config\n",
+ idx);
+
+ retval = 0;
+
+reset:
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ return retval;
+}
+
+reflash_update(app_config)
+
+reflash_update(disp_config)
+
+reflash_update(prod_test_firmware)
+
+reflash_update(app_firmware)
+
+static int reflash_do_reflash(void)
+{
+ int retval;
+ enum update_area update_area;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Start of reflash\n");
+ retval = reflash_get_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get firmware image\n");
+ goto exit;
+ }
+
+ update_area = reflash_compare_id_info();
+
+ switch (update_area) {
+ case FIRMWARE_CONFIG:
+ retval = reflash_update_app_firmware(false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash application firmware\n");
+ goto exit;
+ }
+ memset(&tcm_hcd->app_info, 0x00, sizeof(tcm_hcd->app_info));
+ if (tcm_hcd->features.dual_firmware) {
+ retval = reflash_update_prod_test_firmware(false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash production test firmware\n");
+ goto exit;
+ }
+ }
+ case CONFIG_ONLY:
+ if (reflash_hcd->disp_cfg_update) {
+ retval = reflash_update_disp_config(false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash display config\n");
+ goto exit;
+ }
+ }
+ retval = reflash_update_app_config(true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to reflash application config\n");
+ goto exit;
+ }
+ break;
+ case NONE:
+ default:
+ break;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "End of reflash\n");
+
+ retval = 0;
+ tcm_hcd->reflash_okay = true;
+exit:
+ if (reflash_hcd->fw_entry) {
+ release_firmware(reflash_hcd->fw_entry);
+ reflash_hcd->fw_entry = NULL;
+ reflash_hcd->image = NULL;
+ reflash_hcd->image_size = 0;
+ }
+
+ return retval;
+}
+
+#ifdef STARTUP_REFLASH
+static void reflash_startup_work(struct work_struct *work)
+{
+ int retval;
+ int idx;
+#ifdef CONFIG_FB
+ unsigned int timeout;
+#endif
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+#ifdef CONFIG_FB
+ timeout = FB_READY_TIMEOUT_S * 1000 / FB_READY_WAIT_MS;
+
+ while (tcm_hcd->fb_ready != FB_READY_COUNT) {
+ if (timeout == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Timed out waiting for FB ready\n");
+ return;
+ }
+ msleep(FB_READY_WAIT_MS);
+ timeout--;
+ }
+#endif
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent, "%s Failed to do identification\n", __func__);
+ }
+ }
+
+ pm_stay_awake(&tcm_hcd->pdev->dev);
+
+ mutex_lock(&reflash_hcd->reflash_mutex);
+
+ retval = reflash_do_reflash();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reflash\n");
+ }
+ retval = reflash_read_data(CUSTOM_OTP, false, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent, "Failed to read lockdown data\n");
+ } else {
+ for (idx = 0; idx < LOCKDOWN_SIZE; idx++)
+ tcm_hcd->lockdown[idx] = reflash_hcd->read.buf[idx];
+ pr_info("synaptics %s Lockdown:0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x,0x%2x\n", __func__,
+ tcm_hcd->lockdown[0], tcm_hcd->lockdown[1], tcm_hcd->lockdown[2], tcm_hcd->lockdown[3],
+ tcm_hcd->lockdown[4], tcm_hcd->lockdown[5], tcm_hcd->lockdown[6], tcm_hcd->lockdown[7]);
+ }
+
+ LOGE(tcm_hcd->pdev->dev.parent, "%s: Do Hard reset started\n", __func__);
+ retval = tcm_hcd->reset(tcm_hcd, true, true);
+ if (retval < 0)
+ LOGE(tcm_hcd->pdev->dev.parent, "%s: Do Hard reset failed\n", __func__);
+
+ mutex_unlock(&reflash_hcd->reflash_mutex);
+
+ pm_relax(&tcm_hcd->pdev->dev);
+
+ return;
+}
+#endif
+
+#define TP_INFO_MAX_LENGTH 50
+static ssize_t synaptics_lockdown_info_read(struct file *file, char __user *buf,
+ size_t count, loff_t *pos)
+{
+ int cnt = 0, retval = 0;
+ char tmp[TP_INFO_MAX_LENGTH];
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+
+ if (!reflash_hcd || *pos != 0)
+ return 0;
+ cnt = snprintf(tmp, TP_INFO_MAX_LENGTH,
+ "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n",
+ tcm_hcd->lockdown[0], tcm_hcd->lockdown[1],
+ tcm_hcd->lockdown[2], tcm_hcd->lockdown[3],
+ tcm_hcd->lockdown[4], tcm_hcd->lockdown[5],
+ tcm_hcd->lockdown[6], tcm_hcd->lockdown[7]);
+ retval = copy_to_user(buf, tmp, cnt);
+ *pos += cnt;
+ if (retval != 0)
+ return 0;
+ else
+ return cnt;
+}
+static ssize_t synaptics_fw_version_read(struct file *file, char __user *buf,
+ size_t count, loff_t *pos)
+{
+ char tmp[TP_INFO_MAX_LENGTH];
+ int cnt = 0, retval = 0;
+ struct syna_tcm_hcd *tcm_hcd = reflash_hcd->tcm_hcd;
+ if (!reflash_hcd || *pos != 0)
+ return 0;
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ return 0;
+ }
+ cnt = snprintf(tmp, TP_INFO_MAX_LENGTH, "%d\n", tcm_hcd->packrat_number);
+ retval = copy_to_user(buf, tmp, cnt);
+ *pos += cnt;
+ if (retval != 0)
+ return 0;
+ else
+ return cnt;
+}
+
+static const struct file_operations synaptics_lockdown_info_ops = {
+ .read = synaptics_lockdown_info_read,
+};
+static const struct file_operations synaptics_fw_version_ops = {
+ .read = synaptics_fw_version_read,
+};
+
+static int reflash_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ int idx;
+ reflash_hcd = kzalloc(sizeof(*reflash_hcd), GFP_KERNEL);
+ if (!reflash_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for reflash_hcd\n");
+ return -ENOMEM;
+ }
+
+ reflash_hcd->image_buf = kzalloc(IMAGE_BUF_SIZE, GFP_KERNEL);
+ if (!reflash_hcd->image_buf) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for reflash_hcd->image_buf\n");
+ goto err_allocate_memory;
+ }
+
+ reflash_hcd->tcm_hcd = tcm_hcd;
+
+ reflash_hcd->force_update = FORCE_REFLASH;
+
+ reflash_hcd->disp_cfg_update = DISPLAY_REFLASH;
+
+ mutex_init(&reflash_hcd->reflash_mutex);
+
+ INIT_BUFFER(reflash_hcd->out, false);
+ INIT_BUFFER(reflash_hcd->resp, false);
+ INIT_BUFFER(reflash_hcd->read, false);
+
+#ifdef STARTUP_REFLASH
+ reflash_hcd->workqueue =
+ create_singlethread_workqueue("syna_tcm_reflash");
+ INIT_WORK(&reflash_hcd->work, reflash_startup_work);
+ queue_work(reflash_hcd->workqueue, &reflash_hcd->work);
+#endif
+
+ if (ENABLE_SYSFS_INTERFACE == false)
+ return 0;
+
+ reflash_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!reflash_hcd->sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(reflash_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ retval = sysfs_create_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs bin file\n");
+ goto err_sysfs_create_bin_file;
+ }
+
+ reflash_hcd->custom_dir = kobject_create_and_add(CUSTOM_DIR_NAME,
+ reflash_hcd->sysfs_dir);
+ if (!reflash_hcd->custom_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create custom sysfs directory\n");
+ retval = -EINVAL;
+ goto err_custom_sysfs_create_dir;
+ }
+
+ for (idx = 1; idx < ARRAY_SIZE(bin_attrs); idx++) {
+ retval = sysfs_create_bin_file(reflash_hcd->custom_dir,
+ &bin_attrs[idx]);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs bin file\n");
+ goto err_custom_sysfs_create_bin_file;
+ }
+ }
+
+ tcm_hcd->read_flash_data = reflash_read_data;
+ proc_create("tp_lockdown_info", 0, NULL, &synaptics_lockdown_info_ops);
+ proc_create("tp_fw_version", 0, NULL, &synaptics_fw_version_ops);
+ return 0;
+
+err_custom_sysfs_create_bin_file:
+ for (idx--; idx > 0; idx--)
+ sysfs_remove_bin_file(reflash_hcd->custom_dir, &bin_attrs[idx]);
+
+ kobject_put(reflash_hcd->custom_dir);
+
+ idx = ARRAY_SIZE(attrs);
+
+err_custom_sysfs_create_dir:
+ sysfs_remove_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]);
+
+err_sysfs_create_bin_file:
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(reflash_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(reflash_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+err_allocate_memory:
+ kfree(reflash_hcd->image_buf);
+
+ RELEASE_BUFFER(reflash_hcd->read);
+ RELEASE_BUFFER(reflash_hcd->resp);
+ RELEASE_BUFFER(reflash_hcd->out);
+
+ kfree(reflash_hcd);
+ reflash_hcd = NULL;
+
+ return retval;
+}
+
+static int reflash_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ int idx;
+
+ if (!reflash_hcd)
+ goto exit;
+
+ tcm_hcd->read_flash_data = NULL;
+
+ if (ENABLE_SYSFS_INTERFACE == true) {
+ for (idx = 1; idx < ARRAY_SIZE(bin_attrs); idx++) {
+ sysfs_remove_bin_file(reflash_hcd->custom_dir,
+ &bin_attrs[idx]);
+ }
+
+ kobject_put(reflash_hcd->custom_dir);
+
+ sysfs_remove_bin_file(reflash_hcd->sysfs_dir, &bin_attrs[0]);
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ sysfs_remove_file(reflash_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ }
+
+ kobject_put(reflash_hcd->sysfs_dir);
+ }
+
+#ifdef STARTUP_REFLASH
+ cancel_work_sync(&reflash_hcd->work);
+ flush_workqueue(reflash_hcd->workqueue);
+ destroy_workqueue(reflash_hcd->workqueue);
+#endif
+
+ kfree(reflash_hcd->image_buf);
+
+ RELEASE_BUFFER(reflash_hcd->read);
+ RELEASE_BUFFER(reflash_hcd->resp);
+ RELEASE_BUFFER(reflash_hcd->out);
+
+ kfree(reflash_hcd);
+ reflash_hcd = NULL;
+
+exit:
+ complete(&reflash_remove_complete);
+
+ return 0;
+}
+
+static int reflash_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!reflash_hcd) {
+ retval = reflash_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb reflash_module = {
+ .type = TCM_REFLASH,
+ .init = reflash_init,
+ .remove = reflash_remove,
+ .syncbox = NULL,
+ .asyncbox = NULL,
+ .reset = reflash_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init reflash_module_init(void)
+{
+ return syna_tcm_add_module(&reflash_module, true);
+}
+
+static void __exit reflash_module_exit(void)
+{
+ syna_tcm_add_module(&reflash_module, false);
+
+ wait_for_completion(&reflash_remove_complete);
+
+ return;
+}
+
+late_initcall(reflash_module_init);
+module_exit(reflash_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Reflash Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c
new file mode 100644
index 000000000000..0cddf272bc17
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_spi.c
@@ -0,0 +1,684 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/spi/spi.h>
+#include <linux/of_gpio.h>
+#include "synaptics_tcm_core.h"
+
+static unsigned char *buf;
+
+static unsigned int buf_size;
+
+static struct spi_transfer *xfer;
+
+static struct syna_tcm_bus_io bus_io;
+
+static struct syna_tcm_hw_interface hw_if;
+
+static struct platform_device *syna_tcm_spi_device;
+
+#ifdef CONFIG_OF
+static int parse_dt(struct device *dev, struct syna_tcm_board_data *bdata)
+{
+ int retval;
+ u32 value;
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+ const char *name;
+
+ prop = of_find_property(np, "synaptics,irq-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->irq_gpio = of_get_named_gpio_flags(np,
+ "synaptics,irq-gpio", 0,
+ (enum of_gpio_flags *)&bdata->irq_flags);
+ } else {
+ bdata->irq_gpio = -1;
+ }
+
+ retval = of_property_read_u32(np, "synaptics,irq-on-state", &value);
+ if (retval < 0)
+ bdata->irq_on_state = 0;
+ else
+ bdata->irq_on_state = value;
+
+ retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name);
+ if (retval < 0)
+ bdata->pwr_reg_name = NULL;
+ else
+ bdata->pwr_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,bus-reg-name", &name);
+ if (retval < 0)
+ bdata->bus_reg_name = NULL;
+ else
+ bdata->bus_reg_name = name;
+
+ prop = of_find_property(np, "synaptics,power-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->power_gpio = of_get_named_gpio_flags(np,
+ "synaptics,power-gpio", 0, NULL);
+ } else {
+ bdata->power_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,power-on-state", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-on-state",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,power-on-state property\n");
+ return retval;
+ } else {
+ bdata->power_on_state = value;
+ }
+ } else {
+ bdata->power_on_state = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,power-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-delay-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,power-delay-ms property\n");
+ return retval;
+ } else {
+ bdata->power_delay_ms = value;
+ }
+ } else {
+ bdata->power_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->reset_gpio = of_get_named_gpio_flags(np,
+ "synaptics,reset-gpio", 0, NULL);
+ } else {
+ bdata->reset_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-on-state", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-on-state",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,reset-on-state property\n");
+ return retval;
+ } else {
+ bdata->reset_on_state = value;
+ }
+ } else {
+ bdata->reset_on_state = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-active-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-active-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Failed to read synaptics,reset-active-ms property\n");
+ return retval;
+ } else {
+ bdata->reset_active_ms = value;
+ }
+ } else {
+ bdata->reset_active_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-delay-ms",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,reset-delay-ms property\n");
+ return retval;
+ } else {
+ bdata->reset_delay_ms = value;
+ }
+ } else {
+ bdata->reset_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,x-flip", NULL);
+ bdata->x_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,y-flip", NULL);
+ bdata->y_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,swap-axes", NULL);
+ bdata->swap_axes = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,byte-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,byte-delay-us",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,byte-delay-us property\n");
+ return retval;
+ } else {
+ bdata->byte_delay_us = value;
+ }
+ } else {
+ bdata->byte_delay_us = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,block-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,block-delay-us",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,block-delay-us property\n");
+ return retval;
+ } else {
+ bdata->block_delay_us = value;
+ }
+ } else {
+ bdata->block_delay_us = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,spi-mode", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,spi-mode",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,spi-mode property\n");
+ return retval;
+ } else {
+ bdata->spi_mode = value;
+ }
+ } else {
+ bdata->spi_mode = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,ubl-max-freq", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,ubl-max-freq",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,ubl-max-freq property\n");
+ return retval;
+ } else {
+ bdata->ubl_max_freq = value;
+ }
+ } else {
+ bdata->ubl_max_freq = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,ubl-byte-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,ubl-byte-delay-us",
+ &value);
+ if (retval < 0) {
+ LOGE(dev,
+ "Unable to read synaptics,ubl-byte-delay-us property\n");
+ return retval;
+ } else {
+ bdata->ubl_byte_delay_us = value;
+ }
+ } else {
+ bdata->ubl_byte_delay_us = 0;
+ }
+
+ return 0;
+}
+#endif
+
+static int syna_tcm_spi_alloc_mem(struct syna_tcm_hcd *tcm_hcd,
+ unsigned int count, unsigned int size)
+{
+ static unsigned int xfer_count;
+ struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent);
+
+ if (count > xfer_count) {
+ kfree(xfer);
+ xfer = kcalloc(count, sizeof(*xfer), GFP_KERNEL);
+ if (!xfer) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory for xfer\n");
+ xfer_count = 0;
+ return -ENOMEM;
+ }
+ xfer_count = count;
+ } else {
+ memset(xfer, 0, count * sizeof(*xfer));
+ }
+
+ if (size > buf_size) {
+ if (buf_size)
+ kfree(buf);
+ buf = kmalloc(size, GFP_KERNEL);
+ if (!buf) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory for buf\n");
+ buf_size = 0;
+ return -ENOMEM;
+ }
+ buf_size = size;
+ }
+
+ return 0;
+}
+
+static int syna_tcm_spi_rmi_read(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int mode;
+ unsigned int byte_count;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ spi_message_init(&msg);
+
+ byte_count = length + 2;
+
+ if (bdata->ubl_byte_delay_us == 0)
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, 2, 2);
+ else
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, byte_count, 2);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory\n");
+ goto exit;
+ }
+
+ buf[0] = (unsigned char)(addr >> 8) | 0x80;
+ buf[1] = (unsigned char)addr;
+
+ if (bdata->ubl_byte_delay_us == 0) {
+ xfer[0].len = 2;
+ xfer[0].tx_buf = buf;
+ xfer[0].speed_hz = bdata->ubl_max_freq;
+ spi_message_add_tail(&xfer[0], &msg);
+ xfer[1].len = length;
+ xfer[1].rx_buf = data;
+ if (bdata->block_delay_us)
+ xfer[1].delay_usecs = bdata->block_delay_us;
+ xfer[1].speed_hz = bdata->ubl_max_freq;
+ spi_message_add_tail(&xfer[1], &msg);
+ } else {
+ for (idx = 0; idx < byte_count; idx++) {
+ xfer[idx].len = 1;
+ if (idx < 2)
+ xfer[idx].tx_buf = &buf[idx];
+ else
+ xfer[idx].rx_buf = &data[idx - 2];
+ xfer[idx].delay_usecs = bdata->ubl_byte_delay_us;
+ if (bdata->block_delay_us && (idx == byte_count - 1))
+ xfer[idx].delay_usecs = bdata->block_delay_us;
+ xfer[idx].speed_hz = bdata->ubl_max_freq;
+ spi_message_add_tail(&xfer[idx], &msg);
+ }
+ }
+
+ mode = spi->mode;
+ spi->mode = SPI_MODE_3;
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = length;
+ } else {
+ LOGE(&spi->dev,
+ "Failed to complete SPI transfer, error = %d\n",
+ retval);
+ }
+
+ spi->mode = mode;
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_spi_rmi_write(struct syna_tcm_hcd *tcm_hcd,
+ unsigned short addr, unsigned char *data, unsigned int length)
+{
+ int retval;
+ unsigned int mode;
+ unsigned int byte_count;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ spi_message_init(&msg);
+
+ byte_count = length + 2;
+
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, byte_count);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory\n");
+ goto exit;
+ }
+
+ buf[0] = (unsigned char)(addr >> 8) & ~0x80;
+ buf[1] = (unsigned char)addr;
+ retval = secure_memcpy(&buf[2],
+ buf_size - 2,
+ data,
+ length,
+ length);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to copy write data\n");
+ goto exit;
+ }
+
+ xfer[0].len = byte_count;
+ xfer[0].tx_buf = buf;
+ if (bdata->block_delay_us)
+ xfer[0].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[0], &msg);
+
+ mode = spi->mode;
+ spi->mode = SPI_MODE_3;
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = length;
+ } else {
+ LOGE(&spi->dev,
+ "Failed to complete SPI transfer, error = %d\n",
+ retval);
+ }
+
+ spi->mode = mode;
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_spi_read(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length)
+{
+ int retval;
+ unsigned int idx;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ spi_message_init(&msg);
+
+ if (bdata->byte_delay_us == 0)
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, length);
+ else
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, length, 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory\n");
+ goto exit;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ memset(buf, 0xff, length);
+ xfer[0].len = length;
+ xfer[0].tx_buf = buf;
+ xfer[0].rx_buf = data;
+ if (bdata->block_delay_us)
+ xfer[0].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[0], &msg);
+ } else {
+ buf[0] = 0xff;
+ for (idx = 0; idx < length; idx++) {
+ xfer[idx].len = 1;
+ xfer[idx].tx_buf = buf;
+ xfer[idx].rx_buf = &data[idx];
+ xfer[idx].delay_usecs = bdata->byte_delay_us;
+ if (bdata->block_delay_us && (idx == length - 1))
+ xfer[idx].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[idx], &msg);
+ }
+ }
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = length;
+ } else {
+ LOGE(&spi->dev,
+ "Failed to complete SPI transfer, error = %d\n",
+ retval);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_spi_write(struct syna_tcm_hcd *tcm_hcd, unsigned char *data,
+ unsigned int length)
+{
+ int retval;
+ unsigned int idx;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(tcm_hcd->pdev->dev.parent);
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ mutex_lock(&tcm_hcd->io_ctrl_mutex);
+
+ spi_message_init(&msg);
+
+ if (bdata->byte_delay_us == 0)
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, 1, 0);
+ else
+ retval = syna_tcm_spi_alloc_mem(tcm_hcd, length, 0);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory\n");
+ goto exit;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ xfer[0].len = length;
+ xfer[0].tx_buf = data;
+ if (bdata->block_delay_us)
+ xfer[0].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[0], &msg);
+ } else {
+ for (idx = 0; idx < length; idx++) {
+ xfer[idx].len = 1;
+ xfer[idx].tx_buf = &data[idx];
+ xfer[idx].delay_usecs = bdata->byte_delay_us;
+ if (bdata->block_delay_us && (idx == length - 1))
+ xfer[idx].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[idx], &msg);
+ }
+ }
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = length;
+ } else {
+ LOGE(&spi->dev,
+ "Failed to complete SPI transfer, error = %d\n",
+ retval);
+ }
+
+exit:
+ mutex_unlock(&tcm_hcd->io_ctrl_mutex);
+
+ return retval;
+}
+
+static int syna_tcm_spi_probe(struct spi_device *spi)
+{
+ int retval;
+
+ if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) {
+ LOGE(&spi->dev,
+ "Full duplex not supported by host\n");
+ return -EIO;
+ }
+
+ syna_tcm_spi_device = platform_device_alloc(PLATFORM_DRIVER_NAME, 0);
+ if (!syna_tcm_spi_device) {
+ LOGE(&spi->dev,
+ "Failed to allocate platform device\n");
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_OF
+ hw_if.bdata = devm_kzalloc(&spi->dev, sizeof(*hw_if.bdata), GFP_KERNEL);
+ if (!hw_if.bdata) {
+ LOGE(&spi->dev,
+ "Failed to allocate memory for board data\n");
+ return -ENOMEM;
+ }
+ parse_dt(&spi->dev, hw_if.bdata);
+#else
+ hw_if.bdata = spi->dev.platform_data;
+#endif
+
+ switch (hw_if.bdata->spi_mode) {
+ case 0:
+ spi->mode = SPI_MODE_0;
+ break;
+ case 1:
+ spi->mode = SPI_MODE_1;
+ break;
+ case 2:
+ spi->mode = SPI_MODE_2;
+ break;
+ case 3:
+ spi->mode = SPI_MODE_3;
+ break;
+ }
+
+ bus_io.type = BUS_SPI;
+ bus_io.read = syna_tcm_spi_read;
+ bus_io.write = syna_tcm_spi_write;
+ bus_io.rmi_read = syna_tcm_spi_rmi_read;
+ bus_io.rmi_write = syna_tcm_spi_rmi_write;
+
+ hw_if.bus_io = &bus_io;
+
+ spi->bits_per_word = 8;
+
+ retval = spi_setup(spi);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to set up SPI protocol driver\n");
+ return retval;
+ }
+
+ syna_tcm_spi_device->dev.parent = &spi->dev;
+ syna_tcm_spi_device->dev.platform_data = &hw_if;
+
+ retval = platform_device_add(syna_tcm_spi_device);
+ if (retval < 0) {
+ LOGE(&spi->dev,
+ "Failed to add platform device\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int syna_tcm_spi_remove(struct spi_device *spi)
+{
+ syna_tcm_spi_device->dev.platform_data = NULL;
+
+ platform_device_unregister(syna_tcm_spi_device);
+
+ return 0;
+}
+
+static const struct spi_device_id syna_tcm_id_table[] = {
+ {SPI_MODULE_NAME, 0},
+ {},
+};
+MODULE_DEVICE_TABLE(spi, syna_tcm_id_table);
+
+#ifdef CONFIG_OF
+static struct of_device_id syna_tcm_of_match_table[] = {
+ {
+ .compatible = "synaptics,tcm-spi",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, syna_tcm_of_match_table);
+#else
+#define syna_tcm_of_match_table NULL
+#endif
+
+static struct spi_driver syna_tcm_spi_driver = {
+ .driver = {
+ .name = SPI_MODULE_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = syna_tcm_of_match_table,
+ },
+ .probe = syna_tcm_spi_probe,
+ .remove = syna_tcm_spi_remove,
+ .id_table = syna_tcm_id_table,
+};
+
+int syna_tcm_bus_init(void)
+{
+ return spi_register_driver(&syna_tcm_spi_driver);
+}
+EXPORT_SYMBOL(syna_tcm_bus_init);
+
+void syna_tcm_bus_exit(void)
+{
+ kfree(buf);
+
+ kfree(xfer);
+
+ spi_unregister_driver(&syna_tcm_spi_driver);
+
+ return;
+}
+EXPORT_SYMBOL(syna_tcm_bus_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM SPI Bus Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c
new file mode 100644
index 000000000000..2b6bfffa3f24
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.c
@@ -0,0 +1,2046 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/gpio.h>
+#include "synaptics_tcm_core.h"
+#include "synaptics_tcm_testing.h"
+
+#define SYSFS_DIR_NAME "testing"
+
+#define REPORT_TIMEOUT_MS 500
+
+#define testing_sysfs_show(t_name) \
+static ssize_t testing_sysfs_##t_name##_show(struct device *dev, \
+ struct device_attribute *attr, char *buf) \
+{ \
+ int retval; \
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd; \
+\
+ mutex_lock(&tcm_hcd->extif_mutex); \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ ""#t_name" test start\n"); \
+\
+ retval = testing_##t_name(); \
+ if (retval < 0) { \
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ "Failed to do "#t_name" test\n"); \
+ goto exit; \
+ } \
+\
+ retval = snprintf(buf, PAGE_SIZE, \
+ "%s\n", \
+ testing_hcd->result ? "Passed" : "Failed"); \
+\
+exit: \
+ mutex_unlock(&tcm_hcd->extif_mutex); \
+\
+ LOGE(tcm_hcd->pdev->dev.parent, \
+ ""#t_name" test end\n"); \
+ return retval; \
+}
+
+enum test_code {
+ TEST_TRX_TRX_SHORTS = 0,
+ TEST_TRX_SENSOR_OPENS = 1,
+ TEST_TRX_GROUND_SHORTS = 2,
+ TEST_DYNAMIC_RANGE = 7,
+ TEST_OPEN_SHORT_DETECTOR = 8,
+ TEST_NOISE = 10,
+ TEST_PT11 = 11,
+ TEST_PT12 = 12,
+ TEST_PT13 = 13,
+ TEST_DYNAMIC_RANGE_DOZE = 14,
+ TEST_NOISE_DOZE = 15,
+};
+
+struct testing_hcd {
+ bool result;
+ unsigned char report_type;
+ unsigned int report_index;
+ unsigned int num_of_reports;
+ struct kobject *sysfs_dir;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_buffer report;
+ struct syna_tcm_buffer process;
+ struct syna_tcm_buffer output;
+ struct syna_tcm_hcd *tcm_hcd;
+ int result_type;
+ int (*collect_reports)(enum report_type report_type,
+ unsigned int num_of_reports);
+};
+
+DECLARE_COMPLETION(report_complete);
+
+DECLARE_COMPLETION(testing_remove_complete);
+
+static struct testing_hcd *testing_hcd;
+
+static int testing_dynamic_range(void);
+
+static int testing_dynamic_range_lpwg(void);
+
+static int testing_dynamic_range_doze(void);
+
+static int testing_noise(void);
+
+static int testing_noise_lpwg(void);
+
+static int testing_noise_doze(void);
+
+static int testing_open_short_detector(void);
+
+static int testing_pt11(void);
+
+static int testing_pt12(void);
+
+static int testing_pt13(void);
+
+static int testing_reset_open(void);
+
+static int testing_lockdown(void);
+
+static int testing_trx(enum test_code test_code);
+
+SHOW_PROTOTYPE(testing, dynamic_range)
+SHOW_PROTOTYPE(testing, dynamic_range_lpwg)
+SHOW_PROTOTYPE(testing, dynamic_range_doze)
+SHOW_PROTOTYPE(testing, noise)
+SHOW_PROTOTYPE(testing, noise_lpwg)
+SHOW_PROTOTYPE(testing, noise_doze)
+SHOW_PROTOTYPE(testing, open_short_detector)
+SHOW_PROTOTYPE(testing, pt11)
+SHOW_PROTOTYPE(testing, pt12)
+SHOW_PROTOTYPE(testing, pt13)
+SHOW_PROTOTYPE(testing, reset_open)
+SHOW_PROTOTYPE(testing, lockdown)
+SHOW_PROTOTYPE(testing, trx_trx_shorts)
+SHOW_PROTOTYPE(testing, trx_sensor_opens)
+SHOW_PROTOTYPE(testing, trx_ground_shorts)
+SHOW_PROTOTYPE(testing, size)
+
+static struct device_attribute *attrs[] = {
+ ATTRIFY(dynamic_range),
+ ATTRIFY(dynamic_range_lpwg),
+ ATTRIFY(dynamic_range_doze),
+ ATTRIFY(noise),
+ ATTRIFY(noise_lpwg),
+ ATTRIFY(noise_doze),
+ ATTRIFY(open_short_detector),
+ ATTRIFY(pt11),
+ ATTRIFY(pt12),
+ ATTRIFY(pt13),
+ ATTRIFY(reset_open),
+ ATTRIFY(lockdown),
+ ATTRIFY(trx_trx_shorts),
+ ATTRIFY(trx_sensor_opens),
+ ATTRIFY(trx_ground_shorts),
+ ATTRIFY(size),
+};
+
+static ssize_t testing_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static struct bin_attribute bin_attr = {
+ .attr = {
+ .name = "data",
+ .mode = S_IRUGO,
+ },
+ .size = 0,
+ .read = testing_sysfs_data_show,
+};
+
+testing_sysfs_show(dynamic_range)
+
+testing_sysfs_show(dynamic_range_lpwg)
+
+testing_sysfs_show(dynamic_range_doze)
+
+testing_sysfs_show(noise)
+
+testing_sysfs_show(noise_lpwg)
+
+testing_sysfs_show(noise_doze)
+
+testing_sysfs_show(open_short_detector)
+
+testing_sysfs_show(pt11)
+
+testing_sysfs_show(pt12)
+
+testing_sysfs_show(pt13)
+
+testing_sysfs_show(reset_open)
+
+testing_sysfs_show(lockdown)
+
+static ssize_t testing_sysfs_trx_trx_shorts_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = testing_trx(TEST_TRX_TRX_SHORTS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do TRX-TRX shorts test\n");
+ goto exit;
+ }
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%s\n",
+ testing_hcd->result ? "Passed" : "Failed");
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t testing_sysfs_trx_sensor_opens_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = testing_trx(TEST_TRX_SENSOR_OPENS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do TRX-sensor opens test\n");
+ goto exit;
+ }
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%s\n",
+ testing_hcd->result ? "Passed" : "Failed");
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t testing_sysfs_trx_ground_shorts_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ retval = testing_trx(TEST_TRX_GROUND_SHORTS);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do TRX-ground shorts test\n");
+ goto exit;
+ }
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%s\n",
+ testing_hcd->result ? "Passed" : "Failed");
+
+exit:
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t testing_sysfs_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ LOCK_BUFFER(testing_hcd->output);
+
+ retval = snprintf(buf, PAGE_SIZE,
+ "%u\n",
+ testing_hcd->output.data_length);
+
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static ssize_t testing_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int readlen;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ mutex_lock(&tcm_hcd->extif_mutex);
+
+ LOCK_BUFFER(testing_hcd->output);
+
+ readlen = MIN(count, testing_hcd->output.data_length - pos);
+
+ retval = secure_memcpy(buf,
+ count,
+ &testing_hcd->output.buf[pos],
+ testing_hcd->output.buf_size - pos,
+ readlen);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy report data\n");
+ } else {
+ retval = readlen;
+ }
+
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ mutex_unlock(&tcm_hcd->extif_mutex);
+
+ return retval;
+}
+
+static int testing_run_prod_test_item(enum test_code test_code)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ if (tcm_hcd->features.dual_firmware &&
+ tcm_hcd->id_info.mode != MODE_PRODUCTION_TEST) {
+ retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_PRODUCTION_TEST);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run production test firmware\n");
+ return retval;
+ }
+ } else if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application firmware not running\n");
+ return -ENODEV;
+ }
+
+ LOCK_BUFFER(testing_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->out,
+ 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->out.buf\n");
+ UNLOCK_BUFFER(testing_hcd->out);
+ return retval;
+ }
+
+ testing_hcd->out.buf[0] = test_code;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_PRODUCTION_TEST,
+ testing_hcd->out.buf,
+ 1,
+ &testing_hcd->resp.buf,
+ &testing_hcd->resp.buf_size,
+ &testing_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_PRODUCTION_TEST));
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+
+ return 0;
+}
+
+static int testing_collect_reports(enum report_type report_type,
+ unsigned int num_of_reports)
+{
+ int retval;
+ bool completed;
+ unsigned int timeout;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ testing_hcd->report_index = 0;
+ testing_hcd->report_type = report_type;
+ testing_hcd->num_of_reports = num_of_reports;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
+ reinit_completion(&report_complete);
+#else
+ INIT_COMPLETION(report_complete);
+#endif
+
+ LOCK_BUFFER(testing_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->out,
+ 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->out.buf\n");
+ UNLOCK_BUFFER(testing_hcd->out);
+ goto exit;
+ }
+
+ testing_hcd->out.buf[0] = testing_hcd->report_type;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_ENABLE_REPORT,
+ testing_hcd->out.buf,
+ 1,
+ &testing_hcd->resp.buf,
+ &testing_hcd->resp.buf_size,
+ &testing_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_ENABLE_REPORT));
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+ goto exit;
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+
+ completed = false;
+ timeout = REPORT_TIMEOUT_MS * num_of_reports;
+
+ retval = wait_for_completion_timeout(&report_complete,
+ msecs_to_jiffies(timeout));
+ if (retval == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Timed out waiting for report collection\n");
+ } else {
+ completed = true;
+ }
+
+ LOCK_BUFFER(testing_hcd->out);
+
+ testing_hcd->out.buf[0] = testing_hcd->report_type;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_DISABLE_REPORT,
+ testing_hcd->out.buf,
+ 1,
+ &testing_hcd->resp.buf,
+ &testing_hcd->resp.buf_size,
+ &testing_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_DISABLE_REPORT));
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+ goto exit;
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->out);
+
+ if (completed)
+ retval = 0;
+ else
+ retval = -EIO;
+
+exit:
+ testing_hcd->report_type = 0;
+
+ return retval;
+}
+
+static void testing_get_frame_size_words(unsigned int *size, bool image_only)
+{
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int hybrid;
+ unsigned int buttons;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+ hybrid = le2_to_uint(app_info->has_hybrid_data);
+ buttons = le2_to_uint(app_info->num_of_buttons);
+
+ *size = rows * cols;
+
+ if (!image_only) {
+ if (hybrid)
+ *size += rows + cols;
+ *size += buttons;
+ }
+
+ return;
+}
+
+static void testing_doze_frame_output(unsigned int rows, unsigned int cols)
+{
+ int retval;
+ unsigned int data_size;
+ unsigned int header_size;
+ unsigned int output_size;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ header_size = 2;
+
+ data_size = rows * cols;
+
+ if (le2_to_uint(app_info->num_of_buttons))
+ data_size++;
+
+ output_size = header_size + data_size * 2;
+
+ LOCK_BUFFER(testing_hcd->output);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->output,
+ output_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->output.buf\n");
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ testing_hcd->output.buf[0] = rows;
+ testing_hcd->output.buf[1] = cols;
+
+ output_size = header_size;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = secure_memcpy(testing_hcd->output.buf + header_size,
+ testing_hcd->output.buf_size - header_size,
+ testing_hcd->resp.buf,
+ testing_hcd->resp.buf_size,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy test data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ output_size += testing_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_hcd->output.data_length = output_size;
+
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ return;
+}
+
+static void testing_standard_frame_output(bool image_only)
+{
+ int retval;
+ unsigned int data_size;
+ unsigned int header_size;
+ unsigned int output_size;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ testing_get_frame_size_words(&data_size, image_only);
+
+ header_size = sizeof(app_info->num_of_buttons) +
+ sizeof(app_info->num_of_image_rows) +
+ sizeof(app_info->num_of_image_cols) +
+ sizeof(app_info->has_hybrid_data);
+
+ output_size = header_size + data_size * 2;
+
+ LOCK_BUFFER(testing_hcd->output);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->output,
+ output_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->output.buf\n");
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ retval = secure_memcpy(testing_hcd->output.buf,
+ testing_hcd->output.buf_size,
+ &app_info->num_of_buttons[0],
+ header_size,
+ header_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy header data\n");
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ output_size = header_size;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = secure_memcpy(testing_hcd->output.buf + header_size,
+ testing_hcd->output.buf_size - header_size,
+ testing_hcd->resp.buf,
+ testing_hcd->resp.buf_size,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy test data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ output_size += testing_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_hcd->output.data_length = output_size;
+
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ return;
+}
+
+static int testing_dynamic_range_doze(void)
+{
+ int retval;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int data;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int data_size;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ retval = testing_run_prod_test_item(TEST_DYNAMIC_RANGE_DOZE);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ data_size = testing_hcd->resp.data_length / 2;
+
+ if (le2_to_uint(app_info->num_of_buttons))
+ data_size--;
+
+ if (data_size % cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid max number of rows per burst\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ rows = data_size / cols;
+
+ limits_rows = sizeof(drt_hi_limits) / sizeof(drt_hi_limits[0]);
+ limits_cols = sizeof(drt_hi_limits[0]) / sizeof(drt_hi_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(drt_lo_limits) / sizeof(drt_lo_limits[0]);
+ limits_cols = sizeof(drt_lo_limits[0]) / sizeof(drt_lo_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = le2_to_uint(&buf[idx * 2]);
+ if (data > drt_hi_limits[row][col] ||
+ data < drt_lo_limits[row][col]) {
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_doze_frame_output(rows, cols);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_dynamic_range_lpwg(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable wakeup gesture mode\n");
+ return retval;
+ }
+
+ retval = testing_dynamic_range();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do dynamic range test\n");
+ return retval;
+ }
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable wakeup gesture mode\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int testing_dynamic_range(void)
+{
+ int retval;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int data;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ unsigned int frame_size_words;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ testing_get_frame_size_words(&frame_size_words, false);
+
+ retval = testing_run_prod_test_item(TEST_DYNAMIC_RANGE);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (frame_size_words != testing_hcd->resp.data_length / 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Frame size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(drt_hi_limits) / sizeof(drt_hi_limits[0]);
+ limits_cols = sizeof(drt_hi_limits[0]) / sizeof(drt_hi_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(drt_lo_limits) / sizeof(drt_lo_limits[0]);
+ limits_cols = sizeof(drt_lo_limits[0]) / sizeof(drt_lo_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = le2_to_uint(&buf[idx * 2]);
+ if (data > drt_hi_limits[row][col] ||
+ data < drt_lo_limits[row][col]) {
+ testing_hcd->result = false;
+ dev_info(tcm_hcd->pdev->dev.parent, "row:%d col:%d data:%d outof range\n",
+ row, col, data);
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_standard_frame_output(false);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_noise_doze(void)
+{
+ int retval;
+ short data;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int data_size;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ retval = testing_run_prod_test_item(TEST_NOISE_DOZE);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ data_size = testing_hcd->resp.data_length / 2;
+
+ if (le2_to_uint(app_info->num_of_buttons))
+ data_size--;
+
+ if (data_size % cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid max number of rows per burst\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ rows = data_size / cols;
+
+ limits_rows = sizeof(noise_limits) / sizeof(noise_limits[0]);
+ limits_cols = sizeof(noise_limits[0]) / sizeof(noise_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = (short)le2_to_uint(&buf[idx * 2]);
+ if (data > noise_limits[row][col]) {
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_doze_frame_output(rows, cols);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_noise_lpwg(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable wakeup gesture mode\n");
+ return retval;
+ }
+
+ retval = testing_noise();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do noise test\n");
+ return retval;
+ }
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable wakeup gesture mode\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int testing_noise(void)
+{
+ int retval;
+ short data;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ unsigned int frame_size_words;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ testing_get_frame_size_words(&frame_size_words, false);
+
+ retval = testing_run_prod_test_item(TEST_NOISE);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (frame_size_words != testing_hcd->resp.data_length / 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Frame size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(noise_limits) / sizeof(noise_limits[0]);
+ limits_cols = sizeof(noise_limits[0]) / sizeof(noise_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = (short)le2_to_uint(&buf[idx * 2]);
+ if (data > noise_limits[row][col]) {
+ dev_info(tcm_hcd->pdev->dev.parent, "row:%d col:%d data:%d outof range\n",
+ row, col, data);
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_standard_frame_output(false);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static void testing_open_short_detector_output(void)
+{
+ int retval;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int data_size;
+ unsigned int header_size;
+ unsigned int output_size;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+ data_size = (rows * cols + 7) / 8;
+
+ header_size = sizeof(app_info->num_of_buttons) +
+ sizeof(app_info->num_of_image_rows) +
+ sizeof(app_info->num_of_image_cols) +
+ sizeof(app_info->has_hybrid_data);
+
+ output_size = header_size + data_size * 2;
+
+ LOCK_BUFFER(testing_hcd->output);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->output,
+ output_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->output.buf\n");
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ retval = secure_memcpy(testing_hcd->output.buf,
+ testing_hcd->output.buf_size,
+ &app_info->num_of_buttons[0],
+ header_size,
+ header_size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy header data\n");
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ output_size = header_size;
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = secure_memcpy(testing_hcd->output.buf + header_size,
+ testing_hcd->output.buf_size - header_size,
+ testing_hcd->resp.buf,
+ testing_hcd->resp.buf_size,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy test data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ output_size += testing_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_hcd->output.data_length = output_size;
+
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ return;
+}
+
+static int testing_open_short_detector(void)
+{
+ int retval;
+ unsigned int bit;
+ unsigned int byte;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int data_size;
+ unsigned char *data;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+ data_size = (rows * cols + 7) / 8;
+
+ retval = testing_run_prod_test_item(TEST_OPEN_SHORT_DETECTOR);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (data_size * 2 != testing_hcd->resp.data_length) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Data size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ testing_hcd->result = true;
+
+ bit = 0;
+ byte = 0;
+ data = &testing_hcd->resp.buf[0];
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ if (data[byte] & (1 << bit)) {
+ testing_hcd->result = false;
+ break;
+ }
+ if (bit++ > 7) {
+ bit = 0;
+ byte++;
+ }
+ }
+ }
+
+ if (testing_hcd->result == true) {
+ bit = 0;
+ byte = 0;
+ data = &testing_hcd->resp.buf[data_size];
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ if (data[byte] & (1 << bit)) {
+ testing_hcd->result = false;
+ break;
+ }
+ if (bit++ > 7) {
+ bit = 0;
+ byte++;
+ }
+ }
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_open_short_detector_output();
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+
+ return retval;
+}
+
+static int testing_pt11(void)
+{
+ int retval;
+ short data;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ unsigned int image_size_words;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+ dev_info(tcm_hcd->pdev->dev.parent, "%s\n", __func__);
+ testing_get_frame_size_words(&image_size_words, true);
+
+ retval = testing_run_prod_test_item(TEST_PT11);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (image_size_words != testing_hcd->resp.data_length / 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Image size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(pt11_hi_limits) / sizeof(pt11_hi_limits[0]);
+ limits_cols = sizeof(pt11_hi_limits[0]) / sizeof(pt11_hi_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(pt11_lo_limits) / sizeof(pt11_lo_limits[0]);
+ limits_cols = sizeof(pt11_lo_limits[0]) / sizeof(pt11_lo_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = (short)le2_to_uint(&buf[idx * 2]);
+ if (data > pt11_hi_limits[row][col] ||
+ data < pt11_lo_limits[row][col]) {
+ dev_info(tcm_hcd->pdev->dev.parent, "row:%d, col: %d data:%d outof range:\n",
+ row, col, data);
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_standard_frame_output(true);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_pt12(void)
+{
+ int retval;
+ short data;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ unsigned int image_size_words;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ testing_get_frame_size_words(&image_size_words, true);
+
+ retval = testing_run_prod_test_item(TEST_PT12);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (image_size_words != testing_hcd->resp.data_length / 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Image size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(pt12_limits) / sizeof(pt12_limits[0]);
+ limits_cols = sizeof(pt12_limits[0]) / sizeof(pt12_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = (short)le2_to_uint(&buf[idx * 2]);
+ if (data < pt12_limits[row][col]) {
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_standard_frame_output(true);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_pt13(void)
+{
+ int retval;
+ short data;
+ unsigned char *buf;
+ unsigned int idx;
+ unsigned int row;
+ unsigned int col;
+ unsigned int rows;
+ unsigned int cols;
+ unsigned int limits_rows;
+ unsigned int limits_cols;
+ unsigned int image_size_words;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ app_info = &tcm_hcd->app_info;
+
+ rows = le2_to_uint(app_info->num_of_image_rows);
+ cols = le2_to_uint(app_info->num_of_image_cols);
+
+ testing_get_frame_size_words(&image_size_words, true);
+
+ retval = testing_run_prod_test_item(TEST_PT13);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ if (image_size_words != testing_hcd->resp.data_length / 2) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Image size mismatch\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ limits_rows = sizeof(pt13_limits) / sizeof(pt13_limits[0]);
+ limits_cols = sizeof(pt13_limits[0]) / sizeof(pt13_limits[0][0]);
+
+ if (rows > limits_rows || cols > limits_cols) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ idx = 0;
+ buf = testing_hcd->resp.buf;
+ testing_hcd->result = true;
+
+ for (row = 0; row < rows; row++) {
+ for (col = 0; col < cols; col++) {
+ data = (short)le2_to_uint(&buf[idx * 2]);
+ if (data < pt13_limits[row][col]) {
+ testing_hcd->result = false;
+ break;
+ }
+ idx++;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_standard_frame_output(true);
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static int testing_reset_open(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ if (bdata->reset_gpio < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Hardware reset unavailable\n");
+ return -EINVAL;
+ }
+
+ mutex_lock(&tcm_hcd->reset_mutex);
+
+ tcm_hcd->update_watchdog(tcm_hcd, false);
+
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ msleep(bdata->reset_delay_ms);
+
+ tcm_hcd->update_watchdog(tcm_hcd, true);
+
+ mutex_unlock(&tcm_hcd->reset_mutex);
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ retval = tcm_hcd->switch_mode(tcm_hcd, FW_MODE_BOOTLOADER);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enter bootloader mode\n");
+ return retval;
+ }
+ } else {
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ goto run_app_firmware;
+ }
+ }
+
+ if (tcm_hcd->boot_info.last_reset_reason == reset_open_limit)
+ testing_hcd->result = true;
+ else
+ testing_hcd->result = false;
+
+ retval = 0;
+
+run_app_firmware:
+ if (tcm_hcd->switch_mode(tcm_hcd, FW_MODE_APPLICATION) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run application firmware\n");
+ }
+
+ return retval;
+}
+
+static void testing_lockdown_output(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ LOCK_BUFFER(testing_hcd->output);
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->output,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->output.buf\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ retval = secure_memcpy(testing_hcd->output.buf,
+ testing_hcd->output.buf_size,
+ testing_hcd->resp.buf,
+ testing_hcd->resp.buf_size,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy test data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ testing_hcd->output.data_length = testing_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ return;
+}
+
+static int testing_lockdown(void)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int lockdown_size;
+ unsigned int limits_size;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ if (tcm_hcd->read_flash_data == NULL) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Unable to read from flash\n");
+ return -EINVAL;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = tcm_hcd->read_flash_data(CUSTOM_OTP, true, &testing_hcd->resp);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read lockdown data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ return retval;
+ }
+
+ lockdown_size = testing_hcd->resp.data_length;
+
+ limits_size = sizeof(lockdown_limits) / sizeof(*lockdown_limits);
+
+ if (lockdown_size != limits_size) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Mismatching limits data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ return -EINVAL;
+ }
+
+ testing_hcd->result = true;
+
+ for (idx = 0; idx < lockdown_size; idx++) {
+ if (testing_hcd->resp.buf[idx] != lockdown_limits[idx]) {
+ testing_hcd->result = false;
+ break;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_lockdown_output();
+
+ return 0;
+}
+
+static void testing_trx_output(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ LOCK_BUFFER(testing_hcd->output);
+ LOCK_BUFFER(testing_hcd->resp);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->output,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->output.buf\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ retval = secure_memcpy(testing_hcd->output.buf,
+ testing_hcd->output.buf_size,
+ testing_hcd->resp.buf,
+ testing_hcd->resp.buf_size,
+ testing_hcd->resp.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy test data\n");
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+ return;
+ }
+
+ testing_hcd->output.data_length = testing_hcd->resp.data_length;
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+ UNLOCK_BUFFER(testing_hcd->output);
+
+ return;
+}
+
+static int testing_trx(enum test_code test_code)
+{
+ int retval;
+ unsigned char pass_vector;
+ unsigned int idx;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ switch (test_code) {
+ case TEST_TRX_TRX_SHORTS:
+ case TEST_TRX_GROUND_SHORTS:
+ pass_vector = 0xff;
+ break;
+ case TEST_TRX_SENSOR_OPENS:
+ pass_vector = 0x00;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ retval = testing_run_prod_test_item(test_code);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to run test\n");
+ goto exit;
+ }
+
+ LOCK_BUFFER(testing_hcd->resp);
+
+ testing_hcd->result = true;
+
+ for (idx = 0; idx < testing_hcd->resp.data_length; idx++) {
+ if (testing_hcd->resp.buf[idx] != pass_vector) {
+ testing_hcd->result = false;
+ break;
+ }
+ }
+
+ UNLOCK_BUFFER(testing_hcd->resp);
+
+ testing_trx_output();
+
+ retval = 0;
+
+exit:
+ if (tcm_hcd->features.dual_firmware) {
+ if (tcm_hcd->reset(tcm_hcd, false, true) < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do reset\n");
+ }
+ }
+
+ return retval;
+}
+
+static void testing_report(void)
+{
+ int retval;
+ unsigned int offset;
+ unsigned int report_size;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ report_size = tcm_hcd->report.buffer.data_length;
+
+ LOCK_BUFFER(testing_hcd->report);
+
+ if (testing_hcd->report_index == 0) {
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &testing_hcd->report,
+ report_size * testing_hcd->num_of_reports);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd->report.buf\n");
+ UNLOCK_BUFFER(testing_hcd->report);
+ return;
+ }
+ }
+
+ if (testing_hcd->report_index < testing_hcd->num_of_reports) {
+ offset = report_size * testing_hcd->report_index;
+
+ retval = secure_memcpy(testing_hcd->report.buf + offset,
+ testing_hcd->report.buf_size - offset,
+ tcm_hcd->report.buffer.buf,
+ tcm_hcd->report.buffer.buf_size,
+ tcm_hcd->report.buffer.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy report data\n");
+ UNLOCK_BUFFER(testing_hcd->report);
+ return;
+ }
+
+ testing_hcd->report_index++;
+ testing_hcd->report.data_length += report_size;
+ }
+
+ UNLOCK_BUFFER(testing_hcd->report);
+
+ if (testing_hcd->report_index == testing_hcd->num_of_reports)
+ complete(&report_complete);
+
+ return;
+}
+
+static ssize_t i2c_test(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = testing_hcd->tcm_hcd;
+
+ retval = tcm_hcd->read_message(tcm_hcd,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read message\n");
+ testing_hcd->result_type = TEST_FAILED;
+ } else
+ testing_hcd->result_type = TEST_OK;
+ return retval;
+}
+
+static ssize_t syna_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ char tmp[5];
+
+ if (!testing_hcd)
+ return 0;
+ if (*pos != 0)
+ return 0;
+
+ snprintf(tmp, sizeof(testing_hcd->result_type), "%d\n", testing_hcd->result_type);
+ if (copy_to_user(buf, tmp, strlen(tmp))) {
+ return -EFAULT;
+ }
+
+ *pos += strlen(tmp);
+
+ return strlen(tmp);
+}
+
+static ssize_t syna_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
+{
+ int retval;
+ char tmp[6];
+
+ if (!testing_hcd || count > sizeof(tmp)) {
+ retval = -EINVAL;
+ testing_hcd->result_type = TEST_INVALID;
+ goto out;
+ }
+
+ if (copy_from_user(tmp, buf, count)) {
+ retval = -EFAULT;
+ goto out;
+ }
+
+ if (!strncmp(tmp, "short", 5) || !strncmp(tmp, "open", 4)) {
+ testing_pt11();
+ if (testing_hcd->result)
+ testing_hcd->result_type = TEST_OK;
+ else
+ testing_hcd->result_type = TEST_FAILED;
+ } else if (!strncmp(tmp, "i2c", 3))
+ retval = i2c_test();
+
+out:
+ if (retval >= 0)
+ retval = count;
+
+ return retval;
+}
+
+static const struct file_operations syna_selftest_ops = {
+ .read = syna_selftest_read,
+ .write = syna_selftest_write,
+};
+
+static int testing_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ int idx;
+ static bool proc_already;
+
+ testing_hcd = kzalloc(sizeof(*testing_hcd), GFP_KERNEL);
+ if (!testing_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for testing_hcd\n");
+ return -ENOMEM;
+ }
+
+ testing_hcd->tcm_hcd = tcm_hcd;
+
+ testing_hcd->collect_reports = testing_collect_reports;
+
+ INIT_BUFFER(testing_hcd->out, false);
+ INIT_BUFFER(testing_hcd->resp, false);
+ INIT_BUFFER(testing_hcd->report, false);
+ INIT_BUFFER(testing_hcd->process, false);
+ INIT_BUFFER(testing_hcd->output, false);
+
+ testing_hcd->sysfs_dir = kobject_create_and_add(SYSFS_DIR_NAME,
+ tcm_hcd->sysfs_dir);
+ if (!testing_hcd->sysfs_dir) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs directory\n");
+ retval = -EINVAL;
+ goto err_sysfs_create_dir;
+ }
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++) {
+ retval = sysfs_create_file(testing_hcd->sysfs_dir,
+ &(*attrs[idx]).attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs file\n");
+ goto err_sysfs_create_file;
+ }
+ }
+
+ retval = sysfs_create_bin_file(testing_hcd->sysfs_dir, &bin_attr);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to create sysfs bin file\n");
+ goto err_sysfs_create_bin_file;
+ }
+ if (!proc_already) {
+ proc_already = true;
+ proc_create("tp_selftest", 0644, NULL, &syna_selftest_ops);
+ }
+
+ return 0;
+
+err_sysfs_create_bin_file:
+err_sysfs_create_file:
+ for (idx--; idx >= 0; idx--)
+ sysfs_remove_file(testing_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(testing_hcd->sysfs_dir);
+
+err_sysfs_create_dir:
+ RELEASE_BUFFER(testing_hcd->output);
+ RELEASE_BUFFER(testing_hcd->process);
+ RELEASE_BUFFER(testing_hcd->report);
+ RELEASE_BUFFER(testing_hcd->resp);
+ RELEASE_BUFFER(testing_hcd->out);
+
+ kfree(testing_hcd);
+ testing_hcd = NULL;
+
+ return retval;
+}
+
+static int testing_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ int idx;
+
+ if (!testing_hcd)
+ goto exit;
+
+ sysfs_remove_bin_file(testing_hcd->sysfs_dir, &bin_attr);
+
+ for (idx = 0; idx < ARRAY_SIZE(attrs); idx++)
+ sysfs_remove_file(testing_hcd->sysfs_dir, &(*attrs[idx]).attr);
+
+ kobject_put(testing_hcd->sysfs_dir);
+
+ RELEASE_BUFFER(testing_hcd->output);
+ RELEASE_BUFFER(testing_hcd->process);
+ RELEASE_BUFFER(testing_hcd->report);
+ RELEASE_BUFFER(testing_hcd->resp);
+ RELEASE_BUFFER(testing_hcd->out);
+
+ kfree(testing_hcd);
+ testing_hcd = NULL;
+
+exit:
+ complete(&testing_remove_complete);
+
+ return 0;
+}
+
+static int testing_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!testing_hcd) {
+ retval = testing_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int testing_syncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!testing_hcd)
+ return 0;
+
+ if (tcm_hcd->report.id == testing_hcd->report_type)
+ testing_report();
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb testing_module = {
+ .type = TCM_TESTING,
+ .init = testing_init,
+ .remove = testing_remove,
+ .syncbox = testing_syncbox,
+ .asyncbox = NULL,
+ .reset = testing_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init testing_module_init(void)
+{
+ return syna_tcm_add_module(&testing_module, true);
+}
+
+static void __exit testing_module_exit(void)
+{
+ syna_tcm_add_module(&testing_module, false);
+
+ wait_for_completion(&testing_remove_complete);
+
+ return;
+}
+
+late_initcall(testing_module_init);
+module_exit(testing_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Testing Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h
new file mode 100644
index 000000000000..54bf2b930fc3
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_testing.h
@@ -0,0 +1,418 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#ifndef _SYNAPTICS_TCM_TESTING_H_
+#define _SYNAPTICS_TCM_TESTING_H_
+
+static const unsigned short drt_hi_limits[36][36] = {
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+ {1700, 1700, 1700, 1700, 1700, 1700, 2000, 2000, 2000, 2000, 2000, 2000, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700},
+};
+
+static const unsigned short drt_lo_limits[36][36] = {
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 0, 0, 0, 0, 0, 0, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+};
+
+static const unsigned short noise_limits[36][36] = {
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+ {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
+};
+
+static const short pt11_hi_limits[36][36] = {
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+ {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70},
+};
+
+static const short pt11_lo_limits[36][36] = {
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+ {-70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, -70},
+};
+
+static const short pt12_limits[36][36] = {
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+ {-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10},
+};
+
+static const short pt13_limits[36][36] = {
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+ {-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100},
+};
+
+static const unsigned char lockdown_limits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+};
+
+static const unsigned short discrete_full_raw_hi_limits[36][36] = {
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+ {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000},
+};
+
+static const unsigned short discrete_full_raw_lo_limits[36][36] = {
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+ {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300},
+};
+
+static const unsigned short discrete_abs_row_limits[36] = {
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28
+};
+
+static const unsigned short discrete_abs_col_limits[36] = {
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28
+};
+
+static const unsigned char reset_open_limit = 0x13;
+#define TEST_INVALID 0
+#define TEST_FAILED 1
+#define TEST_OK 2
+#endif
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c
new file mode 100644
index 000000000000..1df24959f0c0
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_touch.c
@@ -0,0 +1,1355 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/input/mt.h>
+#include <linux/interrupt.h>
+#include "synaptics_tcm_core.h"
+#define TYPE_B_PROTOCOL
+
+#define USE_DEFAULT_TOUCH_REPORT_CONFIG
+
+#define TOUCH_REPORT_CONFIG_SIZE 128
+
+#define INPUT_EVENT_START 0
+#define INPUT_EVENT_WAKEUP_MODE_OFF 4
+#define INPUT_EVENT_WAKEUP_MODE_ON 5
+#define INPUT_EVENT_END 13
+
+enum touch_status {
+ LIFT = 0,
+ FINGER = 1,
+ GLOVED_FINGER = 2,
+ NOP = -1,
+};
+
+enum touch_report_code {
+ TOUCH_END = 0,
+ TOUCH_FOREACH_ACTIVE_OBJECT,
+ TOUCH_FOREACH_OBJECT,
+ TOUCH_FOREACH_END,
+ TOUCH_PAD_TO_NEXT_BYTE,
+ TOUCH_TIMESTAMP,
+ TOUCH_OBJECT_N_INDEX,
+ TOUCH_OBJECT_N_CLASSIFICATION,
+ TOUCH_OBJECT_N_X_POSITION,
+ TOUCH_OBJECT_N_Y_POSITION,
+ TOUCH_OBJECT_N_Z,
+ TOUCH_OBJECT_N_X_WIDTH,
+ TOUCH_OBJECT_N_Y_WIDTH,
+ TOUCH_OBJECT_N_TX_POSITION_TIXELS,
+ TOUCH_OBJECT_N_RX_POSITION_TIXELS,
+ TOUCH_0D_BUTTONS_STATE,
+ TOUCH_GESTURE_DOUBLE_TAP,
+ TOUCH_FRAME_RATE,
+ TOUCH_POWER_IM,
+ TOUCH_CID_IM,
+ TOUCH_RAIL_IM,
+ TOUCH_CID_VARIANCE_IM,
+ TOUCH_NSM_FREQUENCY,
+ TOUCH_NSM_STATE,
+ TOUCH_NUM_OF_ACTIVE_OBJECTS,
+ TOUCH_NUM_OF_CPU_CYCLES_USED_SINCE_LAST_FRAME,
+ TOUCH_TUNING_GAUSSIAN_WIDTHS = 0x80,
+ TOUCH_TUNING_SMALL_OBJECT_PARAMS,
+ TOUCH_TUNING_0D_BUTTONS_VARIANCE,
+};
+
+struct object_data {
+ unsigned char status;
+ unsigned int x_pos;
+ unsigned int y_pos;
+ unsigned int x_width;
+ unsigned int y_width;
+ unsigned int z;
+ unsigned int tx_pos;
+ unsigned int rx_pos;
+};
+
+struct input_params {
+ unsigned int max_x;
+ unsigned int max_y;
+ unsigned int max_objects;
+};
+
+struct touch_data {
+ struct object_data *object_data;
+ unsigned int timestamp;
+ unsigned int buttons_state;
+ unsigned int gesture_double_tap;
+ unsigned int frame_rate;
+ unsigned int power_im;
+ unsigned int cid_im;
+ unsigned int rail_im;
+ unsigned int cid_variance_im;
+ unsigned int nsm_frequency;
+ unsigned int nsm_state;
+ unsigned int num_of_active_objects;
+ unsigned int num_of_cpu_cycles;
+};
+struct syna_tcm_work_mode_switch {
+ struct touch_hcd *touch_hcd;
+ unsigned char mode;
+ struct work_struct switch_mode_work;
+};
+struct touch_hcd {
+ int dbclick_count;
+ bool irq_wake;
+ bool report_touch;
+ bool suspend_touch;
+ unsigned char *prev_status;
+ unsigned int max_x;
+ unsigned int max_y;
+ unsigned int max_objects;
+ struct mutex report_mutex;
+ struct input_dev *input_dev;
+ struct touch_data touch_data;
+ struct input_params input_params;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(touch_remove_complete);
+
+/*
+ *add the follow two lines
+ *to declare input event function
+ */
+
+static int syna_tcm_input_event(struct input_dev *dev,
+ unsigned int type, unsigned int code, int value);
+static void syna_tcm_switch_mode_work(struct work_struct *work);
+
+static struct touch_hcd *touch_hcd;
+
+/**
+ * touch_free_objects() - Free all touch objects
+ *
+ * Report finger lift events to the input subsystem for all touch objects.
+ */
+static void touch_free_objects(void)
+{
+#ifdef TYPE_B_PROTOCOL
+ unsigned int idx;
+#endif
+
+ if (touch_hcd->input_dev == NULL)
+ return;
+
+ mutex_lock(&touch_hcd->report_mutex);
+
+#ifdef TYPE_B_PROTOCOL
+ for (idx = 0; idx < touch_hcd->max_objects; idx++) {
+ input_mt_slot(touch_hcd->input_dev, idx);
+ input_mt_report_slot_state(touch_hcd->input_dev,
+ MT_TOOL_FINGER, 0);
+ }
+#endif
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOUCH, 0);
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOOL_FINGER, 0);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(touch_hcd->input_dev);
+#endif
+ input_sync(touch_hcd->input_dev);
+
+ mutex_unlock(&touch_hcd->report_mutex);
+
+ return;
+}
+
+/**
+ * touch_get_report_data() - Retrieve data from touch report
+ *
+ * Retrieve data from the touch report based on the bit offset and bit length
+ * information from the touch report configuration.
+ */
+static int touch_get_report_data(unsigned int offset,
+ unsigned int bits, unsigned int *data)
+{
+ unsigned char mask;
+ unsigned char byte_data;
+ unsigned int output_data;
+ unsigned int bit_offset;
+ unsigned int byte_offset;
+ unsigned int data_bits;
+ unsigned int available_bits;
+ unsigned int remaining_bits;
+ unsigned char *touch_report;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+ if (bits == 0 || bits > 32) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid number of bits\n");
+ return -EINVAL;
+ }
+
+ if (offset + bits > tcm_hcd->report.buffer.data_length * 8) {
+ *data = 0;
+ return 0;
+ }
+
+ touch_report = tcm_hcd->report.buffer.buf;
+
+ output_data = 0;
+ remaining_bits = bits;
+
+ bit_offset = offset % 8;
+ byte_offset = offset / 8;
+
+ while (remaining_bits) {
+ byte_data = touch_report[byte_offset];
+ byte_data >>= bit_offset;
+
+ available_bits = 8 - bit_offset;
+ data_bits = MIN(available_bits, remaining_bits);
+ mask = 0xff >> (8 - data_bits);
+
+ byte_data &= mask;
+
+ output_data |= byte_data << (bits - remaining_bits);
+
+ bit_offset = 0;
+ byte_offset += 1;
+ remaining_bits -= data_bits;
+ }
+
+ *data = output_data;
+
+ return 0;
+}
+
+/**
+ * touch_parse_report() - Parse touch report
+ *
+ * Traverse through the touch report configuration and parse the touch report
+ * generated by the device accordingly to retrieve the touch data.
+ */
+static int touch_parse_report(void)
+{
+ int retval;
+ bool active_only;
+ bool num_of_active_objects;
+ unsigned char code;
+ unsigned int size;
+ unsigned int idx;
+ unsigned int obj;
+ unsigned int next;
+ unsigned int data;
+ unsigned int bits;
+ unsigned int offset;
+ unsigned int objects;
+ unsigned int active_objects;
+ unsigned int report_size;
+ unsigned int config_size;
+ unsigned char *config_data;
+ struct touch_data *touch_data;
+ struct object_data *object_data;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+ static unsigned int end_of_foreach;
+
+ touch_data = &touch_hcd->touch_data;
+ object_data = touch_hcd->touch_data.object_data;
+
+ config_data = tcm_hcd->config.buf;
+ config_size = tcm_hcd->config.data_length;
+
+ report_size = tcm_hcd->report.buffer.data_length;
+
+ size = sizeof(*object_data) * touch_hcd->max_objects;
+ memset(touch_hcd->touch_data.object_data, 0x00, size);
+
+ num_of_active_objects = false;
+
+ idx = 0;
+ offset = 0;
+ objects = 0;
+ while (idx < config_size) {
+ code = config_data[idx++];
+ switch (code) {
+ case TOUCH_END:
+ goto exit;
+ case TOUCH_FOREACH_ACTIVE_OBJECT:
+ obj = 0;
+ next = idx;
+ active_only = true;
+ break;
+ case TOUCH_FOREACH_OBJECT:
+ obj = 0;
+ next = idx;
+ active_only = false;
+ break;
+ case TOUCH_FOREACH_END:
+ end_of_foreach = idx;
+ if (active_only) {
+ if (num_of_active_objects) {
+ objects++;
+ if (objects < active_objects)
+ idx = next;
+ } else if (offset < report_size * 8) {
+ idx = next;
+ }
+ } else {
+ obj++;
+ if (obj < touch_hcd->max_objects)
+ idx = next;
+ }
+ break;
+ case TOUCH_PAD_TO_NEXT_BYTE:
+ offset = ceil_div(offset, 8) * 8;
+ break;
+ case TOUCH_TIMESTAMP:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get timestamp\n");
+ return retval;
+ }
+ touch_data->timestamp = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_INDEX:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &obj);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object index\n");
+ return retval;
+ }
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_CLASSIFICATION:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object classification\n");
+ return retval;
+ }
+ object_data[obj].status = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_X_POSITION:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object x position\n");
+ return retval;
+ }
+ object_data[obj].x_pos = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_Y_POSITION:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object y position\n");
+ return retval;
+ }
+ object_data[obj].y_pos = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_Z:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object z\n");
+ return retval;
+ }
+ object_data[obj].z = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_X_WIDTH:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object x width\n");
+ return retval;
+ }
+ object_data[obj].x_width = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_Y_WIDTH:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object y width\n");
+ return retval;
+ }
+ object_data[obj].y_width = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_TX_POSITION_TIXELS:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object tx position\n");
+ return retval;
+ }
+ object_data[obj].tx_pos = data;
+ offset += bits;
+ break;
+ case TOUCH_OBJECT_N_RX_POSITION_TIXELS:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get object rx position\n");
+ return retval;
+ }
+ object_data[obj].rx_pos = data;
+ offset += bits;
+ break;
+ case TOUCH_0D_BUTTONS_STATE:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get 0D buttons state\n");
+ return retval;
+ }
+ touch_data->buttons_state = data;
+ offset += bits;
+ break;
+ case TOUCH_GESTURE_DOUBLE_TAP:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get gesture double tap\n");
+ return retval;
+ }
+ touch_data->gesture_double_tap = data;
+ tcm_hcd->gesture_enabled = touch_data->gesture_double_tap;
+ offset += bits;
+ break;
+ case TOUCH_FRAME_RATE:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get frame rate\n");
+ return retval;
+ }
+ touch_data->frame_rate = data;
+ offset += bits;
+ break;
+ case TOUCH_POWER_IM:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get power IM\n");
+ return retval;
+ }
+ touch_data->power_im = data;
+ offset += bits;
+ break;
+ case TOUCH_CID_IM:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get CID IM\n");
+ return retval;
+ }
+ touch_data->cid_im = data;
+ offset += bits;
+ break;
+ case TOUCH_RAIL_IM:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get rail IM\n");
+ return retval;
+ }
+ touch_data->rail_im = data;
+ offset += bits;
+ break;
+ case TOUCH_CID_VARIANCE_IM:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get CID variance IM\n");
+ return retval;
+ }
+ touch_data->cid_variance_im = data;
+ offset += bits;
+ break;
+ case TOUCH_NSM_FREQUENCY:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get NSM frequency\n");
+ return retval;
+ }
+ touch_data->nsm_frequency = data;
+ offset += bits;
+ break;
+ case TOUCH_NSM_STATE:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get NSM state\n");
+ return retval;
+ }
+ touch_data->nsm_state = data;
+ offset += bits;
+ break;
+ case TOUCH_NUM_OF_ACTIVE_OBJECTS:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get number of active objects\n");
+ return retval;
+ }
+ active_objects = data;
+ num_of_active_objects = true;
+ touch_data->num_of_active_objects = data;
+ offset += bits;
+ if (touch_data->num_of_active_objects == 0)
+ idx = end_of_foreach;
+ break;
+ case TOUCH_NUM_OF_CPU_CYCLES_USED_SINCE_LAST_FRAME:
+ bits = config_data[idx++];
+ retval = touch_get_report_data(offset, bits, &data);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get number of CPU cycles used since last frame\n");
+ return retval;
+ }
+ touch_data->num_of_cpu_cycles = data;
+ offset += bits;
+ break;
+ case TOUCH_TUNING_GAUSSIAN_WIDTHS:
+ bits = config_data[idx++];
+ offset += bits;
+ break;
+ case TOUCH_TUNING_SMALL_OBJECT_PARAMS:
+ bits = config_data[idx++];
+ offset += bits;
+ break;
+ case TOUCH_TUNING_0D_BUTTONS_VARIANCE:
+ bits = config_data[idx++];
+ offset += bits;
+ break;
+ }
+ }
+
+exit:
+ return 0;
+}
+
+/**
+ * touch_report() - Report touch events
+ *
+ * Retrieve data from the touch report generated by the device and report touch
+ * events to the input subsystem.
+ */
+static void touch_report(void)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int x;
+ unsigned int y;
+ unsigned int temp;
+ unsigned int status;
+ unsigned int touch_count;
+ struct touch_data *touch_data;
+ struct object_data *object_data;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+
+ if (!touch_hcd->report_touch)
+ return;
+
+ if (touch_hcd->input_dev == NULL)
+ return;
+
+ mutex_lock(&touch_hcd->report_mutex);
+
+ retval = touch_parse_report();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to parse touch report\n");
+ goto exit;
+ }
+
+ touch_data = &touch_hcd->touch_data;
+ object_data = touch_hcd->touch_data.object_data;
+#ifdef WAKEUP_GESTURE
+ if (touch_data->gesture_double_tap && tcm_hcd->in_suspend) {
+ touch_hcd->dbclick_count++;
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "syna wakeup with dbclick and count ++\n");
+ input_report_key(touch_hcd->input_dev, KEY_WAKEUP, 1);
+ input_sync(touch_hcd->input_dev);
+ input_report_key(touch_hcd->input_dev, KEY_WAKEUP, 0);
+ input_sync(touch_hcd->input_dev);
+ }
+#endif
+
+ if (tcm_hcd->in_suspend)
+ goto exit;
+
+ touch_count = 0;
+
+ for (idx = 0; idx < touch_hcd->max_objects; idx++) {
+ if (touch_hcd->prev_status[idx] == LIFT &&
+ object_data[idx].status == LIFT)
+ status = NOP;
+ else
+ status = object_data[idx].status;
+
+ switch (status) {
+ case LIFT:
+#ifdef TYPE_B_PROTOCOL
+ input_mt_slot(touch_hcd->input_dev, idx);
+ input_mt_report_slot_state(touch_hcd->input_dev,
+ MT_TOOL_FINGER, 0);
+#endif
+ break;
+ case FINGER:
+ case GLOVED_FINGER:
+ x = object_data[idx].x_pos;
+ y = object_data[idx].y_pos;
+ if (bdata->swap_axes) {
+ temp = x;
+ x = y;
+ y = temp;
+ }
+ if (bdata->x_flip)
+ x = touch_hcd->input_params.max_x - x;
+ if (bdata->y_flip)
+ y = touch_hcd->input_params.max_y - y;
+#ifdef TYPE_B_PROTOCOL
+ input_mt_slot(touch_hcd->input_dev, idx);
+ input_mt_report_slot_state(touch_hcd->input_dev,
+ MT_TOOL_FINGER, 1);
+#endif
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOUCH, 1);
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOOL_FINGER, 1);
+ input_report_abs(touch_hcd->input_dev,
+ ABS_MT_POSITION_X, x);
+ input_report_abs(touch_hcd->input_dev,
+ ABS_MT_POSITION_Y, y);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(touch_hcd->input_dev);
+#endif
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Finger %d: x = %d, y = %d\n",
+ idx, x, y);
+ touch_count++;
+ break;
+ default:
+ break;
+ }
+
+ touch_hcd->prev_status[idx] = object_data[idx].status;
+ }
+
+ if (touch_count == 0) {
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOUCH, 0);
+ input_report_key(touch_hcd->input_dev,
+ BTN_TOOL_FINGER, 0);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(touch_hcd->input_dev);
+#endif
+ }
+
+ input_sync(touch_hcd->input_dev);
+
+exit:
+ mutex_unlock(&touch_hcd->report_mutex);
+
+ return;
+}
+
+/**
+ * touch_set_input_params() - Set input parameters
+ *
+ * Set the input parameters of the input device based on the information
+ * retrieved from the application information packet. In addition, set up an
+ * array for tracking the status of touch objects.
+ */
+static int touch_set_input_params(void)
+{
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+ input_set_abs_params(touch_hcd->input_dev,
+ ABS_MT_POSITION_X, 0, touch_hcd->max_x, 0, 0);
+ input_set_abs_params(touch_hcd->input_dev,
+ ABS_MT_POSITION_Y, 0, touch_hcd->max_y, 0, 0);
+
+ input_mt_init_slots(touch_hcd->input_dev, touch_hcd->max_objects,
+ INPUT_MT_DIRECT);
+
+ touch_hcd->input_params.max_x = touch_hcd->max_x;
+ touch_hcd->input_params.max_y = touch_hcd->max_y;
+ touch_hcd->input_params.max_objects = touch_hcd->max_objects;
+
+ if (touch_hcd->max_objects == 0)
+ return 0;
+
+ kfree(touch_hcd->prev_status);
+ touch_hcd->prev_status = kzalloc(touch_hcd->max_objects, GFP_KERNEL);
+ if (!touch_hcd->prev_status) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for touch_hcd->prev_status\n");
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+/**
+ * touch_get_input_params() - Get input parameters
+ *
+ * Retrieve the input parameters to register with the input subsystem for
+ * the input device from the application information packet. In addition,
+ * the touch report configuration is retrieved and stored.
+ */
+static int touch_get_input_params(void)
+{
+ int retval;
+ unsigned int temp;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+ const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
+
+ app_info = &tcm_hcd->app_info;
+ touch_hcd->max_x = le2_to_uint(app_info->max_x);
+ touch_hcd->max_y = le2_to_uint(app_info->max_y);
+ touch_hcd->max_objects = le2_to_uint(app_info->max_objects);
+
+ if (bdata->swap_axes) {
+ temp = touch_hcd->max_x;
+ touch_hcd->max_x = touch_hcd->max_y;
+ touch_hcd->max_y = temp;
+ }
+
+ LOCK_BUFFER(tcm_hcd->config);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_GET_TOUCH_REPORT_CONFIG,
+ NULL,
+ 0,
+ &tcm_hcd->config.buf,
+ &tcm_hcd->config.buf_size,
+ &tcm_hcd->config.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_GET_TOUCH_REPORT_CONFIG));
+ UNLOCK_BUFFER(tcm_hcd->config);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(tcm_hcd->config);
+
+ return 0;
+}
+
+/**
+ * touch_set_input_dev() - Set up input device
+ *
+ * Allocate an input device, configure the input device based on the particular
+ * input events to be reported, and register the input device with the input
+ * subsystem.
+ */
+static int touch_set_input_dev(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+ touch_hcd->input_dev = input_allocate_device();
+ if (touch_hcd->input_dev == NULL) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate input device\n");
+ return -ENODEV;
+ }
+
+ touch_hcd->input_dev->name = TOUCH_INPUT_NAME;
+ touch_hcd->input_dev->phys = TOUCH_INPUT_PHYS_PATH;
+ touch_hcd->input_dev->id.product = SYNAPTICS_TCM_ID_PRODUCT;
+ touch_hcd->input_dev->id.version = SYNAPTICS_TCM_ID_VERSION;
+ touch_hcd->input_dev->dev.parent = tcm_hcd->pdev->dev.parent;
+ /**add input event interface**/
+ touch_hcd->input_dev->event = syna_tcm_input_event;
+ input_set_drvdata(touch_hcd->input_dev, touch_hcd);
+
+ set_bit(EV_SYN, touch_hcd->input_dev->evbit);
+ set_bit(EV_KEY, touch_hcd->input_dev->evbit);
+ set_bit(EV_ABS, touch_hcd->input_dev->evbit);
+ set_bit(BTN_TOUCH, touch_hcd->input_dev->keybit);
+ set_bit(BTN_TOOL_FINGER, touch_hcd->input_dev->keybit);
+#ifdef INPUT_PROP_DIRECT
+ set_bit(INPUT_PROP_DIRECT, touch_hcd->input_dev->propbit);
+#endif
+
+#ifdef WAKEUP_GESTURE
+ set_bit(KEY_WAKEUP, touch_hcd->input_dev->keybit);
+ input_set_capability(touch_hcd->input_dev, EV_KEY, KEY_WAKEUP);
+#endif
+
+ retval = touch_set_input_params();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set input parameters\n");
+ input_free_device(touch_hcd->input_dev);
+ touch_hcd->input_dev = NULL;
+ return retval;
+ }
+
+ retval = input_register_device(touch_hcd->input_dev);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to register input device\n");
+ input_free_device(touch_hcd->input_dev);
+ touch_hcd->input_dev = NULL;
+ return retval;
+ }
+ return 0;
+}
+
+/**
+ * touch_set_report_config() - Set touch report configuration
+ *
+ * Send the SET_TOUCH_REPORT_CONFIG command to configure the format and content
+ * of the touch report.
+ */
+static int touch_set_report_config(void)
+{
+ int retval;
+ unsigned int idx;
+ unsigned int length;
+ struct syna_tcm_app_info *app_info;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+#ifdef USE_DEFAULT_TOUCH_REPORT_CONFIG
+ return 0;
+#endif
+
+ app_info = &tcm_hcd->app_info;
+ length = le2_to_uint(app_info->max_touch_report_config_size);
+
+ if (length < TOUCH_REPORT_CONFIG_SIZE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid maximum touch report config size\n");
+ return -EINVAL;
+ }
+
+ LOCK_BUFFER(touch_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &touch_hcd->out,
+ length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for touch_hcd->out.buf\n");
+ UNLOCK_BUFFER(touch_hcd->out);
+ return retval;
+ }
+
+ idx = 0;
+#ifdef WAKEUP_GESTURE
+ touch_hcd->out.buf[idx++] = TOUCH_GESTURE_DOUBLE_TAP;
+ touch_hcd->out.buf[idx++] = 8;
+#endif
+ touch_hcd->out.buf[idx++] = TOUCH_FOREACH_ACTIVE_OBJECT;
+ touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_INDEX;
+ touch_hcd->out.buf[idx++] = 4;
+ touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_CLASSIFICATION;
+ touch_hcd->out.buf[idx++] = 4;
+ touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_X_POSITION;
+ touch_hcd->out.buf[idx++] = 12;
+ touch_hcd->out.buf[idx++] = TOUCH_OBJECT_N_Y_POSITION;
+ touch_hcd->out.buf[idx++] = 12;
+ touch_hcd->out.buf[idx++] = TOUCH_FOREACH_END;
+ touch_hcd->out.buf[idx++] = TOUCH_END;
+
+ LOCK_BUFFER(touch_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_SET_TOUCH_REPORT_CONFIG,
+ touch_hcd->out.buf,
+ length,
+ &touch_hcd->resp.buf,
+ &touch_hcd->resp.buf_size,
+ &touch_hcd->resp.data_length,
+ NULL,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_SET_TOUCH_REPORT_CONFIG));
+ UNLOCK_BUFFER(touch_hcd->resp);
+ UNLOCK_BUFFER(touch_hcd->out);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(touch_hcd->resp);
+ UNLOCK_BUFFER(touch_hcd->out);
+
+ return 0;
+}
+
+/**
+ * touch_check_input_params() - Check input parameters
+ *
+ * Check if any of the input parameters registered with the input subsystem for
+ * the input device has changed.
+ */
+static int touch_check_input_params(void)
+{
+ unsigned int size;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+ if (touch_hcd->max_x == 0 && touch_hcd->max_y == 0)
+ return 0;
+
+ if (touch_hcd->input_params.max_objects != touch_hcd->max_objects) {
+ kfree(touch_hcd->touch_data.object_data);
+ size = sizeof(*touch_hcd->touch_data.object_data);
+ size *= touch_hcd->max_objects;
+ touch_hcd->touch_data.object_data = kzalloc(size, GFP_KERNEL);
+ if (!touch_hcd->touch_data.object_data) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for touch_hcd->touch_data.object_data\n");
+ return -ENOMEM;
+ }
+ return 1;
+ }
+
+ if (touch_hcd->input_params.max_x != touch_hcd->max_x)
+ return 1;
+
+ if (touch_hcd->input_params.max_y != touch_hcd->max_y)
+ return 1;
+
+ return 0;
+}
+
+/**
+ * touch_set_input_reporting() - Configure touch report and set up new input
+ * device if necessary
+ *
+ * After a device reset event, configure the touch report and set up a new input
+ * device if any of the input parameters has changed after the device reset.
+ */
+static int touch_set_input_reporting(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION ||
+ tcm_hcd->app_status != APP_STATUS_OK) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application firmware not running\n");
+ return 0;
+ }
+
+ touch_hcd->report_touch = false;
+
+ touch_free_objects();
+
+ mutex_lock(&touch_hcd->report_mutex);
+
+ retval = touch_set_report_config();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set report config\n");
+ goto exit;
+ }
+
+ retval = touch_get_input_params();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get input parameters\n");
+ goto exit;
+ }
+
+ retval = touch_check_input_params();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to check input parameters\n");
+ goto exit;
+ } else if (retval == 0) {
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Input parameters unchanged\n");
+ goto exit;
+ }
+
+ if (touch_hcd->input_dev != NULL) {
+ input_unregister_device(touch_hcd->input_dev);
+ touch_hcd->input_dev = NULL;
+ }
+
+ retval = touch_set_input_dev();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up input device\n");
+ goto exit;
+ }
+
+exit:
+ mutex_unlock(&touch_hcd->report_mutex);
+
+ touch_hcd->report_touch = retval < 0 ? false : true;
+
+ return retval;
+}
+
+
+/*
+ *add syna_tcm_input_event
+ *this function is used to get input event command to switch work mode
+ */
+static void syna_tcm_switch_mode_work(struct work_struct *work)
+{
+ struct syna_tcm_work_mode_switch *ms =
+ container_of(work, struct syna_tcm_work_mode_switch, switch_mode_work);
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+ unsigned char value = ms->mode;
+
+ if (value >= INPUT_EVENT_WAKEUP_MODE_OFF &&
+ value <= INPUT_EVENT_WAKEUP_MODE_ON) {
+ touch_hcd->touch_data.gesture_double_tap = value - INPUT_EVENT_WAKEUP_MODE_OFF;
+ tcm_hcd->gesture_enabled = touch_hcd->touch_data.gesture_double_tap;
+ LOGE(tcm_hcd->pdev->dev.parent, "Success get input tmode command:%d\n", value);
+ } else {
+ LOGE(tcm_hcd->pdev->dev.parent, "Does not support touch mode %d\n", value);
+ }
+ if(ms != NULL) {
+ kfree(ms);
+ ms = NULL;
+ }
+ return;
+}
+
+
+
+static int syna_tcm_input_event
+ (struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ struct touch_hcd *touch_hcd = input_get_drvdata(dev);
+ struct syna_tcm_work_mode_switch *ms;
+ struct syna_tcm_hcd *tcm_hcd = touch_hcd->tcm_hcd;
+ if (type == EV_SYN && code == SYN_CONFIG) {
+ LOGE(tcm_hcd->pdev->dev.parent, "set input event value = %d\n", value);
+ if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) {
+ ms = (struct syna_tcm_work_mode_switch *)
+ kmalloc(sizeof(struct syna_tcm_work_mode_switch), GFP_ATOMIC);
+ if (ms != NULL) {
+ ms->mode = (unsigned char)value;
+ INIT_WORK(&ms->switch_mode_work, syna_tcm_switch_mode_work);
+ schedule_work(&ms->switch_mode_work);
+ } else {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "failed in allocating memory for switching mode\n");
+ return -ENOMEM;
+ }
+ } else {
+ LOGE(tcm_hcd->pdev->dev.parent, "Invalid event value\n");
+ return -EINVAL;
+ }
+ }
+ return 0;
+}
+
+
+static int touch_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ touch_hcd = kzalloc(sizeof(*touch_hcd), GFP_KERNEL);
+ if (!touch_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for touch_hcd\n");
+ return -ENOMEM;
+ }
+
+ touch_hcd->tcm_hcd = tcm_hcd;
+
+ mutex_init(&touch_hcd->report_mutex);
+
+ INIT_BUFFER(touch_hcd->out, false);
+ INIT_BUFFER(touch_hcd->resp, false);
+
+ retval = touch_set_input_reporting();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up input reporting\n");
+ goto err_set_input_reporting;
+ }
+ touch_hcd->dbclick_count = 0;
+ tcm_hcd->report_touch = touch_report;
+
+ return 0;
+
+err_set_input_reporting:
+ kfree(touch_hcd->touch_data.object_data);
+ kfree(touch_hcd->prev_status);
+
+ RELEASE_BUFFER(touch_hcd->resp);
+ RELEASE_BUFFER(touch_hcd->out);
+
+ kfree(touch_hcd);
+ touch_hcd = NULL;
+
+ return retval;
+}
+
+static int touch_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!touch_hcd)
+ goto exit;
+
+ tcm_hcd->report_touch = NULL;
+
+ input_unregister_device(touch_hcd->input_dev);
+
+ kfree(touch_hcd->touch_data.object_data);
+ kfree(touch_hcd->prev_status);
+
+ RELEASE_BUFFER(touch_hcd->resp);
+ RELEASE_BUFFER(touch_hcd->out);
+
+ kfree(touch_hcd);
+ touch_hcd = NULL;
+
+exit:
+ complete(&touch_remove_complete);
+
+ return 0;
+}
+
+static int touch_syncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!touch_hcd)
+ return 0;
+ switch (tcm_hcd->report.id) {
+ case REPORT_IDENTIFY:
+ touch_free_objects();
+ break;
+ case REPORT_TOUCH:
+ if (touch_hcd->touch_data.gesture_double_tap || !touch_hcd->suspend_touch)
+ touch_report();
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int touch_asyncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!touch_hcd)
+ return 0;
+
+ switch (tcm_hcd->async_report_id) {
+ case REPORT_IDENTIFY:
+ if (tcm_hcd->id_info.mode != MODE_APPLICATION)
+ break;
+ retval = tcm_hcd->identify(tcm_hcd, false);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to do identification\n");
+ return retval;
+ }
+ retval = touch_set_input_reporting();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up input reporting\n");
+ return retval;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int touch_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!touch_hcd) {
+ retval = touch_init(tcm_hcd);
+ return retval;
+ }
+
+ if (tcm_hcd->id_info.mode == MODE_APPLICATION) {
+ retval = touch_set_input_reporting();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to set up input reporting\n");
+ return retval;
+ }
+ }
+
+ return 0;
+}
+
+static int touch_early_suspend(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!touch_hcd)
+ return 0;
+
+ touch_hcd->suspend_touch = true;
+
+ touch_free_objects();
+
+ return 0;
+}
+
+static int touch_suspend(struct syna_tcm_hcd *tcm_hcd)
+{
+#ifdef WAKEUP_GESTURE
+ int retval;
+#endif
+
+ if (!touch_hcd)
+ return 0;
+
+ touch_hcd->suspend_touch = true;
+
+
+#ifdef WAKEUP_GESTURE
+ if (touch_hcd->touch_data.gesture_double_tap) {
+ if (!touch_hcd->irq_wake) {
+ enable_irq_wake(tcm_hcd->irq);
+ touch_hcd->irq_wake = true;
+ }
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 1);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable wakeup gesture mode\n");
+ return retval;
+ }
+ }
+#endif
+ touch_free_objects();
+ return 0;
+}
+
+static int touch_resume(struct syna_tcm_hcd *tcm_hcd)
+{
+#ifdef WAKEUP_GESTURE
+ int retval;
+#endif
+
+ if (!touch_hcd)
+ return 0;
+
+ touch_hcd->suspend_touch = false;
+
+#ifdef WAKEUP_GESTURE
+ if ((touch_hcd->touch_data.gesture_double_tap || !tcm_hcd->gesture_disabled_when_resume)
+ && tcm_hcd->gesture_enabled_when_resume) {
+ if (touch_hcd->irq_wake) {
+ disable_irq_wake(tcm_hcd->irq);
+ touch_hcd->irq_wake = false;
+ }
+
+ retval = tcm_hcd->set_dynamic_config(tcm_hcd,
+ DC_IN_WAKEUP_GESTURE_MODE,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable wakeup gesture mode\n");
+ return retval;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb touch_module = {
+ .type = TCM_TOUCH,
+ .init = touch_init,
+ .remove = touch_remove,
+ .syncbox = touch_syncbox,
+ .asyncbox = touch_asyncbox,
+ .reset = touch_reset,
+ .suspend = touch_suspend,
+ .resume = touch_resume,
+ .early_suspend = touch_early_suspend,
+};
+
+static int __init touch_module_init(void)
+{
+ return syna_tcm_add_module(&touch_module, true);
+}
+
+static void __exit touch_module_exit(void)
+{
+ syna_tcm_add_module(&touch_module, false);
+
+ wait_for_completion(&touch_remove_complete);
+
+ return;
+}
+
+late_initcall(touch_module_init);
+module_exit(touch_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Touch Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c
new file mode 100644
index 000000000000..cc7ec971d28a
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_tcm_d2t/synaptics_tcm_zeroflash.c
@@ -0,0 +1,975 @@
+/*
+ * Synaptics TCM touchscreen driver
+ *
+ * Copyright (C) 2017-2018 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2017-2018 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/crc32.h>
+#include <linux/firmware.h>
+#include "synaptics_tcm_core.h"
+
+#define FW_IMAGE_NAME "synaptics/hdl_firmware.img"
+
+#define BOOT_CONFIG_ID "BOOT_CONFIG"
+
+#define F35_APP_CODE_ID "F35_APP_CODE"
+
+#define APP_CONFIG_ID "APP_CONFIG"
+
+#define DISP_CONFIG_ID "DISPLAY"
+
+#define IMAGE_FILE_MAGIC_VALUE 0x4818472b
+
+#define FLASH_AREA_MAGIC_VALUE 0x7c05e516
+
+#define PDT_START_ADDR 0x00e9
+
+#define PDT_END_ADDR 0x00ee
+
+#define UBL_FN_NUMBER 0x35
+
+#define F35_CTRL3_OFFSET 18
+
+#define F35_CTRL7_OFFSET 22
+
+#define F35_WRITE_FW_TO_PMEM_COMMAND 4
+
+#define DOWNLOAD_RETRY_COUNT 10
+
+enum f35_error_code {
+ SUCCESS = 0,
+ UNKNOWN_FLASH_PRESENT,
+ MAGIC_NUMBER_NOT_PRESENT,
+ INVALID_BLOCK_NUMBER,
+ BLOCK_NOT_ERASED,
+ NO_FLASH_PRESENT,
+ CHECKSUM_FAILURE,
+ WRITE_FAILURE,
+ INVALID_COMMAND,
+ IN_DEBUG_MODE,
+ INVALID_HEADER,
+ REQUESTING_FIRMWARE,
+ INVALID_CONFIGURATION,
+ DISABLE_BLOCK_PROTECT_FAILURE,
+};
+
+enum config_download {
+ HDL_INVALID = 0,
+ HDL_TOUCH_CONFIG_TO_PMEM,
+ HDL_DISPLAY_CONFIG_TO_PMEM,
+ HDL_DISPLAY_CONFIG_TO_RAM,
+};
+
+struct area_descriptor {
+ unsigned char magic_value[4];
+ unsigned char id_string[16];
+ unsigned char flags[4];
+ unsigned char flash_addr_words[4];
+ unsigned char length[4];
+ unsigned char checksum[4];
+};
+
+struct block_data {
+ const unsigned char *data;
+ unsigned int size;
+ unsigned int flash_addr;
+};
+
+struct image_info {
+ unsigned int packrat_number;
+ struct block_data boot_config;
+ struct block_data app_firmware;
+ struct block_data app_config;
+ struct block_data disp_config;
+};
+
+struct image_header {
+ unsigned char magic_value[4];
+ unsigned char num_of_areas[4];
+};
+
+struct rmi_f35_query {
+ unsigned char version:4;
+ unsigned char has_debug_mode:1;
+ unsigned char has_data5:1;
+ unsigned char has_query1:1;
+ unsigned char has_query2:1;
+ unsigned char chunk_size;
+ unsigned char has_ctrl7:1;
+ unsigned char has_host_download:1;
+ unsigned char has_spi_master:1;
+ unsigned char advanced_recovery_mode:1;
+ unsigned char reserved:4;
+} __packed;
+
+struct rmi_f35_data {
+ unsigned char error_code:5;
+ unsigned char recovery_mode_forced:1;
+ unsigned char nvm_programmed:1;
+ unsigned char in_recovery:1;
+} __packed;
+
+struct rmi_pdt_entry {
+ unsigned char query_base_addr;
+ unsigned char command_base_addr;
+ unsigned char control_base_addr;
+ unsigned char data_base_addr;
+ unsigned char intr_src_count:3;
+ unsigned char reserved_1:2;
+ unsigned char fn_version:2;
+ unsigned char reserved_2:1;
+ unsigned char fn_number;
+} __packed;
+
+struct rmi_addr {
+ unsigned short query_base;
+ unsigned short command_base;
+ unsigned short control_base;
+ unsigned short data_base;
+};
+
+struct firmware_status {
+ unsigned short invalid_static_config:1;
+ unsigned short need_disp_config:1;
+ unsigned short need_app_config:1;
+ unsigned short reserved:13;
+} __packed;
+
+struct zeroflash_hcd {
+ bool has_hdl;
+ bool f35_ready;
+ const unsigned char *image;
+ unsigned char *buf;
+ const struct firmware *fw_entry;
+ struct work_struct config_work;
+ struct work_struct firmware_work;
+ struct workqueue_struct *workqueue;
+ struct rmi_addr f35_addr;
+ struct image_info image_info;
+ struct firmware_status fw_status;
+ struct syna_tcm_buffer out;
+ struct syna_tcm_buffer resp;
+ struct syna_tcm_hcd *tcm_hcd;
+};
+
+DECLARE_COMPLETION(zeroflash_remove_complete);
+
+static struct zeroflash_hcd *zeroflash_hcd;
+
+static int zeroflash_check_uboot(void)
+{
+ int retval;
+ unsigned char fn_number;
+ struct rmi_f35_query query;
+ struct rmi_pdt_entry p_entry;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ PDT_END_ADDR,
+ &fn_number,
+ sizeof(fn_number));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read RMI function number\n");
+ return retval;
+ }
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Found F$%02x\n",
+ fn_number);
+
+ if (fn_number != UBL_FN_NUMBER) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to find F$35\n");
+ return -ENODEV;
+ }
+
+ if (zeroflash_hcd->f35_ready)
+ return 0;
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ PDT_START_ADDR,
+ (unsigned char *)&p_entry,
+ sizeof(p_entry));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read PDT entry\n");
+ return retval;
+ }
+
+ zeroflash_hcd->f35_addr.query_base = p_entry.query_base_addr;
+ zeroflash_hcd->f35_addr.command_base = p_entry.command_base_addr;
+ zeroflash_hcd->f35_addr.control_base = p_entry.control_base_addr;
+ zeroflash_hcd->f35_addr.data_base = p_entry.data_base_addr;
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ zeroflash_hcd->f35_addr.query_base,
+ (unsigned char *)&query,
+ sizeof(query));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read F$35 query\n");
+ return retval;
+ }
+
+ zeroflash_hcd->f35_ready = true;
+
+ if (query.has_query2 && query.has_ctrl7 && query.has_host_download) {
+ zeroflash_hcd->has_hdl = true;
+ } else {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Host download not supported\n");
+ zeroflash_hcd->has_hdl = false;
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int zeroflash_parse_fw_image(void)
+{
+ unsigned int idx;
+ unsigned int addr;
+ unsigned int offset;
+ unsigned int length;
+ unsigned int checksum;
+ unsigned int flash_addr;
+ unsigned int magic_value;
+ unsigned int num_of_areas;
+ struct image_header *header;
+ struct image_info *image_info;
+ struct area_descriptor *descriptor;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+ const unsigned char *image;
+ const unsigned char *content;
+
+ image = zeroflash_hcd->image;
+ image_info = &zeroflash_hcd->image_info;
+ header = (struct image_header *)image;
+
+ magic_value = le4_to_uint(header->magic_value);
+ if (magic_value != IMAGE_FILE_MAGIC_VALUE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Invalid image file magic value\n");
+ return -EINVAL;
+ }
+
+ memset(image_info, 0x00, sizeof(*image_info));
+
+ offset = sizeof(*header);
+ num_of_areas = le4_to_uint(header->num_of_areas);
+
+ for (idx = 0; idx < num_of_areas; idx++) {
+ addr = le4_to_uint(image + offset);
+ descriptor = (struct area_descriptor *)(image + addr);
+ offset += 4;
+
+ magic_value = le4_to_uint(descriptor->magic_value);
+ if (magic_value != FLASH_AREA_MAGIC_VALUE)
+ continue;
+
+ length = le4_to_uint(descriptor->length);
+ content = (unsigned char *)descriptor + sizeof(*descriptor);
+ flash_addr = le4_to_uint(descriptor->flash_addr_words) * 2;
+ checksum = le4_to_uint(descriptor->checksum);
+
+ if (0 == strncmp((char *)descriptor->id_string,
+ BOOT_CONFIG_ID,
+ strlen(BOOT_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Boot config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->boot_config.size = length;
+ image_info->boot_config.data = content;
+ image_info->boot_config.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Boot config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Boot config flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ F35_APP_CODE_ID,
+ strlen(F35_APP_CODE_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application firmware checksum error\n");
+ return -EINVAL;
+ }
+ image_info->app_firmware.size = length;
+ image_info->app_firmware.data = content;
+ image_info->app_firmware.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application firmware size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application firmware flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ APP_CONFIG_ID,
+ strlen(APP_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Application config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->app_config.size = length;
+ image_info->app_config.data = content;
+ image_info->app_config.flash_addr = flash_addr;
+ image_info->packrat_number = le4_to_uint(&content[14]);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Application config flash address = 0x%08x\n",
+ flash_addr);
+ } else if (0 == strncmp((char *)descriptor->id_string,
+ DISP_CONFIG_ID,
+ strlen(DISP_CONFIG_ID))) {
+ if (checksum != (crc32(~0, content, length) ^ ~0)) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Display config checksum error\n");
+ return -EINVAL;
+ }
+ image_info->disp_config.size = length;
+ image_info->disp_config.data = content;
+ image_info->disp_config.flash_addr = flash_addr;
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Display config size = %d\n",
+ length);
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Display config flash address = 0x%08x\n",
+ flash_addr);
+ }
+ }
+
+ return 0;
+}
+
+static int zeroflash_get_fw_image(void)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+
+ if (zeroflash_hcd->fw_entry != NULL)
+ return 0;
+
+ do {
+ retval = request_firmware(&zeroflash_hcd->fw_entry,
+ FW_IMAGE_NAME,
+ tcm_hcd->pdev->dev.parent);
+ if (retval < 0) {
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Failed to request %s\n",
+ FW_IMAGE_NAME);
+ msleep(100);
+ } else {
+ break;
+ }
+ } while (1);
+
+ LOGD(tcm_hcd->pdev->dev.parent,
+ "Firmware image size = %d\n",
+ (unsigned int)zeroflash_hcd->fw_entry->size);
+
+ zeroflash_hcd->image = zeroflash_hcd->fw_entry->data;
+
+ retval = zeroflash_parse_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to parse firmware image\n");
+ release_firmware(zeroflash_hcd->fw_entry);
+ zeroflash_hcd->fw_entry = NULL;
+ zeroflash_hcd->image = NULL;
+ return retval;
+ }
+
+ return 0;
+}
+
+static void zeroflash_download_config(void)
+{
+ struct firmware_status *fw_status;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+
+ fw_status = &zeroflash_hcd->fw_status;
+
+ if (!fw_status->need_app_config && !fw_status->need_disp_config) {
+ if (atomic_read(&tcm_hcd->helper.task) == HELP_NONE) {
+ atomic_set(&tcm_hcd->helper.task,
+ HELP_SEND_RESET_NOTIFICATION);
+ queue_work(tcm_hcd->helper.workqueue,
+ &tcm_hcd->helper.work);
+ }
+ atomic_set(&tcm_hcd->host_downloading, 0);
+ wake_up_interruptible(&tcm_hcd->hdl_wq);
+ return;
+ }
+
+ queue_work(zeroflash_hcd->workqueue, &zeroflash_hcd->config_work);
+
+ return;
+}
+
+static void zeroflash_download_firmware(void)
+{
+ queue_work(zeroflash_hcd->workqueue, &zeroflash_hcd->firmware_work);
+
+ return;
+}
+
+static int zeroflash_download_disp_config(void)
+{
+ int retval;
+ unsigned char response_code;
+ struct image_info *image_info;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+ static unsigned int retry_count;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Downloading display config\n");
+
+ image_info = &zeroflash_hcd->image_info;
+
+ if (image_info->disp_config.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No display config in image file\n");
+ return -EINVAL;
+ }
+
+ LOCK_BUFFER(zeroflash_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &zeroflash_hcd->out,
+ image_info->disp_config.size + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for zeroflash_hcd->out.buf\n");
+ goto unlock_out;
+ }
+
+ zeroflash_hcd->out.buf[0] = 1;
+ zeroflash_hcd->out.buf[1] = HDL_DISPLAY_CONFIG_TO_RAM;
+
+ retval = secure_memcpy(&zeroflash_hcd->out.buf[2],
+ zeroflash_hcd->out.buf_size - 2,
+ image_info->disp_config.data,
+ image_info->disp_config.size,
+ image_info->disp_config.size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy display config data\n");
+ goto unlock_out;
+ }
+
+ zeroflash_hcd->out.data_length = image_info->disp_config.size + 2;
+
+ LOCK_BUFFER(zeroflash_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_DOWNLOAD_CONFIG,
+ zeroflash_hcd->out.buf,
+ zeroflash_hcd->out.data_length,
+ &zeroflash_hcd->resp.buf,
+ &zeroflash_hcd->resp.buf_size,
+ &zeroflash_hcd->resp.data_length,
+ &response_code,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_DOWNLOAD_CONFIG));
+ if (response_code != STATUS_ERROR)
+ goto unlock_resp;
+ retry_count++;
+ if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT)
+ goto unlock_resp;
+ } else {
+ retry_count = 0;
+ }
+
+ retval = secure_memcpy((unsigned char *)&zeroflash_hcd->fw_status,
+ sizeof(zeroflash_hcd->fw_status),
+ zeroflash_hcd->resp.buf,
+ zeroflash_hcd->resp.buf_size,
+ sizeof(zeroflash_hcd->fw_status));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy firmware status\n");
+ goto unlock_resp;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Display config downloaded\n");
+
+ retval = 0;
+
+unlock_resp:
+ UNLOCK_BUFFER(zeroflash_hcd->resp);
+
+unlock_out:
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+
+ return retval;
+}
+
+static int zeroflash_download_app_config(void)
+{
+ int retval;
+ unsigned char response_code;
+ struct image_info *image_info;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+ static unsigned int retry_count;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Downloading application config\n");
+
+ image_info = &zeroflash_hcd->image_info;
+
+ if (image_info->app_config.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No application config in image file\n");
+ return -EINVAL;
+ }
+
+ LOCK_BUFFER(zeroflash_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &zeroflash_hcd->out,
+ image_info->app_config.size + 2);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for zeroflash_hcd->out.buf\n");
+ goto unlock_out;
+ }
+
+ zeroflash_hcd->out.buf[0] = 1;
+ zeroflash_hcd->out.buf[1] = HDL_TOUCH_CONFIG_TO_PMEM;
+
+ retval = secure_memcpy(&zeroflash_hcd->out.buf[2],
+ zeroflash_hcd->out.buf_size - 2,
+ image_info->app_config.data,
+ image_info->app_config.size,
+ image_info->app_config.size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy application config data\n");
+ goto unlock_out;
+ }
+
+ zeroflash_hcd->out.data_length = image_info->app_config.size + 2;
+
+ LOCK_BUFFER(zeroflash_hcd->resp);
+
+ retval = tcm_hcd->write_message(tcm_hcd,
+ CMD_DOWNLOAD_CONFIG,
+ zeroflash_hcd->out.buf,
+ zeroflash_hcd->out.data_length,
+ &zeroflash_hcd->resp.buf,
+ &zeroflash_hcd->resp.buf_size,
+ &zeroflash_hcd->resp.data_length,
+ &response_code,
+ 0);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write command %s\n",
+ STR(CMD_DOWNLOAD_CONFIG));
+ if (response_code != STATUS_ERROR)
+ goto unlock_resp;
+ retry_count++;
+ if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT)
+ goto unlock_resp;
+ } else {
+ retry_count = 0;
+ }
+
+ retval = secure_memcpy((unsigned char *)&zeroflash_hcd->fw_status,
+ sizeof(zeroflash_hcd->fw_status),
+ zeroflash_hcd->resp.buf,
+ zeroflash_hcd->resp.buf_size,
+ sizeof(zeroflash_hcd->fw_status));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy firmware status\n");
+ goto unlock_resp;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application config downloaded\n");
+
+ retval = 0;
+
+unlock_resp:
+ UNLOCK_BUFFER(zeroflash_hcd->resp);
+
+unlock_out:
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+
+ return retval;
+}
+
+static void zeroflash_download_config_work(struct work_struct *work)
+{
+ int retval;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+
+ retval = zeroflash_get_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get firmware image\n");
+ return;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Start of config download\n");
+
+ if (zeroflash_hcd->fw_status.need_app_config) {
+ retval = zeroflash_download_app_config();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to download application config\n");
+ return;
+ }
+ goto exit;
+ }
+
+ if (zeroflash_hcd->fw_status.need_disp_config) {
+ retval = zeroflash_download_disp_config();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to download display config\n");
+ return;
+ }
+ goto exit;
+ }
+
+exit:
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "End of config download\n");
+
+ zeroflash_download_config();
+
+ return;
+}
+
+static int zeroflash_download_app_fw(void)
+{
+ int retval;
+ unsigned char command;
+ struct image_info *image_info;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Downloading application firmware\n");
+
+ image_info = &zeroflash_hcd->image_info;
+
+ if (image_info->app_firmware.size == 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "No application firmware in image file\n");
+ return -EINVAL;
+ }
+
+ LOCK_BUFFER(zeroflash_hcd->out);
+
+ retval = syna_tcm_alloc_mem(tcm_hcd,
+ &zeroflash_hcd->out,
+ image_info->app_firmware.size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for zeroflash_hcd->out.buf\n");
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+ return retval;
+ }
+
+ retval = secure_memcpy(zeroflash_hcd->out.buf,
+ zeroflash_hcd->out.buf_size,
+ image_info->app_firmware.data,
+ image_info->app_firmware.size,
+ image_info->app_firmware.size);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy application firmware data\n");
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+ return retval;
+ }
+
+ zeroflash_hcd->out.data_length = image_info->app_firmware.size;
+
+ command = F35_WRITE_FW_TO_PMEM_COMMAND;
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ zeroflash_hcd->f35_addr.control_base + F35_CTRL3_OFFSET,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write F$35 command\n");
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+ return retval;
+ }
+
+ retval = syna_tcm_rmi_write(tcm_hcd,
+ zeroflash_hcd->f35_addr.control_base + F35_CTRL7_OFFSET,
+ zeroflash_hcd->out.buf,
+ zeroflash_hcd->out.data_length);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to write application firmware data\n");
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+ return retval;
+ }
+
+ UNLOCK_BUFFER(zeroflash_hcd->out);
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Application firmware downloaded\n");
+
+ return 0;
+}
+
+static void zeroflash_download_firmware_work(struct work_struct *work)
+{
+ int retval;
+ struct rmi_f35_data data;
+ struct syna_tcm_hcd *tcm_hcd = zeroflash_hcd->tcm_hcd;
+ static unsigned int retry_count;
+
+ retval = zeroflash_check_uboot();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Microbootloader support unavailable\n");
+ goto exit;
+ }
+
+ atomic_set(&tcm_hcd->host_downloading, 1);
+
+ retval = syna_tcm_rmi_read(tcm_hcd,
+ zeroflash_hcd->f35_addr.data_base,
+ (unsigned char *)&data,
+ sizeof(data));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to read F$35 data\n");
+ goto exit;
+ }
+
+ if (data.error_code != REQUESTING_FIRMWARE) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Microbootloader error code = 0x%02x\n",
+ data.error_code);
+ if (data.error_code != CHECKSUM_FAILURE) {
+ retval = -EIO;
+ goto exit;
+ } else {
+ retry_count++;
+ }
+ } else {
+ retry_count = 0;
+ }
+
+ retval = zeroflash_get_fw_image();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to get firmware image\n");
+ goto exit;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "Start of firmware download\n");
+
+ retval = zeroflash_download_app_fw();
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to download application firmware\n");
+ goto exit;
+ }
+
+ LOGN(tcm_hcd->pdev->dev.parent,
+ "End of firmware download\n");
+
+exit:
+ if (retval < 0)
+ retry_count++;
+
+ if (DOWNLOAD_RETRY_COUNT && retry_count > DOWNLOAD_RETRY_COUNT) {
+ retval = tcm_hcd->enable_irq(tcm_hcd, false, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable interrupt\n");
+ }
+ } else {
+ retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to enable interrupt\n");
+ }
+ }
+
+ return;
+}
+
+static int zeroflash_init(struct syna_tcm_hcd *tcm_hcd)
+{
+ zeroflash_hcd = kzalloc(sizeof(*zeroflash_hcd), GFP_KERNEL);
+ if (!zeroflash_hcd) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to allocate memory for zeroflash_hcd\n");
+ return -ENOMEM;
+ }
+
+ zeroflash_hcd->tcm_hcd = tcm_hcd;
+
+ INIT_BUFFER(zeroflash_hcd->out, false);
+ INIT_BUFFER(zeroflash_hcd->resp, false);
+
+ zeroflash_hcd->workqueue =
+ create_singlethread_workqueue("syna_tcm_zeroflash");
+ INIT_WORK(&zeroflash_hcd->config_work,
+ zeroflash_download_config_work);
+ INIT_WORK(&zeroflash_hcd->firmware_work,
+ zeroflash_download_firmware_work);
+
+ if (tcm_hcd->init_okay == false &&
+ tcm_hcd->hw_if->bus_io->type == BUS_SPI)
+ zeroflash_download_firmware();
+
+ return 0;
+}
+
+static int zeroflash_remove(struct syna_tcm_hcd *tcm_hcd)
+{
+ if (!zeroflash_hcd)
+ goto exit;
+
+ if (zeroflash_hcd->fw_entry)
+ release_firmware(zeroflash_hcd->fw_entry);
+
+ cancel_work_sync(&zeroflash_hcd->config_work);
+ cancel_work_sync(&zeroflash_hcd->firmware_work);
+ flush_workqueue(zeroflash_hcd->workqueue);
+ destroy_workqueue(zeroflash_hcd->workqueue);
+
+ RELEASE_BUFFER(zeroflash_hcd->resp);
+ RELEASE_BUFFER(zeroflash_hcd->out);
+
+ kfree(zeroflash_hcd);
+ zeroflash_hcd = NULL;
+
+exit:
+ complete(&zeroflash_remove_complete);
+
+ return 0;
+}
+
+static int zeroflash_syncbox(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+ unsigned char *fw_status;
+
+ if (!zeroflash_hcd)
+ return 0;
+
+ switch (tcm_hcd->report.id) {
+ case REPORT_STATUS:
+ fw_status = (unsigned char *)&zeroflash_hcd->fw_status;
+ retval = secure_memcpy(fw_status,
+ sizeof(zeroflash_hcd->fw_status),
+ tcm_hcd->report.buffer.buf,
+ tcm_hcd->report.buffer.buf_size,
+ sizeof(zeroflash_hcd->fw_status));
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to copy firmware status\n");
+ return retval;
+ }
+ zeroflash_download_config();
+ break;
+ case REPORT_HDL:
+ retval = tcm_hcd->enable_irq(tcm_hcd, false, true);
+ if (retval < 0) {
+ LOGE(tcm_hcd->pdev->dev.parent,
+ "Failed to disable interrupt\n");
+ return retval;
+ }
+ zeroflash_download_firmware();
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int zeroflash_reset(struct syna_tcm_hcd *tcm_hcd)
+{
+ int retval;
+
+ if (!zeroflash_hcd) {
+ retval = zeroflash_init(tcm_hcd);
+ return retval;
+ }
+
+ return 0;
+}
+
+static struct syna_tcm_module_cb zeroflash_module = {
+ .type = TCM_ZEROFLASH,
+ .init = zeroflash_init,
+ .remove = zeroflash_remove,
+ .syncbox = zeroflash_syncbox,
+ .asyncbox = NULL,
+ .reset = zeroflash_reset,
+ .suspend = NULL,
+ .resume = NULL,
+ .early_suspend = NULL,
+};
+
+static int __init zeroflash_module_init(void)
+{
+ return syna_tcm_add_module(&zeroflash_module, true);
+}
+
+static void __exit zeroflash_module_exit(void)
+{
+ syna_tcm_add_module(&zeroflash_module, false);
+
+ wait_for_completion(&zeroflash_remove_complete);
+
+ return;
+}
+
+late_initcall(zeroflash_module_init);
+module_exit(zeroflash_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics TCM Zeroflash Module");
+MODULE_LICENSE("GPL v2");
diff --git a/firmware/Makefile b/firmware/Makefile
index 691852793e89..d67fa9dfd8cf 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -106,6 +106,8 @@ fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \
kaweth/trigger_code_fix.bin
fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_jdi_3331_c8.fw \
synaptics_jdi_3330_c8.fw synaptics_sharp_4322_c8.fw
+fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T) += synaptics_boe_4320.fw
+fw-shipped-$(CONFIG_TOUCHSCREEN_NVT_D2T) += novatek_nt36672_d2t.fw
ifdef CONFIG_FIRMWARE_IN_KERNEL
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw
diff --git a/firmware/novatek_nt36672_d2t.fw.ihex b/firmware/novatek_nt36672_d2t.fw.ihex
new file mode 100644
index 000000000000..c33d57951b11
--- /dev/null
+++ b/firmware/novatek_nt36672_d2t.fw.ihex
@@ -0,0 +1,7426 @@
+:1000000000010000000000004BE00000E0390100AA
+:1000100000770200E70300007CDB50F2E1ECCB202C
+:1000200000000000C003632905000000000000007C
+:1000300000B80200FF07000000A001004A08F3E436
+:10004000004E0200FF1300000048010083D9C1BA2E
+:1000500000620200FF130000005C010061F9E93F4B
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F000704C0200FF00000000000000E49B934FE2
+:10010000480001EA400000094000000940000009E1
+:100110003AFFBFFC3A0FA83C4400000148000190A0
+:100120003AFFBFFC3A0FA83C440000024800018897
+:100130003AFFBFFC3A0FA83C44000003480001808E
+:100140003AFFBFFC3A0FA83C440000044800017885
+:100150003AFFBFFC3A0FA83C44000005480001707C
+:100160003AFFBFFC3A0FA83C440000064800016873
+:100170003AFFBFFC3A0FA83C44000007480001606A
+:10018000480000004000000940000009400000094C
+:100190003AFFBCBC3A0F943C440000004800017197
+:1001A0003AFFBCBC3A0F943C440000014800017483
+:1001B0003AFFBCBC3A0F943C440000024800016C7A
+:1001C0003AFFBCBC3A0F943C44000003480001597C
+:1001D0003AFFBCBC3A0F943C440000044800015C68
+:1001E0003AFFBCBC3A0F943C44000005480001496A
+:1001F0003AFFBCBC3A0F943C440000064800014161
+:100200003AFFBCBC3A0F943C440000074800013957
+:100210003AFFBCBC3A0F943C44000008480001314E
+:100220003AFFBCBC3A0F943C440000094800012945
+:100230003AFFBCBC3A0F943C4400000A480001213C
+:100240003AFFBCBC3A0F943C4400000B4800011933
+:100250003AFFBCBC3A0F943C4400000C480001112A
+:100260003AFFBCBC3A0F943C4400000D4800010921
+:100270003AFFBCBC3A0F943C4400000E4800010118
+:100280003AFFBCBC3A0F943C4400000F4800010404
+:100290003AFFBCBC3A0F943C44000010480000FCFC
+:1002A0003AFFBCBC3A0F943C44000011480000E9FE
+:1002B0003AFFBCBC3A0F943C44000012480000E1F5
+:1002C0003AFFBCBC3A0F943C44000013480000D9EC
+:1002D0003AFFBCBC3A0F943C44000014480000DCD8
+:1002E0003AFFBCBC3A0F943C44000015480000D4CF
+:1002F0003AFFBCBC3A0F943C44000016480000C1D1
+:100300003AFFBCBC3A0F943C44000017480000B9C7
+:100310003AFFBCBC3A0F943C44000018480000B1BE
+:100320003AFFBCBC3A0F943C44000019480000A9B5
+:100330003AFFBCBC3A0F943C4400001A480000A1AC
+:100340003AFFBCBC3A0F943C4400001B48000099A3
+:100350003AFFBCBC3A0F943C4400001C480000919A
+:100360003AFFBCBC3A0F943C4400001D4800008991
+:100370003AFFBCBC3A0F943C4400001E4800008188
+:100380003AFFBCBC3A0F943C4400001F480000797F
+:10039000F2C20000F2C20000FAC30000E0CA00008E
+:1003A000E0CA0000E0CA0000E0CA0000E0CA0000A5
+:1003B000E0CA0000E0CA00000000000038C60000EB
+:1003C00040C600004CC60000BEC60000F8C60000D3
+:1003D0003EC7000090C70000B4C70000BCC70000C3
+:1003E000C4C70000CCC70000D4C70000DCC70000B1
+:1003F000E4C70000E6C70000EEC70000C2C8000066
+:10040000CEC800001CC9000024C900009EC900001D
+:10041000A6C90000AEC90000DAC9000040CA000049
+:1004200064CA00006CCA00009ECA0000A6CA000090
+:10043000A8CA0000D0CA0000D8CA00006412A402F2
+:10044000642204023A1F883C803F442002983821ED
+:100450000202643200029ED964320003DD2264028B
+:100460000043640000083A1F88046412A403642255
+:1004700004033A0FA8043AFFBFC4640000044420F8
+:1004800002BC38210202DD223A0F94043AFFBC84F8
+:10049000640000046412A402642204023A1F883C2F
+:1004A000442002BC38210202643200029ED9643228
+:1004B0000003DD2264020043640000083A1F880440
+:1004C0006412A403642204033A0F94043AFFBC8428
+:1004D000640000044FF2001D3A0FA83C3AFFBFFC35
+:1004E00045D28F88801F64126402965F9E49C105C1
+:1004F0003CFD5CC2480000043CFD5CC3E809DD2F04
+:10050000C8073AFFBFC43A0FA8046400000464029D
+:100510002402441F3FFFFE0E5800400064022403E3
+:100520006400000845D28F8845F2B80044F0C2B498
+:100530004EF20003DD2F3CFD5CC4DD2F640FFFEAAB
+:10054000FC41F28180E13C2DFBC13C1DFBC080C31E
+:10055000490033FA3C1DFBBE8520A60AA64B490084
+:100560003411F0014900341B3C1DFBBF000080101A
+:10057000E320E81180093810A4004900341D3C0D27
+:10058000FBBF401024008009001080084900343C63
+:100590008D21D5EB840049003406490033E2840103
+:1005A00049003401490033DD8403490033FC49002C
+:1005B00033D8490033F0AE308400A670E201E83B46
+:1005C000A079950138508101D034A0FD94429899CA
+:1005D0000091000294AA886200F18002E32FE803F0
+:1005E00010918002A0FD40918400886200948003F5
+:1005F00000A18003E349E80310918003A0FD389136
+:100600008400886200F18000E32FE80310918000ED
+:10061000A0FD88238843A649A6D1E261E802AE5135
+:10062000A0BA956988A238111001A4E88823AC68A3
+:100630008C01D5C4FCC1FC402240800084C0AD10B8
+:1006400022408001AD112E400404CC043C4DFC0A34
+:10065000A1A14440010842019073B480C405005038
+:1006600000209746CD05005000EA5A580112440276
+:100670007FA0848138400C08A40844427F70A449BC
+:1006800038020E09941A8804AC414800010E5A4001
+:100690000404480000C2001000E05A1001044800A1
+:1006A000010484203C1FFBF93C1FFBF844127FA08F
+:1006B00038108C00C94944427F5C44A27EC0385245
+:1006C0000C0044427F5038920C005A50010680E1E1
+:1006D0008081850CD521951A894480A1808184E18F
+:1006E0004C54C00384E2228500008CA14213A07305
+:1006F0002285000197684243A07350A500305A58E4
+:1007000003F084A440109436404214963C1FFBF939
+:100710003C4FFBF8D51980A34252207338F51611CF
+:10072000956A88AA8C81225280019720882FE32421
+:1007300088E5E8F28D214010A4364073A4F63C1FF2
+:10074000FBF93C7FFBF83C1DFBF93CADFBF880A1BD
+:100750004E140003FF4A808A4EA400045245000054
+:100760008885E2C44EF200A10040002044527F7010
+:100770009716959A44900064C411444000823872E0
+:100780008E01FE644010A43688274245102438129A
+:100790008E09407224F6986ED51144700073424061
+:1007A0009C2438128E0140422496888142751C2474
+:1007B00038428E09986E4073A4F6A50988E4ADC945
+:1007C00038128E0144427E90AC50986E38720E11F1
+:1007D000A44988C4AC510010002022F00007581032
+:1007E0008002101000202251000022100006224337
+:1007F00000018AE18AA1221100018A8F8A2FFF2439
+:10080000FE4C42439C7342129473E081E84D842174
+:1008100010100050D549C4485A40064744627FA092
+:1008200044527F5C38430C0044027F505A48010A0E
+:10083000848038428C0838400C0838430C08D516A0
+:1008400038400C00E682E8038C81D5028480384071
+:100850000C0838428C00CC0A38400C005A48020779
+:1008600044427F5C84A138520C0838400C0080A3BD
+:10087000840C4252007344427F70226080002270D8
+:1008800080018005945A38520E0144927EC088241B
+:100890009B7538548209A549940288099B7DAD4116
+:1008A00038620E09ADC944027E90A45038100E097A
+:1008B00094DA8860A411AC19FCC0FC40A10DA04CD6
+:1008C00095513C8DFC0C94D288A18864A66900A443
+:1008D0000002A79A84BEA71B4295142480A19EE122
+:1008E000425328738A66956996D8804688A084E02A
+:1008F00038629C114E640003FFB25EF30033E909D5
+:100900008C6196D8E664E8218E4188E95A2FFFF27F
+:10091000421510739449005400034065040888018F
+:100920008440E085E810381008114E140003FE4A98
+:100930005EF08033E9088C6196D8E6648846E80565
+:100940008C81D5F08401D5028400FCC0FC42A10D4D
+:1009500094D2886480C000918000A7D90081800271
+:10096000A6DB8381F3829CF98A6996D8F283F381AE
+:100970004E830006E6E6E903E72CE906F001E6030C
+:10098000E907480000A649FFFF9A4E0300A28440F1
+:1009900080083C3DFC0C80A28082802204AF800253
+:1009A000E340E9334E92001700F18002814942A0F2
+:1009B0003C7338F3291141E504084EF7000488AF71
+:1009C000976B41E3780022FF7FFF4EF70004884FCA
+:1009D000969301E1800250FF7FFFE0EFE81481E78A
+:1009E00042F0787341E7840838F33D114EF7000474
+:1009F000882F964B41E3780022FF00014EF7000458
+:100A0000888F97238C01D5CB8405FE84E045E80AC6
+:100A1000FE24E001E8074E920006A61A8E01E0E0EF
+:100A2000E959F0015A080114F0028C018A08960075
+:100A3000E606E90DE045E9034E93000A8405FF044C
+:100A4000E081E948A61A8E014C700045F003B90414
+:100A5000940188018420A60100A1800380E1812106
+:100A60008441E24AE824A75A810042811473404439
+:100A70000408388321114E84000452840000892820
+:100A8000C00A4083100022847FFF4E8400045284F9
+:100A9000000088E88EA14C0280098886224200016D
+:100AA0004E440003FF2288248C41D5DC5CF487D1BE
+:100AB000E90F5CF38064E902C80B5CF08064E90A2A
+:100AC000A75A84208EA1FE2D40008006D504840103
+:100AD000D5028400FCC2FC4FF185F287441268788D
+:100AE0008440F48CF594F382F181848180A2F30533
+:100AF000E243F389E83322600000F7021260800AC3
+:100B000022300001A1FB1260800CA1851230800B05
+:100B10001230800D3873990194F1127080171460AF
+:100B2000800EA58212608020F602A1B48866A79983
+:100B300010608033A6D810308032C606C3055A60D4
+:100B400011045A3823051040802CD5031050802CF6
+:100B50008C41501080488C18D5CB2E07F02C448245
+:100B60006848F086F0848400802044A2681844928B
+:100B700067E8447267B84460004844526878443279
+:100B8000645842201824991588433814020A3815ED
+:100B9000020A3814820A3813820A8C011012002BC0
+:100BA0001011002B5A080CEF3C0C0253F206F09384
+:100BB0002E00040444100048F0972E07EC0F3CADC3
+:100BC000FC0DF0983C0DFB8945E26878F0992E0702
+:100BD000EBC1F09AF0059402F09B44026458420184
+:100BE0000473F09C8400F088F508F11B4C5081964A
+:100BF000F1084402684884413820040A440262181B
+:100C00008801F08344526458F01C4C500180F10676
+:100C1000F005E201221F000CE80A2202800E9A0869
+:100C2000F08D221F000D2202800FD5092202800CB8
+:100C30009A08F08D221F000D2202800D9A08F08B79
+:100C4000220F000C44100050F0902202800CF0950E
+:100C5000220F000DF0912202800DF096B405F08A6B
+:100C600022028018F092FE0C44100064400004162A
+:100C7000F09D00028035C0069F01E6119720E8062E
+:100C8000D50280809C419648D502FA21002280340A
+:100C9000F18EC2079E515CF100239648E806D5020A
+:100CA00080229DD196F8D502FA73FAC2F38FFF8C99
+:100CB0008520F30FE061E92B98F480E494D9048F48
+:100CC000800EE107E921048F8002B50838840C000A
+:100CD0005A80FF1804FF800204F7800138F7A10052
+:100CE000048F000E4CF4400E048F801304FF801D0F
+:100CF00089030284000040840011E10FE90285218C
+:100D00008CE18C62D5DD8C218CD2D5D4F302041F0A
+:100D1000000EA0DD944A9999A6F2A673A731A7B058
+:100D2000E206E920E280E91EE243E91CE222E91A38
+:100D3000FA2242010473F11394018801F112A40014
+:100D400085E296034010BC36E020E9035A98010B77
+:100D500000028044E602E806040280098E01E603F0
+:100D6000D50285E0049280095A9804080002802880
+:100D70005A0801084800052B5A980704480005271F
+:100D8000F00BF10DFE04F21542008473F1109B8A02
+:100D9000F111F2169BCA0422800F42139C244213C5
+:100DA0001873CA735AF801044800050404250001A9
+:100DB000E2224EF304FF02350001F40AFEE4E223CE
+:100DC000E83004350002E223E809A0ECA12BFEFC88
+:100DD000423310734E3604EED52404350003E2236B
+:100DE000E820A0ECA12BFEFC42331073F60A44402D
+:100DF0000064FF1C40421897FF24FF340065002761
+:100E000044F0271040F23DF7FF8C444000644063FB
+:100E100010D7E2CFE8064E370005F30A4E3304CA76
+:100E20000032802A00450000E283E8060435000411
+:100E3000E2234EF304BFF3175A380110F3185A385F
+:100E4000010DF3195CF18065E908F31AC3068465A6
+:100E5000FE9CE2224EF304AE002500264E2204B78B
+:100E60004426D983E2414EF304B25A980404480060
+:100E700004AE0012802C4E1304AA001F002C4E1347
+:100E800004A646190000D5375A2002044800049FE2
+:100E90005A9804044800049B04F500012242800E85
+:100EA000E22F048280032222800FA0EC4EF3048202
+:100EB0000015002885EA42940424FE5C4094BD3667
+:100EC00040F0BDF6F11188438A228041F1108888F4
+:100ED0008A24FE94422084734217BC244214A473D3
+:100EE000E0414EF20474FEFC423320734E37046F2F
+:100EF000461800008801F10350528048B601F00303
+:100F000050000030F08348FFFE81F00851EF0048A8
+:100F10008C04F08848FFFE6A8400441268188441FB
+:100F2000F306E203E8053820820A8C01D5FAF005C1
+:100F3000E60BE810E66BE80E8023F00544226848D3
+:100F40004432681844426218445262004900048BDB
+:100F5000D50DF005F1064422684844326818444231
+:100F600062184452620049000435F08A8400F0831C
+:100F7000F0864608FFFF50000FFF442264584432B9
+:100F80006878F08B448293E8F006F10AE2014EF2B1
+:100F9000018BF00680A29501440262008804A641FC
+:100FA00044000048425080730402800F5A08021720
+:100FB000F506440262003800150084AC42009473C8
+:100FC00044526218380282024E0500094402681831
+:100FD00084813840060A480001624402620044509D
+:100FE00000483800100080834240147380C2509241
+:100FF000001842609473F688225480012273000C1A
+:101000002263000D22A2000C9BAE81E440751C01FE
+:1010100043E3182443E39C731DE78002A9A41477DB
+:10102000800188C588EA127480021264800380E01F
+:1010300084CC4270987344626218F50B38631E02C8
+:1010400051E20010E2A650420038E80CF50884C2D4
+:101050008CB0A9A1A52A124F0002A52B124F0003A4
+:10106000D50384A0A9614460004880A380E2425077
+:1010700018734270987380C7509280108CF022448D
+:10108000800222A38002227380038A8AA929224433
+:101090008003049300098A87A92A00430020507224
+:1010A0008020104280205A9003044800007E38546B
+:1010B00010005A58020D445293DC385290005A588E
+:1010C000010784EA3874100810530028445293E84A
+:1010D000385290005A58010F4450004880C2426074
+:1010E0009473005300288CB81053002884A23854FD
+:1010F0001008385410005A58030E4450004880C25B
+:101100004260947380A684C11062802884A43854FD
+:1011100010084450004880C24260947380E34270DB
+:101120001473005300288EA1105380282E57EC18FA
+:10113000C51C04AF80020493800E04A50005406422
+:10114000880888CA00A30001A7B08B464EA7000EEE
+:10115000F602A1B438632500E6C4E9078EA13E5724
+:10116000EC1884A0105380284450004880C342608B
+:1011700014730073002844526878C708B4C65CF33F
+:101180000385E90A38441000CC0744400048425027
+:1011900010738481D5064440004842501073848304
+:1011A00014428009D5142E67EC188482A939C60F21
+:1011B0000442800EF5029522A16D8885A761A720C3
+:1011C0008AA44E5700058EC13E67EC184450004873
+:1011D00080824240947380C342601473505300284D
+:1011E0000042002A3C9DFC0DAF2AB4C60474800561
+:1011F000E2E6E805E68AE80A8C81D50704748006F1
+:10120000E2C7E804C4038E81AF2A44400048445238
+:1012100064584250907300528044FF045CF280C8CE
+:101220008883E8028CA11052004444500048424098
+:101230001424FE6C999C40910400227300172254E0
+:101240008018E0A7445268A8E80688851273001841
+:10125000A461D50A88854452648802748017882561
+:1012600012730018A449AC624410004880834240C5
+:10127000047300520020444267B884213812160AD1
+:10128000444267E83812020AF0098E01F089F0043E
+:101290008E01F084F0038801F083F0068C01F08663
+:1012A00048FFFE744492681844626458850044A262
+:1012B00067E82E07F02CE300E803F004C80E3C0DAD
+:1012C000FC0D3C1016394462687812100015850038
+:1012D000449267B8480001083C2DFC0CF103000162
+:1012E0000009E220E8ED0C0480015A0001044800E6
+:1012F00000E2F00CC80D040300095A08030AF00CC0
+:101300001404FFFFF0048E01F084480000D40403AD
+:1013100000095A00030B5A0007099E41E622E80B18
+:101320000413000F5A1802048420D51B3C1DFC0D29
+:10133000A649D517001300285A18011300430020AE
+:1013400044300108F50742520C73004280855A4828
+:10135000010884221013002810128085D5048E21E4
+:1013600010130028001300285A180112004300200F
+:1013700044300108F50742520C7300328085CB07D8
+:101380000033002B583180041033002B002100194A
+:1013900084E044326848E2E2E80938451E02CC04A1
+:1013A00038419E02C4068CE1D5F784E048000081F4
+:1013B000C1038404D5525A080345000300339E41FB
+:1013C000E630E82B2E100427C10800130020442229
+:1013D00093E838110400C1210023002044100108C3
+:1013E000F30742310473224180192221801880239F
+:1013F00084639522FE9CE082E810F214A692CA0D46
+:101400002E27EBE3CA0A001080DFC107840714030C
+:10141000000910330029D523842814130009C003C0
+:101420005A08111E00030020441293E8380080007F
+:10143000C016840414030009840210030028D50F89
+:101440005A08070B00030029C0058E01100300296C
+:10145000D5068408D502840614030009000300445D
+:101460005CF000C8E8048C011003004444200048EC
+:1014700044026878420388738026490065F7002398
+:101480000020441267B8840138008A0A38051E0A11
+:1014900084001404FFFFF0048E01F084F0038C013B
+:1014A000F083D50838351E024E32FF848CE14C7132
+:1014B0007FFB8D015063004848FFFEFDF0094E029E
+:1014C00000BE00218009F003E2024EF200B844029F
+:1014D000684840A40808380022025A00010C8D0117
+:1014E00050630048F0053C3DFC0CE300E9E848008F
+:1014F00000A6440267E838702202CFF2F1020433FA
+:10150000000E3C0DFC0DA04B38108D010230001573
+:10151000E261E8E638149E024E13008D0223000CAF
+:10152000B626A871A872A873A874F184F1031223D7
+:10153000000E0223000D88011223000F10730020FB
+:101540000000001C1003002849002872F1045A080A
+:1015500002142E000404C0072E07EC01C004840509
+:10156000100300282E00035DC009000300288C0131
+:1015700010030028D5031013002800030020441294
+:1015800093E8844038208008F30744100108423073
+:1015900004730423000EF102F026F38449FFF9D806
+:1015A000F3042E17EC18100180DFC902C80484056B
+:1015B000100300288400100181041001808284013E
+:1015C000140180221401801500130028C102840335
+:1015D0001403000984001003002A0003002B8481F7
+:1015E000FE271003002B0203001784601433000F42
+:1015F000103300441203001850130032500300341B
+:101600008442F486F38449006531F406440267E8B5
+:10161000F3043840280A4402684838449E0A3830A7
+:10162000280AF0098E01F089F0038C01F08348FF4D
+:10163000FF588CE1E2E248FFFF6E8420F007804112
+:1016400000418009E224E80AB6401020004E102034
+:1016500000EA8C2150000108D5F484003E07F02CEC
+:101660003E07EBE38500446267E8447264583C0D32
+:10167000FC0C00000019E3004EF200973803220230
+:101680005A0001044800008AF00104A000095AA091
+:1016900006145AA008122E07F02C44200048802778
+:1016A000421008738001F101490064E02E07F02C1C
+:1016B0008C013E07F02CF001049F800700100020F1
+:1016C00044000108429080738400100480F15AA8FD
+:1016D00007068400B6098401D5075AA808058400C6
+:1016E000B609D502B7491004804E0004804E5A084E
+:1016F000010A020480061204800802048007120412
+:101700008009F00150248024F1010000002B100416
+:101710008020F0012200000A12048002F001220061
+:10172000000B12048003F00104A0000E14A4800931
+:10173000B400A815A0495CF02711A856F101A04AF1
+:10174000A857E9062E07EBE38C013E07EBE3F00117
+:101750000400000F14048011B4095A08030D00049A
+:1017600080DFC80BF026F102804A49FFF8F110042F
+:1017700080DFD5035A000412F00240150408A003CC
+:101780003800290112048018F002A084500480EE71
+:10179000882284424900646AF0018D0150000048AB
+:1017A000F08148FFFF662E07F02C3E07EC19FCCFB6
+:1017B0005A90030448FFFBA1F10C5A18010448FF9A
+:1017C000FB9C4611000048FFFB97841F48FFFB95D8
+:1017D000FC43F08181008400F484F182F58580E18E
+:1017E0008380812084814E82003DC73B5A48013A64
+:1017F00084A08085855EF101D122386116025A6885
+:10180000011DF10495AA88C1F68384C0F1024C60E1
+:10181000801539E19A025BE8010F4410003042F371
+:101820000424F1033810BC02E22AE80583868125EE
+:10183000809E81418CC1D5EB8CA1D5DEC4D5F1054C
+:10184000954188A18C0184201092800011C28001F2
+:1018500096003811260A8F013811F20A8EE1D5C49C
+:10186000FCC3C06EC16FFC4051FFFD28E220E82F91
+:1018700080E144A00030851F81244293A87384C076
+:1018800038849A0A8CC14C607FFD8CE14C707FF6E5
+:1018900080C083818001802681248105F28181437B
+:1018A000490026E5B026490026E98009490026F0CE
+:1018B000B002490026F7840C490026FE49002701A2
+:1018C000844080A245E000308082D514E201E8E146
+:1018D00084E044A00030851F81244293A87380C017
+:1018E00038849A0A8CC14C60FFFD8CE14C70FFF685
+:1018F000D5D0840C81E94212802442F2F87384E04E
+:1019000098F9B00238300C005A38011138379E026D
+:101910005A37FF0D94D188688C41AFD8AF59F30185
+:10192000969038419E0A3845160A8CE14C737FEA3E
+:101930008CA14C5E7FE0800251FF82D8FCC08040C9
+:10194000D50280418002DD9EFC0080C04900340C3D
+:10195000C00784013E07EB5C8400AE34AE35FC80EA
+:101960002E07F050DD9E44327FD0AE18AE59AE9AAD
+:10197000DD9E3C0FF9F4DD9E3C0DF9F4DD9E3C0D3F
+:10198000FB88465FF00F50528F00FF464600100064
+:10199000D80684003E07EE238401DD9E8400DD9E90
+:1019A0002E17F0762E57F0773C0DFC524C12C010DB
+:1019B0002E27F0745A28010CA6059D49400280B6D6
+:1019C00097683E57F0763E57F077DD9EA6058CA1CE
+:1019D000400280B697683E57F077D90484013E07ED
+:1019E000F074DD9E2E57F0762E17F077D9042E076F
+:1019F000F074C0103C0DFC528CA1A605400280B6CC
+:101A000097683E57F0764C12C00584003E07F0748C
+:101A10008401DD9E2E57F0762E07F077D8082E072A
+:101A2000F07484208E0140008006DD9E8401DD9EDE
+:101A30002E57F0762E07F077D8072E17F074840013
+:101A400040000406DD9E8401DD9EFC0084A08C81A4
+:101A5000E2A4E8073860080438608C0C8CA1D5F942
+:101A6000FC8080603C0DF9F49E41E622E8253C2D87
+:101A7000FC5184200041000AE224E809A1593852AF
+:101A800087025A58010384028C21D5F7FC00842078
+:101A90000041000944500108E224E80DB44342200B
+:101AA0009473B4429F91E6C2E9055A2004048C2144
+:101AB000D5F48401FC80DD9EFC43F181B4E1843FD8
+:101AC000101F80172E1029108140C1082E17F050CA
+:101AD000C90549FFFFC83C0FF9F43C0DF9F45A0061
+:101AE00001044800012B2E27EC183C1DFC51F28309
+:101AF0003C8DFC52B61F84C045E27FC0B41F00304D
+:101B000080098E019600E203845F4EF201124420A8
+:101B1000010842900824B44A8849B4629F19E682B9
+:101B2000E9095A3004080031004E5A3001044800D7
+:101B300000F7383F00005CF180C8E8048C61383F52
+:101B4000000800310085CB29003100505A38012EA1
+:101B50000021004E5A20012A442296083821000014
+:101B6000E6544EF200E08C414432960896903821BB
+:101B700080085A200104480000D6442295D8382114
+:101B800000005A200104480000CE382F00005A20DF
+:101B90000104480000C8D5095A3802080231000C77
+:101BA000ACD40231000DACD5B48A88890022004E35
+:101BB0005A28011BF203CA18442293E83801000096
+:101BC000C80702020008AC2402020009AC25220268
+:101BD00000044E0400048400AC24220200054E04DC
+:101BE00000048400AC250004000022220004C0058B
+:101BF000020080098E019A82000400012232000551
+:101C0000C0050200800A8E019AC300040003C02DA3
+:101C100002508009000400028EA1C810A40A85E2C7
+:101C200040F2BDF68E0142F10073402794570250F6
+:101C3000800A02F080038EA1D50FA40B85E240F24A
+:101C4000BDF68E0142F10073402794570250800A7E
+:101C500002F080028EA1840250F7FFFF400280163E
+:101C60004201BC7340301477A40AE240E9029E812D
+:101C7000A40BE260E9029EC184A6800742031473AC
+:101C8000B4BF40F11009956B58528002AF40005428
+:101C9000000214FF800240F19009CD0B005F800824
+:101CA000949496DFFE9FAF4110F00002AE83D50AF8
+:101CB000005F800894DC969FFED710F00001AF42D1
+:101CC000AEC30202000EC0039600D5028401804715
+:101CD000846642230C73AE140202000FC003960008
+:101CE000D5028401AE15841F1003803C1003803D93
+:101CF0000000800CE602E910B40A880900000049DF
+:101D0000C802840198BE10010046B40A8809200068
+:101D1000004A1001006E8CC197B0D5048440382F62
+:101D20000008B41F8C019600B61F48FFFEE910237F
+:101D3000803E1023803FD53F5A08022784181003A5
+:101D4000803C84C084001003803D3C3DFC518006F3
+:101D50000011800AE201E813041500013810830223
+:101D60005A18010B0023803D4010800CFE578CC197
+:101D70001013803D97B08C019600D5EB0003803D99
+:101D80003E07F04BD5182E67F048C6152E17F049C0
+:101D9000A638E63EE804944B9617D5039617843090
+:101DA000FE0FAE382E07F04AAFB9AE3A84013E07B7
+:101DB000F05084C02E07F0505A00FF0DC00BCE0A21
+:101DC000841F3E07F0503C0DFC138C013C0FFC13AC
+:101DD000D5033E67F0503C3DF9F45A3801173C0DED
+:101DE000FC5100400009E2C4E810F0018426FE74B2
+:101DF000B4408A868406FF0496488822500F8017D4
+:101E000084408E8149FFFE23F001B420840080A12C
+:101E1000502080400832800188039600DAFCFE02E0
+:101E2000100080408401C60284003E07F07AFCC3A3
+:101E3000FC20844180624440004080E080C149FF32
+:101E4000FE063C0DFC510000000CE602E910505368
+:101E500080465013004650738050080280011800DD
+:101E600080012002802710008027DFF8FCA0FC40C2
+:101E70008120A60080C184203E17F079C0292E075A
+:101E8000F0755A08010C2E27F0783E17F0743E27A3
+:101E9000F0763E27F0773E07F07949FFFD833C0D51
+:101EA000FC522E77F0773C1DFC1CA70484410404EF
+:101EB00080014213907380628E8149FFFDC82E0716
+:101EC000F07A5A0801063E07F0753E77F0782E1733
+:101ED000F079B4065A180130A605C81849003148EF
+:101EE000C80F3C0DFC52B4262E37F078A6843C0D6A
+:101EF000FC1C42018873B42149FFFF9CD50A4900AC
+:101F00003137C0F0490030F5D5FB49003131C80305
+:101F100049003136B42684003E07F0793E07F0755B
+:101F20008401AE0DB426AE0C2E17F048C13FB42686
+:101F3000AE0FD53CA644C90549FFFD7CC037D50D81
+:101F4000A6055A08010849003113C8304900311864
+:101F5000D52D49FFFD61C8F84900310A80E0C82647
+:101F600049FFFD423C0DFC52B4262E97F076A68424
+:101F70003C0DFC1CB4214204887349FFFF5B2E1703
+:101F8000F0755A18010F2E57F0784C54C00BB40658
+:101F90003E77F075AE452E07F048C003B406AE4755
+:101FA000490030EEB4068421AE44FCC0FC208040E1
+:101FB00080E144027FECA05144628004B6202E17D9
+:101FC000F0503C6FFC1810100008A052A8414412B9
+:101FD0007FE849FFFD7344027FE02E17F050A9818E
+:101FE000AE40B4273C1FFC1544127FDC49FFFF4183
+:101FF00044027FD08420AE40AE41AE4249FFFD1A7C
+:10200000FCA0FC41F5814082801141C2C00A4450CD
+:10201000010842019473005000202260800054A205
+:1020200080012210800184E14EA2001644528B34BC
+:10203000852038928C08854C44528AA44251A8735A
+:10204000ADA8AC6944528B40109000EC38728C08FB
+:102050004800007201E000E95BE8030B44528B404A
+:1020600038A28C0844528B3438A28C08D5644FE3D4
+:10207000002044928B40854338548C0081E542F126
+:10208000A87340A788088CA144F28AA4894F976856
+:10209000E6A3126500001215000138548C08E94BC4
+:1020A00044528B3439E48C0838728C08D5445BE890
+:1020B000016E44928B4084E338548C0081E542F1F8
+:1020C0009C7340F7880844728AA440F79C008CA156
+:1020D00097681267800012178001E6A338548C08B5
+:1020E00044528B34E90539E28C0838A48C08385204
+:1020F0008C00CD0538548C00C51ED50284A3842CD9
+:10210000427184738460802380C3549180FFE325EF
+:10211000E80E40918808892738A38E010294800137
+:1021200088CA882997B3964B8C61D5F0406314D642
+:1021300040109436003F80285A380129000000E9F9
+:102140005A0801253C5DFEF4A42DE280E81F4033CF
+:1021500020014E340003FEDA4000F0014E0400037B
+:10216000FE028803A4EEE003E811A4EF9F194001EA
+:102170008409421270734262207388C088014063F0
+:102180000CD640100C3697B3964BAD90AC51FCC1B9
+:10219000FC0196CB9683903090108A018A43FE040E
+:1021A00042010873FC81FC4480C3812222308000FC
+:1021B00022208001441001084203047380E0B4002F
+:1021C000F481F082F102841DFE0EF5833C3BFAE6B9
+:1021D0003C2BFAE744428524448284F444A28410D0
+:1021E0005A000106000380EA4E0200F93C0DFD731F
+:1021F000441284E838021A0A38041A0A444284B89D
+:10220000840038009808441009C438121A0A44128D
+:1022100084AC848F38409808441284A05EF18032E8
+:1022200038009808100380E044128494E806840182
+:10223000380098088003D50F5EF18406E806380060
+:10224000980844000032D5078402380098085201EB
+:10225000843796035EF10032444293E8E80938502F
+:10226000980058528004385098088022D5135EF1A7
+:1022700008CEE90B3850980058528008385098081A
+:10228000521108FF964BD50D5EF1007844100032D4
+:10229000E8085051FE7997695CF28121E818D5076A
+:1022A0005EF108CFE9143C5DFFE9CD11385218000A
+:1022B000CD0E445293E885E138F29808445293C811
+:1022C00038229909445294003832990945E293DC46
+:1022D00084A0385F1808385218005A580226445211
+:1022E0009400385299118AA34E540003FF6A5EF29B
+:1022F0008051E90484A1385F1808445293C83852C9
+:1023000099115EF28480E80550528028E0A2D50839
+:1023100044F004804C57800950F2FFC4E04FE804B9
+:1023200084A338521808E02044428488E8058E3E91
+:1023300038121808D5048E1E3802180838021810F2
+:10234000E40FE80644028488842F3810180802132A
+:10235000800F440284285EF1803338101B09441238
+:1023600083F8840038009909441283EC3805190970
+:1023700038009808441293F438009808441283E017
+:1023800038009808E9133C1DFEF30200800950F064
+:102390007FCDE06FE80B5EF10033E9080200800AB0
+:1023A00050F07FCDE04F8401E9028400441283D4D1
+:1023B000100380DE84003800980838241A02441282
+:1023C00083A438209A0A441283983800980844124B
+:1023D000838C380098084800033638021A023C1DE6
+:1023E000FD73F286F385F48449FFFED4B61F3805E9
+:1023F0001901F404F305F206C8090203800F5CF02A
+:1024000012C1E904840138051909440283F838101F
+:102410001901C90E0213800F5CF0A329E90384237C
+:10242000D5055CF09965E904842238101909F0019A
+:10243000E603E9082E07EBFDC808F001E608E90904
+:10244000D504854F84A5D50744A0003CFAA0D50348
+:10245000854F84A8000380E0C043F001E602E94014
+:10246000B41FFF6CE205E82C441283E038009800AA
+:102470005CF0003DE92B4402835C3C1DFD73380099
+:102480001A02F487F586F285F38449FFFE83F50688
+:10249000F304E205F205F407E813441284B8420598
+:1024A000282438009A0A8402100380E0440284F44D
+:1024B00038101A02440283A438101A0AD5114402B3
+:1024C00083E0842038101808D50BC8073C5DFD73E5
+:1024D00044A2835C38551A0A8C013800980800031E
+:1024E00080DE5A0802168400441284B8100380DE8D
+:1024F0004400190038009A0A8403100380E0440263
+:1025000084F438101A02440283A438101A0A4402D0
+:1025100084B838A01A02440284AC38001800C019EC
+:10252000F10344528410A648C90438F29901E80A1C
+:102530005200000FE405E8062E07EBFDC80340A596
+:1025400010084402849438001810C0034E12038609
+:1025500000038020960EC80C44128428943388010E
+:10256000A542AD43A541AD4238109B01AC414402A8
+:1025700084280213800F445283EC38101B09380260
+:102580009800E603E8048C0138029808B41F5CF058
+:102590002710440293F4E80638501800C5068EA1AF
+:1025A000D50284AF3850180844028410380019014D
+:1025B0005A080143000380F8C0152E57EC0F5A58F3
+:1025C0000112445001F4FF4450F289C4B4BFE2AF99
+:1025D000E80984A08C0114538015100380F844A0EE
+:1025E000FE01F0025A0002065A0804278409D502A7
+:1025F000840684AAFE6C445283EC40F308083852E7
+:10260000980088AF44F2842838579501FE2CE020CA
+:10261000E813840014038015440293F43800180072
+:10262000E606E908854F40A501568401140380158C
+:10263000D50344A0FE014402838C381018005A10C0
+:10264000FF058C213810180838001800E615E95DE0
+:10265000000380E05A0804114412835038009800A7
+:102660008E01960038009808C850441284B8814002
+:1026700038009A0AD54A5A0801493C0C03595CF0C3
+:1026800000C8E8430213802D5CF08097E93EF0011A
+:102690005A08013C5EF18065E9383C0DFEF30250BA
+:1026A000000950F2FF9BE06FE8305EF100B5E92DC4
+:1026B0000200000A50F07F9BE04FE8270223802CA5
+:1026C000846A8407FED4FE0CE060E81F440283980D
+:1026D000842038101808840438141A02100380E08B
+:1026E000440283A444A009C438101A0A84001403C5
+:1026F000801544028350842538101808440284B899
+:102700001223802D38A01A0AF48249001F91F40286
+:102710005A00020540A50808D5112E07EBFB5A0800
+:10272000010E3C1005A83C27F6278403944AFE14AA
+:10273000E020E804840642A50024B41F441284ACBF
+:10274000E34094B284A0E861000380E084613E37F6
+:10275000EBE85A000155445284E838329808C81210
+:1027600044028338FA7838301909F3015A38011ACB
+:1027700044328398005F800438519808443000C880
+:10278000D5065A080208FA64440283383830190919
+:10279000D5085A08030544300032D5F75A0004F52D
+:1027A00044F282C0440283208460445282F0383074
+:1027B000190938079A0238A41A0138029A0A380708
+:1027C0009A014452829040A0280138A29A094007F9
+:1027D000880040A40800A40102A5000188A28A0A7A
+:1027E000AC298401100380E0440283D43830980877
+:1027F00038301808440284A038301808440284B8DD
+:10280000846038301A0A84A138009800105380F090
+:102810003C1DFD73C0258E01443284AC9600380106
+:102820009808C81E4402841038121A0A3830190158
+:10283000440284B8C311443283F838319901C30982
+:102840005A30030544300640D509443007E9D5061F
+:1028500044300384D503443000E138301A0A44324E
+:1028600084F44E5200D844A284E838121A0A38057B
+:10287000180014AF8001C80538119A0A480000D921
+:102880005A08035E441282903C83FAE638509A114B
+:1028900038219A0141E28013400478018A0294B2FF
+:1028A000990A9601F081224200018862020F80029B
+:1028B0003CA3FAE740F20013A4D93C0BF98240058F
+:1028C0003C019AC3F00196D9FE0296033C3BF98382
+:1028D000FEDA3C0BF98096DBFE2C3C3BF9814E0581
+:1028E000000AC5068402405280B6405F1401385089
+:1028F0009A09FEE44E35000A980AC40684624042F2
+:102900000C9640479001AD0138309A11CB0B440230
+:102910008290880222000001C805440284E8383011
+:1029200018088822440284F48B03A44938801A09C9
+:1029300088028B4112A000014800007B5A0001046C
+:102940004800007744328398814338019800C019C9
+:10295000444282C03C0DFD7338121A02F283F482A5
+:1029600049FFFC18E609F402F203E80838121A02DB
+:10297000440282F038101A0AD50484003805180879
+:102980003845180044A28320CC19441282F03C0D33
+:10299000FD7338109A02F283F48249FFFBFBF402C4
+:1029A000802449003274381519019601E2203C0B4D
+:1029B000F97EF203E8033805190944028338381018
+:1029C000190138051901E201E90944028320F301E4
+:1029D000381019098400380198084432829038056B
+:1029E000190138419A119A08FF043C53FAE6404213
+:1029F00004969B2C38441A0989028843222100013D
+:102A0000FE14400004163C13FAE79A081204000171
+:102A1000D50F440293E838001800E604E9093C03A6
+:102A2000FAE638019A0988623C03FAE7AC19B41F48
+:102A3000E60BE9082E07EBE85A080105B41F3C0F26
+:102A4000FB8900138082443293E8440283D4C90591
+:102A500038119800E624E90C382198008420E644D7
+:102A600038101808E905442284E83811180838108D
+:102A70001800444283A4440284F4C1309EC9441225
+:102A800083D496D838309808441284A038201A117C
+:102A900038A0980038521A1140150C0140830808DC
+:102AA000FE8C880842228C734052200022000001D4
+:102AB00022F28001FE0C42078C7340212856400010
+:102AC00028169603969312048001AC2912248000E4
+:102AD00038221A098401480000B8B42794B28E2124
+:102AE000E622E83E38119800445293E8E62AE93895
+:102AF00044A293C838F519115EF78481E93122F3B5
+:102B0000804638801A1150A0FFF65210800E4217EE
+:102B100084244214287385444010A836121480007F
+:102B200038129800880222F380472280000150006A
+:102B3000FFF65210800E4217842442140073401096
+:102B4000A83612148001380298008C0196003802D1
+:102B500098085A080F71840038019808D56C3851CC
+:102B60009800E6A4E960441293C850A2FFFC38F034
+:102B70009911525280095EF7848022138046E8271B
+:102B800022F380475EF78033E905448000321283E8
+:102B9000804738801A11FE6C4214287385454050D6
+:102BA000A8B61254800038119800880222F380479A
+:102BB00022800001520080099F4C42178024421459
+:102BC00014734010A83612148001D523448008FFE6
+:102BD0001283804738801A11FE6C4214287384A532
+:102BE0004010943612148000441293E88802381082
+:102BF00098002280000150A0FFFC52008009441080
+:102C000008FFFE0C420428734000141612048001D1
+:102C100038019800E609E8A0441293E88C013800D6
+:102C20009808D50938101A01880212148000A401EE
+:102C30001204800102048000884438021A09020448
+:102C40008001AC118400100380E13C1DFD7344023F
+:102C500082C038101A0AFCC4960054100001C10545
+:102C600038F21A11E06FE91B54100002C105381246
+:102C70001A11E023E91454100004C1079472882447
+:102C800022F08001E04FE90B961E4E02FC63943265
+:102C9000880422000001E0024EF2FC5C3802990137
+:102CA0004E03FC584402848838A0181048FFFC5298
+:102CB000FC4822708000226080014410010842011B
+:102CC0008473B4A044428254945A3C9DFEF45A50FA
+:102CD0000105005000EAC516ADD0AD9138720E095D
+:102CE000000480058881ADA15A0001044800015EFE
+:102CF000440282248820844038200E09AC89480090
+:102D00000155F28B00000020002480058143F285EC
+:102D1000F08A5A200104480000ACF00A960E4E02D8
+:102D200000A84402822438200E11CA0A88202200FA
+:102D300080014E02009E38720E114800009A8801F0
+:102D4000229000014E9300078824226080014800F1
+:102D500000908007901FF08640037C0A528100009B
+:102D60008824F0874004FC0AB61F40047C0AF081E6
+:102D70002200800138120E11FE1442048475F10104
+:102D8000F082901FF088804880618008F58FF7837B
+:102D9000490059248381F18CB43F80E08049800947
+:102DA00080614900591B80808807E204F18D883CCE
+:102DB000F08440078400F203F10CF306F0898007E9
+:102DC000F48E4900590B80E0F301F18C8009B43F87
+:102DD0008048490059038046F307490058FF41C322
+:102DE0008001F00CE2FC8A0140703C01F202F30821
+:102DF0008009B43F490058F2400E0001402E000601
+:102E00009A79F3098A22F204490057E6F50FB43F94
+:102E100097C35204800040528006FE4A8A25F3017F
+:102E20008048490058DBF203F306490058D7F40EF6
+:102E30008380812180048046F307F10D490058CE3C
+:102E4000406E0000E2DC882940978400F202F3081B
+:102E50008008F101490058C29A30406300064014CE
+:102E600084018A26F204F309490057B69783F00AD1
+:102E700044928254960EC0783C0DFEF380270230B7
+:102E80000009E0E3E9073854AA11E0A3E80E9F59CE
+:102E9000D50C4E7400083854AA114E55000784A072
+:102EA000D50480A78480D50284810200000A408571
+:102EB0000808B61FB45F8006E0C2E9094044A000DC
+:102EC00022420001E082E80F9F11D50D4E640009F7
+:102ED0004044A000224200014E440062D5045A48FA
+:102EE00001448086890939C4AA1122840001402343
+:102EF000F00140F32001C20B840241E2F0014001E5
+:102F00000016420F3C73400008168808E80B842224
+:102F100041E2200140178436421F08734010BC363E
+:102F2000883C4C44003FE023E90552318001886130
+:102F3000D5044E140037FECA4C5E000DB45FE002AB
+:102F4000E905522100018840D5064E040004FE82A6
+:102F5000D5028440E043E80497EB9783D505E0620F
+:102F6000E80397CB97A3F105400508085A18010F0D
+:102F70003824AA01441282249ABA3820AA0940248B
+:102F800080008820A4919AB2AC893874AA0989205B
+:102F9000F00B12648001ADC0AD81D5078480D5A34C
+:102FA00084604C5E7FCDD5E0FCC8FC43F1833C1DC2
+:102FB000FEF4812084003C0FFB89A44D3C0DF9F503
+:102FC000E201E8048C013C0FF9F5814980C984E0F5
+:102FD0003C0DFEF300300009E2E34EF200C6B406F9
+:102FE0004E0200945A080604480000902213000480
+:102FF00044229C50943A38111E092213000588027D
+:103000003C8DFEF4AC41A436B045120F800AA437C3
+:103010008041120F800B000400018067B61F3C4DF9
+:10302000F9F580093C5DFEF249FFF7ED000400046C
+:10303000C00B49001AFD5A080208B04580098041BA
+:103040008067490059A73C0DFEF4A602C00AB045AE
+:10305000800980418067F40344528B4C49FFF8A5F6
+:103060003C0DFEF4A603C00C49001AE25A080209FE
+:10307000B045800980418067F40349005869B04534
+:10308000804144029CB496F82E402C4949FFEAD571
+:10309000B04580098041806749FFFE0C220F800AFD
+:1030A0004E0400058400120F800A3C0DFEF3222F0F
+:1030B000800A02100009E041E9049E89122F800A6B
+:1030C000222F800B4E2400058440122F800B02001B
+:1030D000000A222F800BE040E9049E81122F800B12
+:1030E000222F800A225F800B003300DEACB4AD7566
+:1030F0005A38010CC2078E214C208005C5038E0171
+:10310000D8048402100300DEB4265A1006045A18AC
+:103110000823000300E0C0035A180819440000788F
+:103120003E07FBC62E07FBC5E602E80E042300227D
+:103130005A280105002300EDC2035A18080D8C011E
+:103140003E07FBC5D5088401D50484003E07FBC5B6
+:103150003E07FBC42E07FBC48CE13E0004355063E0
+:10316000010848FFFF372E07FBC4C8072E07FBC620
+:10317000C0108E013E07FBC6444001084291907387
+:103180003C27FDE43C17FDE53C0DF9F58089D50EA3
+:103190003E07FBC5D5F2B46A5A380607222500045B
+:1031A00022150005840050A501084CA27FF63C2B97
+:1031B000FDE43C1BFDE53C0FF9F5FCC3FC208480DD
+:1031C0008E4184C2E044E91198E24031987638702B
+:1031D0000D019559E027E90788A0A529E024E90712
+:1031E0009D19D5F19E99D5EF841FD5028003FCA0CF
+:1031F000FC423C7DFEF5F1825013800AF181508340
+:1032000080DC51C000028540853EF002E3404EF272
+:1032100000DB226E7FFFA43DE006E85CA53C9C231A
+:10322000940188079EA1A401E0C0E904A5B88EC15D
+:10323000D552F0018026F48349FFFFC25A07FF4CA4
+:10324000A57BA4B9E2059441F403E8108827FE1495
+:10325000A4CDA44E8AC3FF94404314969B8B406236
+:1032600018D6405014B788C5D5368A858E81E204B9
+:10327000E9188827A4FAA50D886552F18001880F06
+:103280008AC4FF94FE1440001417A4F8405314B6E7
+:10329000A58E8A628AC48803406298D688C0D51BEE
+:1032A0008827A4F84231247381E3A4CDA53A8A0586
+:1032B0008AC38E814267982442003C244000101744
+:1032C00040431096A58E88408AC3406218D688C2B3
+:1032D000D50284C0126E7FFF0203806E226E000052
+:1032E000E006E86B0243806D5002006B9401880792
+:1032F0009EA1A402E0C0E905026380698EC1D55E8B
+:1033000080088026F48349FFFF5B5A07FF58025369
+:10331000806C0223806AE2059441F403E812882756
+:10332000FE140230806E0210806F8AC3FF94404307
+:1033300014969B8B406218D6405014B788C5D53E72
+:103340008A858E81E204E91C88270233806B024063
+:10335000806E886552F18001880F8AC4FF94FE1444
+:103360004000141702338069405314B60260806F26
+:103370008A628AC48803406298D688C0D51F88278D
+:10338000023380694231247381E30230806E02434C
+:10339000806B8A058AC38E814267982442003C2450
+:1033A00040001017404310960260806F88408AC327
+:1033B000406218D688C2D50284C01A6E000C8D41B6
+:1033C00048FFFF25FCC2FC43F081F601FA0242608F
+:1033D0008073B40495B199C68381A678F083840084
+:1033E000F482B602A8115A18FF05B623A859D50CC5
+:1033F000F002A678A00138000501962FB60344001C
+:1034000000FFA8198401F4014617FFFF50108FFF39
+:103410008824F18480248C21507E7FFFF185501E0A
+:103420000001E0274EF300805CF38024E878F1018E
+:10343000F4045090FFFFFA2242438473946188257C
+:10344000F405E089E96CE732E867F4014C92400545
+:103450004C7E4005D5614C7E4060F40340A0940151
+:1034600038A228005AA0FF59F4020482000138A4AF
+:10347000290154A5003FC80F2280800039E298112D
+:1034800040FF2007E849B743B4028B1E8900B7020A
+:103490008401D5425A080115B5034CA400172280B7
+:1034A000800039E2981140FF2007E83614A180011E
+:1034B000A0118B1E8900148100018402D52D5A08A9
+:1034C0000233B5034CA4401022A08000388298112A
+:1034D00005E10000E10AE8038B48D5028540895EDA
+:1034E000B742D51A048180014CA4401122A080006B
+:1034F0003882981105E10001E10AE8038B48D50202
+:103500008540895E14A10001D50722F08000388231
+:103510009811E10FE9078D218C22D5938CE148FFAA
+:10352000FF808403FCC3FC4680C03C0DFEF6B63F22
+:10353000A602F0842E07EBF35A08050884003C3DF0
+:10354000FEF68020480000A52E100406C9F8F004FD
+:103550009401F0852E07EBDFE020E8F14403F04A08
+:1035600044200055AE8004A3000138550501F583C1
+:103570004C50C08CA035948A884087C0A6D0A751F3
+:10358000E662A612A693E9048E6255E180FF3C3DF7
+:10359000FEF6A71A9FE2E0A7E8048CA29728D503BD
+:1035A0008E819720E602F481E9048E029600D5020E
+:1035B0008400A6DB9F1AE044E8048C429690D50371
+:1035C0008E619698F2823C2C0254F304F287805E5E
+:1035D00042200C7394918480F28680648040812420
+:1035E000F502E0A2E929F506811E88A4F701E0E8CA
+:1035F000E91FB4E640F394000077800197D6CF0925
+:103600000077800004FF800338751D014C77C00EE1
+:10361000F70788E5A5F8CF09B4FF8C6196D9387310
+:10362000940188E9409380118D018CA2D5E0F505C5
+:103630008C418885D5D640418409892440348C76D4
+:10364000F206B49F8844F402E080E91F80FE80A265
+:10365000F401E087E917B49FB5269B2C8889009276
+:10366000000154F48004E908A720049F8003384532
+:1036700011014C44C005A5288A83AD288CE18CA299
+:10368000D5E88C01F405D5DF8C2148FFFF650021CA
+:103690008038E002E80DA0B63811020AA0B7381150
+:1036A000020A042300083811020A8C01D5F18500B2
+:1036B0002E07EBDFE3004EF200E4A0313850210189
+:1036C0004C5440DCA075400408088801A7C2E6E21B
+:1036D000E9048EE197F8D50284E0A6435CF08022ED
+:1036E000E8048C219648D502FA33F183A640E622FD
+:1036F000E9048E219648D5028420A601F181E610C6
+:10370000E8048C019600D502FA01F084FA02FE3C2E
+:10371000F082F003E0074EF300B104AF8001F00245
+:10372000B43F880A940140908000F004E00A4EF310
+:1037300000A0B41F40048001F085F105B4068801A3
+:10374000200000014E050091220480004E07008DEC
+:10375000800A8027B088B0CA8086B4BF49FFFE3592
+:103760005A08011DF00AA0769402880122148000F4
+:10377000B44042250473B640F00AA0B79402880210
+:10378000B44042238473B640F00A04230008940234
+:103790008802B4408822B620D55F5A08025EF10A3A
+:1037A000A0F622048000F508F409944A88234220F8
+:1037B0001424888540411096B44142251073B641C7
+:1037C000F20AA17704FF8008F40994928845421018
+:1037D0003C24888F40409096B42242139073B622C6
+:1037E000F40A0423000805EF8008F1099522888275
+:1037F00042F07824883E4017843604F20000882F77
+:10380000B624F10B04FF8009F408944A8861888F7C
+:1038100042103C2440409096B42342151073B623C6
+:10382000F10BF408944A8825F50942301424888560
+:1038300040419096B46142339073B661F10BF30945
+:10384000944A884142100C24F008880340008016F6
+:10385000B4228801B602B406F1058801441FFF8036
+:10386000A681FE57AE418D418D2248FFFF60F002D8
+:103870008CE18C1248FFFF4E8D0148FFFF1BFCC6F8
+:10388000FC403C7DFEF680C19B31E282E81FA1072F
+:1038900004900008048000060853000100A3803251
+:1038A0003894960238421602385416028C784255E3
+:1038B00014244052A4B71251FFF400538033FF2C5C
+:1038C000404224971241FFF5D5E0FCC0FC41812025
+:1038D0008400814280E3AE20F18180C43C2DFEF65D
+:1038E000840044328B64E20AE811041480013850E9
+:1038F0008101D818A67038018408A6708C219648DA
+:10390000AE7000410019E224E90D8009F10149FF80
+:10391000FE0C8400AE3084A03C0DFEF644228B6485
+:10392000D50A8C01D5E104148001381095014C12A0
+:1039300080068CA14C557FF9D50CA670385104082F
+:10394000A6708C219648AE7000300019E223E9F28F
+:103950008009A6B0806744128B6449FFFF938400FE
+:10396000FA4844328B64A670E201E80980274210CD
+:103970000873384180008C01A90DD5F6FCC1FC20EC
+:1039800080E480C5C83FCA17CB112E07EB845A08C4
+:1039900001053C0C01EBD5555A1004392E002914B1
+:1039A0005A00014C3C0C01E5D54C5A38014C5A18D0
+:1039B000043ED52C5A280152CB095A1804053C0C58
+:1039C00001E7D5163C0C01F1D50A5A3801135A18F3
+:1039D00004053C0C01EAD50C3C0C01E8B6062E00AF
+:1039E00029145A0801072E07EBFD4900088FB60677
+:1039F000B40684203C0FFB2D4403F40BAE4084211D
+:103A0000D5295A08012BC90ACB043C0C01E7D5196A
+:103A10005A3801193C0C01EAD5145A180114CB0488
+:103A20003C0C01E5D5055A38010E3C0C01E8B60600
+:103A30002E0029145A0801072E07EBFD49000866DD
+:103A4000B606B40684233C0FFB2D4403F40BAE40B2
+:103A500084204403F40DAE40A47044024E2097F835
+:103A6000AC404403F40044104E20AC404403F40244
+:103A7000AFC0FCA084003C0FFBB54403F4038421D9
+:103A8000AE40DD9E4403F403A6005C000001DD9E11
+:103A90004413F40384003C0FFBB5AE08DD9EFC002C
+:103AA00084C03C6FFBB55A08010949FFFFE53C6F34
+:103AB000FBB53C6BF630D50349FFFFECFC80FC20E6
+:103AC0004463F01D4473F421A670A631A6B04000F3
+:103AD0002008FE0F580004009640AE709208A671B0
+:103AE000AE3144000055AE38442000004430000A96
+:103AF000502100014C21FFFE49FFFFCC8400AE386D
+:103B0000442000004430000A502100014C21FFFEF7
+:103B1000A6309600AE30FCA0FC402E07EB84B4E14A
+:103B200084C04490003C44A200005A08014C2E0777
+:103B3000EB93E2C04EF200858006490024E10213B7
+:103B40008012421024733C0DFB404010A8043C1F1F
+:103B5000FB2AC81602208014440FCFFFFE861220D5
+:103B6000801402208015FE86122080150220801607
+:103B7000FE861220801602208017FE16D51702003E
+:103B80008014580030001200801402008015580084
+:103B9000300012008015020080165800300012001C
+:103BA000801602008017580030008CC11200801768
+:103BB00097B0D5BE8006490024A35A080C098CC1D1
+:103BC00097B02E0028A7E2C0E9F6D53A021380127A
+:103BD000421024733C0DFB404010A8043C1FFB2AFC
+:103BE000C81602208014440FCFFFFE8612208014D6
+:103BF00002208015FE861220801502208016FE8687
+:103C00001220801602208017FE16D517020080149D
+:103C10005800300012008014020080155800300057
+:103C20001200801502008016580030001200801625
+:103C3000020080175800300012008017D5C1FCC068
+:103C4000FC0049FFFF6BFC80FC214413F0604463DF
+:103C5000F061A6084473F04A9600100F8007000F29
+:103C60008007540000FC100F8007000F80075800E9
+:103C70000003100F8007AE088400100F8007840037
+:103C80003C0FFB78000F80075A000311A630960006
+:103C9000100F8007000F8007960F100F8007440059
+:103CA0000055AE384900430BD5EEFCA194038420A7
+:103CB00044229A6C380105098C215A1808FD3C2DC4
+:103CC000FB2D4401000044429A6C0411000C8060FA
+:103CD000FE471411000C4450005C84209721A0166C
+:103CE000920A962FE220E80A02010012880342009D
+:103CF00094738C211240001AD5F3DD9EFC214413ED
+:103D0000F0604463F061A6084473F04A9600100F17
+:103D10008007000F8007540000FC100F8007000F81
+:103D200080079600AE08841F100F800784003C0FA8
+:103D3000FB78000F8007C010A6309600100F800798
+:103D4000000F8007960F100F800744000055AE3813
+:103D5000490042B5D5EFFCA13C0DFB2D0200001639
+:103D6000DD9E44220000FE174430003C0200001299
+:103D700042008C738840A616DD9E44220000FE1788
+:103D80004430003C0200001242008C738840A615AB
+:103D9000DD9E8060C10D3C0DFB2D844C02000013A4
+:103DA0004201887344220000FE1710100008DD9EB7
+:103DB000C1193C2DFB2D846C5CF0840002210013A2
+:103DC00042200C7344020000FE878001E903440096
+:103DD00003FFA051540003FF922A4010A808FE0FD1
+:103DE000A811DD9E3C1003CA44024E20AC40DD9E6B
+:103DF0003C0C01E54610037050108037025000154E
+:103E000044020000FF47460AFFFA50228078500023
+:103E10000FFFB605A829A86A8CACDAFCDD9EFC2051
+:103E2000B48084608C8484E6B4045A380506920A0F
+:103E300040002808D504921E4000780842219C24A6
+:103E4000969084A05A20200C386088008C414063F2
+:103E5000140C8CA5880696905A581EF68C6196D83C
+:103E6000AA215A3806E3FCA0FC00A6495A18060706
+:103E7000441297B849FFFFD5D50E5A1003085020B9
+:103E8000FFF6E642E9035A180D072E17EBFD8E21C7
+:103E9000E622E8EFFC80FC0084003E07EBF9840397
+:103EA0003E07EBEF2E07EBFDE6023E07EBD6840064
+:103EB000E8028403848144527D6C3E07EBFD2E07AB
+:103EC000EBF92E17EBEF2E27EBB32E37EBD549FF8F
+:103ED000FD5844027D6C441297B849FFFFA22E079B
+:103EE000EBD684813E07EBFD44527D6C2E07EBF947
+:103EF0002E17EBEF2E27EBB32E37EBD549FFFD4105
+:103F000044027D6C441297B849FFFF8B2E07EBD615
+:103F1000E6028403E80284003E07EBFDFC80B480E7
+:103F2000840080403830800095414031940C8C01F1
+:103F300088435A0810F98400A8A780405030001028
+:103F400096D8954138308C008C014031940C8843D0
+:103F50005A0810F614220008DD9EFC00B440806070
+:103F60003C2FFB2DA6495A1003045A180D06800356
+:103F700044129750D51A5A18040B2E000CA8E605C7
+:103F8000E91A2E07EBB35A080105D5155A1805088A
+:103F9000A057841CFE0E58000001D5105030FFF6CB
+:103FA000E662E8064412A72449FFFFBBD5088E2825
+:103FB000E622E805A057841CFE0EA817FC80FC40F2
+:103FC000A68181405A20032B5A2006299E14E6021E
+:103FD000E80C84003E07EBF984043E07EBEF2E97D4
+:103FE000EBD73C73F631D53350017FF8E602E80C8D
+:103FF00084013E07EBF984003E07EBEF2E902CFC8A
+:104000003C70167FD52450017FF6E602E9125A284B
+:104010000D3E4900130D5A08020D84003E07EBF9CE
+:1040200084033E07EBEF2E97EBDB3C73F62ED50AAD
+:1040300084013E07EBF92E902CFD3E07EBEF3C7020
+:1040400016802E000CAB84C35A00010384C02E07D7
+:10405000EBF984812E17EBEF44527D6C2E27EBB3E6
+:104060002E37EBD549FFFC8D44027D6C802A49FF39
+:10407000FF768006802949FFFE8EFD0349FFFE9AE8
+:1040800044027D6C802A49FFFEF1FCC0FC012E1722
+:10409000EBFAF081C91584213E17EBFA4420004861
+:1040A0004412489449001117F00144124924442055
+:1040B000004849001110F001441249B4D50D2E27D3
+:1040C000EB6884234011045796904412489444307E
+:1040D000009042110C7344200048490010FC2E0748
+:1040E000EB6884238C0196004020043796484010EA
+:1040F000041B3E17EB68FC81FC40840084203C0BD1
+:10410000FF833C0BFF822E57EBFD806180014462F0
+:104110004A5C44724A5E44924A6044A24A62C503C1
+:104120005A580303C91B948B9916028200003C4322
+:10413000FF8388883C4BFF839917028200003C4331
+:10414000FF8288883C4BFF8240412400884AA5209A
+:10415000A49088048862960196D98C215A180AE1A5
+:104160003C13FF833C23FF828801985A96499601AD
+:104170003C0BFF8388013C1BFF823C0BFF81FCC092
+:10418000FC41002F8028006F802C8460F2812E87F4
+:10419000EBC241C3040880A3814387DFF201D21F31
+:1041A000844099C340908C0054F100FF40F798067A
+:1041B000E8125A80010B38F2090138F3890938F204
+:1041C000090138F48909D50538A3890939E4890931
+:1041D0008C41D5EB8CA19768887CD5E1FCC1FC00B3
+:1041E000001F801084A0944988224C208018A500CC
+:1041F000A590E2C4E803A500AD10A580A518E2C40F
+:10420000E803A500AD180A4100010A6180018A8611
+:10421000E0A4E80297618C02D5E98005FC80FC42AD
+:10422000443000909541810044020BF0880580C124
+:1042300042340C24444223A044927CA844727C90D3
+:1042400044A00048442221F0F083B0438843B75F84
+:104250008864440205204044940088C888A749FF28
+:10426000FFC097B044129414380099092E07EBFD53
+:104270005A080111B75F44020520B04344222310BD
+:10428000443224C0504480049D7C49FFFFAA3C0B6B
+:10429000F60FFCC2FC42F0828400F1833C0BFF80ED
+:1042A0003C0BFF7F49FFFF2AF00249FFFEF12E077A
+:1042B000EB6C5A0801082E07EBFD3C2DFFC3C843E9
+:1042C000D52E84C04470004844824894F00381484D
+:1042D0004090180042A31C738029442221F04432EC
+:1042E00023A044427CA844527C90B6FF800A49FF38
+:1042F000FF783C0BFF80B6FF800A80294422231000
+:10430000443224C044427CAC44527C9449FFFF694F
+:104310008CC23C0BFF7F5A6806DBD5CE0261000ED3
+:104320000071002A490011845A0802049639D524E4
+:104330003C0DFFC30260000E8403FF8497B144006C
+:10434000FFFFD51A3C03F612C0153C13FE080221EC
+:10435000000F42300424FE8C446FFFCE4410003224
+:10436000406198D6401104368826998197B184001F
+:10437000D5030261000F2E37EBFD3C23FF803C1379
+:10438000FF7FC3042E47EB6BD5032E47EB62402122
+:104390001056401090363C2BFF803C1BFF7F3C1397
+:1043A000FF80E2C12E17EB6AE906CB073C23FF81B1
+:1043B000E202E8038C21D503C1048E213E17EB6A8B
+:1043C000FCC2FC003C03FF805CF00033E910840178
+:1043D0003E0004272E07EBFC5A081E063C0DFFC3C7
+:1043E000A600D50284073C0FFB44D50D3C03FE0814
+:1043F0005CF00033E908490016BD3C0FFB44840023
+:104400003E000427FC80FC52842080C080E2801F94
+:10441000442000902EA0287B49004E323C03FE0829
+:104420002E9028A65CF00033E92C40050408844057
+:10443000960080A285439668E229E823842096C8E6
+:10444000E260E81C98CA94D98866384F8501A4D8E0
+:104450004031A47688642E4028A696D98E81383FB4
+:104460008509DC0A38438501926242422824908201
+:104470008864383385098C21D5E38CA18840D5DC4C
+:10448000FCD2FC0084003E07EB752E07EB6AE602C7
+:10449000E90484013E07EB752E07EBFF3C13FF8018
+:1044A000E201E8053C13FF7FE201E9193C0C05EF4E
+:1044B0005A0001062E00042A5A0801063C03FE0693
+:1044C0008C01D50284003C0BFE062E07EBE7C00CE6
+:1044D0003C03FE088C013C0BFE08D50684003C0B17
+:1044E000FE083C0BFE06FC8084003E07EB6A84005D
+:1044F0003C0BFE08DD9EFC003C03FE085CF0003334
+:10450000E90649FFFFF384003C0BF6123C03FE066C
+:104510005CF00033E90484003C0BFE06FC8084015F
+:104520003E07FC0E84003E07EB77DD9EFC0049FF52
+:10453000FDE52E27EB623C13F60F3C0002464010CF
+:104540008836400008163C1BF60F3C08024649001E
+:10455000106F5A0802093C0DFFC30010002B4400E5
+:104560000032D5054410FFFF440000963C23F60FAF
+:10457000E240E9053C200246E240E80A3C03FF81B4
+:10458000E220E90684003C0BFE068401D50284008B
+:10459000FC802E37EBFD8E62E662E81D40302C0A6F
+:1045A00096C6C304443FF000FE1F3CF7F62BE00F15
+:1045B000E8042E000CC6D50A3CF7F629E00FE80403
+:1045C0002E000CC2D5032E07EB65AE102E07EB694B
+:1045D000AE08D5072E07EB60AE082E07EB62AE10D3
+:1045E0002E07FF085A08010D2E07EBFD8E02E6028A
+:1045F000E8072E07EB69AE082E07EB65AE10DD9ECF
+:104600002E100CC6FE0C2E17EB6B96034000041602
+:10461000DD9E2E17EBFD5A18031FFC40449299684B
+:1046200080C050A000244480051084E038031C1191
+:1046300049FFFFE838031C09507380244C747FF84D
+:104640002204800049FFFFDE8CC21A0480014C6501
+:104650007FEEFCC0DD9EFC405A0803053C5C01E691
+:10466000D5033C5C01E50232801844620000FEF78D
+:10467000A418A1D9B4630242801292704090001332
+:10468000547387FF54318FFF9721C908504200B4FB
+:10469000FF37A0A454210FFF969354010800C004D3
+:1046A000440FF000FE87001280494600009650003B
+:1046B00002585A1801075014800288238841D503F4
+:1046C00088478C429491400008169601FCC05A0815
+:1046D00003083C040657AC083C040656D5063C04C7
+:1046E0000659AC083C040658AC10DD9EFC003C4D5D
+:1046F000FB2D4460003C54108FFF025200124250C8
+:10470000187344020000FE2F96F7A14492AC405269
+:10471000B008FF4FA9442E17EBFD9F49E6A2E822FF
+:10472000B48058420080B6805A180109A104441F81
+:10473000CFFFFE6658109000D504A0445810B0007A
+:10474000A844A044464F00FF50420FFF40215008AC
+:10475000FE66FE57A844B4209227944FFECFB66061
+:10476000D51CC90B0412000F460FE7FF50000FFFC6
+:10477000FE0E46100800D5050412000F4600180072
+:10478000FE0F1402000F10220049B424440FFC074E
+:1047900094DBFE0EFEC7B664FC80FC4181202E0730
+:1047A000EBFDC8043C77FE00D50544028B703870E1
+:1047B00025113C0DFFC30000002EC0033C7414BE45
+:1047C0002E07EB63501F80063E07EB6D2E07EB6B49
+:1047D000502F80073E07EB64800749FFFEDC000F87
+:1047E000800684C03E07EB63000F80073E07EB6B3B
+:1047F00080068CC149001E8497B080272E27EB636A
+:104800002E37EB6B49FFFF745A680AF43E97EB674B
+:10481000FCC1FC0049000F0C5A0802264413F0604A
+:104820002E27EBEEA608540000FC5A280111580070
+:104830000001AE084423F04A4413F06144300055AF
+:10484000A608960F5A000110AED0D5FBAE0844233F
+:10485000F04A4413F06144300055A608960FC00397
+:10486000AED0D5FCFC8084013E07FC0EDD9EFC40F2
+:10487000844080A04440FFFF80024472942C9790B3
+:10488000E2C1E80F38938800A4E88C414031A47657
+:10489000E2641A3280014041BC1B40033C1BD5F04E
+:1048A000FCC0949180A088408400D2080A32800124
+:1048B000E223E8FC9CC19618D5F9DD9EFC002E177A
+:1048C000EB722E67EB768E21FE74840096483E07CD
+:1048D000EB739449440294148801804644100032DA
+:1048E00049FFFFE1FE355C0000013E07EB73FC80F1
+:1048F000FC0049FFFE02842080412E07EBFD49FFAA
+:10490000FEAC2E17FC0E3C0BF6335A180120840027
+:104910003E07EBFA3E07EB773E07EB683E07FC0EDF
+:104920003E17EB7249FFFDE23C0DFFC30000002E75
+:10493000C00D3C0014BE3C0BF61184003C0BFF7E06
+:104940003E07EBE784003C0E0106FC80FC003E07BE
+:10495000EBFD3C0DFB8349FFFB342E07EB6749FF62
+:10496000FF1E49FFFDDEFC80FC0080C02E07EC012D
+:10497000E606E9042E17EBA8D5033C1014A12E007F
+:1049800004275A0801042E10299A2E07EBE7C805C0
+:104990002E00299C88209649AC702E00299AAC34B0
+:1049A00049000E465A0002113C1005A884039449A0
+:1049B0004010803696495CF08055E903AC70D50410
+:1049C00044000055AC30FC80DD9E2E3004275A3068
+:1049D00001062E37EB6E5A38011784603E37EB6EB6
+:1049E000003000103E302C49A00794023C0E0B13FF
+:1049F000A60A3E002C9CA60B3E002C9DA4123C084F
+:104A00001663D51AA6C03E302C49A0033C0E0B13EA
+:104A1000A6083E002C9CA6093E002C9DA4103C0834
+:104A200016632E07EBFCE605E90D2E000E24C804E4
+:104A30002E000F2CC007440000503C081664840A66
+:104A4000D505FA043C08166484043E002CCA2E07DF
+:104A5000EC01E605E90A2E000434C0074400005AC0
+:104A60003E002A043E002A05DD9EFC402E77EB72B4
+:104A700081202E07EB768EE1FFC484C084013C6F59
+:104A8000FBA397F8490010B444A3F04A3E67FC0E1C
+:104A900049FFFD2C4C64803684003E07EC0449003D
+:104AA0001E1F441000552E07EC04E60AE8231015DB
+:104AB00000003C8DFBA35A8801F884003C0FFBA347
+:104AC0002E07EC048027960649FFFBAB2E17EC045B
+:104AD0005004FFFF8C2196483E17EC044C603FE3E6
+:104AE0002E07EC045A080ADF3C0DFB77108000000B
+:104AF000D5D9440FFFAA8CC13E07EBCE97B0D5CBDA
+:104B0000840049001075FCC0C8043C0C01E5DD9E22
+:104B10005A0801053C0C01EDDD9E5A0803053C0CCA
+:104B200001E6DD9E3C0C01EEDD9EFC002E07EBE570
+:104B3000C00484003C0E01062E07EBE7C8303C1C85
+:104B400001065A18142D3C0805A44422163480602E
+:104B50003C101456E201E80698428C01AEC896015A
+:104B6000D5F844026E703C1C025149000BDF440032
+:104B700000333C0BFE083C0DFB40C00444023520D2
+:104B8000D5034402052044128DEC44228CC84432E3
+:104B90008C3449FFFC3A84013E07EBE7FC802E177A
+:104BA000EBFD2E07EBF1C1062E17EBEE5A180103B1
+:104BB0008C013E002940DD9E840044228BA03811E8
+:104BC0000101FE5C381281098C015A0848FADD9E09
+:104BD0002E4004295A480228FC403C9C025184A0E3
+:104BE00044A22A603C401456E2A4E81695A94073FA
+:104BF000280088C9A538A5F8028300008CA140844C
+:104C000005168AE8407380F642438875FF1C972199
+:104C1000AD309769D5E884003E07EBE784003C0E91
+:104C20000106FCC0DD9E949188404C0100051A10DD
+:104C30000001D5FCDD9EFC422E17EB763C032802DA
+:104C400084C0120F800444A28B702E06500644824A
+:104C5000942C100F800A3C032804120F80062E06A5
+:104C6000500A100F800E2E07EB728E01FE0C54902E
+:104C700000FF3C0DFB778421AE402E07EB76E2C0AF
+:104C8000E8632E07EBFD5A0801063C77F610B003E7
+:104C9000D5064004980038750111B0028380501F7A
+:104CA00080068007502F800749FFFC75380E1800DA
+:104CB0008027002F8006003F800749FFFD192E073F
+:104CC000EBC244700090FFF45A080114440221F032
+:104CD000880784204420004849FFFFA7440223A0FE
+:104CE00088074410FFFF4420004849FFFF9ED51F5E
+:104CF000445221F02E07EB632E17EB6B002F80063A
+:104D0000003F800744428CC888A749FFFF574452A0
+:104D100023A02E07EB632E17EB6B002F8006003FBE
+:104D2000800744428CC888A749FFFF482E07EBFD47
+:104D30005A00010840041800001F8007381024089A
+:104D40008CC197B0D59BFCC2FC412EA028A62E306A
+:104D5000287B4210A82494D984C0F081964896D824
+:104D60002FE7EBFD2E07FF0880A644828CC845C2C2
+:104D70008C384C550023F40194B18844848097E02A
+:104D8000E2E3E81702F1000095E140F785F65BE801
+:104D90000309C807389E1C01892F389E1C09D506B7
+:104DA00038941C01892F38941C098C818C42D5E8D9
+:104DB0008CA1976888C3D5DEFCC1FC202E10042886
+:104DC0005A10010944128DF44420004849000A8316
+:104DD000D51980C02E57EB6C844044428DF4840A70
+:104DE00084E6381309015A50010938320901FE7C62
+:104DF000FEC4906490248823381209098C415A28F3
+:104E000048F2FCA04413F4034423F04A4430005514
+:104E1000A608C003AED0D5FDDD9EFC0080C049FFD2
+:104E2000FFF33C0DFB833E67EBFD49FFF8CA8400AE
+:104E300049FFFCB584203C1FFBB53C1DFB7784017A
+:104E40003E000429AE0849001C4B4413F04A44209C
+:104E500000553C0DFB77A6005A080104AE88D5FA30
+:104E60004413F4034423F04A44300055A608C00319
+:104E7000AED0D5FD3C0C024F3C1C025149000A56F5
+:104E800044428CC82E07EB6D2E17EB642E27EB6384
+:104E90002E37EB6B80A449FFFE9149FFFB42840152
+:104EA0003E07EBE7FC80FC02B61F84003C0FFBB51D
+:104EB0003C0DFB77F1818421AE40F282F3834900FF
+:104EC0001C0F4413F04A442000553C0DFB77A6000C
+:104ED0005A080104AE88D5FA440298C444127B7B78
+:104EE00049001A4BF101F202F303B41F49FFFE72AD
+:104EF0004413F4034423F04A44300055A608C00389
+:104F0000AED0D5FD3C0DFB778421AE404402052098
+:104F100049FFFF554402052044128CC84420004834
+:104F2000490009D9FC82FC0080C049FFFF6D3C0D9F
+:104F3000FB833E67EBFD49FFF84449FFFAF2FC8032
+:104F4000FC2084C0840184E13C6FFB403E77EB721F
+:104F500049FFFFEB49FFFE714402231080264420E5
+:104F6000004849FFFE62440224C04410FFFF442071
+:104F7000004849FFFE5A440294148026844C49FF9D
+:104F8000FE54840149FFFD7349FFFAD25A00013BE8
+:104F900084033E07EBFD3C0DFB8349FFF8128403BD
+:104FA00049FFFCD62E07EB6D2E27EB632E17EB6423
+:104FB0002E37EB6B4C0140044C11800B44428CC8E3
+:104FC00080A449FFFDFB84023E000429D5033E7006
+:104FD00004292E07EB6D2E17EB642E27EB632E377B
+:104FE000EB6B49FFFF6244428CC82E07EB6D2E1716
+:104FF000EB642E27EB632E37EB6B80A449FFFDDEBD
+:10500000D51F84023E000429800649FFFCA12E071B
+:10501000EB6D2E17EB642E27EB602E37EB6249FF0A
+:10502000FF442E07EBEE3E67EB6CC0053E67EBEEF0
+:1050300049FFFBF184003C0E01063E07EBE749FF08
+:10504000FA70FCA0FC40840184203E07EB72844689
+:10505000440294143C1FFB4049FFFDE7840249FFD2
+:10506000FF643C0DFFC30060002EC61A2E07EB76CE
+:105070002E17EB7244629414FE449648800649FF52
+:10508000FBF884203C1BF6123C1DFFC338230101B2
+:105090000230800FE262E82D3C2BF612D52A4493B1
+:1050A000F04A447000555A6001E31074800049FFD3
+:1050B000FDC43C0DFFC3A60149FFFCD949FFFC001C
+:1050C0002E07EBC2C8052E07EB735A0801D12E0735
+:1050D000EB722E27EB768C018426960040108836E2
+:1050E000E0203E07EB72E8E03E17EB7284C1D5DAB0
+:1050F0000010802D5A18010384003E07EB678403DB
+:1051000049FFFC262E07EB6D2E27EB632E17EB6471
+:105110002E37EB6B4C0140044C11800944428CC883
+:1051200080A449FFFD4B8402D50284013E0004297E
+:105130002E07EBC2C80B2E07EB6D2E17EB642E2744
+:10514000EB632E37EB6B49FFFEB0840084213C0EED
+:1051500001063E1004273E07EBE7FCC0FC0184017A
+:10516000446000483E00042849FFFBC484014432E7
+:105170007C9044428CC844528C34B61F441223A005
+:10518000440221F044227CA8F68149FFF7FB440247
+:1051900023108420804649FFFD48440224C0441067
+:1051A000FFFF804649FFFD413C0DFB8B44128DEC17
+:1051B000844049FFF87149FFF9662E07EBFD441062
+:1051C0000032C8033E0004273E17EBFF3C1DFFC31F
+:1051D0000020802C5A2001052E27EBE9CA07C004C5
+:1051E000840049FFFE1C8400D5140020802D5A281D
+:1051F00001065A0003FA8403D5F50010802EC11C65
+:105200005A18020B3C57F6113C0414BED0ED840131
+:105210003E07EB75D5115A180110C004840049FFF0
+:10522000FDFE3C57F6113C0414BED0DE2E07EB67A2
+:1052300049FFFAB5D5D93C0DFB8B44128DEC4422C5
+:105240008CC844328C3449FFF8E02E67EB755A68FD
+:10525000010B84023E00042984003E00042849FF1B
+:10526000FEF3D51C2E07FF08C81B2E07EBFDC01848
+:105270003C0DFFC30060002ECE133C03FE065CF025
+:105280000032E90E49FFF94D3C6BFE063E600428F2
+:1052900084C13E67EB6E49FFFE553E6004283C0D1D
+:1052A000FFC30000002EC01B3C03FF803C13FF7EA9
+:1052B000E220E8033C0BFF7E44121C539680A6C8F4
+:1052C0009208AE88A689AE093C13F63344021C55F9
+:1052D0009688A6C09228AE80A681AE41FC81FC4093
+:1052E0003C3005A84452B8002E602A0C2E47EBFD36
+:1052F0002E7004368420812544A000785C31812CF6
+:105300004480005A9688E246E81EC405988100F160
+:105310000020D50338F0040098A910F10184CF0FC4
+:105320009881C40400210028D5030021000840F41E
+:10533000840040240C1B1027818CD50310A1018C04
+:105340008C21D5E12E07EBE35A08010A4400005AEC
+:105350003E002A043E002A053E002A06FCC0DD9ECF
+:10536000FC2084003C0FFB784463F4034473F04A50
+:10537000A6305A08010844000055AE384900379F4E
+:10538000D5F8FCA0FC2380C0A601F283F384F48549
+:1053900080E55A080412A6305A08010F3C1DFB860E
+:1053A0005A100A045A180B06440298C44900177A86
+:1053B000840049001ABA2E07EC0B5A08010A44026D
+:1053C0007B93F103F204F305808749002975440FAC
+:1053D000FFAA3E07EC083C1DFB8344227B55F303E8
+:1053E000F404F505B6FF44027D9C49002AFF9600AF
+:1053F0003E07EBF3490026D32E07EBF35A000105D5
+:1054000084013C0FFBAFA6315A080810A6305A0899
+:1054100002433C0DFB865A00063D5A0809334900F9
+:1054200009075A08022FD5355A08090BA6305A0821
+:1054300002333C0DFB868E06E602E823D52A5A0885
+:105440000A07A6308E02E602E826D5235A0803088A
+:10545000A6305A08012149000BEBD51B5A08040657
+:10546000A6305A080119D5155A080616A7B05A6869
+:105470000113800649000BDC800649000BB9D509F1
+:10548000844084618402FA25808380A24900163B0F
+:105490008408D5028401FCA3FC00840149000BA808
+:1054A0002E07EB9D5A08050D3C0DFB83A601490014
+:1054B0001A693C0BF62184013E07EB9DD50484005C
+:1054C0003C0BF62184003C0BF6203E07EBDA84000F
+:1054D0003C0FFB402E102D04840A442297B844321E
+:1054E000982449001A0D440FFFAA3E07EBCE3C0D4D
+:1054F000FB778421AE40FC80FC003C0DFB838423C1
+:10550000AE4149FFF55E49001731840049000B7038
+:105510003C1DFB928401AE083C1DFB77AE082E07B4
+:10552000EB9D5A00040584053E07EB9D49001A3E99
+:10553000E6028400E90449001A398E023C0E010596
+:1055400084023E07EC0984003E07EBA0FC80FC408F
+:1055500084003C0FFBB23C0FFB784473F04A44904C
+:1055600000553C6DFBB2CE0E10938000490036A76B
+:105570008401802080468066808080A6490015C313
+:10558000D5F1FCC0FC2084C03C6FFBB349FFFFE1B8
+:105590003C0DFB4044127D6C49FFF354840149FFEC
+:1055A000F280447000553C6FFB784463F04A2E0053
+:1055B00028A73C1DFBB38E01E220E80DAFF04900A7
+:1055C000367E8401844080208062808080A24900F1
+:1055D000159AD5EE84003C0FFB784463F04A447082
+:1055E000005549FFF251C805AFF049003668D5FAB9
+:1055F000FCA0FC20490016BA3C0DFB4044127D6C17
+:1056000049FFF320840149FFF24C84003C0FFB78F2
+:105610004463F4034473F04AA6305A080108440076
+:105620000055AE384900364BD5F84900169FFCA00E
+:10563000FC003C0DFB83A601540000FD5A08091133
+:105640002E07EB9D5A00040584053E07EB9D49009B
+:105650000F64E602E90549000F608E02D50284005E
+:105660003C0E010584203C0DFB834900178F3C0D47
+:10567000FB83842AAE4149FFF4A449FFFFBC8401A7
+:105680003E00042584003E07EBA049000F1C840E59
+:1056900049001555FC80FC40C006441003E8FE0C90
+:1056A00049000F3F842144004F0080418061490040
+:1056B000076444600E5D4473F04A4490005549000D
+:1056C00007B7C0068EC1C60410938000D5F9490003
+:1056D00007AFC00D8400490007744463F04A44706A
+:1056E0000055490007A5C003AFF0D5FCFCC0000081
+:1056F000FC40812080C24900153380E049FFFE3222
+:105700005004FFFFE60A4EF2018244F056183807B3
+:10571000810140F03C00DD0F1400560024010A0214
+:1057200088002C023C0288027002BE02840EAE3158
+:105730008405AE30840010038050449000554473BB
+:10574000F04A490007755A08020510938000D5FAFF
+:105750004900076EC008842144005AF080418061EE
+:105760004900070B4400009149FFFF97D50F840EB5
+:10577000AE318406AE3084001003805080A7500301
+:105780008041843F18128001D8FE800684214900A0
+:1057900016FD8420840280418461808148000134A8
+:1057A00084E13E70036249FFF37884003E07EBF921
+:1057B000AFF02E07EBF984812E17EBEF44527D6C8E
+:1057C0002E27EBB32E37EBD549FFF0DB44027D6C7F
+:1057D0004412975049FFF3A52E000CAB84E05A0801
+:1057E000010384E380072E17EBDB49FFF2D4800727
+:1057F0003C13F62E49FFF2DE84002E2004283E00E2
+:105800000425842184003C0E01053E17EBC35A2079
+:1058100001063E17FC0E490009EB3C1DFB92840279
+:10582000AE083C1DFB77AE08A6318E08E6044EF2AA
+:1058300000EE800649001575480000E9440218CCC6
+:10584000FA23AE40441218CD440FFFAAAE0844120A
+:1058500018CEAE08441218CFAE083C1DFB77840169
+:105860003E0003638402AE08AE308400490009D1D3
+:10587000A6319E43E624E90A5A000D095A080E098A
+:10588000490017608400490016318408D502840954
+:10589000AE318400100380503E07EBDA49FFF2FD81
+:1058A0003C0DFB8349FFF38D84033E07EB79446392
+:1058B000F04A4900121144700055490006B95A08CF
+:1058C0000204AFF0D5FB490006B3C00884214400B0
+:1058D0005AF0804180614900065084002E2004283F
+:1058E0003E000425842184003C0E01053E17EBC3D5
+:1058F0005A2001063E17FC0E4900097A3C0DFB8632
+:105900005A0004045A0807088440840284218062F3
+:10591000848FD57984408402FA258062848F84A1A3
+:10592000D57384203C0DFB8349001630840AAE31C8
+:105930008403AE303C0DFB8349FFF343840149FFF0
+:10594000E01AD56484003E07EBF93E07EBD549FF2A
+:10595000F1D7D53484003E07EBF984013E07EBD53F
+:1059600049FFF1742E07EBF984812E17EBEF4452B7
+:105970007D6C2E27EBB32E37EBD549FFF0024400A8
+:10598000004049FFF195D542440000A0441000A119
+:1059900084418460490005F184003E07EBF9D50C91
+:1059A000440000A0802084418460490005E6840012
+:1059B0003E07EBF984013E07EBB32E07EBF9848138
+:1059C0002E17EBEF44527D6C2E27EBB32E37EBD521
+:1059D00049FFEFD7D51B840EAE318406AE3080A7C9
+:1059E00050038041843F18128001D8FE8006842134
+:1059F000490015CC840084208461100380508041CC
+:105A00008402808380A14900137EFCC0FC41A681F2
+:105A10008E43E6494EF202FD80E380C044F0592CEB
+:105A20003827890140F13C004A003C0012004A013D
+:105A3000E205B802E2058403D403A8046C053C0D1A
+:105A4000FB865A08091E490005F35A08021A440247
+:105A50007B3744127BE24900153A44027B554412DD
+:105A60007B5C49001522840CAE313C0DFB83842005
+:105A70004900158C8403AE31FA003C0FFB8600030D
+:105A800080205A000104480002C42E002912C809CF
+:105A900084003C0FFB784493F04A44A00055D52A7B
+:105AA0005A0001092E0029125A000104480002B1CF
+:105AB000D5260493800449001779E209E8EAD5F372
+:105AC0003C0DFB77A6005A0801EF10A480004900A6
+:105AD00033F62E07EBCD5A08010644027BE8490055
+:105AE000147584408401842A8062808080A24900E9
+:105AF000130A3C0DFB92A600C0E4D5D504938004A4
+:105B000049001754E209E90EA63A5A0001092E0786
+:105B1000EB915A0001044800027CD50B2E00035C77
+:105B2000C8F749FFDF1FC8F42E07EB5C5A0801F1E4
+:105B30002E07EBEF5A00041D84003C0FFB784473E2
+:105B4000F04A449000553C0DFB92A600C806109305
+:105B50008000490033B4D5F83C0DFB838420490014
+:105B600015158404AE313C0DFB8349FFF22A49FF31
+:105B7000FC95480000AA2E07EB9DC0035A08032D90
+:105B80008006842049001502840149FFEF8A44738E
+:105B9000F04A4490005549FFEF77C8041093800005
+:105BA000D5FB490016602E07EB9D5A00041B84218B
+:105BB0003C0DFB83490014EA8401490016B64900F4
+:105BC00016CBF08184408402F1018461808280A23E
+:105BD00049001299D5065A08040584013E07EB9D39
+:105BE000800684E02E17EBF33E77EBA04900183ACD
+:105BF0002E07EB915A08010D440FFFAA3E07EBCE8A
+:105C00003C0DFB773E77EBD8AFC0480002022E0771
+:105C1000EBD85A080104480000C92E07EB9D5A082A
+:105C20000404480000C33C73F621A631490016AABB
+:105C3000E2E0E903490015CA3C73F620A6314900A9
+:105C400016ABE2E0E9042E000406C0063C03F62091
+:105C50005CF00168E939440FFFAA3E07EBCE8406E9
+:105C6000AE313C0DFB8349FFF1AC84013E07EBA054
+:105C700084003C0BF6203C0DFB865A080A064402C1
+:105C800098C4842BD5065A080B07440298C4842A6A
+:105C9000490013082E67EBB397B05A60010448001F
+:105CA00001B880263C0DFB8349001470490016544E
+:105CB000F081F101840284408066808280A24900E4
+:105CC0001222480001A684213C0DFB834900145E8A
+:105CD00084014900162A4900163FF081F10184022F
+:105CE0008440D55C2E97EBA05A98012A49FFFC4CC2
+:105CF0002E0004065A0801174900049A5A08021394
+:105D00004900313080E03E07EBD85A08010C84008E
+:105D100049000DD184003E00035D3E70035C3E00EF
+:105D200004063C0DFB838421490014308406AE3107
+:105D30003C0DFB8349FFF1454800013A5A900204AB
+:105D4000480001673C0DFB92109000003C0DFB7772
+:105D500010900000A608C8242E07EBD8C821000127
+:105D60008026C81E2E77EBE5CF1B8404AE313C0D98
+:105D7000FB8349FFF1263C1DFB9284013C7FFB40E5
+:105D8000AE083C1DFB77AE088401490015CE4900E2
+:105D900015E3F081F101800980478461D58F3C0DC6
+:105DA000FB838420490013F249FFFBA8480001311E
+:105DB0003C0DFB865A08061384003E07EB9D3E0708
+:105DC000EBA049000435C054490012F03C0DFB51D2
+:105DD0000200001149FFFC61D54B5A00090448003C
+:105DE0000118490004255A000204480001123C0D24
+:105DF000FB838420490013CA8403AE3148000109A3
+:105E00002E97EB9D4E9300238029490013BF490034
+:105E100014B780068029490013B9490014B149001C
+:105E200015223C0DFB778421AE402E07EB9D5A00D6
+:105E30000413490015A2F08184618402F1018049B4
+:105E4000808380A94900115FD5065A980405840112
+:105E50003E07EB9D80062E17EBF3490017032E0734
+:105E6000EBD85A0001062E07EB9D5A08040C49FF97
+:105E7000FBE13C1DFB7784013E07EB9CAE0848002C
+:105E800000C83C93F621A6314900157CE320E903C4
+:105E90004900149C3C93F620A6314900157DE3206F
+:105EA000E91285203C0DFB8314938004802949006E
+:105EB000136D840BAE3184013E07EBA03C9BF620B2
+:105EC000480000A749001559F081F101840284407F
+:105ED00048000099A6005A08024CA608C8042E07DC
+:105EE000EBD8C0042E07EB9CC83B04938004490008
+:105EF0000B14E320E8052E07EB9C4E03008A840078
+:105F00003C0FFB784493F04A44A000553C0DFB92B3
+:105F1000A600C80610A48000490031D1D5F82E078C
+:105F2000EB9D5A08050BA6314900152C3C0BF621B8
+:105F300084013E07EB9DD50484003C0BF6218520AF
+:105F400084093C9BF620AE313C0DFB8384C049FFA5
+:105F5000F03810938021A9BC3E97EBA0D54D84006A
+:105F6000A83C84011003802149000AADD5513C0DA5
+:105F7000FB865A08070F8409AE3149FFFB5B3C1DC5
+:105F8000FB7784013E07EB9CAE08FA003C0FFB86D2
+:105F9000840010038021D53C2E07EBA05A08011085
+:105FA0003C0DFB8349FFF00D49FFFB2584023E07B2
+:105FB000EBA03C0DFB778420AE40D52A5A0802297D
+:105FC00084003E07EBA0A608C8042E07EBD8C00447
+:105FD0002E07EB9CC81B8409AE313C0DFB8349FFA7
+:105FE000EFF03C0DFB838421490012D084C0840073
+:105FF00010038021A9BC490014C0F081F101840282
+:1060000080468461808348FFFE5B49FFFB13FCC12F
+:10601000E605E85B4423F2484413F24944F05F2C60
+:106020003807800040F03C004A003C0006364C50E7
+:106030006A008401AE108442AE884413F24A84643C
+:10604000AE084413F24BAE884413F24CAEC844136E
+:10605000F24DAE884413F24EAE084413F24FAE88B0
+:10606000D531841FAE10AE084413F24A8448AE08FE
+:106070004413F24BAE08D51A8401D5028402AE1047
+:10608000AE084413F24AAE084413F24BAE08441370
+:10609000F24CAE08D50E8400AE10AE084413F24A9E
+:1060A0008441AE084413F24BAE084413F24CAE8860
+:1060B0004413F24DAE084413F24EAE084413F24FAF
+:1060C000AE084413F250AE08DD9E92004433F25104
+:1060D0004443F241A698AE60541100E0FE0FAE18A2
+:1060E000DD9E4433F2529601AC184403F2549649B3
+:1060F000AC404403F2569691AC80DD9E4403F240DE
+:106100008421AE404413F04A44200055AE88A64096
+:106110005A1001FFDD9E4413F258A448AC404413CA
+:10612000F25AA448AC414413F25CA448AC42441374
+:10613000F25EA448AC434413F260A6481010000875
+:10614000DD9EFC2180E0800280C1F38149FFFF6277
+:106150004403F24497F9ADC04403F24697B1AD80D1
+:1061600049FFFFCEF00149FFFFD8FCA144021BD834
+:106170003C0FFB454403F142441FFFD8AE404403AB
+:10618000F143FA2BAE40DD9E3C1DFB46A68210205B
+:10619000800CA6831020800DA680A6011020800E02
+:1061A0001000800FDD9E3C1DFB46A6821020801053
+:1061B000A68310208011A680A60110208012100056
+:1061C0008013DD9E3C1DFB46A68210208014A68312
+:1061D00010208015A680A6011020801610008017C0
+:1061E000DD9EFC01B63FF28149FFFFD0B41F49FF9D
+:1061F000FFDCF00149FFFFE8FC813C1DFFC45410A7
+:10620000802FFE0F3C1DFB463C0FFFC41000800A90
+:10621000DD9E3C1DFFC4541080F0FE0F3C1DFB466C
+:106220003C0FFFC41000800ADD9E3C1DFFC45410CB
+:1062300080F05A1810053C1DFB46AC0CDD9EFC029C
+:10624000F1813C1DFB4584C0F383AD8BF2823C1F82
+:10625000FB4649FFFFD4F102F001F20349FFFFC3FF
+:10626000800649FFFFE43C0DFB4644107FFF1210FF
+:10627000000C441F80001210000DFC82FC40814085
+:106280008401812180E280C349FFFFC53C4DFB466C
+:106290004403F140842112A2000012920001ADE2F9
+:1062A0001062000BAE40FCC0FC408120840280E103
+:1062B00080C249FFFFB03C3DFB4684008421AC19FD
+:1062C0004403F14012918000ADDA1061800BAE40C2
+:1062D000FCC0FC029690B61F102F80088401102F7E
+:1062E000800B102F800C102F800FB0838062F18103
+:1062F000100F800A100F8009100F800E100F800DF4
+:10630000B042FA0049FFFF9DB41FF101844049FFEC
+:10631000FFCD4403F04A44100055AE404413F14011
+:10632000A6085A0001FFFC82FC02B61F8401100F70
+:10633000800E2E002887F181100F800C100F800F27
+:106340002E002888B04380418061100F800DFA0034
+:1063500049FFFF77B41FF101844049FFFFA74403C1
+:10636000F04A44100055AE404413F140A6085A00CC
+:1063700001FFFC82FC03B61F8401100F8016FA0295
+:10638000F181100F8014B045100F8017FA14F282BB
+:10639000F38380418061100F8015840049FFFF5115
+:1063A000B41FF101F202F30349FFFF6A4403F04A0C
+:1063B00044100055AE404413F140A6085A0001FFB6
+:1063C000FC83FC2084003C0FFB784463F40344739B
+:1063D000F04AA6305A08010844000055AE3849007A
+:1063E0002F6ED5F84403F3808421AE404413F04A65
+:1063F00044200055AE88A6405A1001FFFCA044532B
+:10640000F381944AA7289407544200F0FEA7FE5750
+:106410009648FE0F9600AE284403F38496D8AEC08B
+:10642000DD9EC8044403F386D5034403F387A60026
+:106430009600DD9E4413F3868400AE084413F38770
+:10644000AE08DD9E4403F3C98421AE40DD9E4413B3
+:10645000F280A60858000001AE08DD9E4423F280B9
+:106460009405A650FE479648AE50DD9E440219277B
+:1064700044121926A600A64840002008FE0FDD9E03
+:106480004402192944121928A600A64840002008F1
+:10649000FE0F50F066D45CF7805AE9034400192CD3
+:1064A000DD9E44021924A60092019606DD9E440258
+:1064B0001924A60092029606DD9E44021925A60024
+:1064C000DD9E4412192AA6089600C00EA608960062
+:1064D0005A00010BA60896005A000207A60896006B
+:1064E0005A0003038400DD9E4412192B9600AE0867
+:1064F000DD9EFC20002000094443F280968694D162
+:10650000A6A00010000A542100FDFE9F3C4FFB2670
+:106510009646AEA0948AA66080E0541080FBFE5799
+:10652000AE60A4404403F28480C4AC40A47A440327
+:10653000F286AC40001380084403F283AE400003AF
+:10654000800B49FFFF8D49FFFF844413F04A44202C
+:106550000055A6309606C003AE88D5FC4413F281E0
+:106560003C1FFB34A60892029606C0EAA6089203D6
+:106570009606C0E6FCA0FC0044621924AE704412EA
+:106580009BF8B6018401100080081000800B800188
+:10659000A989102080091030800A49FFFFACA6307D
+:1065A000FC80FC008441842080624400B10049FFEB
+:1065B000FFE484003C0FFBA13E000360FC80C808A0
+:1065C000441218C1A6088C019600AE08D50F4422CB
+:1065D00018C2A6508C219648AE505A0801084413A0
+:1065E000F060A60858000004D5064413F060A60821
+:1065F000540000FBAE08DD9E4403F061A600920249
+:106600009606DD9E4403F061A6009207DD9E4413CA
+:10661000F0679600AE08DD9E4413F0689600AE0861
+:10662000DD9E4413F06A9600AE08DD9EFC0049FF33
+:10663000FFEBC80749FFFFE25A0001068401D504B9
+:106640008400D5028402FC809404FE47960844230B
+:10665000F06D4413F077443FFFC0AED0AE08DD9E2E
+:106660004403F06D8420AE40DD9E9404FE479608FE
+:106670004413F481AE08DD9E4413F4839680AE8803
+:1066800092084413F4849600AE08DD9E4413F4850A
+:106690009680AE8892084413F4869600AE08DD9E7C
+:1066A0004413F4879680AE8892084413F4889600C9
+:1066B000AE08DD9E4413F4899600AE08DD9E4403C7
+:1066C000F48244200055A640541080FE58108001EA
+:1066D000AE404413F04AAE88A6409646C9FEDD9E01
+:1066E000FC004463F00EA43054000100C0094412C1
+:1066F00018C0A6088C019600AE088408D57EA43088
+:10670000960EC86AA430961EC009441218BFA60887
+:106710008C019600AE088403D570A4309616C0098B
+:10672000441218BEA6088C019600AE088402D565F6
+:10673000A4309626C009441218BDA6088C01960004
+:10674000AE088404D55AA4309606C803FA00D5557D
+:1067500049002DCAA4309636C841A430962EC840B0
+:10676000A430963EC83FA43054000200C00B44033E
+:10677000F063A6409646C138A640541080FEAE4055
+:10678000D5334403F00EA44054108400C92FA44014
+:1067900054108800C92DA44054109000C92BA44067
+:1067A0005410A000922DC928A48054214000C20C8E
+:1067B0002E000361C80584013E000361D5033E102D
+:1067C0000361840ED51AA400920FC0C184013E005B
+:1067D0000360840FD5128401D5108406D50E84057C
+:1067E000D50C8407D50A8409D508840AD506840BFC
+:1067F000D504840CD502840D4413F00E8440AC887B
+:10680000FC804403F3228421AE40DD9E4413F32335
+:10681000AE08DD9E4403F323A600DD9EFC00446326
+:10682000F540B6064403F544B6204403F548B640A7
+:106830004403F54CB6604403F550B6804403F55468
+:10684000B6A0F1044403F558B620F1054403F55C05
+:10685000B620FC80FC004413F5024403F5043C0F11
+:10686000FB3E3C1FFB3FA48858210040AC88A4405D
+:1068700058108040AC4084008020804080604900F7
+:106880000C97FC80FC004413F5023C1FFB3F4413B3
+:10689000F5043C1FFB3E4413F5103C1FFB41441321
+:1068A000F5113C1FFB3A4413F5123C1FFB3B44130C
+:1068B000F51380C03C1FFB3C5A08027C4403F522C0
+:1068C0008420AE404403F523842FAE404413F344A8
+:1068D0008403AE084413F5008441AE884413F501E7
+:1068E000AE08840080208040806049000C613C2D0F
+:1068F000FB3F441FFFBFA41058000022FE0EAC1047
+:106900003C0DFB3EA480FE56AC40840080208040BD
+:10691000806049000C4D44000D02490006023C1DF8
+:10692000FB3EA40858000022AC0884008020804070
+:10693000806049000C3D44001F38490005F23C0DC1
+:10694000FB3BA64058108001AE4084008020804070
+:10695000806049000C2D440007CE490005E23C0D43
+:10696000FB41A64058108001AE408400802080404A
+:10697000806049000C1D3C1DFB3FA408580000042A
+:10698000AC083C0DFB3EA48058210004AC80A488D8
+:1069900058210008AC88A44058108008AC408400FE
+:1069A00080208040806049000C0344001A04D567B1
+:1069B000C8694413F522844FAE084413F52384615B
+:1069C000AE884423F3448423AE504423F500AED074
+:1069D0004423F5018060AE508020804049000BE8E0
+:1069E0003C5DFB3F440FFEFF8046A4688066FE4688
+:1069F000AC683C4DFB3EA460FE0EAC20A468440F86
+:106A0000FFEFFE46AC68A460FE0EAC20A4288026F2
+:106A100058000002AC28A42058000002AC20A42892
+:106A200058000020AC28A42058000020AC20A42846
+:106A300058000004AC28A42058000004AC20A4286E
+:106A400058000008AC28A42058000008AC2080069C
+:106A500049000BAE3C1DFB413C0DFB3BA688582179
+:106A60000001AE88A64058108001AE40840080200E
+:106A70008040806049000B9C4400027F4900055122
+:106A8000D57E5A08017D4403F5228420AE4044039C
+:106A9000F523842AAE404403F3448422AE403C2DC7
+:106AA000FB41841EA650FE46AE503C1DFB3BA68813
+:106AB000FE16AE08840080208040806049000B787C
+:106AC0003C1DFB3FA40858000100AC083C0DFB3EF8
+:106AD000A48058210100AC80A48858210010AC8803
+:106AE000A48058210010AC80A4C8845DFED6ACC838
+:106AF000A4C0FE9EAC80A4C8442FFFDFFED6ACC865
+:106B0000A4C0FE9EAC80A4C8845BFED6ACC8A4C062
+:106B1000FE9EAC80A4C88457FED6ACC8A440FE8EAE
+:106B2000AC80840080208040806049000B413C0D97
+:106B3000FB83A6415A180E17A6005A0805143C1DDF
+:106B4000FB41A60858000003AE083C1DFB3BA6080D
+:106B500058000003AE088400802080408060490017
+:106B60000B274413F5008400AE084413F501AE086A
+:106B7000840080208040806049000B1AFC80FC006B
+:106B80004433F5104423F51280203C3FFB413C2F59
+:106B9000FB3BC80CA71858420001AF18A6D05831CB
+:106BA0008001AED080408060D50E5A08010FA658F3
+:106BB000841EFE46AE58A650FE0EAE108400802005
+:106BC0008040806049000AF4FC8046108000641315
+:106BD000240364230402461F7FFF50108FFFFE56DC
+:106BE00040006C08FE0F64030403DD9E461008009D
+:106BF0006413240364230402461FF7FF50108FFF21
+:106C0000FE5640005C08FE0F64030403DD9E441141
+:106C100000006413240364230402441EFFFFFE5695
+:106C200040004008FE0F64030403DD9E4410800012
+:106C30006413240364230402441F7FFFFE564000B4
+:106C40003C08FE0F64030403DD9EFC003C1DFB3F7B
+:106C5000A40858000040AC083C1DFB3EA4085800A6
+:106C60000040AC08840080208040806049000AA079
+:106C7000FC80FC003C2DFB3F440FFFBFA450FE46B0
+:106C8000AC503C1DFB3EA488FE16AC08840080205E
+:106C90008040806049000A8CFC80FC2080C1441345
+:106CA000F04080E2A6C84423F00E5431801CFEC799
+:106CB000848096D8AD10AEC85A08020584246413A7
+:106CC00004034413F04A44200055AE885A080207D2
+:106CD000490000FCC8FE640304034413F0DA97B0D3
+:106CE000A608540000F0402380044403F0ED969081
+:106CF000AE88AF804403F04144100055AE404000E0
+:106D0000000940000009400000094000000940005F
+:106D10000009FCA0944D4423F042FE0F9600A6D03B
+:106D2000AE10DD9E96069404965FFE474403F04342
+:106D3000AE40DD9E4413F044AC08DD9E4413F046A3
+:106D4000AE08DD9E4433F2009601AC184403F20213
+:106D50009649AC404403F2049691AC80DD9E440316
+:106D6000F20A44200055A640541080FE58108001BD
+:106D7000AE404413F04AAE88A6409646C9FEDD9E5A
+:106D80004423F2069600AE104403F2079648AE4044
+:106D9000DD9E4403F20BA600DD9E4413F208AC080E
+:106DA000DD9E4423F20A9401A6509646FE4796487B
+:106DB000AE50DD9EE608E82544F06CC83807800038
+:106DC00040F03C004A003C00080E141A20262C32E9
+:106DD0004403F20CD5154403F20ED5124403F2100D
+:106DE000D50F4403F212D50C4403F214D509440321
+:106DF000F216D5064403F218D5034403F21AAE4046
+:106E0000DD9E9200E608E82544F06D183807800002
+:106E100040F03C004A003C00080E141A20262C3298
+:106E20004403F20DD5154403F20FD5124403F211B9
+:106E3000D50F4403F213D50C4403F215D5094403CE
+:106E4000F217D5064403F219D5034403F21BAE40F2
+:106E5000DD9E92003C0DFB20B40092039617DD9E50
+:106E60004403F0C4A600DD9E4413F0C49600AE08AF
+:106E7000DD9E4403F0C3A600DD9E4413F0C39600DC
+:106E8000AE08DD9E4433F0D44423F0D6A458A610B7
+:106E900040F0A00840F7800444021BFFE00FE80B1D
+:106EA000A418A65040002008FE0F44F21C424000E7
+:106EB0003C07DD9E8400DD9E44021C00DD9E4413E1
+:106EC000F0C69600AE08DD9E4403F0F4A600DD9EF9
+:106ED0004403F0F7A600DD9E4413F0F79600AE08D9
+:106EE000DD9E4403F0F6A600DD9E4413F0F6960006
+:106EF000AE08DD9E4423F0509617A650541080F83B
+:106F0000FE47AE50DD9E4423F0509617A6509404E1
+:106F10005410808FFE47AE50DD9E4413F050A608FB
+:106F200058000080AE08DD9E4413F050A608963746
+:106F3000AE08DD9E4413F051A60858000001AE08CB
+:106F4000DD9EFC00840749FFFFD74403F04C8420FA
+:106F5000AE40840749FFFFD94403F04E8421AE4080
+:106F6000FC80C80444120000D503441230003C1FCA
+:106F7000FB2CC80444120510D503441235103C1FE5
+:106F8000FB2BC804441206DCD503441236DC3C1F3C
+:106F9000FB24C80444020BF0D50344023BF03C0F31
+:106FA000FB23DD9E84003C0FFBA24403F18084217F
+:106FB000AE404413F04A44200055AE88A6405A1013
+:106FC00001FFDD9EC8283C53F6584443F1863C3D02
+:106FD000FB243C2DFB313C1DFB293C0DFB33AD60FC
+:106FE0004443F18E96D9ACE04433F1889691AC9845
+:106FF0004423F18A9649AC504413F18C9601AC08B5
+:107000002E2028874403F1842E102888AE80440364
+:10701000F185AE40DD9EFC404433F1824473F18142
+:107020003C3FFB323C7FFB27A740848140629002BB
+:10703000A758855E4052A802FF77AF58A741853D0B
+:10704000FF664062900CA7584052A402FF77AF58E9
+:10705000A742FF6695AAA758545280FBFF77AF5806
+:10706000A743FF6695ABA758545280F7FF77AF58F8
+:10707000A744FF6695ACA758545280EFFF77AF58EE
+:10708000A745FF6695ADA758545280DFFF77AF58EC
+:10709000A6069546A618962FFE2FAE18A610A6F89F
+:1070A000FE264031A80240A1800410A38000A61152
+:1070B000FF069421544500FF40422402FF07AF38E9
+:1070C0000020800E4403F183AE80A4894403F19034
+:1070D000AC80A48A4403F192AC80A68E4403F19460
+:1070E000AE80022080084403F196AC80A48E440355
+:1070F000F198AC80002080084403F19EAE8000200F
+:10710000800B4403F195AE800020800A4403F19F78
+:10711000AE80002080124403F1A0AE800210800AED
+:107120004403F1A2AC40FCC04413F19AA448AC4023
+:107130004413F19CA448AC414413F1A4A448AC42CC
+:107140004413F1A6A448AC434413F1A8A448AC44AA
+:107150004413F1AAA448AC454413F00AA648965734
+:107160001010000CDD9E4403F00AA6009606DD9E7A
+:107170003C0DFFC5A600DD9EFC00A6488E24E6223D
+:10718000E813C80444120000D503441230003C1F29
+:10719000FB1DC80444123000D503441200003C1FFC
+:1071A000FB1BC016D512C80444123000D50344128C
+:1071B00000003C1FFB1DC80444120000D50344120C
+:1071C00030003C1FFB1BC80444020000D5034402EE
+:1071D00030003C0FFB21FC8084003C0FFB964403F5
+:1071E000F1C08421AE40DD9EFC005A0002055A0029
+:1071F0000318C82E2E2028874403F1C22E10288899
+:10720000AE804403F1C34423F1C4AE403C1DFB1BDC
+:107210003C33F63A3C0DFB219649ACD0D5122E20DA
+:1072200028874403F1C22E102888AE804403F1C39E
+:107230004423F1C4AE403C13F6363C0DFB21AC5068
+:107240004423F1C69601AC504413F1C8AC08FC804D
+:10725000FC202E10042980E03C6DF9F7C102840364
+:1072600049FFFFC43C1DF9F75A100F16C7035A789F
+:10727000020380C14403F1C197B0AF8049FFFFAE64
+:107280004403F04A44100055AE404413F1C0A60830
+:107290005A0001FFFCA0C0045A000209DD9E3C0D0B
+:1072A000FFC5A6003C0FF9F7DD9E3C1FF9F7DD9EF8
+:1072B000FC4380E0840080C181222E102A0C4422ED
+:1072C000B8008060E201E80699028C011032018C5E
+:1072D000D5FAA03C8029FA4E503F801749FFC932A9
+:1072E000000F80178420F0813C4DFB53841F80A148
+:1072F000F201E2A2E8260434800194A93831950114
+:10730000DB1E04A4800404348002884A008100014A
+:1073100038319501E702E91300A200028F42E10A29
+:10732000E80E00A10000E742E90AA6A38E42E1426E
+:10733000E806E2234011BC1B4002BC1B8CA1D5D93E
+:107340005A07FF1B50348018B443944238A10202FC
+:10735000A09938510202A09A38310202C375002266
+:1073600000320002003342250824FE2C41E10FD7F1
+:1073700040300C77D56A846083C380438143D50F46
+:107380004E220090000200324205002440A009571E
+:10739000000200334204002440200857A6305A005F
+:1073A000010B2E07EBE8C004F0015A000105441060
+:1073B000003CD502FA38400F28019A9AFE04420197
+:1073C0000873FE4CE22081403C0FFB8A0013003022
+:1073D000E819F001E603E810C90F2E00043CC80CC0
+:1073E0002E07EBE75A080109442000783E17EBE12D
+:1073F0003E27FF18AE30A6305A080113440000782B
+:10740000D50B2E07EBE8C00C2E07EBE1C0092E07C9
+:10741000FF18C0058E013E07FF18D502AE30C1032C
+:107420008400AE30A6305A0801405CF500C92E0732
+:10743000EBC1E905E605E8388C01D503C0358E01BE
+:107440003E07EBC1D53183C3040480058440882006
+:107450008102A60BA74AF0828142F002E205E9917F
+:1074600000908001A608149F8003049F8003E320FE
+:10747000E9160092000281E042F2A473409784086A
+:1074800004F38004892F0294800040948011E53E2B
+:10749000E904894089058C418C01D5E88CA1D5DEB1
+:1074A000814248FFFF7DFCC33C1DFFC9A004A44CE2
+:1074B000E201E90684003E0004258402DD9E84008A
+:1074C000DD9EFC0044027D848420442FFFAAAE810F
+:1074D000AE40AE423E27E7E4840084413E17FF53AE
+:1074E0003C0FFFD23C0FFFD13E07FF523C0BFFA6E3
+:1074F0003C2FF9F83E17FF513C0BFFA73E07FF5406
+:107500003E07FF2F3E07FF2E3E07FF2D3E07FF5091
+:107510003E07FF2CFC803C0DFFC9A404DD9EEFF864
+:10752000F081F0018E01F081F001C002D5FBEC0882
+:10753000DD9EFC0046F7FFFF50F78FFF5A18022C24
+:10754000806084A0B4435A280221808084C0D61869
+:10755000B4445A28021622118004222200049A8A76
+:107560004E240003FE922211800522F200058A2F8C
+:107570004E140003FE4AFE4C4211087381E18CC197
+:10758000504201085A680AE58CA1503181085A58C6
+:107590000ADBD50484003E0004362E000436C80AF7
+:1075A0004401DE83E00F8401E80284003E000436DB
+:1075B000FC8044031703D5F7FC02F382F483B63F43
+:1075C000F28149FFFD01B41FF101F20249FFFD25DF
+:1075D00049FFFCEAF00349FFFDA9FC82FC40F609E3
+:1075E000227F80164E0300840093000C1092800EC0
+:1075F0000293000112928001029300021292800213
+:107600000093000110928006A4D82EF7EC011232EC
+:107610008008A4F5ACEEA4F3ACEC00330009103202
+:10762000800B003300081032800AE90C2E37EBED96
+:10763000C3068E613E37EBEDA4F5D502FA78ACEEC9
+:10764000D506A4F5ACEE846A3E37EBED84605CF7BA
+:1076500080063E37EBA7E8064430003C3E37EBA8F7
+:10766000D50AFA7D3E37EBA884613E37EBA7FA7D59
+:10767000123280082E300434C3038460AEEEF30867
+:1076800022918004FEFAE123E802ADE92E37EBE512
+:107690005A380105A4F7123280082E37EBFD5A380C
+:1076A0000316A5B72E37EB6BFEF42E600CC64031E7
+:1076B0009876979940330409E2C340333C1A12325A
+:1076C00080088E6596D9ACEAACE92E3004255A388C
+:1076D0000106F30CA4DA123280082E300365CB05C4
+:1076E0002E37EBF85A3801048460AEEEA6C85A383B
+:1076F00002088461AEE4C8068403AE08D5038400A2
+:10770000AE240011002284005A1801071001002243
+:10771000AE62AE63D503AE22AE23FCC02E00291F9D
+:107720005A0801272E100434C9243C1014AB3C2005
+:1077300005A4E222E9053C20064CE222E81A842056
+:107740003C1805A43C18064C8400443216343C20F6
+:107750001456E202E80698838C01AE509601D5F8E3
+:107760002E00042B8C013E00042B8402DD9E84013C
+:10777000DD9EFC4084404430FFFFB641A8C9B4C040
+:1077800044429968447005103832081184A0982A40
+:107790008806029000002E0029404001800C8809D4
+:1077A000B5219603E320E802B60104908001E209C6
+:1077B000E802A80950528024DFEB8C425A2824E6C4
+:1077C000FCC0FC413C5DFFDCA72AB69F4440010899
+:1077D0004201907305C00000504E7FFFE682E85AD8
+:1077E00004400009A04D95228881A662A7A00092BE
+:1077F0000001A7E3C1038E219648A72B8E81E0E408
+:10780000E8038CE197F8C6038EC197B0B49F8E81D0
+:10781000E124E80550448001549200FF848083C431
+:10782000855FE2E1E91AB4BFFF4CF58180A6E3254C
+:10783000E911048F8001890538812111E510E907DC
+:10784000E30A888840A43C1B51EF00018CA1976893
+:10785000D5EF8C219648D5E6441001F44245787561
+:10786000FF0C0210002C442294F0404204975BC8A5
+:10787000010538410E0AD50C38110E0284A5FE6CA4
+:1078800084A3421214734010940D38110E0A124052
+:10789000000FFCC12E17FF7584003E07FF74C1085E
+:1078A00084213E17EBD83E10035C3E07FF75840031
+:1078B000DD9E3E07FF7584003E07FF748400DD9E59
+:1078C00084003E00035DDD9E841F3C0FFA3284007D
+:1078D0003E07FF753E07FF74DD9EFC438100840078
+:1078E00081413C0FFB7884C0F6813C0DFB54A6031C
+:1078F000E0C0E871E4C48400E9029E33F0829C3366
+:1079000084E0F0833C0DFB54A602E0E0E86244030F
+:10791000F04A44100055AE40490024D13C3DFB5490
+:10792000B4488027A61A42130073381105005A1074
+:10793000FF4F04440001381205114E150049E4E4DC
+:1079400087C0E90351E3FFFDA65BF5038E21E02527
+:107950004012BC1A8E01F1849C7BE0014000BC1AED
+:10796000F085F102F004E001E932801EF505E0A0A7
+:10797000E92C0091800281E042F0A4734057840812
+:1079800038F13D005AF0FF2038F23D114EF4001C52
+:1079900004F5000488AF3CF00488A568976BE0AF5D
+:1079A000E91280A7425324733851150044FF800028
+:1079B000956988A4029280004094BC0412928000D1
+:1079C00084A1F5818C01D5D38C21D5CD8CE1D59BBB
+:1079D0008CC1D58CF001C888FCC3FC40A612C00342
+:1079E0008E01AE123C9DFB54A753000480038E0110
+:1079F000D0038CA1AF53A610C0038E01AE100004BB
+:107A00008002A7518E01D0038CA1AF512E07EBEA63
+:107A1000E602E90D3C3005A8926196DBE479E907BE
+:107A20005EF18097E90544300096D502FA6984003A
+:107A3000A79000A1000180A0E346E926A7D200811B
+:107A40000003E307E91F0044800281E642F39073DC
+:107A5000808F04F080059521888F02F2000040F7A6
+:107A60008011E06FE80D02F2000040F78011880FEE
+:107A700002F2000040F78011E0AFE802A5608CE15F
+:107A8000D5E18CC1D5DAC506441001F4FE0C4000E6
+:107A90001417FCC0FC4C847F3C3FFA323C3DFB5544
+:107AA000A71B5CF20042E90444400041AF1BA71849
+:107AB0005CF20042E90444400041AF182E50040635
+:107AC000444003E85A5001062E50035D5A580107FE
+:107AD000A75CA7DD42929024D505A75BA7D8429268
+:107AE00090242E300404FFE4A7105A38010C2E37DE
+:107AF000EBC1C310E683E80E846342948C24FFDC60
+:107B0000D509CB082E37EBB5E66BE9044094840821
+:107B100095F9CC048420480000C284603C8DFA3280
+:107B200080A3E0A4E80FA18138631501DE09A182DA
+:107B300038631501E2664082BC1B40333C1B8CA1BC
+:107B4000D5F18142A085F18140140808882280C0C7
+:107B50008444B0033C8FFA32490032888006F10138
+:107B6000B08349FFFF3CE2E0E81B84013E07FF745D
+:107B70003E00035D49FFF55C5A08020A44000078A4
+:107B80003C0801AF3C0DFB55A601D505FA083C08A1
+:107B900001AF840C3E07FF75842148000080E3207C
+:107BA000E8BA442F80008420B0C4402408040005B3
+:107BB0000000E020E80CA13194098804A540385168
+:107BC00085094C544003AC808C21D5F28006F1012C
+:107BD00049FFFE853C9DFA32048300054014880865
+:107BE0008828B00384444900324100350000500425
+:107BF00000038420E023E82EA0B13851050196ABA4
+:107C00004E2400265452FFFF4C548022D9200020DD
+:107C10007FFD004F800CE282E903102F800C0020D2
+:107C20007FFE004F800DE244E903102F800D0020FD
+:107C30007FFF004F800EE282E903102F800EA680A6
+:107C4000004F800FE244E903102F800F8C218C0439
+:107C5000D5D28006F101B08349FFFEC1E2E0E81011
+:107C60003C1DFB5584013E07FF74A6493E00035DA1
+:107C7000440000783E17FF753C0801AFD58E8400A4
+:107C8000B08400150000E0014EF2FF46A0713831CB
+:107C90000101383081098C01D5F52E07FF75C00D23
+:107CA0005A1801053E17FF74D5088E0196003E074D
+:107CB000FF75C8033E07FF743C0001AFC009C90847
+:107CC0008E0196013C0801AFC8033E10035D2E07EC
+:107CD000FF74FCCC2E57EB7A2E07EB793BFFFCBCF4
+:107CE0008C01EFFCD0294403F04A44100055AE400B
+:107CF0002E07EB792E17EB792E27EB79443277009C
+:107D00009404949488038843944CA002381184020C
+:107D1000A49249002371440002EE49FFFC022E07A1
+:107D2000EB798C0196003E07EB7A2E07EB7B8C01FA
+:107D300096003E07EB7B49FFF89EC00784013C0F8D
+:107D4000FBAF840049FFF89B49FFF88CC00AEC04A4
+:107D500084013C0FFB9A3BFFFC84840048FFF886BB
+:107D6000EC043BFFFC84DD9E84003E07EB7948FF7A
+:107D7000FFB33BFFFCBCEFFC49FFF45A5A0002067C
+:107D800084033E07EB79D50484043E07EB79EC04C9
+:107D90003BFFFC8448FFFFA03A6FAABCEFFC8120A8
+:107DA0008001490003AD83808403400480375490F0
+:107DB00000FF4402953C548080FF381070005074DE
+:107DC000800C97F85A10FF1E442295183C03F615B4
+:107DD0003811040049FFDFC73C13F614442000604B
+:107DE00042100873800144120000FE0F84CA38005C
+:107DF0002602426418244060180D546303FFD50323
+:107E0000446003FF44029524381070005A10FF1E8E
+:107E1000442295303C03F6153811040049FFDFA3D6
+:107E20003C13F61444200060421008738001441291
+:107E30000000FE0F842A38001E024214042440A0D1
+:107E4000040D54A503FFD50344A003FF803C3C0D63
+:107E5000FB2D49FFDF88838049FFDF8044100060ED
+:107E6000420E047344120000FE0F4613FFFF502021
+:107E7000006080A050108FFFAA69DAFF846A423444
+:107E80000C24442003FF40210C0CFE5340A50C0C95
+:107E900040630C0CEC04FF8F401504043860260A84
+:107EA00038101E0A3A6FAA84DD9E3A6FA8BC3C6D5A
+:107EB000FB2D449200004063240484E00403000C82
+:107EC00044A0003C940792071403000C0413000C18
+:107ED000460FE03F50000FFFFE0E1403000C9638D3
+:107EE0004900030E021300128CE188294210287306
+:107EF000A08B8001441FF03FFE56A8435A7809F139
+:107F00003A6FA884DD9E84003E07EB7FDD9E3A6FCA
+:107F10009ABCEFFC2E17EB92E623E9633C3DFB2D68
+:107F20004412000002218012FE573C1FFB2AB4417C
+:107F3000924796865A280105B4219677D504B42332
+:107F400092239677442FFE00FE54964984A0444025
+:107F50000510B46088658CA2A49888419691AC986D
+:107F6000DCF949000FE884003E07EB8E3E07EB8406
+:107F70003E07EB7C3E07EB873E07EB8B840049FF17
+:107F8000F6264413F04A442000553C0DFB92A6000F
+:107F9000C803AE88D5FB8421804180614400FBA0EA
+:107FA00049FFF2EB84418062441000AF44001CA002
+:107FB00049FFF2E384418062FA284400D9B049FFC6
+:107FC000F2DC490013132E07EBF984812E17EBEF37
+:107FD00044527D6C2E27EBB32E37EBD549FFDCD115
+:107FE0008401EC043A6F9A84DD9E5A08040F3BFF2B
+:107FF000FCBCEFFC49000F9F3C0DFB778421EC0497
+:10800000AE403BFFFC84DD9E3C0DFB778421AE40FF
+:10801000DD9E3C1DFB2D463FFC7F464003000220B9
+:10802000801544120000FE574650FFF0844C3A6F12
+:108030009C3C4210087350318FC78440504200303E
+:1080400050528FFF466A000AB4015A200206FE2EE3
+:10805000FE37AA09D504FE1EFE27B6018C41969074
+:108060005A2803F43A6F9C04DD9E3A6F98BC80C195
+:108070002E17EB7CC91C5A00FF063E07EB7949FF1F
+:10808000FE2B5A68011549000090C80944023000CF
+:10809000441200003A6F988448FFF14844020000FF
+:1080A000441230003A6F988448FFF1403A6F988448
+:1080B000DD9E4423F5104413F5125A080106840589
+:1080C000AE10AE08DD9E3A6F98BC840084C0AF90BD
+:1080D0008060AF88804080204900006A3E67EB8561
+:1080E0003A6F9884DD9EFC0049FFF2FCFC8044035B
+:1080F000F04A44100055AE40DD9EFC0049FFF835C3
+:10810000FC80FC03F0818005F384F485F283F18226
+:1081100049FFF289F002F10349FFF5FE4403F04AFA
+:1081200044100055AE40F001F104F20549FFF5B7E7
+:10813000440001F449FFF9F5FC83FC2084C080E091
+:10814000E2C7E80C8401844080208062808080A2A5
+:108150008CC149FFFFD897B0D5F4FCA0FC0049FFC3
+:10816000F6ADFC80FC0049FFF68FFC80FC0049FF67
+:10817000F673FC80FC0049FFF24CFC80FC0044627A
+:10818000B8000003000B49FFF2444400003249FFED
+:10819000F9C80003000B5200000149FFF23A8400C5
+:1081A0003E07EB5CFC803C0DFB40DD9EFC0049FF84
+:1081B000F12849FFF1084403F04A44100055AE404D
+:1081C0004413F380A6085A0001FF84003C0FFB789B
+:1081D0004463F380840049FFF1265A08011149FFE6
+:1081E000F12B49FFF0F04403F04A44100055AE4033
+:1081F00049002065A6305A0001FFD5ED840149FFF2
+:10820000F1125A0001EEFC80FC0049FFF846FC80A8
+:1082100044026200DD9EC80444220000D5034422CB
+:108220003000B641C80444220510D503442235105D
+:10823000A889C804442206DCD503442236DCA88C75
+:10824000C804442236DCD503442206DCA88DC804C9
+:1082500044220BF0D50344223BF0A88EC8044422EC
+:108260003BF0D50344220BF0A88F44220BFCA88AD4
+:1082700044223BFCA88B2E2029145A28010AC8044A
+:1082800044020520D503440235203C0FFB8B4402F9
+:108290002550140080104402620014008011DD9EFD
+:1082A0005A180A0544123D44D5055A180B064412C3
+:1082B0004BE014100009DD9EFC015A0801153C0C2E
+:1082C0000A3B3C1C0A36B61F3C0C0A3C3C2C0A37C5
+:1082D000F0813C3C0A383C0C0A353C4C0A393C5C89
+:1082E0000A3AD5133C0C0A333C1C0A2EB61F3C0C30
+:1082F0000A343C2C0A2FF0813C3C0A303C0C0A2DFD
+:108300003C4C0A313C5C0A3249FFF28A84008020EE
+:108310008040806049FFF07549FFF055FC81FC20EA
+:10832000842CAE4184C084013C6FFBA64470005590
+:1083300049FFF1473C6FFB784463F04A3C0DFBA6D4
+:10834000C00C8420846184028041808380A33C1F10
+:10835000FBA649FFFED8FCA049FFF25E5A0801F3D4
+:10836000AFF049001FACD5EB3C0DFB4052000001C3
+:108370003C0FFB40DD9EFC01B61F3C0DFB83F181F1
+:10838000A6015A00060449FFFFF1B43F3C0DFB4033
+:1083900049FFFF433C0DFB4049FFF5E53C0DFB4029
+:1083A000F10149FFF6EBFC81FC0049FFF22C84014E
+:1083B00049FFF22EFC804423F0759606A650541017
+:1083C00080FEFE0FAE10DD9EA4408C2196495CF02D
+:1083D0008190AC40E90AFC00840049FFDB62440064
+:1083E000006949FFF56EFC80DD9EFC00A740D90CBA
+:1083F0008CA19768E6A5E90284A0AF40440FFFAACC
+:108400003E07EBCED512441218BCA6088C0196008C
+:10841000AE08840049FFDB454403F4038420AE40EA
+:108420004400005549FFF54D440218BCA600C004A5
+:1084300084013E00042DFC80A6885A28AA0AFC006C
+:10844000A680AE888420AE4049FFF570FC80DD9E9A
+:10845000FC003C0DFB865A08042749FFF52F3C0F12
+:10846000FFDF49FFF0E55A0002162E0029135A08D3
+:10847000011284003E0003643E07EBAF84003C0B16
+:10848000F62D44127B5C44027B5549FFFFD78403E1
+:10849000D505FA003C0FFB86840584203C2DFB8328
+:1084A00049FFE928FC80A6885A20AA10FC00AE806B
+:1084B000442FFFAAAE88A6005A08010549FFF52FF0
+:1084C000D50349FFF533FC80DD9E8440AE808400F7
+:1084D000AC08DD9EFC008420840149FFF4254400A3
+:1084E0000CD549FFF429FC80FC005A08010549FF1E
+:1084F000F3AED50349FFF3BFFC800000E60DE83280
+:108500003C1DFB2D44F084143807800040F03C00F3
+:108510004A003C000E12161A1E22262A30363C4211
+:108520004800A009D51DA009D50CA009D50DA009AA
+:10853000D50EA009D50FA009D510A00AD511A00A03
+:108540009205D50EA00A920AD50BA00A920FD50863
+:10855000A00A9214D505A00A9219D502A00B96275D
+:10856000DD9E8400DD9E9200FC004403F5608420C3
+:10857000AE404403F5618423AE40840080208040F7
+:10858000806049FFFE15FC80FC004423F04A443023
+:108590000055AED04433F380A6985A2001FFC95F3E
+:1085A000A6018E01E60E4EF2009944F084B8380719
+:1085B000810140F03C00DD0F1C0020012000700014
+:1085C00020007000700034003400780078007000E3
+:1085D00020008C008402D52A2E000CB8C830441329
+:1085E000F516AE084413F517AE08D5292E000CB8C1
+:1085F000C8084413F5168401AE084413F517AE08F5
+:10860000840149FFF00B8440840180A084228062B1
+:10861000808249FFFD78840149FFF392840149FF7C
+:10862000FECC840049FFFE4A840049FFF12DD55558
+:10863000840149FFFEC2840049FFFE40840049FFD7
+:10864000F2A0D54B8440840180A084228062808285
+:1086500049FFFD59840149FFF373D5E75A180136E4
+:10866000A6018E03E60CE83944F0857838078000CF
+:1086700040F03C004A003C00240C240C0C10101E5E
+:108680001E6024288401D5D2840149FFFE1784018D
+:1086900049FFF0FAD510840149FFFE108401D5D0BE
+:1086A000840149FFFE0B49FFFF61840149FFF0ECA3
+:1086B00049FFF2CD840049FFFE80840049FFF3406A
+:1086C000840049FFEFABD5095A180208840149FF1D
+:1086D000F0DB840049FFF334FC809200FC002E079D
+:1086E000EBF95A08012E49FFEFA3C82A3C0DFB9273
+:1086F000A6405A1801FFA6005A0801233C0DFB773B
+:10870000A78097B05A68011D3C0DFB838429AE41B8
+:10871000842049FFFF3B3C0DFB83842AAE413C0D86
+:10872000FB4044127D6C49FFDA8D3C1DFB928400B6
+:10873000AE083C1DFB77AE08800649FFD9B2FC802D
+:10874000FC004403F5608423AE404403F5618420BB
+:10875000AE40840080208040806049FFFD29FC807D
+:108760004402978C8420AE4084213E17EDCA8420B9
+:10877000AC431210000812100011DD9EFC20840191
+:1087800049FFD98F84003C0FFB784463F04A447062
+:10879000005549FFD979C8183C0DFBB5C815AFF095
+:1087A00049001D8D2E07EBCD5A08010644027BE8D7
+:1087B00049FFFE0C8440840180208062808280A278
+:1087C00049FFFCA1D5E7FCA0FC403C0DFB83A601C2
+:1087D0005A08042E3C0DFB865A080A0A2E07EBE0C5
+:1087E0005A00014084013E07EBE0D50A5A080B0904
+:1087F0002E07EBCF5A00013684013E07EBCF2E0740
+:10880000EBE05A08010D2E07EBCF5A08010984004E
+:108810003C0BF6213E07EBE03E07EBCF3C4DFB6106
+:108820003C5C02583C6C02598440D50584003C0BEA
+:10883000F621D5F5A6239401E040E813945199E977
+:108840008826A4F8A438A448409008094001840967
+:1088500088099222880196018C41AC389690D5EB1C
+:10886000FCC0FC4084003C0BF6203C0BF6213E078C
+:10887000EBD83C0DFB83A6015A0804092E07EB9D9B
+:10888000C8038403D5045A08030584043E07EB9DFE
+:108890002E07EB9D5A08020584003E07EB998400E1
+:1088A0003C2DFB613C3C02593C4C02573C5C02585D
+:1088B000446001F4447299148120A6539449E00164
+:1088C000E81D944140A204004081840002A50000FC
+:1088D000882540A5001312A400002EF00406E90824
+:1088E00002A4000040A5001312A08000D502AD88AC
+:1088F000389380088C019600D5E1FCC08400848CFC
+:108900009640E628E8049850A649D5085A18080564
+:1089100010418008D50538110000381180088C01FD
+:108920005A0820F0DD9EFC005A0801132E07EBB315
+:10893000C8112E000CA8E605E9075A0005058E02AD
+:108940009600D5028404802049FFEE80D50349FFBC
+:10895000EE89FC802E17EBB33C0DFB51C903A60238
+:10896000D502A6032E17EBA05A180206E604E90367
+:108970008E039600DD9E3C0DFB5100000016DD9E2F
+:108980005A0804053C03FFC1DD9E3C0DFB5102006B
+:108990000009DD9E5A0804053C03FFC0DD9E3C0D26
+:1089A000FB510200000ADD9E3C0DFB51A400DD9E40
+:1089B000A400920196065A000107A60892019606A5
+:1089C0005A080108440000643C0BFFC18402D5082A
+:1089D0003C0DFB51A447020000083C1BFFC13C0BAF
+:1089E000FFC0DD9EFC402E17EB9E5A18020B2E177F
+:1089F000EB9CC9072E17EB9D8E225C108001D502DF
+:108A000084203C2DFB613C9C025984A0A6D384C1E8
+:108A100095198E819FD944A2954852800000E0A408
+:108A2000E81BD71740F284084024BC0050F78002AE
+:108A300040F4BC00A49002F780008A4F9693E002B5
+:108A400038251509E903E048E8045A18010384C2EF
+:108A50008CA19768D5E55A18012D920144229548BA
+:108A600084208122FF02E027E81638510511E00535
+:108A7000E80740A08C0038F12911E00FE908E0A4D4
+:108A8000E807994B38549511E0A4E80284C28C2180
+:108A90009648D5EA5A68010E84E084003E67EB9C54
+:108AA0003E7004063E67EBD849FFF7053E70035D54
+:108AB0008006FCC0FC42B61F4400FFFFA80B3C0D23
+:108AC000FB51850014808002A604E610E8055220C0
+:108AD0000010548100FFE6118060E902FA6084C052
+:108AE00096D88006812644423D4444A299143C5DB8
+:108AF000FB61A76B9569E1253C5DFB834EF200AA03
+:108B0000A6A940748408540100FD3C5C02595A082F
+:108B100004203C0DFB865A080A0944024BE099BC2C
+:108B200038001C01A5B0D5095A080B0A983C4462CC
+:108B30004BE0A40038631C019B8697B35A280604B7
+:108B4000FFB297B398AFA4108A069601AC103C2CE4
+:108B5000025788A78847A428A490420020244201F5
+:108B60000C7392049601AC283C0C02593C5C025AEE
+:108B7000880788A7A4803C0C02588807A4009A1094
+:108B80009603AC283C0DFB51A568A405976BFE022B
+:108B9000E0A0E8312E07EB9C5A0001062E07EB9D62
+:108BA0005A08022A2E000406C81C380524003C5D21
+:108BB000FB518C01960038052408A56EE2A0E8213F
+:108BC0003C5C02593C0C025888A78807A568976945
+:108BD000AD4084003805240884013E07EB99D51187
+:108BE000F483F182F38149FFED23F301F102F403F1
+:108BF0005A0802DD38052400C0048E013805240817
+:108C00003C0C0259A14A8807A480E2A2E803A540CF
+:108C1000A94AA480A14BE245E803A400A80BB41F15
+:108C2000A7413C0DFB515A580904A403D502A404E2
+:108C30003C5C025A88E5A578976BE005E80484A1BE
+:108C40003E57EBD850548001549280FF48FFFF51AB
+:108C5000A6695A18090649FFFEC73E07EB9EFCC2EB
+:108C6000FC408121A64180C05074FFFC5A18043397
+:108C7000840149FFEFCE840149FFEFDA840149FF07
+:108C8000EFB7E6E4E9305A900C2F2E07EB9D5A001F
+:108C9000042B2E07EB915A0001272E07EBB35A083D
+:108CA000010449FFE4568006842049FFFC6F8401DB
+:108CB00049FFD6F784003C0FFB784493F04A44A068
+:108CC000005549FFD6E1C80F10A4800049001AF7EB
+:108CD000D5F92E17EB9D5A100407842049FFFC5646
+:108CE00049FFFD4E3C03F62144129C048C013C0BD1
+:108CF000F6213C03F6208C013C0BF620800649FF50
+:108D0000FEDB2E0004065A08012249FFEC915A08A6
+:108D1000021E4900192784C081203E07EBD83C6B16
+:108D2000F6215A08010B840049FFF5C53E60035D3A
+:108D30003E90035C3E6004062E07EBAD5A08010727
+:108D40003C03F6208C143C0BF6202E07EBD85A0877
+:108D5000010684003E07EBDAD5132E67EB9C5A68B8
+:108D6000011044029C043C1014B444227B6249006C
+:108D7000054F5A0802063E67EBD83E67EC0E440FDB
+:108D8000FFAAE6E23E07EBCEE80B490008D48400D8
+:108D90003E07EBD884003C0BF6203C0BF6212E0757
+:108DA000EBBB5A0801043E07EBD8FCC0FC20840052
+:108DB0003C0FFB784463F04A447000553C0DFBB512
+:108DC000C815AFF049001A7B2E07EBCD5A080106F3
+:108DD00044027BE849FFFAFA8401844080208062E3
+:108DE000808080A249FFF98FD5EA3C0DFB8384295E
+:108DF000AE41842149FFFBCA3C0DFB83842AAE416E
+:108E00002E27EE20CA09840284298461848380A2EB
+:108E100049FFF979D504840E49FFF991FCA0FC00C3
+:108E2000840084203E07FF943E07FF913E07FF9099
+:108E30003C1BFFC73C1BFFC63E17FF933E07FF923C
+:108E40004410004084003E17E8CD3E17E8CC3C0FAC
+:108E5000FFE8FC80A601C819E622E9043C0004886A
+:108E6000D512E664E90E8E638405FEC4E470E9045D
+:108E700044000055D508503180463C381639DD9EF7
+:108E8000440000463C081639DD9EFC418501B61FB2
+:108E900080818120838185404004A001E320405EE1
+:108EA00028014C5780234074A000E2E9400E2800BE
+:108EB0004067800040037C0892E1FFC792C18007B1
+:108EC000802680478066F48149002888F401E28189
+:108ED000E9094C124005B43FE220E90481078146CC
+:108EE000D5DC81278386D5D9E602E8DE8008802A92
+:108EF000FCC1A640922696465A180109A6809245C2
+:108F00009686CA043C1FFFE9DD9EA640922696463F
+:108F10005A180109A600920596065A08010484020F
+:108F2000D50284003C0FFFE9DD9EFC4DB61F840096
+:108F3000F084F08680E1FA01FA338142F185F0870E
+:108F40003C1C021EB0083C2C021F80C349FFEEFCF3
+:108F50008401802A49FFEF16440291DC4C60000D29
+:108F60004402915C4C60000E440290DC4C600011A5
+:108F7000508F8014D50FB003810051CF8018D505D4
+:108F8000B003810051CF801C44900055D507508F0D
+:108F90008010B003838044900032FA1D49FFEEFF39
+:108FA000549480FF848080048420F48149FFEF047E
+:108FB000F4018029800449FFEF27F4018C815A488D
+:108FC00008F48400F083FA82F003E20AE80EB4A801
+:108FD000B43CB45F4212907338110501B088381167
+:108FE00001098C01F083D5F1840049FFEEDC49FFD3
+:108FF000EEB8840149FFEED749FFEEB3840349FF81
+:10900000EED249FFEEAE49FFEEC6AE308400A67048
+:10901000E201E819A07938508101D013A07D948233
+:10902000956A98CA8825A6DAA70AE264E802AECA59
+:10903000A0FD884388A3A653A6ABE241E802AE6B2D
+:109040008C01D5E65035000184A0926150230025A3
+:109050008085D32FA630E2A0E828A039380015017A
+:109060004C02C02450F38014B50F942A89009875DF
+:1090700000940003008400028D218B28109080252D
+:10908000B52F89200094800210908037B52F880971
+:10909000A60310008049A03B381015015002802C17
+:1090A00094018806AC42D502AF108CA18C41D5D278
+:1090B0008CC184A0843F4C550010B40738001500C3
+:1090C0005A08FF04AE70D505A0B938010101AE30D1
+:1090D0008CA18CC1D5F1FCCDFC01FA54443291DC59
+:1090E000B61FF18149FFFF23B41FF101FA54443246
+:1090F000915C49FFFF1CB41FF101FA42443290DC3D
+:1091000049FFFF15B41FF101FA424432905C49FF58
+:10911000FF0EFC81FC4683C0F384F485C9074060E0
+:1091200088068401C20984FFD508C20484C3841F51
+:10913000D5FB84C2841F84E1FA62FED4F383886184
+:1091400094D9887EF386223180005EF1802E4EF322
+:1091500000E996D0F38796C8F388F407F30488648F
+:10916000A6D9F389F409F3048864F4082031802532
+:10917000F381F3058864A6D9F38AF40AF3058864B9
+:1091800020318025F38238329800C3048464383259
+:109190009808F301429388245EF18024E903F301E7
+:1091A0008E614243882489238C81FA7442A21C2454
+:1091B00043C38C248101FA6242850C73806894D980
+:1091C000850040AF0C008068E124E90938F52011E2
+:1091D0004EF70003886F8C81891CD5F7CB02846120
+:1091E000F40242A00424E492E903F4028E8189444B
+:1091F0004290042495018D21F48BF4034244807342
+:1092000095218780408F1000809CE149E90C38F45B
+:1092100070114EF70003888F04FF800B8D2141CE23
+:109220003C00D5F4CC0284818847FB4242A128242B
+:1092300040808000402520003CFDFFE939CF091126
+:10924000844AE91DF109FED45010802CF20494499F
+:10925000884140319076A512F203441000508848AE
+:109260004490005AFF0C429E242444100064404263
+:109270000496382F091140948536D51BFF14F20A45
+:1092800040320C765041002CF20595218844882A02
+:10929000A51244200050FF14382F05114410005A25
+:1092A00044900064421E0424404224964090A53617
+:1092B000F10622F08000E08FE840F101E423E804A9
+:1092C000F102E423E93AE122E838E4753832980003
+:1092D000E8035A380433F102F2088E214220047365
+:1092E0009652F201F4078E4142438873852496A278
+:1092F00038929808992ECB03AEA4D51020320004E2
+:1093000042F38824FFDCE0EFE802AEA4202200084C
+:1093100042F00424FE14E00FE81010120008D50DEE
+:109320005EF1802438029800E804C0078E01D5035E
+:10933000C004840438029808FCC6FC44F185F48615
+:10934000F587843FC802842143E08024424F0424EF
+:10935000B69F8A80952195C1F48484C0F406384272
+:1093600018005A48014FF4058886A7215A40FF3655
+:10937000B52338449C005A40FF3105C1800104A147
+:109380008005385E1101976FC805952A888AA72144
+:10939000D50338451600FF0CF481F404815E8887FC
+:1093A0008889F48385208080048F8001E10AE91692
+:1093B000B51F8909148F8002048F8003388425002B
+:1093C00038FE210154F7803F4CF2C0055A80FF035C
+:1093D000F4028D418921D5E98080205100244290FA
+:1093E0009024FF4CE125E809A750E6A3E9038EA1EC
+:1093F000AF50A750E6A3E811104100248484D50C97
+:10940000F4071001002438F21C115EF78024E805EF
+:10941000A710C4038E81AF108CC18C41507380247F
+:109420005A68249EFCC4FC42F281C505B1C1B183D7
+:10943000FAA2D504B1C3B181FAB4C00450A07FFF31
+:10944000D50281409EAAE241E8038EA1D5029D4942
+:1094500044200032FF1444200064F0834042089707
+:10946000852045C00012F203E222E91204F38000D5
+:10947000B5064287F07338F1A111E28FE9054C205F
+:1094800000054C2080038D2A8C41F283D5EDF083BA
+:1094900004F38000B446FB024227A07338218911EF
+:1094A0004E270004E282E80284404C008011F183E0
+:1094B00005C38000B50644F00012428E3C7338812B
+:1094C000A1114E870005E288E902884814AF8003A5
+:1094D0004CA0000DB507B406FB42420428733801C6
+:1094E0008111E408E9038E078840F583D10CB4A705
+:1094F000B406FA224202847338018111E408E903B8
+:109500008E078840842AFE8C400110178809FCC20F
+:109510004420010842008873842110100086A04274
+:10952000A845DD9EFC029703F182964B9A61F28179
+:1095300090104E140003FE4A023F80059741222FEF
+:1095400080039AEB9A8296DB84028843402100567E
+:109550005EF20200964B9613E805FE2440000416C6
+:10956000D50652420438FF044002041696039A2896
+:1095700097435EF289018005E903440009009643A0
+:109580004E14000384009603FC82FC403C5DFB2DDE
+:109590004460003C02428012424198734432000011
+:1095A000FF1F3C4FFB2AC96DA7240252801497204D
+:1095B000FEEF4450005842321473CA3780A2812211
+:1095C0008541956940801400892384A09728401222
+:1095D000040954720001944A8827386415014072C6
+:1095E0000C093864840897C64012100954630100BE
+:1095F0005073804C944A88E192C8971788E95A685A
+:1096000001074043100CA7B8FF37D5064045100CA2
+:10961000A678FF23FF0E8CA1AF385A5825D9852292
+:109620005A20014A8441D5CE804180C1949199C28B
+:1096300088C3844097504092900940428C094094DE
+:109640008808892697068889549280070042004C32
+:109650004042240E4092840940948808974688A985
+:1096600097063853140040422008888538438909FA
+:109670008C415A2825E184C25A10011E8421D5D775
+:10968000A6A60252801644100060FF5F4251047388
+:109690008C0298E9A269542083FF12207FFF4020AA
+:1096A000A8099234542103FF541083FFAC80AC41CD
+:1096B0008C06DBF1FCC0FC40EE88B0028420442024
+:1096C00000B0B1EE490024DC8420442000C08007B3
+:1096D000490024D63C0DFB40441298C449FFF59D37
+:1096E0002E0028A54490003C8C019600F08184C196
+:1096F00044A20000F001E2C0E853B002842084419B
+:10970000806649FFFF44842180078066804149FFCD
+:10971000FF3E3C0DFB2D3C5C0254023000128400E5
+:1097200088694031A8043C3FFB2A80808C819721C6
+:109730005A40253202218014021180154083800096
+:1097400039E3800196499691B63F02F400245BE329
+:10975000FF1054210FFF9041885EB042969141E086
+:1097600080009491884523EF002613E10000022435
+:1097700000245A23FF0FB43FB08254108FFF902172
+:10978000882F964988409449882522210001AC8879
+:109790008C02D5CD8CC197B05094803CD5ACED787F
+:1097A000FCC03C1DFB2AC80402008014D503020043
+:1097B00080159601DD9E3C5DFB2D3C1C01E7D10927
+:1097C000021280124420003C421008738001DD9E8A
+:1097D00002028012500002D0DD9E3C2DFB2D443051
+:1097E000003C0211001242100C7380014412000070
+:1097F000FE0F3C0FFB2AB420922796465A1801040C
+:10980000B400D503B40292039637DD9E2E3029288A
+:109810005A30010448000099FC4081003C0DFB8354
+:109820008122A6015A0009045A0804223C000401BE
+:109830003C6014B1E22040103C1B99CEE22697F91F
+:10984000E8049A719789D50284C0840C49FFFFC748
+:1098500004A400022FC029754015003740A08013D2
+:1098600004140003400080179601D54C3C0004000E
+:109870002E27EBFDE22040103C1BC2052E07FF08FF
+:109880005A0801053C6014B0D5033C6014B999CE68
+:10989000E22697F9E8048AC197B1D50284C02E0761
+:1098A000EBE7C81EC2052E17FF085A18010B3C60D3
+:1098B00014B0507300645CF3006597F9E90ED509A4
+:1098C0003C6014B9507300645CF3006597F9E907D4
+:1098D00050637F9C97B1D50484C0D50280C08401B9
+:1098E0002FC0297449FFFF7BB5484005001740A0F1
+:1098F0000013840149FFFF73041400014000801726
+:1099000096015CF384018027E90344100400964922
+:10991000E22AE805000480008C01D504E206E9FB98
+:109920008400100480000004800040FE00068401D2
+:10993000E80A8400100480002E00042C8C013E00F4
+:10994000042C8402FCC08401DD9E3C1C01E73C5DCC
+:10995000FB2DD1062E1028A68A019600DD9E840CD0
+:10996000DD9E2E100CAAE622E90440008006DD9E52
+:109970002E100CBA8440FE0D40010006DD9E3C2DE9
+:10998000FB2A0411000E92219646C102C00904115F
+:10999000000E9646C1078E015C000001DD9E840129
+:1099A000DD9E8001DD9E3C1DFB2AC804020080165E
+:1099B000D503020080179601DD9EFC00A6903C4076
+:1099C00014A1C2028441A882A082A00396863C5DB5
+:1099D000FB6496D99606CA12C833A6A88844884361
+:1099E000AC882E20287AE202E83CA6A8A189884407
+:1099F0008843382301098C01D5F5C012A62A84407A
+:109A000088048803AC082E00287AE240E82AA62AB7
+:109A1000A18988048803380309098C41D5F5A6A9D2
+:109A200088448843AC882E20287AE202E81AA6A946
+:109A3000A18988448843382301098C01D5F5A62BD8
+:109A400088048803AC0880022E20287AE202E80904
+:109A5000A6ABA18988448843382301098C01D5F538
+:109A6000FC80FC4680C181008400AC0812008009A3
+:109A700012008008AC0FAC0EAC0BAC0AAC09441061
+:109A800003E8AC7485204410FFFFAC358068B72232
+:109A9000A8511293000AA8553C1DFB231491000401
+:109AA000A85E3C1DFB2BA09DA8593C1DFB2E3E072C
+:109AB000EBE6A85BA05A3C3DFB623E07EC17B408FE
+:109AC0000031800CF482814949FFE456B73F149F6E
+:109AD000800104140005400484088801A5C02E07F5
+:109AE000EBFD97FB5A080306800749FFD58B80E002
+:109AF0008420808944207FFF80A180615002001271
+:109B000004F4000596019401880F2EF7EBFDA400E4
+:109B100096035AF8030EF387F486F285F184F583F1
+:109B200049FFD570F307F406F205F104F50350F28E
+:109B30007FFA5CF78006E920E0E24023BC1B9693A5
+:109B40005A30232440F380014EF4000452F7800081
+:109B500041E78013E4FFE9075CFF0010E8169DE988
+:109B60009779D5135EF3FFE2E8105CFF0010E80D73
+:109B70008C219649D50A8CF497F95CF38029E90584
+:109B8000F7018CE197F8F7818C6196D88C925A3066
+:109B9000240480E0D5B45CF28021E805E450E907B4
+:109BA000E6B0E905B41F8C019601B61F5CF0802178
+:109BB000E8065EF17FF1E807E630E90550050001AF
+:109BC00040A000138D215A981286FA1D80208441EE
+:109BD00080E849FFE2888400842149FFE279A03DC2
+:109BE000B0C98020844449FFE2AE020F8012844154
+:109BF000AC30020F8013AC31F00222000000802054
+:109C000049FFE2718400842149FFE262A03D84445F
+:109C10008020B0C949FFE297020F8012B43FAC32F6
+:109C2000020F8013AC33020F8014AC35220F801565
+:109C3000AC34C9034EA2000684213E17EBE5D503E0
+:109C40003EA7EBE55EF00065E90484013E07EBE525
+:109C5000F0015A08081684033E07EC1A2E07EC148C
+:109C600084218C019600E6053E17EC173E07EC14A4
+:109C7000E90A000F80043E1004313E07EC1A84000C
+:109C80003E07EC142E07EBB95A08010C221300050D
+:109C900044021924AC402213000A44021926AC40A5
+:109CA000FCC6FC4A84803C87F6233DC7F6223CACC8
+:109CB00000B580C0806480A4509F800451E0FFFF05
+:109CC000D13CCD0C22200000227000018A474E2496
+:109CD0000003FE9212248000D51D222300004C5F59
+:109CE000400922737FFF8A474E240013FE92D5104D
+:109CF000227300019BD74E740003FFFA22F37FFF0B
+:109D00008A4F4E240003FE92E0474023BC1B3824B8
+:109D100095092A230001E102E90EE05CE90C3874A0
+:109D2000951100F5000240F79C07E90588628C81D7
+:109D300096DB97238CA1D5C500050004E0048400C0
+:109D4000E80440319076961BFCCAFC4B84C0F0813D
+:109D500081218102FAE251CF800C81468420800665
+:109D600042009C73F20194018802A400380E050998
+:109D70008C215A1824F6801C49FFFF952E1029408B
+:109D800094F14000040C886897434012840EAC584C
+:109D9000842098CE96D994D98869A518E085E906DB
+:109DA000A5188A809721AD18D50312A180008C32A6
+:109DB00096495A1A88F08CC15A6812D2FCCBFC0022
+:109DC0002E07EBE55A0001142E0004345A0001104E
+:109DD0002E07EBE7C8062E00291484C25A0001039F
+:109DE00084C149FFE425C80484C3D50284C83C2C3F
+:109DF00000B5A616AE12A6919E51FE448402400004
+:109E000080168E01FE3496033C0BF6233E27EBA210
+:109E1000FE038C413C0BF6223E27EBA3FC80FC02A8
+:109E2000F081F282F38349FFFFCCF002F101F203EB
+:109E300049FFFF8DFC82381185118801E004E90E8D
+:109E40005CF28024E80E9E2DE6074402A77CE8021F
+:109E50008CB238001511E004E80444008000DD9E57
+:109E60008400DD9E001000A284413E1002FA001022
+:109E700000A1102000B63E1002F9001000AC3E1008
+:109E800002F80010009C3E1002F70010009A3E10ED
+:109E900002F68420101000A2101000A1101000ACD7
+:109EA0001010009C1010009A3C0C00BF10100051C4
+:109EB000DD9E2E1002F150200401101004382E10E7
+:109EC00002F044429260101004362E1002EF10107F
+:109ED00004372E1002EE101004352E1002ED101073
+:109EE00004602E1002EC101004612E1002EB101012
+:109EF00004622E1002EA101004632E1002E9101002
+:109F000000A52E1002E8101000AB2E1002E7101072
+:109F1000009A8420383204008C21183100015A182C
+:109F20000AFB8420101000B73C0C00BF1010005139
+:109F3000DD9EFC2084003C0FFB784463F04A4470B3
+:109F400000553C0DFB92A600C805AFF0490011B7C3
+:109F5000D5F949FFF12A3C1C00BFC804440FFFA0FB
+:109F6000D503440FFFA1100080513C0DFB83A601D7
+:109F70005A08040584013E07EBF684003C0FFB7889
+:109F80004423F04A443000553C0C00BF00100051FF
+:109F90005A10BB04AED0D5F9842010100051FCA09B
+:109FA0005A0801093C0C00BF842010100051840A9B
+:109FB000DD9E8401DD9E00008E01E604E81244F07F
+:109FC0009ECC3807800040F03C00DD0F04080C10E8
+:109FD0008400D5068401D5048402D5028403B60129
+:109FE000DD9E9200FC419EC1E66E4EF200C68001ED
+:109FF00044F09F0038378D0140F1BC004A003C001E
+:10A000001C0022002800A800C800CE007601D40061
+:10A01000E40004010801760176010C018406480081
+:10A0200000AD8407480000AA84003C0FFB7844730D
+:10A03000F04A4490005549FFE24680C05A000207AA
+:10A04000109380004900113BD5F7840149FFE24E8F
+:10A0500049FFE20E3C0E027549FFE2143C0E027607
+:10A0600049FFE2213E0009DD49FFE2293E0009DC0B
+:10A0700049FFE21F3E0009DE4402995C49FFE23BD2
+:10A08000800649FFE23384003C0FFB784463F04ACA
+:10A090004470005549FFE217C005AFF04900110FA9
+:10A0A000D5FA49FFE223D568842EAE418426AE401E
+:10A0B000842149FFF26B8420840280418461808185
+:10A0C00080A149FFF020D5588401AE10D51A840133
+:10A0D000AE10D50784C1AF9049FFCE8C3E67FF0814
+:10A0E000840ED54B8401AE1044124E00440148004A
+:10A0F00044201400490011A7440002EE49FFEA1170
+:10A10000840DD53BFA00D539FA01D53744021C51EC
+:10A11000A640A7C1A640A68192E440212008FE8F58
+:10A1200097CF842154210FFF800749FFD29680C02A
+:10A13000B0418007502F800649FFD2CB44021C5506
+:10A14000967092C8A68097B1AE40A641AF81021F1B
+:10A15000800244021C579688A6C09228AE80A68131
+:10A16000AE41021F800344021C599688A6C0922863
+:10A17000AE80A681AE418401FCC192003C1C00BFB0
+:10A1800010008060DD9E3C0C00BF00000060DD9E82
+:10A190003C1C00BF10008061DD9EFC005A080604D4
+:10A1A0008401D5045A08070684003E07EBBBD51C82
+:10A1B0005A080D0784003E07EBBB8421D5075A08D7
+:10A1C0000E0B84013E07EBBB84203E17EBE93E07F4
+:10A1D000EBE2D50A5A0810048401D5045A08110587
+:10A1E00084003E07EBB9FC80FC003C0C00BF441F20
+:10A1F000FFAA101000513C0C00BF000000515A088B
+:10A20000AA07440000FA49FFE98CD5F65A00DD049C
+:10A210008401D5028403FC805A080307FC008001F6
+:10A2200049FFFE22FC805A08041E2E0002FA10008C
+:10A2300080A22E0002F9100080A12E0002F810006A
+:10A2400080AC2E0002F71000809C2E0002F6100059
+:10A25000809A8400100080B63C1C00BF1000805122
+:10A26000DD9EDD9E5A08051D0000812C84423E00C3
+:10A2700002F50000812D3E0002F40000809A3E00AD
+:10A2800002F30000809E3E0002F284001000809ADB
+:10A290001000809E1000812C1000812DD5335A08AB
+:10A2A00006162E0002F31000809A2E0002F5100010
+:10A2B000812C2E0002F41000812D2E0002F21000DD
+:10A2C000809E84001000812ED51F5A0807220000AE
+:10A2D000812C84413E0002F50000812D3E0002F4F5
+:10A2E0000000809A3E0002F30000809E3E0002F2D1
+:10A2F00084001000809A1000809E1000812C1000B5
+:10A30000812D1020812E3C1C00BF10008051DD9E4D
+:10A310005A08016100008438505084013E0002F167
+:10A320000000843680453E0002F00000843744324D
+:10A3300092603E0002EF000084353E0002EE000015
+:10A3400084603E0002ED000084613E0002EC0000EB
+:10A3500084623E0002EB000084633E0002EA0000DB
+:10A3600080A53E0002E9000080AB3E0002E800004C
+:10A37000809A3E0002E784000841000138418008CD
+:10A380008C015A080AFB8440846110208435102017
+:10A3900084601020846110208462102080A5102029
+:10A3A00080AB1020809A1030843810308436103002
+:10A3B0008437103084635020840B18028001DAFE49
+:10A3C0008401100080B73C0C00BF842010100051A5
+:10A3D000DD9E5A0802FFFC00800149FFFD6CFC80F5
+:10A3E0009EC1E664E823FC01F281800144F0A2FCF6
+:10A3F00038378C0040F1BC004A003C00040C1C249F
+:10A40000A44858108002D504A488843DFE56AC4070
+:10A41000F10149FFF2CFD509A44858108001D504B5
+:10A42000A488843EFE56AC40FC81DD9EFC009EC1AB
+:10A43000E66CE85F80818004802244F0A3483837CE
+:10A440008C0040F1BC00DD0F0C14222A3242A8A877
+:10A45000A84C6688A69058210002D504A6905421E5
+:10A4600000FDAE8849FFF2A6D544A61058000001B1
+:10A47000D510A610540000FED50CA61058000004FC
+:10A48000AE1084013E07EDCAD534A610540000FB7F
+:10A49000AE08D52FA6D0442FFFBFFED6AEC8A6C8A3
+:10A4A00058318020AEC8A460FE8EACA0D51EA69008
+:10A4B00058210040AE88A6C8442FFFDFFED6AEC8A4
+:10A4C000A46058108040AC60A460FE8EACA0D51192
+:10A4D000A69058210040AE88A68858210020AE885A
+:10A4E000A46058108040AC60A44058108020AC405C
+:10A4F000FC8092005A08071C8E21E624E87444F080
+:10A50000A40C3817840040F0BC00DD0F040C121AB4
+:10A51000A41058000002D566A450841DD552A41082
+:10A5200058000001D55FA450841ED54B5A08082856
+:10A530008E21E626E85844F0A4443817840040F001
+:10A54000BC00DD0F060E161E262EA61858000002AF
+:10A55000D514A618540000FDD510A6185800000107
+:10A56000D50CA618540000FED508A6185800000403
+:10A57000D504A618540000FBAE18DD9E5A080B3413
+:10A580005A100B125A100C205A180A2EA658440FB3
+:10A59000FFBFFE46AE58A65858108020AE58A450B3
+:10A5A000FE0ED51CA61858000040AE18A658440F41
+:10A5B000FFDFFE46AE58A45058108040AC50A45067
+:10A5C000FE0ED510A61858000040AE18A618580068
+:10A5D0000020AE18A41058000040AC10A410580081
+:10A5E0000020AC10DD9E92003C1C00BF000080509B
+:10A5F00050007FDFE602E904840010008050DD9EF9
+:10A600003C4C00BF840044329BBC94413821810102
+:10A610008824102080A8382181118C0190481020B6
+:10A6200080A95A081EF4DD9EFC42F28244221C508E
+:10A63000F081F383812144121C51A610A790A7C872
+:10A640009204979F97F85A0801249E71E622E90F19
+:10A650005A6003045A68051D3C1C00BF001080604E
+:10A660005A10A1062E1004285A10011344027B37F9
+:10A6700044127BE249FFEF2B44027B5544127B5C82
+:10A6800049FFEEDCFD03F20149FFD834D5139E47A4
+:10A69000E622E9035A080B0F8026F202F30349FF72
+:10A6A000FF2B8401100480003C0C00BF842010109C
+:10A6B0000050FCC2FC4080C18420AE40A410812226
+:10A6C0009201960680E381445A08010AA43080234F
+:10A6D00058000002AC30800649FFF16C0204800093
+:10A6E00092019606C809A470841DFE0EAC30802726
+:10A6F000800649FFF15F0204800096065A080106B1
+:10A70000A43058000001AC30020480009606C80551
+:10A71000A470841EFE0EAC300204800092079606E0
+:10A720005A080108A47058108080AC703E07EDCA2A
+:10A730000204800092079606C806A470440FFF7FAB
+:10A74000FE0EAC3000050000920196065A08010A80
+:10A75000A638802758000002AE38800649FFF12A4B
+:10A760000005000092019606C809A638802754000B
+:10A7700000FDAE38800649FFF11D00050000960679
+:10A780005A080106A63858000001AE38000500003E
+:10A790009606C805A638540000FEAE380005000035
+:10A7A000920296065A080108A67858108004AE78DE
+:10A7B0003E07EDCA0005000092029606C805A638BD
+:10A7C000540000FBAE380005000092059606C8054F
+:10A7D000A638540000DFAE3800050000920596064A
+:10A7E0005A080106A63858000020AE3800050000BF
+:10A7F00092069606C805A638540000BFAE3800057C
+:10A800000000920696065A080106A6385800004035
+:10A81000AE380204800092059606C806A470440F64
+:10A82000FFDFFE0EAC3002048000920596065A0847
+:10A830000106A43058000020AC30020480009206CB
+:10A840009606C806A470440FFFBFFE0EAC3002048B
+:10A850008000920696065A080106A430580000406F
+:10A86000AC30FCC0FC0080C049FFFC995A68091953
+:10A870002E07EB895A08014B49FFF71F49FFFB5B85
+:10A8800084003E07EB893E07EB7C49FFDED1802048
+:10A890008403C1038404842049FFEBE9D5375A6857
+:10A8A000030649FFCAA18006D5325A680E0C2E074E
+:10A8B000FF085A08012C3C0DFB83A6015A08030A25
+:10A8C000D5065A600DFA5A6002F8D5208402D51FC9
+:10A8D000840049FFE19E3C0DFB83A7815A680A0B67
+:10A8E0008429AE41842049FFEE513C0DFB83AF81AA
+:10A8F000D504842049FFEE4A49FFDE9A5A0802E84F
+:10A900003C1DFB838443AE89D5028401FC8000009A
+:10A91000FC00800180C149FFFB4596005A6802593E
+:10A920003C6C00BF001300528E21E627E85144F032
+:10A93000A83C3817840040F0BC00DD0F08141E2826
+:10A940003A4E7A0084014412B80049FFFCE3D51066
+:10A950004402B80049FFFAAFD50B4402B80049FFE2
+:10A96000FA83D50684044412B80049FFFC578400DA
+:10A9700010030052D52F84054412B80049FFFC741F
+:10A980008400100300528402D5202E0002F33E0002
+:10A9900029122E0002F53E0029A42E0002F43E00EA
+:10A9A00029A52E0002F23E00291684001003005152
+:10A9B00010030052D50A84074412B80049FFFC5422
+:10A9C00084001003005284013E0029A6D5035A08D2
+:10A9D0000A0C49FFFC0B3C2DFB9284219600AE50E3
+:10A9E0003C2DFB77AE50FC80FC43008080013CFC9A
+:10A9F00000BF5A88041484C03E67EBF62E67EB9DB7
+:10AA00005A60010D00678050546300F05A601007CF
+:10AA1000440000553E07EC08D5150067805081259D
+:10AA2000F4848143B65F80E1F083CE0F800244124C
+:10AA30007B5C49FFED3A440000553E07EC083E6759
+:10AA4000EBF284014800017A5A80010949FFDDF0E8
+:10AA50005A080205840149FFE0EBB41F44127B5CF5
+:10AA600049FFECEC3C1C00BF84003E07EC0A006090
+:10AA7000805040031009F08200008051979FF081C0
+:10AA800084003C0FFBAAA6795A180421840149FFCF
+:10AA9000E0AF2E07EBB35A08010449FFD55A8007EF
+:10AAA000842049FFED73840149FFC7FB84003C0FFC
+:10AAB000FB784483F04A49FFC7E7C83C440000558F
+:10AAC0001004000049000BFBD5F7A6785A10010AC4
+:10AAD00084003C0FFB784483F04A44200055D51590
+:10AAE0003C0FFBB23C0FFB784483F04A3C0DFBB2B9
+:10AAF000C8F049FFDD9D5A0802ED440000551004DE
+:10AB0000000049000BDCD5F33C0DFB92A640C908C0
+:10AB100010240000F28549000BD2F205D5F6A600FC
+:10AB20005A0002093C0DFB77A6405A180204842003
+:10AB3000AE40F0028E01E60B4EF200FC44F0AA4C4F
+:10AB40003807810140F03C004A003C0016004E00EE
+:10AB50009E00B8004C0156016401A601E4017A018F
+:10AB6000A60144027B3744127BE249FFECB0B41FDC
+:10AB700044127B5C49FFEC998006F101804749FF54
+:10AB8000D5B93C0C00BF8420101000505A600F044F
+:10AB9000480000D084CC480000B884013E07EC0A8D
+:10ABA0005A6801092E07EBBBC813843F3C1E010500
+:10ABB000D5105A6802092E07EBBBC80D843F3C1E16
+:10ABC0000105D50A84015A68030A84C2D5088400A5
+:10ABD00084C4D505840084C5D50280C084213E1775
+:10ABE000EBF24E0200974800009084053E07EB7997
+:10ABF0008026840149FFFE8E80C084043E07EB79E5
+:10AC0000480000832E07EB7C84E13E77EC0A5A086B
+:10AC100001044800009184023E77EB7C3E07EB790B
+:10AC200049FFE85A5A6801063E67EB8948000084EC
+:10AC30005A680B053E77EB91D5215A68031A3C2CD4
+:10AC400000BF0001005500310054400020080011F1
+:10AC50000052880344310000FEC7000100518046C5
+:10AC60003E17EB823C3FFB5C49001C3CD5055A601B
+:10AC700005E85A600AE65A68070549002498D55B3A
+:10AC80005A68095A3C0C00BF000000523E07EB888E
+:10AC900084013E07EB8DD5388006F10349FFF98E1C
+:10ACA000D548FD0344227B9249FFF99E9780D52C1D
+:10ACB0008006802A804949FFFB95F10402050000C7
+:10ACC00084CBAC08D5213C0C00BF84201010005070
+:10ACD00044027B3744127BE249FFEBF9B41F441274
+:10ACE0007B5C49FFEBE28006F101804749FFD339E5
+:10ACF000D5208006802A804949FFFB9AF10E000486
+:10AD0000800084CFAE083C0C00BF8420101000509F
+:10AD10002E07EC0AC80C44027B3744127BE249FF41
+:10AD2000EBD6B41F44127B5C49FFEBBF8006D50510
+:10AD300084C1D5EA84C9D5EDFCC39200FC2380828E
+:10AD40004420DFCCB18380A280E681E33A228C04E8
+:10AD50003A238C24A4E84420DFD8ACF83A21080038
+:10AD6000B1C13A2388202E265054102F8008C134B8
+:10AD7000442295D85A1804058461383100083851A6
+:10AD80000000806184454232887338230C004021E2
+:10AD9000100E9686C21B5A48010538338400D50828
+:10ADA0005EF782BDE9045A480403C5168461445223
+:10ADB000928C38228000E243E8058C4138228008DA
+:10ADC000D509842038128008D5074432928C382166
+:10ADD00080088001D5028004FCA32210000C2220F0
+:10ADE00000079ACA222000062200000B9A8A884394
+:10ADF0009A088802DD9EFC423C4C00C080E084C082
+:10AE000000A2000F0042001080A6F4814045040813
+:10AE1000F4824647FFFF50420FFF88814272287339
+:10AE200095F98E218086F1838EE287868E01F1036B
+:10AE30008825964A4E150021049F8001E029E81CD0
+:10AE4000987E83C34081040043E2F07384204090E5
+:10AE50000400409480104E95000DE12AE80A38F471
+:10AE60000511389F05014297A4244E970003888955
+:10AE70008C215A1803EEF1028CA188C15A5803D9CB
+:10AE800044000084400200169603FCC280608040AB
+:10AE900084019A50E622E90B9850922142F08424D2
+:10AEA000E26F4000BC1A4020BC1BD5F4DD9EFC20A4
+:10AEB000848080A4806484E14063900CFF96C60582
+:10AEC000386011118CA188668C815A4819F75A1084
+:10AED000021AC91A403194773C3FFB6680C184E175
+:10AEE0004043840CFF16C406384005118A83426231
+:10AEF00010738C215A1819F64003141749FFFFC824
+:10AF0000D5048003D502841FFCA0FC42F2834620B6
+:10AF10001F8D84205021063F810080C349FFFFC957
+:10AF2000812084208008442739C03CADFB6649FF5E
+:10AF3000FFC044129CB48041F082440001084223C7
+:10AF400000733C0C022004210009F1812274000CE2
+:10AF5000385009008008B6BF49FFFF41F1012E8734
+:10AF6000EBC58041B4BFF4034E8300053C13F624C7
+:10AF7000D503441000462FE7EC19503F7FFEE663EF
+:10AF8000E8102E37EBE6CB0D50140001E03EE80749
+:10AF9000843B421F042450108050D50344100046C7
+:10AFA000C4083C33F6248423FE5C846540108C3650
+:10AFB0004430010842230C730221000FB65F844025
+:10AFC0003E27EBA4442295D838211800F2815A2854
+:10AFD00001594422965838211A025CF100C8E8044D
+:10AFE000E62BE9028E2A2E37EC012E27EC0D4C21A0
+:10AFF000C0402E300433CB3C5A28013B443001087A
+:10B0000044229CB442230C730431000E5CF180C8CE
+:10B01000E82F22F100055EF7889CE82AA4948E5A56
+:10B020005CF10404E8258446CC02844D44429694A5
+:10B03000FA6438421901FEFCFEA4E26244229CB488
+:10B0400044300108E81942230C73003100F8848170
+:10B050003E47EBA4CB04104100F8D515E666E91392
+:10B060008460103100F83E37EBA48462D50D443083
+:10B07000010844229CB442230C738460103100F810
+:10B080008460D5028461442296B438211901E655C2
+:10B09000E8045CFF0002E93D2E47EBE6CC3444F0C7
+:10B0A000010844429CB442433C73004200505A4859
+:10B0B00001153C4005A69521E0A4E8074E82000654
+:10B0C000400390098840D51D5CF382D1E8094241D4
+:10B0D0001C24448002D0D50A5CF383B7E903949121
+:10B0E000D50842411C24448003B64042209788443E
+:10B0F000FB0940002017E202E8038A40D5028440A1
+:10B100008822D507E655E8CC5CFF00024EF2009499
+:10B11000F0029401E209E9055CF28029E804D50B0C
+:10B12000E6B5E907FA04405280B74010940DD510F7
+:10B130009221D50E2E07EBE6C80B3C0005A85CF06B
+:10B140000097B41FE9039208D502920A88204400B0
+:10B15000006442048024400004175CF00100E9030D
+:10B16000440000FF44229CB44440010880A24253A2
+:10B17000107350428100A764E2A0E802AE245CF3A1
+:10B1800087D1E81A4400010880824243007380049A
+:10B19000004200505A48040E0400000E5CF007D133
+:10B1A000E80B440293E838001800E604E902FA24A8
+:10B1B000E3218401E952F101440296585A18010D25
+:10B1C00038101A02848780AA425204738025922381
+:10B1D00038101A0AD50C4412963838A01A0A963933
+:10B1E00038009909441296943800990944000108DE
+:10B1F00042230073000100505A0004048404D52D3A
+:10B20000441295E838A09909CB0A44129638442292
+:10B2100096943830990138311909D50A5A3802F014
+:10B220004412969497F938709909441296383870F8
+:10B230009909D5135A40010448FFFF6C5CF38190D3
+:10B240004EF2FF685CF000E74EF3FF64944B840A13
+:10B250004010803748FFFF5EFCC2FC53F0883C0C76
+:10B2600000C0F189F28C0010003200000033F1823E
+:10B27000F08384003E07EBB63E07EBA63C0005A634
+:10B280005CF00031E903FA06D503520000463C0B9E
+:10B29000F6242E07EBE62E17EC0D5A080109E622DC
+:10B2A000E9063C03F6248E0A3C0BF624E625E90465
+:10B2B00084003C0BF624F00284E09201F08AF00353
+:10B2C00044A296B49201F08BF009506000E93C0C66
+:10B2D00000C0F08600000009E2E04EF2015E50037B
+:10B2E0007F17B400F0818E01E6034EF20116500381
+:10B2F0007F1B85002250000050037F1D148F8004A7
+:10B3000022900000F002403280B6961BF087F003D6
+:10B31000976840148016F18DF10A960088A1F10B10
+:10B320008801FE02F085F005FEAA42400024B01418
+:10B3300088088420F08E800442010873F393F19210
+:10B34000F591F490F28F49FFFDA396015CF0008423
+:10B35000F20FF410F511F112F313E8055200008416
+:10B360009601D5028400049F800E38048509049F4D
+:10B3700080048C21892080099601F084F0028840A5
+:10B380005A1803DBF105F0038D068820F1855A88F1
+:10B3900012CC840038051D099E1AF08EF00D852010
+:10B3A0008E0295798109F08F840AB0594214007396
+:10B3B000F00FF185880896038480F08DF00EF10D72
+:10B3C00088049603F208B0D4F591F49049FFFD1576
+:10B3D0008020F410F5114E0400038420F205960B32
+:10B3E0005EF0003338111109E907380514018C01AA
+:10B3F00038051409D50289208C815A4805E18D0150
+:10B400005A8805D44400003240948137380514012D
+:10B410008920F0073895140985214E07000AF006A7
+:10B42000A60250907FFFF007E00956978001221F87
+:10B43000803E44000084FE0CF104400004165013CA
+:10B440007F6F9601AC0850137F71A488E240E80634
+:10B450003C2C03595CF100C8E904F2015A280303AB
+:10B46000AC0896F8F00944129800F208F38149FFFD
+:10B47000E1AAF10C8049F301B01949FFFD48804071
+:10B4800010037F6600137F678007223F803E49FFDD
+:10B49000FC5750137F1710037F67B4215A18030716
+:10B4A0008420AE705A080122D5175A08040BA670E2
+:10B4B000C9058421AE70AE71D5188422AE70D51541
+:10B4C0005A080114A6705A1802048423D5045A1885
+:10B4D00003048420AE70441295D838109C005A188A
+:10B4E000010510137FF4D50E842010137FF45A0841
+:10B4F00004082E07EBB68C013E07EBB6D5485A0878
+:10B500000147CF452E000650C8422E07EC058C019E
+:10B510003E07EC05D53CF1018417FE0EC0035A1816
+:10B5200006258026442295D8840010037F661003E8
+:10B530007F671800FF3538011C084422960838013F
+:10B540001C08442294F0840038011E0A44229618F4
+:10B5500038011D094422963838011D094422969469
+:10B5600038011D09AC08D513F0015A080411000375
+:10B570007F675A08010D4402928C38001C00C007F6
+:10B5800000037F665A08040410037F678CE1506350
+:10B59000010848FFFE9EFCD384A1C20284BFC909F2
+:10B5A000FA22FE0CFA2142010473B6038805D50E77
+:10B5B0004410027681E042F10473FA33425104737D
+:10B5C000FA2214F1800042028473B604DD9EFC402E
+:10B5D00044302710FE5CFA984657FFFF40208856FB
+:10B5E000FB2450528FFF80C44470005080233830B9
+:10B5F000191138601D11FECC403198768A624E34A4
+:10B600000003FEDAE0654051BC1B9CE140923C1B0C
+:10B610005A30790D5CF18051E9045262009FD502E5
+:10B6200080C3527200778083D5E38009FCC05CF050
+:10B630000051E905523000A0B661D502B6015010A4
+:10B640007FD85CF08051E905520000C8B602DD9E4B
+:10B65000B622DD9EFC4484C0810583808141F28254
+:10B66000F38180E480A38126E2E5E9148005F110EE
+:10B67000F202B0C4B105F58349FFFF90F004F50371
+:10B68000380E01118CA18920F005380E011188C0F7
+:10B69000D5ECF00180468AE0FFFB840542238073ED
+:10B6A0004E26000384418029800A49FFFF92B42876
+:10B6B0005A10FF058C2188019201B608B046B08768
+:10B6C00049FFFFB7F00638150111F00738250111C1
+:10B6D0008402400080164204887340000416FCC4B3
+:10B6E000FC4580E13C1C00D4F2835060002800201F
+:10B6F00080328400F2850020803344A2929CF2863E
+:10B70000202080392010803AF287F188F08444802C
+:10B7100000FF3C0C00D4F10400000009E2204EF2CE
+:10B7200000D104137FF6841BFE0E4E0200B85A1897
+:10B730000604480000B4A0375A080204480000AFCD
+:10B7400004937FFF40048808F089F109A03D880137
+:10B75000A6C0CB19A642E622E9029EC9A7035CF265
+:10B760000022E8038C81D502FA9384403C1C00D56A
+:10B77000B65FF00380A649FFFF6FA07E3810A602D7
+:10B780008A20D522A6415A18112CA6C2E662E903E6
+:10B790008E61D5028460A7035CF20022E8038C81ED
+:10B7A000D502FA933C1C00D58400B61F501080A22D
+:10B7B0008441F00380A649FFFF4FA07EFA42381073
+:10B7C000A60242100873F205FE54042380083821B3
+:10B7D0002602880240008016F1078801D504B706CA
+:10B7E00002037FEE12037FF2F109A03D8801A6C299
+:10B7F000CB1BA640E622E9029EC9A701E690E8031A
+:10B800008C81D502FA813C1C00D58401B61F5010F2
+:10B810008144F00384409D7449FFFF1EA07F3810CF
+:10B82000A6028A20D520A6435A18232AA6C0E6627B
+:10B83000E9038E61D5028460A701E690E8038C815C
+:10B84000D502FA813C1C00D58441B65F501081E6D8
+:10B85000F0039D7449FFFF00A07FFA543810A60240
+:10B8600042100873F206FE54042380083821260291
+:10B87000880240008016F1088801D5051483000174
+:10B8800002037FEF12037FF322037FF21205000011
+:10B8900022037FF312050001D50C220500001203DC
+:10B8A0007FF222050001B70612037FF31483000123
+:10B8B000F0048D448C01F0845063010848FFFF2B95
+:10B8C000FCC5FC424462785CB61FF181440000A2D2
+:10B8D00080264211807380E28001F201B43F81230F
+:10B8E00049FFFE77B042B08349FFFEA344000051F8
+:10B8F00042348024F002F103880388613823011167
+:10B9000038130D1184024001001642038473400075
+:10B9100008169603FCC2C10B402084094430006421
+:10B9200042200C7340110436960BDD9E8001DD9E93
+:10B93000FC5280C03C0C00D4B042509F801C008060
+:10B9400000024400DFE050AF80303A2014043A2077
+:10B950009424A400B1D1AC084400DFF480293A203B
+:10B9600014043A209424A40051C3000CAC084400F1
+:10B97000E008802A3A2014043A209424A400FA54BF
+:10B98000AC088420B01B4900137B4400E01C8027D6
+:10B990003A2014043A209424A400AC084400E03077
+:10B9A000B0563A2014043A209424A400AC08220390
+:10B9B0000000001F804449FFFFB0AC30A67D220389
+:10B9C000000549FFFFAAAC350013800C2203000CD0
+:10B9D00049FFFFA31203000C001380112203001182
+:10B9E00049FFFF9B221302761203001144000064FA
+:10B9F000FE444420004E5010802740108836121319
+:10BA0000027622130287FE0C500000274000081621
+:10BA10005024000694911203028788468500401343
+:10BA2000A000220E0000A64EF28149FFFF761A0EFA
+:10BA30000001F201B0164010200022010000A64EC5
+:10BA400049FFFF6BF2018D011A0100015A8806E9D6
+:10BA5000B01B8086842044500064B08238210400EA
+:10BA60005A280A1C38348400382504002282000039
+:10BA7000FEECFEAC99DA4224082442340C24403116
+:10BA80009C7602F07FFF40711CF6A480886F88E2EC
+:10BA900012307FFFADC0D5225A280B1B38348400EA
+:10BAA0003825040022820000FEECFEAC99DA422424
+:10BAB000082442340C2440319C7602F0000040718E
+:10BAC0001CF6A481886F88E2ACC0ADC1D5075A28A6
+:10BAD0000C06A480A4E08843AC808C218C028C826C
+:10BAE0005A1812BD8400B05B381081013813010967
+:10BAF0008C015A0812FA507300305093003C2A23EC
+:10BB00008001E45FE91422338010221380112203A4
+:10BB1000FFFE22438000882322338012880288237C
+:10BB20008804846049FFFECF1203FFED4C74FFE9E7
+:10BB300022230005E45FE9152233000422130016D6
+:10BB40002203001722430029882322330028880279
+:10BB500088238804846149FFFEB6A4768801AC3648
+:10BB60002223000CE45FE9172233000D2213001F8B
+:10BB70002203001E22430030882322330031880232
+:10BB800088238804846249FFFE9E0213000B88010B
+:10BB90001203000BFCD2A0CD94128860A61BA6DA7B
+:10BBA0008A03E41FE90484653E37EC182E37EC1550
+:10BBB0005A380108A04C38108900E622E804D5075D
+:10BBC0005A300206E41FE8038400DD9E4400800032
+:10BBD000DD9EFC4051FFFD58F0822E00043480E1D0
+:10BBE0008102C805FAD545C00041D5054460004B27
+:10BBF00045C000822E07EBFD442000825A08032234
+:10BC00002E17EB6B2E000CC64460004BFE8CFF8C95
+:10BC100040210056406300D64091001196B3425433
+:10BC20008424FF8CF28144200064405280B640633B
+:10BC300000D6FE5441C2801197B340A08156D5076B
+:10BC40004400004BF081812244A0006484008020E5
+:10BC500049FFD23E8441B0C58007802849FFD27396
+:10BC60008400842149FFD2348027B0C580078441F5
+:10BC700049FFD2695054002450138024503404ECFE
+:10BC8000A4A8505280249693AC880222FFFF501043
+:10BC9000802496931220FFFFDBF48403842149FF64
+:10BCA000D21780078442B0C5802749FFD24C804715
+:10BCB0008400FA62B10840F00C37C1035A1811072A
+:10BCC000A450964B40FE0407D504A450964BE121A6
+:10BCD00038F200088C018C425A0A88EF80078027CE
+:10BCE0008442B0C5F48349FFD22E84A0812580050B
+:10BCF00045E29968F403987DF301A4889693E06285
+:10BD0000F20298D5E910FA4240F00857C2035A28C7
+:10BD1000110802F0800040F78011E0CFE90438F20A
+:10BD20000000E805A4989693AC88D50B12F080002B
+:10BD3000A458382F09018822964B4E1700038921F9
+:10BD40008CA2441005108C01D9D7F002802849FF3D
+:10BD5000D2ED44000064400480164005000751FF06
+:10BD600082A8FCC0FC433C4C02222E97EBDF95419D
+:10BD700098655024FFFEE644A6C9A6484EF20094FA
+:10BD800044227D28382100005A2801044800008CF4
+:10BD90003DCC0221E6624022F000F282A4902E7097
+:10BDA000287A924140A100113C8C0253E910804353
+:10BDB00042209C7394918E4288489F9AA490E6708A
+:10BDC00096934021280797B0E815D504446000FFFA
+:10BDD000844081E342F09C7380EF8CE195F988E820
+:10BDE000A5F897FBE0EAE803582100028C6296D898
+:10BDF000D503443000FFE622F381E9089ECA5CF0D7
+:10BE0000802255E180FFE805D50283C18C22964847
+:10BE1000C24A3C3C021F97C1F383F7858460975860
+:10BE2000D8078C6197D8E2E98C82E9FAD53CF70310
+:10BE300038738D01F784F50497D9DFF4A761DE0329
+:10BE40005A20020804AF80014C557FED5A2801EBBF
+:10BE5000A7E0E2FEE9E7E227E9E5F502387E0D0119
+:10BE600002A28000E347E8DE44527D2884E1387274
+:10BE70008C0804AF800384E0048F80050AF500017C
+:10BE80004CF4400B028F800844527D2812857FFFBE
+:10BE9000850138829C088CE154F380FF40F7A406AA
+:10BEA000E9ECD5C0FCC3FC003C0C0253842050508C
+:10BEB00000305040003C8041A4E896DBE475E9087E
+:10BEC000A4E896DB5EF18046E8038C41969002324E
+:10BED000801296DBE474E8038C2196488CA2DCED9A
+:10BEE000E647E90BE627E90984213E17EC153E17E2
+:10BEF000EC17842A3E17EC1A2E17EC155A18011E5F
+:10BF000050500022504000189401846050000022DC
+:10BF10009A45A448968BA468964B9A514E140003F8
+:10BF2000FE4AE434E8038C6196D88EA2DCF25A38DB
+:10BF3000050584023E07EC152E07EC125A08010590
+:10BF400084023E07EC152E07EC175A0801048405FD
+:10BF5000D5052E07EC18C0048E013E07EC18FC80B6
+:10BF6000FC00842084003E07EBAD3C6C025A8061EB
+:10BF7000804180019971A52897235EF200C8E903EA
+:10BF80008C018C41A52897235EF27F39E8038C61F0
+:10BF90008C018C225A1890F05A3048045A284805CF
+:10BFA00084213E17EBAD84203C3C02598041991915
+:10BFB000A5205CF20064E8068C419690E644E90214
+:10BFC00084008C225A1890F55C000003FC803C1C15
+:10BFD000022294018801A640A6018E02E60FE8081D
+:10BFE0008E215CF08022E80484003E07EC12DD9E86
+:10BFF000FC403C3C02214090040894893841810176
+:10C00000383185013C7C0223E264954A3C4C021F96
+:10C010003C3C02209582E8273802010138020509DC
+:10C020004001A40038118501A4808822AC40987E8C
+:10C03000983DA6CAA682E2434021BC1AAE8AA6CB8E
+:10C04000A683E2624021BC1AAE8BA6C8A680A601D8
+:10C05000E2434021BC1AAE88A689E24040013C1A66
+:10C06000AE09D52538120501884338120109381167
+:10C070008101A4108801AC10987E983DA6CAA682C2
+:10C08000E2434021BC1AAE82A6CBA683E2624021E5
+:10C09000BC1AAE83A6C8A680A649E2434021BC1ABA
+:10C0A000AE80A681E2224020BC1AAE81FCC0503096
+:10C0B0000024441F80002A200001E02240113C1B84
+:10C0C0004C01FFFB5E00FFD8DD9EFC4DF292442048
+:10C0D000E044B118F3893A210C003A220C2046279B
+:10C0E000FFFF878050210FFF813CF48EF295F2090B
+:10C0F000A690E3224EF200DC04A080013825250141
+:10C10000F2814C24C0D2A0CD402488088843A6D315
+:10C11000A712F38FA6D0A691F390F291F20FE2440A
+:10C120004EF300C39EA1F310B65FF211E2434EF34B
+:10C1300000B9B4412FE0287AF2828043F50242220E
+:10C140007873949199AAA77197564E5300A8A77037
+:10C15000F601385515014C5340A29982F68322838B
+:10C1600000004E87009CC408B4FF80C34263F8738C
+:10C1700038601901D50344607FFF126F802CC30C17
+:10C180002E60287A80E34272187380C7F71588C73B
+:10C1900038601901D50344607FFF126F802D506F06
+:10C1A0007FFFE266E8048840A491D50344207FFF26
+:10C1B000122F802E2E20287B8E41E282E8089CA13F
+:10C1C00080C34261787338201901D50344207FFF72
+:10C1D000122F802F844642740824F29396A8F2947A
+:10C1E0009E9984CAF28B9CA1406398D6F28C9C994C
+:10C1F000F68AF28D84C0F20EB15638211900382229
+:10C200008911F50AF284E045E846F50E94B18845B7
+:10C21000B156A69138228911F50AF285E045E83B2E
+:10C220005A60020B5A60030B5A600104F20BD502EC
+:10C23000F20DB4BFD505F20BD502F20DF50C42227A
+:10C24000F873F502949188A2F586A76997569768C6
+:10C25000CD228840F713F2872221000042F11C24EE
+:10C26000F28884EAF20440779CF6E047E814F2058D
+:10C27000E047E811F206A7D0F21438751D004C23F0
+:10C28000C00BF208E048E903F203D502F207AD5013
+:10C290008781D5048CC15A6804B08C6148FFFF4780
+:10C2A0008C8148FFFF3D8D2148FFFF235BC80106BD
+:10C2B000F309F21249FFA146FCCD3C0DFB78461074
+:10C2C00010008C01E2203C0FFB78E802D500DD9ED7
+:10C2D000FC0044027AE84422A7C484208A40490032
+:10C2E0000ECFFC80FC0084003C0FFBA93C0FFBAA96
+:10C2F0003C0FFBB63C0FFB973C0FFBB53C0FFBAE76
+:10C300003C0FFBB43C0FFBA73C0FFBA23C0FFB9682
+:10C310003C0FFBB93C0FFBA03C0FFBB13C0FFBAB50
+:10C320003C0FFBB73C0FFB993C0FFB9E3C0FFB9D6A
+:10C330003C0FFB9B3C0FFBAC3C0FFBB33C0FFB9853
+:10C340003C0FFBA53C0FFBB83C0FFBA43C0FFBB024
+:10C350003C0FFBA83C0FFB9C3C0FFBA63C0FFBA338
+:10C360003C0FFBA13C0FFBAD64030003640304031B
+:10C37000641224029646C103640300034400400093
+:10C3800064022403641200028419FE0E6402000396
+:10C390006400000864030402461617805010807C75
+:10C3A000FE0F6403040364020002580000016402EB
+:10C3B0000003FC804403F04A44100055AE4044138F
+:10C3C000F0EDA6085A08010A4423F0DAA61054003A
+:10C3D00000F0AE108400AE08840464030403440338
+:10C3E000F0498425AE404403F04A44100053AE4067
+:10C3F000DD9EDD9EFC204443F1104473F04AB4649A
+:10C4000092784031E008FE1F4433F114B604B403BF
+:10C41000921840006008FE474403F10EB623AC803A
+:10C420004403F10C8421AE4084203C1FFB7880C083
+:10C43000A630C00744000055AE3849FFFF40D5F98B
+:10C44000FCA0FC204443F1108E41B4649691927894
+:10C450004031E008FE1F4433F114B604B4034473C2
+:10C46000F04A921840006008FE474403F10EB623DC
+:10C47000AC804403F10C8421AE4084203C1FFB7847
+:10C4800080C0A630C00744000055AE3849FFFF17F2
+:10C49000D5F9FCA0FC204443F1144463F134B464A6
+:10C4A0004473F04A92784031E008FE1FB60444031A
+:10C4B000F10EAC404403F1048421B6404403F13250
+:10C4C000AE4084003C0FFB78A630960EC8074400AF
+:10C4D0000055AE3849FFFEF3D5F84413F134A608F1
+:10C4E0009606C8FEFCA0924284A0D20738301602FD
+:10C4F0003830960A8CA1D5FADD9E3A6F9EBC840036
+:10C50000802049FFD40984006405E4034403F00E4D
+:10C51000A4009626C00949FFD08B5A0802064400A1
+:10C52000006949FFD4CE4403F00EA440964EC90FD3
+:10C53000A4409656C90CA440965EC909A4409666CC
+:10C54000C906A400540001004E0200D14403F00EBD
+:10C55000A400960EC80949FFFEBD4403F00EA44096
+:10C56000965EC92CD52244021C5084C0AD803E6723
+:10C57000EBD349FFD171440218BCAF80440218BD0F
+:10C58000AF80440218BEAF80440218BFAF8044029F
+:10C5900018C0AF80440218C1AF80440218C2AF80F7
+:10C5A000440218C3AF80D5D8A4409656C907A4400A
+:10C5B000964EC904A4009626C019446221EC460197
+:10C5C0003135B4A650000A5AFF46D01049FFD0308A
+:10C5D0005A08020D460A5A5A500005A54413F06342
+:10C5E000B606A608540000FEAE0844121C60446261
+:10C5F0001C788400AC0844200100AC3044124C701C
+:10C6000084003C0FFBAF3C0FFB9A3C0FFBB249FF91
+:10C61000FF1A440002EE49FFD78444224C70503187
+:10C6200000F0A0193C2FFB7D9E44A09BB4039649CB
+:10C6300049FFFF3244027C0044124E0044201400A3
+:10C640003C0FFB8C4401480049FFFEFD440002EE14
+:10C6500049FFD7673C2DFB7D040100100211002229
+:10C660000421001349FFFF184412B80044200800B9
+:10C670004401A00049FFFEE7440002EE49FFD75104
+:10C680003C2DFB7D0401000C0211001A0421000F57
+:10C6900049FFFF024402B8008026FA5449FFFF25F3
+:10C6A0003C0DFB7D44321C7C44221C7D04000009AF
+:10C6B000401020093E0028953E1028964010400961
+:10C6C00092183E1028973E002898A618A650960269
+:10C6D000964AAE58AE1044321C7E44221C7FA618E7
+:10C6E000A6509602964AAE58AE1064000009440364
+:10C6F000F061441218CDA6009600AE084403F00E77
+:10C70000441218CEA6009600AE084403F00F44125F
+:10C7100018CFA6009600AE0849FFDCE73C0FFB8669
+:10C720005A080107440218CC441FFFAAAE40490032
+:10C7300002643A6F9E84DD9E84013C0FFBA9DD9E5E
+:10C740003C0DFBAA8C013C0FFBAADD9E3A6F9ABC04
+:10C75000EFFC3C0DFBB68C013C0FFBB63C0DFB83A4
+:10C76000A6005A0801272E07EBD95A0055062E07B6
+:10C77000EBCE5A0855153C03F62D8C019601E60ABE
+:10C780003C0BF62DE90F84013E00042D840049FF87
+:10C79000B9884400006949FFD394D50484003C0B58
+:10C7A000F62D440000553E07EBD93E07EBCED504ED
+:10C7B00084003C0BF62DEC043A6F9A84DD9E3BFF1F
+:10C7C000FCBCEFFC84013C0FFB9749FFCEFA49FF0C
+:10C7D000B9613C0DFB83842249FFDED849FFB97162
+:10C7E0008420840284468061808180A149FFDC8BA3
+:10C7F000EC043BFFFC84DD9E3A6F9ABCEFFC49FFE2
+:10C80000D33AC01184013C0FFBAF840049FFD337FA
+:10C810003C0DFB8344127B933C2DFB933C3DFB7111
+:10C8200049FFEF0449FFD31EC00784013C0FFB9A68
+:10C83000840049FFD31BEC043A6F9A84DD9E3A6F63
+:10C840009ABCEFFC3C0DFB9284213C1FFBB5AE4033
+:10C85000440FFFAA3E07EBD92E07EBB4C80A3C0DE4
+:10C86000FB83A681542100FD5A20040449FFDE8E7B
+:10C8700084003E07EBB42E07EB8E5A0801072E0703
+:10C88000EB928C013E07EB92EC043A6F9A84DD9EAA
+:10C8900084013C0FFBAE4403F081A600C00B3BFFBC
+:10C8A000FCBCEFFC4400006949FFD30BEC043BFFE8
+:10C8B000FC84DD9E84013C0FFBB4DD9E84013C0FB3
+:10C8C000FBA7DD9E84013C0FFBA2DD9E84013C0F93
+:10C8D000FB96DD9E84013C0FFBB9DD9E84013C0F7D
+:10C8E000FBA0DD9EDD9E84013C0FFBABDD9E3A6F1D
+:10C8F0009ABCEFFC3C0DFBB05A08010684203C1F9B
+:10C90000FBB0D50284023E07EB7D3C1DFB83840116
+:10C910003C0FFBB284003C0FFBB7A6095A000D0781
+:10C920009E82E642E9035A08074AA6085A080147C8
+:10C930002E07EBF99600C8423C1DFB92A6485A18F8
+:10C94000013E3C1DFB77A6485A1801393C0FFBB34A
+:10C950002E07EB805A08010449FFDAD72E07EB8E29
+:10C960005A0801082E07EB855A08010449FFDBA38A
+:10C970002E07EB875A08010449FFDA992E07EB8E40
+:10C980005A0801082E07EB8B5A08010449000E4291
+:10C990003C0DFB83842049FFDDF944127D6C3C0D86
+:10C9A000FB4049FFB94F840149FFB87B3C1DFB9216
+:10C9B0008400AE083C1DFB77AE08EC043A6F9A8405
+:10C9C000DD9E3C0DFBB78C013C0FFBB7DD9E840167
+:10C9D0003C0FFBA13E0003604403F07E3BFFFCBC28
+:10C9E000A640EFFC5A10010FA6405A10020CA640B8
+:10C9F0005A100309A6405A100406A6405A10100304
+:10CA0000A6008441842080624400B10149FFCDB575
+:10CA100049FFCDC9EC043BFFFC84DD9E84013C0F43
+:10CA2000FB99DD9E84014413F0633C0FFB9EA60836
+:10CA30009606C819442221EC4615A5A550108A5A1D
+:10CA4000B6222E1003635A180109461131355010D1
+:10CA50008A5AB6223E0003634413F063A6085800C6
+:10CA60000001D51CA6089606C01A441221EC460AFD
+:10CA70005A5A500005A5B6012E0003625A08010A51
+:10CA80004601515550000A5AB60184003E00036227
+:10CA90004413F063A608540000FEAE08DD9E840136
+:10CAA0003C0FFB9DDD9E84013C0FFB9BDD9E3BFF0D
+:10CAB000FCBCEFFC84013C0FFBAC49FFEB665A0861
+:10CAC000A10A4403F4038420AE404400005549FF0A
+:10CAD000D1F8EC043BFFFC84DD9E3A6F9ABCEFFC7E
+:10CAE00084013C0FFBA33C0DFBB38C013C0FFBB35B
+:10CAF0002E07EB805A0801222E07EB8CC8052E0763
+:10CB0000EB7F49FFDA882E07EB8C2E17EB7F49FF6E
+:10CB1000D9452E07EB7F2E57EB938C0196003E07ED
+:10CB2000EB7FD80B2E07EB928C013E07EB922E0782
+:10CB3000EB8C8C013E07EB8CEC043A6F9A84DD9E03
+:10CB400084013C0FFB984403F4033BFFFCBC8420AE
+:10CB5000EFFCAE404400005549FFD1B3EC043BFF6D
+:10CB6000FC84DD9E84013C0FFBA5DD9E3BFFFCBCED
+:10CB7000EFFC49FFD1B8C00784013C0FFBA484003F
+:10CB800049FFD1B549FFD1A6C007840049FFD1A60E
+:10CB900084013C0FFBB8EC043BFFFC84DD9E840168
+:10CBA0003C0FFBB0DD9EDD9E3BFFFCBCEFFC840137
+:10CBB0003C0FFB9C49FFCC4049FFB766C80449FFC6
+:10CBC000B769D50349FFCBFFEC043BFFFC84DD9E36
+:10CBD00084013C0FFBA6DD9E84013C0FFBADDD9E76
+:10CBE0003BFFFCBCEFFC4400006949FFD16AEC0448
+:10CBF0003BFFFC84DD9EFC452E0029115A000106F6
+:10CC00002E0029135A08011A3C0DFB869E46E62287
+:10CC1000E9048E09E603E8113C0DFB834412938C72
+:10CC20003C2DFB943C3DFB933C4DFB823C5DFB71FA
+:10CC300049FFC3AA5A00085049FFD898490011403B
+:10CC4000490010483C0DFB838421AE41490013B4D8
+:10CC5000440000A049FFEA9444027D9C3C1DFB83F4
+:10CC60004900105249000DD049000AF584013E07E1
+:10CC7000EB7949FFD831440000A149FFEA813C0D1E
+:10CC8000FB8344127B933C2DFB933C3DFB7149FF9E
+:10CC9000ECCD2E07EBCD5A08010A44027B37441233
+:10CCA0007BE249FFDC1449FFD1413C1DFB92840229
+:10CCB000AE083C1DFB77AE0849000C8B2E07EBCD70
+:10CCC0005A08010649FFD12B49FFD13649001222EB
+:10CCD00049FFD85144A2B8BC44929CC45085011469
+:10CCE00051C480784473F04A44600055840E49FF73
+:10CCF000EA51AFB849FFDBAE2E1004062E27EBFD3C
+:10CD0000840AFE0C44100064420104732E100404D3
+:10CD10003C2DFFE9880144102710420104732E20A6
+:10CD20000434441003E8420104733C08061A49FF26
+:10CD3000EC692E0029115A0001172E0029135A0000
+:10CD400001132E07EC0B5A08012544027B933C1D6E
+:10CD5000FB943C2DFB933C3DFB823C4DFB7149FF1A
+:10CD6000ECABD5173C0DFB83A6415A100D0D2E10D0
+:10CD70000425C90944127B952E20291B4432938C2B
+:10CD800049FFC6462E07EBC35A0801DD48FFFF7076
+:10CD90003C0DFBAF5A08013C84003C0FFBAF2E0753
+:10CDA000EC085A0855163C0DFB713C1DFB83B61F61
+:10CDB00044227B5544027D9C3C3DFB943C4DFB93BF
+:10CDC0003C5DFB8249FFEE123E07EBF3D5033E6765
+:10CDD000EC082E07EBF349FFED4796003E07EBBD4D
+:10CDE0005A08030448FFFF2A5A08021284003C0F25
+:10CDF000FB784463F04A447000553C0DFB92A6005A
+:10CE00004E03FF36AFF049FFFA5AD5F83C1DFB92AE
+:10CE1000A6085A08020C3C0DFB77A6005A08020728
+:10CE20008401AE083C1DFB77AE083C0DFB83A601D8
+:10CE30005A000B0449FFDC543C0DFB77A68096900A
+:10CE40004E23FF562E07EB805A0801213C2FFB781A
+:10CE50004463F04A447000553C0DFB92A600C8059F
+:10CE6000AFF049FFFA2CD5F9440298C449000A2FC3
+:10CE70002E07EBF349FFD8BB49FFCBDAC803840385
+:10CE8000D5028404842148000186440298C44412D7
+:10CE90007B7BF28749FFDA712E07EC09F2075A080B
+:10CEA000020A3C1DFB7784013E07EC09AE0848FFEF
+:10CEB000FF1B2E00035C5A08010B2E07EBF349FF02
+:10CEC000D89684023E00035C48FFFF0E5A08020415
+:10CED0003E20035C2E07EBCD5A08010744027B3746
+:10CEE000842049FFDA842E07EB8E5A08010744029A
+:10CEF00098C449FFD80ED5BD2E07EBFD5A08030C88
+:10CF00002E0029145A08010849FFBA5D84023C1D0D
+:10CF1000FB44D50649FFD12EF087F107840049FF75
+:10CF2000D9753C0DFB83A6415A180D098423AE41E7
+:10CF3000440000A349FFE924D51E440000A349FF93
+:10CF4000E91F2E0029155A0801113C0DFB83A6404C
+:10CF50005A18010CA6015A0006092E07EC09C8054B
+:10CF60002E07EBD049FFD1762E000429C00484009F
+:10CF70003E0004292E6029145A68010984003E00ED
+:10CF8000042849FFBE0E3E600428440298C444129F
+:10CF9000985C44229C044432B8004442989849FF6B
+:10CFA000E5622E07EBF35A08040649FFE7C4480080
+:10CFB00006D02E07EBF7E60EE80C2E07EBEBE609A2
+:10CFC000E8082E07EBE7C80B3C0C0106E613E9075F
+:10CFD0003C0C024F44126E7049FFC9A83C1C02541D
+:10CFE00084004432A77C0A208001382181098C0109
+:10CFF0005A0824F93C0FFBBB2E0029165A08010CD5
+:10D000003C0C024F3C1C02513C2C025444329968A7
+:10D0100049FFE7072E17EBCD5A18010644027B376C
+:10D0200049FFD9E54402985CB61F3C0414AA441297
+:10D030007B39F0834402B9E4F0844422938C840069
+:10D040004432989844427D5C44529AB814AF8001AF
+:10D05000148F800249FFD2C4840044127D5C4422B4
+:10D060009AB844327D8044429AD049FFD2A73C000E
+:10D0700005A85CF000F5E80484013E07EBE63C0CF3
+:10D08000025349FFBAC83C0C0254A445964BE43500
+:10D09000E90702100017964B5EF0FFF6E90C02104C
+:10D0A000000C964BE435E9090210001E964B5EF029
+:10D0B000FFF6E8038421D50284203E17EC15A44531
+:10D0C000964BE435E80FA440964BE435E80B02108C
+:10D0D000000C964BE435E806020000119603E415B7
+:10D0E000E9073C00046B5CF000658401E802840001
+:10D0F0003E07EC122E07EB865A08012E440298C414
+:10D100004900083A49FFCA9480208403C10384047B
+:10D11000842049FFD7AC3C0DFB778421AE402E67BD
+:10D12000EB915A60010448FFFDDF80263C0DFB8334
+:10D1300049FFDA2C800649FFDBF849FFDC0DF08758
+:10D1400084408402F1078066808280A249FFD7DB99
+:10D1500048FFFDCA2E67EB8D5A68012184003E0707
+:10D16000EB8D3E07EB7C2E07EB8849FFD80549FF86
+:10D17000E6E22E0028835200000149FFD7FD3C0D56
+:10D18000FB77AF8049FFCA5480208403C103840425
+:10D19000842049FFD76C48FFFDA749FFD7B03C0E5C
+:10D1A00005EF2E07EBCD5A08010744027B37842296
+:10D1B00049FFD91D2E0029175A08010C4402A74423
+:10D1C0004412989844227B952E37EBDD49FFE3F714
+:10D1D0002E0029145A0801084402989844129844D1
+:10D1E00049FFBBC42E00291A5A08011249FFCA2060
+:10D1F0005A08020B440298C44412938C44229800AB
+:10D2000049FFD058D50484003E0004043C0C02536E
+:10D2100049FFF39084403C2FFBBB3C3C025344024B
+:10D220009D70FA825A200A1E04107FD15A10030BF7
+:10D2300004107FF38E22E622E905B4208E22E62236
+:10D24000E80C0050003200100033421290739449F1
+:10D250008823A44812107FBB8C4150000108D5E3FD
+:10D260003C5C025484068440444299685011000C8E
+:10D2700099A98823A5C8381201018827964BAC705C
+:10D280005011003099A988238C42A5C83812010199
+:10D290008C018827964BAC705A080CEA3C0FFBBBFC
+:10D2A0003C1C02543C0C02533C2C025F49FFF4939B
+:10D2B0003E00043449FFC9BCC0073C0C0254441270
+:10D2C000980049FFDF0B3C1C05EF84005A10010455
+:10D2D0004800010D3E07EBF43E07EBF72E00291442
+:10D2E0005A0001062E00291A5A0801064402B99C68
+:10D2F00049FFBFF72E000434C0073C0C025444120F
+:10D3000098008441D5073C0C0254441298003C20FC
+:10D31000048844327B6749FF99152E0029245A0856
+:10D3200001123C000202C80E2E07EBFDC80B3C0C9C
+:10D330000253441298003C20048844327B6749FF22
+:10D34000F6C6840044127D288040382080088C0175
+:10D350005A0806FD84003C0FFBBBFAC23C0DFBBB28
+:10D360002E17EBDFE201E8453C2C021F94413851B7
+:10D370000101D8393C2C02223C3C02218841FA842C
+:10D38000A651A69080A138018111425118734432F0
+:10D39000996849FFE5523C2DFBBB3C3C021F945170
+:10D3A0008823A4C8FE1FAC083C0C02213C10059940
+:10D3B00038000901E220E80C5CF0003CE8092E1777
+:10D3C000EC035CF080FAE8048C213E17EC03961025
+:10D3D00049FFF4CA2E07EC125A0801062E07EEEC9C
+:10D3E00049FFF5F73C0DFBBB8C013C0FFBBBD5B7F0
+:10D3F0005A1002072E0029195A080162D5468400E6
+:10D400003E07EC163E07EC1184003C0FFBBB84C1C9
+:10D410003C0DFBBB2E17EBDFE201E8ED3C1C021FCD
+:10D42000950138508101D82B2E07EC165A080118A7
+:10D430002E17EC113C0C022294C988608880A698B3
+:10D44000A6209A828C41E643E80AA6A1A6198A4042
+:10D450008C42E645E804962849FFF5CC3C1DFBBB11
+:10D460003C2C022294098802A680CA09A6018E05D6
+:10D47000E608E8053E67EC163E17EC113C0DFBBBD9
+:10D480008C013C0FFBBBD5C53C0DFB94A40096065C
+:10D490005A0001083C0DFB82A60096065A080110AE
+:10D4A0002E07EB6AC80C44029800441298C4442228
+:10D4B0007B6749FFD2F13E000406D50684003E009A
+:10D4C000040649FFD2033CF4046E5EF78065E9046C
+:10D4D00084003E0004062E0004065A08010584005C
+:10D4E0003E00035C49FFF4E1D51D3E0004373E00D9
+:10D4F00004363E00043C2E0004065A08010649FF8B
+:10D50000D1CB3E00040649FFD1DD84003E07EBDFAE
+:10D510003E07EC032E07EBF4E60AE8048C013E0715
+:10D52000EBF42E07EBCD5A08010744027B37842326
+:10D5300049FFD75D84003C0FFBBB3C0DFBBB2E2796
+:10D54000EBDFE202E81C3C1C021F38508101D813BB
+:10D550004412980096A83C0C02544432938C49FF24
+:10D56000F31C3C1DFBBB3C2C021F94498822A48861
+:10D57000FE17AC083C0DFBBB8C01D5DECA043E2770
+:10D58000EC0DD50B440298003C1C025344326BD87E
+:10D5900044427B9549FFB19C2E0004065A080105C0
+:10D5A00084203E17EC0D2E17EC0DC1472E3028AA13
+:10D5B0002E4028AB9261928144026BD88440E241B4
+:10D5C000E80BA5408C4188A3AD40A5418C1888A4E8
+:10D5D00012507FF5D5F52E00291D3C2FFBBB5A08B4
+:10D5E00001092E000804C80544026BD849FFAE02A9
+:10D5F0003C0C01048C013C0E010484003C0E01052E
+:10D600003C0E01063E07EC073E07EBF73E07EBEB4F
+:10D610003C0DFB83A6015A0803048400D5085A0870
+:10D620000A6C2E07EB9D5A08050684013E07EB9D08
+:10D63000D5635A080462D5F2C85F84213E000436DF
+:10D640003E07EBE83E17EBE13E07EBDF3E07EC0D54
+:10D650003C0E01083C0E01043C1C0105460005B8C7
+:10D6600050000D80E201E9048C213C1E01053C1CA8
+:10D670000106E201E9142E07EBFF3C23FF80E202E2
+:10D68000E8083C23FF7FE202E8042E07FF08C005FC
+:10D690008C213C1E0106D5033C0E01062E07EBE54E
+:10D6A0005A08010F2E07EBF7E60FE8072E17EBF4E9
+:10D6B0005A180A048C01D50284003E07EBF7440295
+:10D6C000996849FFF4F65A0801082E07EBEBE60AC1
+:10D6D000E8038C01D50284003E07EBEB2E07EBBB81
+:10D6E0005A0801083E07EBD884003C0E0105D5041A
+:10D6F00084003E07EBD82E07EBE24E0300852E0098
+:10D700000406C8282E07EC0DC8252E07EC0EC822EB
+:10D71000440298C444129C0449FFD02D2E07FF08F0
+:10D720005A08010B3C0C01065CF000C8E9058401B5
+:10D730003E07EC0ED50F49FFCFF35A0002FA440220
+:10D740009C043C1014B344227B8F49FFE0615A00D3
+:10D7500002F03C0DFB83A6015A0006045A080B1385
+:10D760002E07EC0E5A0001092E0004315A00010563
+:10D770002E07EC07C04884013E07EBD83E07EB9C20
+:10D78000D5422E07EBEB5A000A0E2E07EC0E5A007C
+:10D79000010A2E0004315A0001062E07EC155A0822
+:10D7A000022484003E07EC1584003C0FFB784463A0
+:10D7B000F04A447000553C0DFB92A600C805AFF03E
+:10D7C00049FFF57DD5F9840084213E07EC0E3E002B
+:10D7D00004313E1004323E07EB9D3E07EBE53E0769
+:10D7E000EBEB48FFFA452E07EBF75A080F0D8400C4
+:10D7F0003E07EBE53E07EBF73C1C025144026E701E
+:10D8000049FFC5942E0004065A08010784003C0E07
+:10D8100001053C0E01062E0029145A08010A440293
+:10D82000BC00501000305020005849FFB8D04402CE
+:10D83000938C2E17EC0D2E27EBE62E37EC0349FFC9
+:10D84000DB0B3C0C025F2E27EC18B61F2E17EC0DDD
+:10D8500044026BD8C20744229CB4443298008480AE
+:10D86000D50644229CB44432980084814452938C5F
+:10D8700049FF99333C0C025344129CB42E27EC0D03
+:10D8800049FFECED2E07EBCD5A08010744027B3728
+:10D89000842449FFD5AC2E00292344629CB45A0845
+:10D8A000010A8006441298003C2C025349FFEF1AEB
+:10D8B000D5132E20288180068420E222E80BB46054
+:10D8C000C305A4C2ACC6A4C3ACC78C2150000108D8
+:10D8D000D5F53C1FFBBB2E07EC0D2E17EBC59A416F
+:10D8E000964844029CB449FFAB6249FFC6A1C80DEB
+:10D8F0002E07EBD13E07EBC52E0029135A00010479
+:10D90000480001634800014E3C0DFB8249FFDAF3F9
+:10D910004412980044029CB4490005BB3E07EC0F3A
+:10D920004412980044029CB44900063244029CB45C
+:10D93000441298003C2C025349000A7F44029CB4D4
+:10D94000441298003C2C0253490006AF84003E0765
+:10D95000EBD184003C0FFBBB3C0DFBBBE60AE8C9E6
+:10D9600044100108FE4498F1B4034E020116502100
+:10D970008080A6124E0200F5A7164E4200BB002181
+:10D9800080EB44029CBC5A28030950200010380048
+:10D99000040238110402D506402484003800040231
+:10D9A000A05149FFA3F7842049FFDA7196C15CF1C9
+:10D9B00080973C1DFBBBE90D4400010880464220D6
+:10D9C0008073500100808440AE82AE864430009661
+:10D9D00044000108804642208073005100EB800221
+:10D9E000527180968C48C56CE6A2E94722F000048B
+:10D9F00084805EF7821CE903444004375A58022CA5
+:10DA000044200108FE8C983284A3105000EB505043
+:10DA1000001002F2800245E29C5012F0000C02F26B
+:10DA20008003F489F388F58712F0000D38FF0601B2
+:10DA3000944A883E40048800A449885C41E0C008BC
+:10DA4000A001A051402F3C0449FFDD6EF507F40909
+:10DA5000F308AC2B3C1DFBBB440001088046422070
+:10DA6000807322110004FF3C42408C7344100096E6
+:10DA700040420496AD14D50D2210000A2220000465
+:10DA8000FE7C42110C734420009640108836AC4452
+:10DA90003C1DFBBB4400010880464220807380028D
+:10DAA000501100082200000B22208001FFC44271A7
+:10DAB0000C7344000096407380F6ADC9D5395050C0
+:10DAC00000882212800222400004FE7C42120C7365
+:10DAD0004440009640109036AC442212800322014C
+:10DAE0000001FFCC42700C73407390F6ADD1D5208D
+:10DAF0005011808822F08002225180045270000A66
+:10DB000042F03C245041800842F3947384AA40F7C9
+:10DB100095F62210800312F1800422320001FE44A7
+:10DB200042138C73401094368E01AC61AE123C1DD2
+:10DB3000FBBB440001088046422080732231000470
+:10DB40004E3400048460ACD480464220807380024E
+:10DB50008C08221000014E1400048420AC413C1DAE
+:10DB6000FBBB4400010880464220807380020421F0
+:10DB700000225A2801060400002F5A00010E2E0729
+:10DB8000EBD180468C013E07EBD1440001084220D6
+:10DB900080738420B6223C0DFBBB8C0148FFFEDC69
+:10DBA0002E0004255A0801114402938C49FFCC7EB3
+:10DBB000C80B4402980044129CB42E27EC0D44324A
+:10DBC0007D84490002F084003C0FFBBC3E07EBEA79
+:10DBD0003C0FFBBB2E4028813C6C0220804044124D
+:10DBE0009CD08060447000FFE264E81B0450FFF9A1
+:10DBF000CD0380A2D511A14A385315015CF28100F2
+:10DC0000E807E6B5AD48E9058C019600D502ADC838
+:10DC1000A14FE2A2E9EF8C61501081088045D5E563
+:10DC20003E07EBEA2E07EC0D3C3FFBBB3C2FFBBC59
+:10DC3000C0232E07EBFD5A0803202E0004275A00AC
+:10DC4000010544000090D503440000413C1DFBBC8D
+:10DC50003E07EC1CE2202E07EBFCE805E61EE80C74
+:10DC60008C01D508C0095CF09900E9038400D50255
+:10DC70008E013E07EBFC49FFC4DB5A08020A44024E
+:10DC80009CB42E17EC0D4422980049FFCC543C0D57
+:10DC9000FB83A6015A00030749FF9E70E6034EF37B
+:10DCA00000933C0DFB9A5A08010984003C0FFB9A33
+:10DCB00044027DA449FF9E4A2E07EBF35A00050A51
+:10DCC00044029A0844127DC449FFA1723E07EE2225
+:10DCD00049FF9E5780C05A08015149FF9E4F5A087C
+:10DCE0000305800649FF9E4749FF9E485A080405E0
+:10DCF000840149FF9E403C0C05EF3C0E05F03C00C2
+:10DD000005A83C0BF6272E07EC0D3E07EC0149FF5A
+:10DD10009E29E602E93D49FF9E255A00FF3AFA0E88
+:10DD20003E00043C49FF9E1EC8383E07EBB52E005E
+:10DD300029145A0001392E07EC09C0048E013E0750
+:10DD4000EC092E07EBF35A08050448FFF9303C0DA7
+:10DD5000FB778421AE402E0029135A00010448FFAE
+:10DD6000F7C33C0DFB83A6015A000A0448FFF7BC29
+:10DD700049FFD81E48FFF7B849FF9E005A0803BD67
+:10DD800084003C0E010584013E07EB9CD5B52E00B6
+:10DD9000043CC0C98E01D5C52E07EBB5E60AE8C81C
+:10DDA0008C01D5C43C0DFB83A6015A0006C65A005F
+:10DDB0000BC42E07EC09E602E8BF49FFB6B849FFDD
+:10DDC000B9CFD5BA84003E07EE203E07EE213E07CC
+:10DDD000EE22D5923A6F98BC40608C0390DF4E34AF
+:10DDE0000006FEDAC203FE929ED94E140006FE4AD9
+:10DDF000C003FE029E4984804900003AC6084040A4
+:10DE00008004C405FE4AC003FE029E493A6F98840E
+:10DE1000DD9E920040A14009974192104040A837F2
+:10DE200096D14010C008FE4742020C24E220E809C7
+:10DE30009F21984AE222E905E220E8039F21984ABF
+:10DE40009A484010A81740004008FE2FFECCE2037D
+:10DE5000E80998029E49E202E905E203E803980214
+:10DE60009E499A0340424008FE67DD9EEFD83A6F14
+:10DE7000AAA0FD30FD418384CB51E2E8E81A800876
+:10DE8000490000CCF087C00C4084000C52500020A8
+:10DE90004053140D4073800CFFEF4063000CFD03F2
+:10DEA000804849FFFFB9F18880C084A0F589D52555
+:10DEB000C22C8008490000B2F087C8058AE884A116
+:10DEC000F589D51452F000204084000C804840436E
+:10DED0003C0D4053800C4063000C40029004401302
+:10DEE000BC0D49FFFF99F18980E0FD03804849FF9F
+:10DEF000FF93F188506000004FC20055F307447053
+:10DF0000000040630C0DD54C407420D78420840061
+:10DF10004FC2004CB6DCBF81D548E2E9E9F8800980
+:10DF20004900007CF087C045524000204054100D4D
+:10DF30004024800CFEAF81224084000C4033100D41
+:10DF40004063000C4003800C4013900DFE1F49FFFE
+:10DF5000FF63F18880E0800849000070E2E1E90594
+:10DF60004C13C00DE2C0E80AF3088A299ED9F38851
+:10DF700040302001E2038A2F80038460F3894FC27E
+:10DF800000129A309A79E2C08A2FF307524180201A
+:10DF90004070900C40600C0DFFBF40708C0DB6DCE3
+:10DFA000BF81F008041F80093A6FAA80EC28DD9E2B
+:10DFB0008460E327E903E2C8E90A84A1F5884043C5
+:10DFC00020018AE9E2C48AEF80C4D502F388F3898C
+:10DFD0004FC3FFE7D5E79200425088244010400924
+:10DFE00042500C73960140314009969142F00C2446
+:10DFF00042400824FE8C40078800E20240F7C00837
+:10E000004020400842F08C7340104009882F98222D
+:10E01000E204882F984DDD9EC00EFA20FA6F9B19FE
+:10E020004020040D4032081B4001081B9221C9F812
+:10E030008003DD9EFA10DD9E9681403040099609EE
+:10E04000923042510424FE84FE1C9968E2A040F7FD
+:10E05000C00842F184734012C009882F4002C008F2
+:10E060009802E202882FDD9E8060C207994A08402C
+:10E07000800118418001D9FCDD9E92008060995A90
+:10E08000D30418118001D5FDDD9E92000F10FF0012
+:10E090000D0EFF0000020800000404040406080638
+:10E0A00001082105060604070104040601042206EE
+:10E0B00004040506060101080606050607010422F8
+:10E0C0000404012206040501050701041E1D1B119D
+:10E0D000031E1119110300000000050004000000D8
+:10E0E0000B0B0B0B0B0B0000000000000A0A0A0AC6
+:10E0F0000A0A00003C282828282800000000000008
+:10E100003C1414141414000014141414143C0000CF
+:10E110000000000028282828283C0000426464648D
+:10E120006441000000000000416464646442000037
+:10E13000646464646464614D4C4C4D616464646403
+:10E140006464000000010002010302033C0FFBBFF6
+:10E15000DD9E3C0FFBBEDD9EFC00C0085A08010B93
+:10E16000490004B03C0FFBC1D505490004A83C0F91
+:10E17000FBC0FC808020E6293C0DFBC1E82544F073
+:10E18000E08C3817840040F0BC00DD0F0A3C10160C
+:10E190001C22282E34003C0DFBC0DD9E5000005098
+:10E1A000DD9E500000A0DD9E500000F0DD9E50007E
+:10E1B0000140DD9E500001E0DD9E50000280DD9EAA
+:10E1C00050000320DD9E8400DD9E92003C0FFC0A7F
+:10E1D000DD9E3C0FFC09DD9E3C0FFC0DDD9E3C0FDF
+:10E1E000FC0CDD9E3C0FFC52DD9E3C0FFC51DD9E85
+:10E1F0003C1DFC52440280483C0FFC1CA64D840090
+:10E200008E2196483E17F0763E17F07784213E0720
+:10E21000F0743E07F0753E07F0783E07F0793E0750
+:10E22000F07A3E07F0493E07F0483E07F04A3C1FAF
+:10E23000F9F43E07EE23441280048400845F382002
+:10E2400080088C015A0841FDDD9EFC0049FFCF8803
+:10E25000FC80FC21841F100F800749FFCF89C81064
+:10E26000500F800784404440003F44128004846182
+:10E2700049FF9BED8480800444228004D50A4463D6
+:10E28000F04A4470005549FFCF73C0EBAFF0D5FCA6
+:10E29000381110008C81880196005A4840FB844157
+:10E2A000FE0244121C0080623E07F0BC440280045F
+:10E2B00049FF9BCD84013E07EE2049FFCF61FCA1C1
+:10E2C0003C0FFEF4DD9E3C0FFEF3DD9E3C0FFEF5A1
+:10E2D000DD9E3C0FFEF6DD9E4433F405AE984423EC
+:10E2E000F406AE504413F404AE08DD9EA640A685A5
+:10E2F0003E100CA8A641402120083E100CA9A642C1
+:10E30000A6C63E100CAAA643004000083E100CAB67
+:10E31000A6448841A64796934010A0088823003061
+:10E320000009964B4031A00888643C3806580030FC
+:10E33000000B0040000A4031A00888643C380659B0
+:10E340000030000C3C2806563E300CB40030000D66
+:10E350003C1806573E300CB50030000E96C63E30D5
+:10E360000CB60030000E926196C63E300CB70030FD
+:10E37000000E926296C63E300CB80030000E9263DA
+:10E3800096C63E300CB90030000F3E300CBA00305B
+:10E390000011004000104031A00888643C38065E3F
+:10E3A00000300013004000124031A00888643C385F
+:10E3B000065F003000150040001496CF4031A008E1
+:10E3C00088643C3806600030001592623E300CC212
+:10E3D000003000170040001696CF4031A008886436
+:10E3E0003C3806620000001792023E000CC6400155
+:10E3F0002C0A9606C006440FF000FE873C280656FD
+:10E400004000AC0A9606C006440FF000FE473C18D8
+:10E410000657DD9EA4C04422971C44120000FECF84
+:10E42000B662A4C250410020FECFA8D2A4C4FECF41
+:10E43000A8D1A4C6FECFB66402300008FECFA8E182
+:10E440000230000AFECFA8E20230000CFECFA8E3A3
+:10E450000200000EFE47A864DD9E4413F40BAE08D4
+:10E46000DD9E4413F407AE084413F408AE08DD9EA5
+:10E47000FC004403F5378424AE40840080208040B3
+:10E48000806049FFCE95FC805A0804053C0C01E7EA
+:10E49000D5033C0C01E502000013844C4200887354
+:10E4A00044120000FE0F00000008DD9E5A0804051B
+:10E4B0003C0C01E7D5033C0C01E502000013844C41
+:10E4C0004200887344120000FE0FA001540003FFB5
+:10E4D000DD9EFC002E000CAB84C05A08010384C3EF
+:10E4E0008026840349FFFFD23E07EBDB80268403AE
+:10E4F00049FFFFDE3C0BF62E8420840449FFFFC653
+:10E500003E07EBD78420840449FFFFD23C0BF63151
+:10E51000FC80B44084A08C449C2EA2D196005A5812
+:10E52000200680A05A0824FADD9E5441801F3840FE
+:10E5300094088CA197689265D8F3D5F4B4605050D4
+:10E5400080108001A09F54410003184000019242B6
+:10E550004C02FFFB0401800850108020542000036F
+:10E56000182280019202D9FBDD9EFC404462971C78
+:10E570008423B40684E13C0FFB2D4403F40B852077
+:10E58000AE404403F4054413F407AFC04403F4065B
+:10E59000AFC04403F404109000008402AE0844139A
+:10E5A000F408AE0849FFFF664403F01E1090000017
+:10E5B0004403F420AFC049FFB2094900008849FF75
+:10E5C000FF8A8006441297B849FFFFA580064412CF
+:10E5D000975049FFFFB5490000BCFCC0FC002E105D
+:10E5E000294084003E17EBF13C1414BE3E07EBFDBE
+:10E5F0003C1BF6113C1BFDF43C1014BF3E07EB67BF
+:10E600003C1BFDF53C1014C03E07EBC23C1BFDF665
+:10E610003C1014C13E0004293C1BFDF73C1014C201
+:10E620003C1BFDF83C1014C33C1BFDF93C1014C40A
+:10E630003C1BFDFA3C1014C53C1BFDFB3C1014C6F2
+:10E640003C1BFDFC3C1014C73C1BFDFD3C1014C8DA
+:10E650003C1BFDFE3C1014C93C1BFDFF2E17EB6557
+:10E660003E17EBAE3E07EBEE3E07EBC73E07EBC0B7
+:10E670003E07EB613E07EBFC4400003284213E077D
+:10E68000EBFF84023E17FC0E3E07EB7684203C0431
+:10E6900006623C1BF6123E17EB6C842F3C1FFB44BA
+:10E6A0004010240A9646C104441FFC00FE0F3C0B98
+:10E6B000F62B3C0406604010240A9646C104441F11
+:10E6C000FC00FE0F3C0BF629FC802E0029145A0892
+:10E6D0000118FC002E00299E4900007C2E00299F75
+:10E6E0004900007D2E0029A0490000832E0029A1A9
+:10E6F0004900007A44004A5C49000080FC80DD9EAD
+:10E700003C0FFFC3DD9E3C3DFB2D022180120031FA
+:10E7100080499691AEC03C0DFB2DB4009203963714
+:10E72000AE082E07EBFDC81344120000400104049C
+:10E73000A00454000FFF96033C0BF6103C0BFE00A8
+:10E740003C0BFE013C0BFE023C0814BDDD9EFC00B0
+:10E7500084033E07EBFD84812E07EBF944527D6C68
+:10E760002E17EBEF2E27EBB32E37EBD549FFA90978
+:10E770002E07EBC7C80A44027AF144127AED49FF2A
+:10E78000FFC484013E07EBC784003E07EBFD848194
+:10E790002E07EBF944527D6C2E17EBEF2E27EBB3CF
+:10E7A0002E37EBD549FFA8ED2E07EBC0C80A44026F
+:10E7B0007AE844127AEA49FFFFA884013E07EBC0D9
+:10E7C000FC804423F242AE104403F243AE40DD9E8F
+:10E7D0004413F3C59600AE08DD9E4413F3C69600BD
+:10E7E000AE08DD9E4413F3C79600AE08DD9E4413C9
+:10E7F000F3C89600AE08DD9E4413F3DE9681AC8824
+:10E800008002DD9EFC204472B80084C02E002FB030
+:10E810008CE4E2C0E80F0203839C0013873A2E20A9
+:10E820002FB1846149FFBEA98CC11003873B97B00B
+:10E83000D5EEFCA04423F054AC104403F056AC4099
+:10E84000DD9EFC004403F58784234423F583AE401A
+:10E850008402AE104423F59FFA70AE504423F59B1A
+:10E860004443F58CAE104423F5AD84A5AE5044135B
+:10E87000F5A9845FAE084403F5814413F580AE80AA
+:10E880004403F585AEC08401AE084413F588AE0894
+:10E890004413F589AE084413F58AAE084413F58B8A
+:10E8A000AE088420AE604443F58DAE604443F58EDF
+:10E8B000AE204443F58FAE204443F590AE20444350
+:10E8C000F591AE204443F592AE204443F593AE203B
+:10E8D0004443F594AE204443F595AE204443F59669
+:10E8E000AE204443F597AE204443F53FAF60444328
+:10E8F000F08CAE204443F599AEA04443F59DAEE0C4
+:10E900004443F598AE204443F5A0AE204443F5A11E
+:10E91000AE604443F5A2AE204443F5A3AE20444389
+:10E92000F5A4AE604443F5A5AE604443F5A7AEA0A0
+:10E930004443F5ABAEE04433F5A64443F584AE184A
+:10E940004433F5AEAE184433F5AFAE184433F5B0EA
+:10E95000AE184433F5B1AE184433F5B2AE58443373
+:10E96000F5B3AE584433F582AE98FA71AEE0444345
+:10E97000F586AE204443F59AAEA04443F59CAEE044
+:10E980004443F59EAE204443F5A8AEA04423F5AA27
+:10E990004443F51AAED04423F5AC846AAE10442348
+:10E9A000F56BAED02E200CB84433F51BAE605A2860
+:10E9B000011D4403F51CAE58AE804403F51DAE4066
+:10E9C0004403F51EAE404403F51FAE404403F51466
+:10E9D000AE404403F515AE404413F518FA14AE08E2
+:10E9E0004413F519AE08D51DAE184433F51CAE1806
+:10E9F0004433F51DAE184403F51E846CAE40440349
+:10EA0000F51FAEC04403F514AE404403F515AE4007
+:10EA10004403F518FA34AE404403F519FA2BAE401E
+:10EA20004403F56A8421AE404413F5B4840FAE0864
+:10EA30004413F5B54433F516AE084413F5B6840314
+:10EA4000AE084413F5B7AE084413F5B8AE08441346
+:10EA5000F5B9AE084413F5178400AE18AE084403A8
+:10EA6000F5BA5A280104AE80D5038422AE4044038F
+:10EA7000F566842E4423F567AE408402AE1044232D
+:10EA8000F568AE504413F5694423F340AE0884386A
+:10EA9000AE504423F524AE504423F525AE50441324
+:10EAA000F523844AAE884413F344AE0884008020E2
+:10EAB0008040806049FFCB7CFC8044023E6CDD9E40
+:10EAC00044021E00DD9EFC204403F0C03C0FFB20EE
+:10EAD0004403F0D44410021CAC4084003C0FFB788B
+:10EAE0004463F0F44473F04AA6309600C007440033
+:10EAF0000055AE3849FFEBE3D5F84413F0C284412A
+:10EB0000AE884413F0CC44200036AE884413F0E8BD
+:10EB1000AE084413F069AE08FCA092084413F0D488
+:10EB20009601AC08DD9EFC00840049FFC21C440233
+:10EB30000BFC3C0FFB314402111044227D5C3C0F66
+:10EB4000FB294402163484213C0FFB338400AE5071
+:10EB5000AE51AE12AE13AE14AE55AE1644229AB8F4
+:10EB6000FA7DACD1ACD244300032123100084430CE
+:10EB700000641031000AFA6444500078848A10312D
+:10EB80000012FA64AE561011000EAD56AD1410010D
+:10EB9000000B1231000A44227D804460005FAE50B9
+:10EBA000AE1144223BFC3C2FFB2E44223C083C2F60
+:10EBB000FB2244223C143C2FFB3644227DC8AE503D
+:10EBC000AE51AE12AE13AE14AE55AE1644229844FA
+:10EBD0001001000EAD91AD92ACD410310012446022
+:10EBE00000648463AE5612610008AD561001000B3C
+:10EBF0001041000A1231000A44227D8CAE50AE1141
+:10EC0000FC803C0FFFC5DD9E3C0FFB53DD9E3C0F9F
+:10EC1000FFC9DD9E3C0FFFC8DD9E3C0FFFC7DD9E98
+:10EC20003C0FFFD6DD9E440294C88420AE40AE4126
+:10EC3000AE42AE43AE44AE45AE46AE47DD9E3C0F5F
+:10EC4000FFDCDD9E3C0FFB55DD9E3C0FFB54DD9E43
+:10EC50003A6F9ABCEFFC3C0FFFDE49FFCADB3C0F6A
+:10EC6000FB5649FFCAD7500002883C0FFB57EC0403
+:10EC70003A6F9A84DD9E5020002044123D44A851F2
+:10EC800044123C1CB62244123CB0A85244123DD45B
+:10EC9000A85544123D40A85644123CACA854441216
+:10ECA0003DD8A85344123E68A857DD9E4413F30292
+:10ECB000A6089600E41EE808A6084413F01F8C027C
+:10ECC0009600AE08DD9E4403F01FFA2FAE40DD9E95
+:10ECD000FC008400802049FFFDAF49FFFEF649FF9C
+:10ECE000FC4649FFCBF949FFFFE349FFFF1E49FFFF
+:10ECF000FDAA49FFBA3D49FFC12649FFBBA549FF0F
+:10ED0000EAF3FC80FC403C0DFB8680C15A080410ED
+:10ED10002E002913C00C840249FFDA3C840349FF0A
+:10ED2000DA393C0DFB865A08042AD5174473F04A99
+:10ED30004490005549FFBC7C5A0002EF840149FF12
+:10ED4000DA298420846110938000840280418081CC
+:10ED500080A349FFC9D8D5EF49FFBC6A5A00020F0A
+:10ED60002E7029135A78010B800749FFBD5184008A
+:10ED700049FFA697800749FFBC2484003C0FFB781D
+:10ED80004473F04A449000553C0DFBA6C00C84052A
+:10ED900049FFDA00840649FFD9FD2E0003645A08B2
+:10EDA0000128D50D49FFBD385A0801F3840449FFF5
+:10EDB000D9F11093800049FFEA82D5E73C0DFB862C
+:10EDC0005A08041749FFBC345A0002132E002913B5
+:10EDD0005A08010F49FFCAEA840049FFB45E3C0D9E
+:10EDE000FB83842049FFCBD28402AE31D513804609
+:10EDF0008405842049FFB47E3C0DFB83842049FFB9
+:10EE0000CBC58402AE31840149FFBF12840749FF9C
+:10EE1000D9C1FCC03C0FFB61DD9E3C0FFB51DD9E68
+:10EE2000502000202E100CAB5A1001048420D50273
+:10EE30008423181000014C017FF7DD9E3C0FFFE793
+:10EE4000DD9E3C0FFFE6DD9E3C0DFFE7A4413C1B31
+:10EE5000FFC5A444A6003C1BFFC43E07FF86DD9E01
+:10EE60003C0FFB63DD9E3C0FFB62DD9E3C0FFB64B1
+:10EE7000DD9E3C0FFB65DD9E3C0E00B5DD9EFC007B
+:10EE800049FFC96E84203C0E00BF101000501010C6
+:10EE9000005110100052101000531010006010109C
+:10EEA0000061FC803C0E00C0DD9E3C0FFB67DD9ED8
+:10EEB0003C0E00D5DD9E3C0E00D4DD9EFC402E3085
+:10EEC000287A2E1028AA2E20287B42008C243C0869
+:10EED00014452E0028AB92214240082492013E00A6
+:10EEE00028B22E0028823E2028883C4814463E1036
+:10EEF00028B13E3028874422B800C00284013E0079
+:10EF000029104452B800444F64784412B82498EC55
+:10EF1000080280019602AE18D9FB44521C9C443D65
+:10EF2000EAD844021CA4986B38110410181280010E
+:10EF3000D8FB44321C7C44221C7DA618A6509602A5
+:10EF4000964AAE58AE1044321C7E44221C7FA6184E
+:10EF5000A6509602964AAE58AE102E10287B2E0070
+:10EF6000287A84C0FE0C3C08145644024E203C6FA4
+:10EF7000FB8549FFFA513C0C01E5442218CA3C0FBD
+:10EF8000FB7944321C5E44121C5C440218C84442A3
+:10EF900018C4AD98AD88AD80AD903C4FFB92444213
+:10EFA00018C53C4FFB77444218C63C2FFB823C3FC0
+:10EFB000FB933E67EBE23C1FFB943C0FFB713C4F25
+:10EFC000FB83A50884E158420002AD08A5088541ED
+:10EFD000FF3FAD08A548444FFF7FFF2EAD08A508B1
+:10EFE000852258420020AD08A548444FFFBFFF2EA0
+:10EFF000AD08A448AC58A65058108002AE50A65098
+:10F00000FE7FAE50A650541080FBAE50A650AE40CE
+:10F010002E0029203E67EC0B3E07EBCD440FFFAAE4
+:10F020003E07EBD4440000553E07EBD93E07EBCE3C
+:10F030003E07EC083E67EBF83C7E01033E67EC0EB2
+:10F040003E67EC073E67EBDA3E6004323E67EBAFAB
+:10F050003C6BF62D3C6BF6303EA7EBF33EA7EBBDC9
+:10F0600049FFFF0F3C0DFB833E67EB7A3E67EBBB2E
+:10F070003E67EB7BAF813E67EBD03EA7EBE93E6797
+:10F08000EBB9AF802E0029113E67EBF93E00042456
+:10F090003C0DFB923E67EBEF3C6E05EF3E67EBD518
+:10F0A0003C7E05F33E6004253E6004263E67EBB3DC
+:10F0B000109000003C0DFB7710900000440298C4B3
+:10F0C0003E67EBC33E97EBB149FFFDD744026E703C
+:10F0D0003C0E02A344026E203C0E02A444026D8C3E
+:10F0E0003C0E02A544026CF83C0E02A6440000321D
+:10F0F0003C0804883C08048C44029C8C3C0E02456D
+:10F10000440297103C0FFB8E840A3E07EDC82E0088
+:10F11000287B3C6BF6343E0029AD80063C6BF63212
+:10F120003E67EBB83E67EE343E67EDC93E67EDCA19
+:10F1300049FFF814800749FFF811800649FFF81CC1
+:10F140003C0E021E800749FFF8173C0E021F840286
+:10F1500049FFF8123C0E0220840349FFF80D3C0ED3
+:10F160000221840449FFF8083C0E0222840549FF6D
+:10F17000F8033C0E0223840649FFF7FE3C0E0224EE
+:10F18000840749FFF7F93C0E0225840849FFF7F48C
+:10F190003C0E02264402A7043C0FFB7B3C001445B6
+:10F1A0003C1015523C0815503C0014463C6E0108BA
+:10F1B0003C0815B93C0015533E67EBD840001C0CC9
+:10F1C00088013C0815543C0015BC3C1015BB4000A0
+:10F1D0001C0C88013C0815BD4402BC603E60041C48
+:10F1E00049FFF8024402B80049FFF80149FFF82F2F
+:10F1F0003C0FFB8749FFF7FE44029CB43C0E02A182
+:10F20000440298A43C0E02A244027DA43E67EE2173
+:10F210003E67EE203E67EE223E600A803C0FFB8F89
+:10F22000845F3C0DFB87843F382018088CC65A68E1
+:10F230003CFA3C0DFB8784C084E11010003C1010A8
+:10F24000003D2E0028833C6E01053E07EB883C6E96
+:10F2500001063E60042C3E60042B3E60042D3E609F
+:10F26000042E3E67EDFC3E67EDFE3E67EDFD3E770A
+:10F27000EBDC3E67EBF63E67EBB43E67EC093E67BE
+:10F28000EBE03E67EBCF3E67EB833E67EB843E6788
+:10F29000EB893E67EB7C3E67EB8E3E67EB863E6715
+:10F2A000EB8A3E67EB803E67EB8D3E67EB913E60FD
+:10F2B000043149FFFCBA4400005AFA493C080518D9
+:10F2C0003C28051C440000963C2DFB823C08051997
+:10F2D0003C08051EFA183E60042F3E600A293E6075
+:10F2E0000A2A3C08051F84053C080521A610441085
+:10F2F0000064540000F73C1805163C6805173C688C
+:10F30000051A3C68051B3C68051D3C6805203C68E7
+:10F310000522AE10FA043C08040C440003843C08A7
+:10F32000040D840F3E00081E84063C18040E3E00A7
+:10F3300008203E6004303E6008043E6008053E60E0
+:10F3400008063C6804053C68040B3E60081F3E60EC
+:10F3500008213E70082249FFCA05FA083E00082429
+:10F3600044024E003E67EC033E67EBE63E67EBED82
+:10F3700049FFF7BE2E0029145A08010449FFF9304D
+:10F380004402A7243E7004283E77EBE749FFFD4A7C
+:10F3900084003C0FFB783E07EBE33C0FFB893E0704
+:10F3A000EBF73E07EBEB2E1028882E00288749FF4D
+:10F3B000FA0AFCC0FC014462B8B8800649FFFC238D
+:10F3C00050037F48F08149FFFD4D9C3449FFFD4DBE
+:10F3D0005003007849FFFD52500300A849FFFD4843
+:10F3E000500300C049FFFD47500300CC49FFF6B071
+:10F3F00050037F48F08149FFF6AE50037F48F0810B
+:10F4000049FFFD55500300B049FFFC1E50037F48E3
+:10F41000F08149FFFC1C50037F48F08149FFFBF657
+:10F420005003011849FFFD0C50037F48F08149FF4C
+:10F43000FD0A49FFFD0B5003012C49FFFBEA500375
+:10F440007F48F08149FFFBE8500303A849FFFBE731
+:10F4500050037F48F08149FFF73E5003017049FF98
+:10F46000F7375003031849FFF6B950037F48F0817E
+:10F4700049FFF6B75003036C49FFF6AA50037F48D3
+:10F48000F08149FFF6A85003037C49FFF71B5003A6
+:10F490007F48F08149FFF719500303B449FFFCBFCF
+:10F4A00050037F48F08149FFFCB73C1DFB823C0DB7
+:10F4B000FB9449FFCA7F500303D849FFFCFB50036C
+:10F4C0007F48F08149FFFCF95003004849FFF91AD1
+:10F4D00050037F48F08149FFFBBD50037F48F08116
+:10F4E00049FFFCE250037F48F08149FFFBAA50032B
+:10F4F0007F48F08149FFFB96FC81FC402E07EBFD25
+:10F50000E602E8062E77EB602E97EB62D5052E77A4
+:10F51000EB692E97EB6584C02E0028A7E2C0E80BAC
+:10F5200080063C17F610804780698CC149FFB2B74E
+:10F5300097B0D5F3FCC0FC4480E0F1843C0DFB4067
+:10F5400044127D6CF28549FFAD543C1DFB92840151
+:10F5500084C0AE083C1DFB778127AE0884013C6F58
+:10F56000FBA349FFC51CE6E9E902852885403C6FFD
+:10F57000FB7880CA4C6480D44483F04A4410005520
+:10F5800010140000F18749FFF07140031C3784001C
+:10F590003E07EC043C0DFB83F186F107A6018E0AC1
+:10F5A000E602E813101400004403F403A6005A0016
+:10F5B00001FD3C0DFB83842049FFD1BF84003C0F3B
+:10F5C000FBB3840149FFAC44540480FF5084FFFF27
+:10F5D000F0872E17EC042E0028A7E2204EF2009DA3
+:10F5E0003C0DFBA35A0001045AA801F584203C1FDE
+:10F5F000FBA32E07EC048C0196003E07EC042E279B
+:10F60000EC042E0028A6E202E82D2E37EC04F206C8
+:10F610008A60B6FFCA0AF004F281F2828020F20505
+:10F6200096D8FA9484A1D51BF004F181F18244228A
+:10F6300006DC802096D8FA9484A1490000752E0734
+:10F64000EC042E3028A6F10584A19AC3B6BFF5813B
+:10F65000F582440206DC804196D8FA9449000064A1
+:10F66000D50D2E57EC04D80A2E0029145A0801078C
+:10F6700044020520F10749FFB5402E0029145A081D
+:10F6800001112E17EC042E5028A6D9193C1DFB772A
+:10F69000AE084C6440152E07EBFD5A080311D50B3C
+:10F6A0003C0DFB778421AE404C64400A2E07EC00F1
+:10F6B0005A0806063C0DFB778420AE402E00291424
+:10F6C0005A0801162E0028A72E57EC048E02D80FD8
+:10F6D0004C64400E2E07EBFDC80A84033E07EBFD89
+:10F6E0003C0DFB8349FFAE4449FFFF093C5DFBB382
+:10F6F0002E07EC048540D0073C0DFBB32E2028A636
+:10F7000040A100062E07EC042E5028A74C507F6322
+:10F71000854048FFFF608CC148FFFF2E840049FFF1
+:10F72000C43EFCC4FC593C6DFB2D4490003C048F4E
+:10F73000803A02730016026300124261A4734432DD
+:10F740000000FF9FFEFF0093000644700060F481FC
+:10F7500004FF803C3C6FFB2A42349C734E830003C1
+:10F760008501E90285E150AF800851E18060812A7E
+:10F77000A3D955C383FF13C4800041C3A80992F4E1
+:10F7800055CE03FF547383FF13C4800112748002AB
+:10F790008D264C3F7FEF8780F3014DC180380233C7
+:10F7A0000014029300150A7500014044801396D995
+:10F7B000B69F03E500235A73FF139261886796D9B9
+:10F7C000F43B38708D11FFE44093BD3738700D1154
+:10F7D000FFEC4073A0F788E938710D095BE3FF1473
+:10F7E000B47FF43B9261887E96D938708D11FFE426
+:10F7F0004093BD3738700D11FFEC4073A0F788E9D6
+:10F8000038710D0951CE0001D5C8FCD9FC412E003C
+:10F81000293444120000442230004442351044325E
+:10F82000051049FFFE8A2E10287A2E47EB69B63F55
+:10F830002E10287B2E57EB60F1812E17EB6284008F
+:10F8400081218AA43C0FFB843C0FFB733C0FFB74AB
+:10F850002E77EB6597218020804044A230004482BF
+:10F860000BFC3C301456E243E82F41E104084432DB
+:10F870002A60406F0C00403F280041EF200002F159
+:10F88000800003EF000040F79DF6A4D841EF27D693
+:10F8900041E7F80141EF17D640319C764232787348
+:10F8A00096D9ACF02E30287A40F10FD6926140FF05
+:10F8B0000C07A4F05031FE3EE9038803D5028823EB
+:10F8C0008C419691D5CFB47FF20144428BA0FE9C2F
+:10F8D0004031080A8823904140108837501081C277
+:10F8E00088033C1FFB84400008172E10287B500023
+:10F8F00001C23C0FFB7394492E37EB6584004452E0
+:10F900008C38E001E80A3822810140210C56382267
+:10F9100001098C019601D5F62E07EBD6C8123E07D9
+:10F92000EBFD3C0DFB8349FFAD2344020BFC44126D
+:10F93000000049FFBED244020BFC44123000D51730
+:10F9400084032E27EB6944428CC83E07EBFD2E173B
+:10F95000EB622E07EB6080A43E27EB633E37EB6B38
+:10F9600049FFB3034402300044120BFC49FFBEB50B
+:10F970004403F04A44100055AE40FCC1FC418401F0
+:10F980003E07EBC22E0029145A0801352E07EBE979
+:10F99000C0032E07EBFD3E07EBD684003E07EBC409
+:10F9A0003E07FF083E0004293E07EBFD3E07EBFA49
+:10F9B0003E07EB682E07EB602E20287B3E07EB63AB
+:10F9C0002E07EB6284203E07EB6B949144028D5826
+:10F9D00049FFB3024402231084204420004849FF19
+:10F9E000B2FB440224C04410FFFF4420004849FFFA
+:10F9F000B2F33C0DFB8384203C1FFB40A601F18148
+:10FA00003E07EC0049FFBFEB3C2DFB83F1015A0898
+:10FA100002098404AE11800249FFCF8F842DD507DF
+:10FA20008409AE11800249FFCF88842A3C0DFB83F4
+:10FA3000AE413C0DFB8349FFAC9B2E0029145A08B4
+:10FA4000010449FFFD5C840849FFDD7B2E00291E6F
+:10FA50005A08010449000468840C49FFDD722E60D5
+:10FA600029145A68013249FFB0D72E20287B44025E
+:10FA70008CC88420949149FFB2AF2E20287B440289
+:10FA80008C388420949149FFB2A72E07FF08C8192B
+:10FA90003C0DFB8349FFAC6C4412000044220BFC7C
+:10FAA0004432051044423BFC2E00293449FFFD45F9
+:10FAB000840D3E67EBE749FFDD4449FFFEA9D51001
+:10FAC0002E00299DD5032E00293444120000442223
+:10FAD0000BFC4432051044423BFC49FFFD2E49FF1C
+:10FAE000BF7E3C1DFB832E27EC005A0802069E12A7
+:10FAF000E602E804D5055A200204AE89D503840D38
+:10FB0000AE092E0029145A0001153C0DFB8349FF54
+:10FB1000AC2F840084233E07EBE53E07EBF73E075E
+:10FB2000EBEB3E07EBC33E17EBB13E07EBC2FCC16C
+:10FB300084C04490009044728DF42E0028A6E2C048
+:10FB4000E8E5441205204213247344028CC8442083
+:10FB5000004849FFBD9744200048421308249449B7
+:10FB600044028CC888278CC149FFBD8C97B0D5E66C
+:10FB7000FC41B421003F8030009F802C0210801493
+:10FB8000B67F9649CA07021F8014AD00AD42AC4152
+:10FB9000FCC14031200954A1800144320000FE5FC5
+:10FBA000F1818781B43FE321E8EF44100058048FCE
+:10FBB000800185E04284847380EF88E8842040607F
+:10FBC000840995B254308001886640608C093823DE
+:10FBD0008C089786403090095063004C94DA886610
+:10FBE0008867546080075AA8010901E180004065D8
+:10FBF000180C406F1804D508406E180C01E1800005
+:10FC0000FFB3406F18028C219648AF985A1825D937
+:10FC100084E25AF0010485E1D5D15014800154905A
+:10FC200080FFD5C1FC4580E03C0DFB2DB63F812215
+:10FC3000B45F020000124410003C420104734462AD
+:10FC40000000FE373C0FFB2A8009F382F48449FF51
+:10FC5000D781FE37F0854E930011F0028029844150
+:10FC6000B47F49FFD66B8421F0048041B47F49FF03
+:10FC7000D6658149FAD5D503FB5484C0B41F49FF2A
+:10FC8000D785F083B41F001F80008C044000A41AA5
+:10FC90009600F086F00295B14080180040050408F7
+:10FCA000854080C8F087802A14AF8001542500FF6A
+:10FCB000CA228009F189F28849FFD83AF208F1098D
+:10FCC000C04F8009F188F28149FFD84644320000D4
+:10FCD000FE1F3C5DFB2D3C3C01E7F201F108DB031C
+:10FCE000A53AD502A539F303A40040000C16F3068B
+:10FCF000F381D519F107400504088801F104880152
+:10FD000002107FFF5A13FF2D3C0C01E73C5DFB2DD9
+:10FD1000D803A53AD502A538F005F303380005014C
+:10FD200040000C162E37EBB22E57EBF051E1FFFEE0
+:10FD30009B04E0BE9723E86CE669E822C5395A5077
+:10FD40000146220300004E0400048400AC3022F37C
+:10FD500000005EF78200E904440001FFAC308D41F1
+:10FD60008CC25AA825A55A900104480000E88420B6
+:10FD7000F0028041B47F49FFD5E1480000E03C0338
+:10FD8000F62A4E45000CCA06022400009A104800CC
+:10FD900000C4A4B08802480000CFCA0602240000B4
+:10FDA0008802480000BAA4B09A10480000C5CA08EA
+:10FDB000F30144223BFC38010D09480000AB44220A
+:10FDC0003E6C38010509480000B5CA13F30144220E
+:10FDD0003BFC38210D118A024E040003FE029603FB
+:10FDE00040420096020400009B0412440000D5AA81
+:10FDF00044223E6C382105118A024E040003FE02A3
+:10FE0000960340420096A4308880AD30D59B4C5F6D
+:10FE1000402CCA0E05EF800144F235103847F9092D
+:10FE200002F400004E45001650F7FFFFD51440F0D5
+:10FE3000840845E230003847F80945E23E6C38074F
+:10FE4000F8094E45000C02F3000050F78001D50A76
+:10FE500050F7800112F40000D50702F3000050F7BC
+:10FE6000FFFF12F300008E614C51FF6D4E450045BF
+:10FE7000CA11F20144023510380009114E04FF6323
+:10FE8000FE029603E0804EF3FF5E020400008E0146
+:10FE9000D5433C2C01E73C5DFB2D40F08408443207
+:10FEA0003E6CDA0F38278C118A024E040003FE02E2
+:10FEB0000223800D96C3E043E8111203800DD50E96
+:10FEC00038278C118A024E040003FE020223800CA4
+:10FED00096C3E043E8031203800C4402300038006C
+:10FEE00005114E04FF30FE029603E0804EF3FF2B17
+:10FEF000A4308C01D520FF229723CA12F2014402BC
+:10FF00003510380009114E05FF1EE0044EF2FF1BAC
+:10FF1000020400008C011204000048FFFF14440298
+:10FF20003000380005114E05FF0EE0044EF2FF0BC5
+:10FF3000A4308E01AC3048FFFF06FCC5FC40EE78D3
+:10FF4000B63F814084208102B006442000B049FFC2
+:10FF5000FA6E8420442000C0B03249FFFA68840160
+:10FF600049FFC01D84013E07EBBE3C5DFB2D3C0CF0
+:10FF700001E7D0078400B43F3C0FFB4049FFA8399C
+:10FF80003C1DFB928401467EFFFFAE083C1DFB77C3
+:10FF900084C050738FFFAE0884003E07EBF03C0D29
+:10FFA000FB2D8380B90C92309646F181BA0C441E29
+:10FFB000FFFFFE56B98C96304C64001549FFD5D42E
+:10FFC00044120000FE0F8380B083B90C3C0FFB2A63
+:10FFD000923C964638130808B90C8CC1FE7EB98C49
+:10FFE000D5EB2E000432C8183C5DFB2D3C0C01E71C
+:10FFF000D0043C0C01EFD8042E00296BD5032E0051
+:020000021000EC
+:10000000296A469010003E07EBB28D2184C045C39B
+:10001000F403480000A1840AD5F54403F04A4410D3
+:1000200000558F21AE404E92009F84003E07EC04A5
+:1000300084003C0FFBA349FFBCD25A0002044800D5
+:10004000009484012E17EBF03E07EBB444000080CF
+:100050004000040E9601C80284013C0BF62A3C5D68
+:10006000FB2D3C0C01E74C50009249FFBCB85A00F4
+:1000700002044800008C3C0C01EF3C5DFB2D4C5011
+:1000800000863C0DFB2DA1C692EA97EF2E07EC04EB
+:10009000E207E84E3C0DFBA35A000104480000941F
+:1000A0002E07EBB22E17EBF08E01E0204EF30092FC
+:1000B00084003C0FFBA32E07EC043C5DFB2D8C0160
+:1000C00096003E07EC043C0C01E54C5040A72E077F
+:1000D000EBE95A000104480000A12E07EC042E5061
+:1000E00028A64C50409B2E27EBFD4E2300972E0058
+:1000F00029145A000104480000912E0029265A00B4
+:1001000001044800008B4402052044128DEC49FF95
+:10011000AA9A49FFBC645A0802753C03FF7F3C1051
+:1001200014CCE220E86884013E07FF0884C02E0753
+:10013000EBF03C1C01E73C5DFB2D8C013E07EBF036
+:100140002E07EBB24C50C0B72E57EBF0D804840208
+:100150003E07EBBE2E07EBBE5A08010448FFFF5FC7
+:10016000480000B5D5002E07EBF04E03FF6C3C0DA8
+:10017000FB865A0804058409100500013C0DFB8329
+:10018000842049FFCBDA48FFFF5E84003C0FFBB3BD
+:100190004403F04A44100055AE40000E00005A00DF
+:1001A00001FE000500015A0809073C0DFB8384206D
+:1001B00049FFCBC3840149FFA64B84013E07EBB442
+:1001C00048FFFF615A60010448FFFF6248FFFF6A71
+:1001D0002E07EC042E5028A64C507F6C3C0C01E7F7
+:1001E0003C5DFB2D4C503F663C0DFB778421AE40BF
+:1001F00048FFFF603C03FF812E1029A3E220E99411
+:1002000049FFBBED5A00020A3C2014CC3C13FF7F8F
+:100210008403FE14E001E9882E07EC0449FFD57A37
+:100220005A0001073C0C01E73C5DFB2DD8302E073E
+:10023000EC0449FFD563B61F2E07EBB22E57EBF047
+:100240008E01D81549FFBBCB5A0802123C0C01E7BE
+:100250003C5DFB2DD80C3C0DFB778421AE40840D1A
+:10026000100500013C0DFB8349FFA88244029770F2
+:10027000B43F8440B0C6B13249FFFCD64402977007
+:10028000B43F8441B0C6B13249FFFCCE3C5DFBB304
+:100290002E07EC0484C0D0072E07EC042E6028A69D
+:1002A000406300062E57EC044C53FEF284C048FF16
+:1002B000FEEF2E17EBFD4E13FF492E17FF084E12CF
+:1002C000FF453E07EBF048FFFF41840049FFBE6752
+:1002D0003C2DFB2DF001838240104008BB0C440EE6
+:1002E000FFFFFE1EFE0F467EFFFFB88C84C05073DA
+:1002F0008FFF96304C64001649FFD436441200003C
+:10030000FE0FB0438380381304003C0FFB2A96464F
+:100310004020F008B90C8CC1FE7EFE57B98CD5EA9E
+:10032000ED88FCC0FC432E000432C8142E00296A5C
+:100330005A000A073C9014B63C7014B7D5044470B8
+:10034000010081272E00296B5A000A0A3C6014B86C
+:10035000D5084460010080E68126D5034460010091
+:100360003C0014B23C4014B0B61F8400F0812E0053
+:1003700028A53C5014B180678540F08244127D6C02
+:100380004402977080493CA804003CA8040149FF3E
+:10039000FBF13C0DFB8344127D6C2E2028A749FF06
+:1003A000FDCF840949FFD8CD2E0029145A08013BFE
+:1003B0002E8029265A8801372E07FF08C0332E17B2
+:1003C000EBFDC930F1853EA004283E80042949FF99
+:1003D000B012F105840A3C1E01063E8004283E80CE
+:1003E00004273EA7EBE749FFD8AC3C0014B2F10567
+:1003F000B61F2E0028A5F181F08244127D6C4402C4
+:10040000977080493C4014B03C5014B1806749FF5C
+:10041000FBB13C0DFB8344127D6C2E2028A749FFC5
+:10042000FD8F49FFBADC3C1DFB835A080209840595
+:10043000AE098001842049FFCA80D5038409AE0932
+:100440003C0DFB8349FFA794840B49FFD87A3C00FD
+:1004500014B284EAB61F840B3C4014B03C5014B173
+:10046000F08244127D6C4402977080468066F7816A
+:1004700049FFFB803C0DFB8344127D6C844149FFA6
+:10048000FD5F84003E00043249FFBAA95A08020603
+:10049000842D3C0DFB83D50C3C0DFB83842049FF50
+:1004A000CA4C2E17EC003C0DFB835A100204AE41DF
+:1004B000D502AFC13C0DFB8349FFA75AFCC3FC002A
+:1004C0003C1DFB928402AE083C1DFB77AE08840104
+:1004D0003C0FFB40440000A249FFD8293C0DFB83A0
+:1004E000A6015A080D128400847F3C2DFB87843FAF
+:1004F000383100088C065A083CFA3C0DFB87101076
+:10050000003C1010003D49FFCE633E0004052E0064
+:10051000288384C0520000013E67EBAF49FFC80347
+:100520003E60040649FFC3A9FC803C0C01E50200C3
+:100530000016DD9E3C0DFB2D02000015DD9E3C0CDF
+:1005400001E5DD9EA44044020000FE0F3C0E01EBDD
+:10055000DD9E3A6FA6BC3C1DFFDEA1440220801A3E
+:100560002E17EB915A1801082E20287B0430000B1F
+:100570009491D50280653C13F6173C43F616E224AD
+:10058000E9073C6DFB563C7DFB578420D5568C21FA
+:1005900096493C1BF6175A10010580038420D53379
+:1005A0008400443FFF804440007F9641E222E87A85
+:1005B0003C1DFB56383080083C1DFB5738408008F6
+:1005C0008C01D5F43C6DFB563C3DFB572E57EB910F
+:1005D00038430410383184105A580106A540976BEF
+:1005E00090A2AD40A540976BE085E911A540976BBF
+:1005F000E0A3E918384304083C4DFB578C0238321D
+:1006000004088C2196C9E262E9DED54CA500972347
+:100610005EF20080E804A5009723D5E94440007FFE
+:10062000D5E6A4C096DB5EF1FF81E904A4C096DBA9
+:10063000D5E2443FFF81D5DF96C9E262E813384333
+:1006400004103833840040422008FF1F94C94092B0
+:100650008C008C2112448000049000058869AD183C
+:10066000D5EC84C03E67EB863E67EB7C49FFDE52EB
+:100670002E07EB915A0801143E07EBBB84203C0D7A
+:10068000FB833E67EBF649FFD1703C0DFB8384236F
+:10069000AE4149FFAE85840049FFC4AA84003E07ED
+:1006A000EB913A6FA684DD9E2E17EB925A182546E1
+:1006B0003C2DFB2D84203E17EB92023100123E1799
+:1006C000EB8C44120000FE5FB4623A6F98BC9263F8
+:1006D0003C1FFB2A96F73C5DFFDE8440FAC80212FD
+:1006E000801AE241E80DB480945188818C41A46065
+:1006F0009691FE7440108C379649AC60D5F149FF55
+:10070000DE0984003E07EB7C3E07EB803E07EB846E
+:1007100049FFE15B840049FFC45A2E07EBF984814D
+:100720002E17EBEF44527D6C2E27EBB33A6F988473
+:100730002E37EBD548FFAB14DD9E3A6FAABCEFF421
+:10074000840044529518843F444295304432953C8D
+:100750004422952438128008381200083811800885
+:10076000381100088C0144A29518448295304462E7
+:10077000953C447295245A0809EF85202E07EB9387
+:10078000E320E8453C13F61A4402000041C080040F
+:1007900050048001549000FF80293C03F61549FF66
+:1007A000ACDD842C43C00473803C8440B4015A20E7
+:1007B000022294D240540C00848054F0000792032B
+:1007C0005AF80204389290088C815A4804F8A50916
+:1007D000886A84005452000792835A580204389160
+:1007E00080088C015A0804F88C418C245A2803E0B4
+:1007F000D5C6541000075A1802043E9005B0921056
+:1008000096175A0802BD3E900598D5B985208508EF
+:100810002E07EB93E320E850800949FFD060814028
+:100820003C0DFB2D45C20000802A0230001540001F
+:10083000700496D9F38149FFAC91F301842C4031C7
+:10084000F004423004738400B4435A00022195023C
+:10085000972084205451000792435A580205994C1E
+:100860003853A8088C2196485A1804F6A499842075
+:100870005451000792435A580205994C385328089E
+:100880008C2196485A1804F68C64D50D5411000733
+:100890005A1802043883A808925096975A280204DE
+:1008A000388328088C0196005A0803D05004800130
+:1008B000549000FFD5AEEC0C3A6FAA84DD9E3A6FDF
+:1008C000AABCEFFC850084C1812180E28383814042
+:1008D0003E67EB843E87EB923E87EB8B49FFFE271A
+:1008E0003C0BF61449FFFE2D3C0BF61549FFFE2488
+:1008F0003C0BF61A3E87EB8C3E87EB855A78030853
+:1009000084013E67EB8049FFC362D5228421804188
+:1009100080614400FBA03E67EB8E49FFC01D84410F
+:100920008062441000FA44001CA049FFC0158441B5
+:100930004400D9B0FA20806249FFC00E5AA8AD0524
+:100940003E67EB85D5055AA8AE043E67EB8B500594
+:1009500000559600E602E8068404490007FA3EA71F
+:10096000EB7E54048002C01C5A90030445C15C0015
+:10097000801C441262004420140049FFEF534400DD
+:1009800002EE49FFC7BD5A7803074402622049FFBF
+:10099000FDDBD50F4402622449FFFDD6D50A49008C
+:1009A00007B84E92FFF25A980105801C49FFFDCC12
+:1009B0002E07EBF984812E17EBEF44527D6C2E2726
+:1009C000EBB32E37EBD549FFA9CB3C0DFB2DA00691
+:1009D000920A962F3E07EB935A780307EC043A6F7E
+:1009E000AA8448FFFEACEC043A6FAA84DD9E3C3D2D
+:1009F000FB2D44120000FECF3A6FAABC0421800CEC
+:100A0000460FE03F50000FFFFE1646200AC0FE17BB
+:100A10001401800C0401800C462800009407920702
+:100A2000FE17EFEC1401800C84408081446FF8FFC6
+:100A3000445FC7FF020180124482000088028804DC
+:100A40005021003CA045FE7658108100A845A045E5
+:100A5000FE6EA8455A2A58F00201801285EC8808DB
+:100A6000446FFFC7A645020180154200BC73880889
+:100A70008438B440444FFE3FFE8E58210004B640F7
+:100A8000B440467FFC7FFEB658210020B640B440FB
+:100A900046900200FEA658210100B640B440444FE3
+:100AA000F1FFFEA658210800B640B4A04428FFFF7D
+:100AB000FF564052A004B6A0B4A050438FFFFF667B
+:100AC0004052A404F481B6A0B4A0467FE3FF504393
+:100AD0008FFFFF6646701000FF7FF482B6A0B4A0BF
+:100AE00046AF1FFF50450FFF47C08000FF664052D2
+:100AF000F004F483B6A0A141444FFE3FFF4E58528C
+:100B00008004A941A14147E04000FF76585280206F
+:100B1000A941A141FF6658528100A941A141444F1A
+:100B2000F1FFFF6658528800A941A14140A2880206
+:100B30004454000040A5140414A0000104A00001C6
+:100B4000F40140A5100240A5240414A0000104A053
+:100B50000001F40240A5100240A51C0414A00001ED
+:100B600004A00001F40340A5100240A5700414A0E5
+:100B7000000104A00002444FFE3F40A5040258A516
+:100B8000000214A0000204A0000240A5080240A533
+:100B9000140414A0000202A180124402004138A0F3
+:100BA00028000201801542053C738808B54040A525
+:100BB000040258A50004B740B54040A5180258A546
+:100BC0000020B740B54040A5100258A50100B7402D
+:100BD000B540444FF1FF40A5100258A50800B740AA
+:100BE000B54040A5080240A51404B740B540F40143
+:100BF00040A510024640010040A51004B740B54092
+:100C0000F40240A5100240A51C04B740F403B5400F
+:100C100040A5100240A57004B74004A00001444F55
+:100C2000FE3F40A5040258A5000414A0000104A042
+:100C3000000140A5180258A5002014A0000104A03E
+:100C4000000140A5100258A5010014A0000104A055
+:100C50000001444FF1FF40A5100258A5040014A064
+:100C6000000104A0000140A5080240A5140414A03E
+:100C7000000104A00001F40140A5100240A52404D5
+:100C800014A0000104A00001F40240A5100240A538
+:100C90001C0414A0000104A00001F40340A51002EC
+:100CA00040A5700414A0000104A00002444FFE3FC0
+:100CB00040A5080240A5140414A0000204A00002EC
+:100CC00040A5040258A5000414A0000202A180124D
+:100CD0004402007D38A028000201801542053C73C3
+:100CE0008808B54040A5040258A50004B740B540A7
+:100CF00040A5180258A50020B740B54040A51002F5
+:100D000058A50100B740B540444FF1FF40A510027F
+:100D100058A50800B740B54040A5080240A51404F6
+:100D2000B740B540F40140A5100240A52404B740E7
+:100D3000B540F40240A510024640080040A510044A
+:100D4000B740B540F40340A5100240A57004B74079
+:100D500004A00001444FFE3F40A5040258A5000432
+:100D600014A0000104A0000140A5180258A500200D
+:100D700014A0000104A0000140A5100258A50080A5
+:100D800014A0000104A00001444FF1FF40A510028F
+:100D900058A5080014A0000104A0000140A5080205
+:100DA00040A5140414A0000104A00001F40140A512
+:100DB000100240A5240414A0000104A00001F402C4
+:100DC00040A5100240A51C0414A0000104A00001CD
+:100DD000F40340A5100240A5700414A0000104A073
+:100DE0000002444FFE3F40A5080240A5140414A091
+:100DF000000204A0000240A5040258A5000414A0AB
+:100E0000000202A18012440200B938A028000201A9
+:100E1000801542053C738808B54040A5040258A5DA
+:100E20000004B740B54040A5180258A50020B740BF
+:100E3000B54040A5100258A50100B740B540444F49
+:100E4000F1FF40A5100258A50800B740B54040A5E5
+:100E5000080240A51404B740B540F40140A51002B3
+:100E600040A52404B740B540F40240A5100240A5B7
+:100E70001C04B740B540F40340A5100240A5780417
+:100E8000B74004A00001444FFE3F40A5040258A50E
+:100E9000000414A0000104A0000140A5180258A5F8
+:100EA000001014A0000104A0000140A5100258A5E4
+:100EB000010014A0000104A00001444FF1FF40A56F
+:100EC000100258A5080014A0000104A0000140A5CC
+:100ED000080240A5140414A0000104A00001F401BC
+:100EE00040A5100240A5240414A0000104A00001A4
+:100EF000F40240A5100240A51C0414A0000104A0A7
+:100F00000001F40340A5100240A5700414A00001E4
+:100F100004A00002444FFE3F40A5080240A514046F
+:100F200014A0000204A0000240A5040258A5000479
+:100F300014A0000202A18012440200F538A028008B
+:100F40000201801542053C738808B54040A50402A3
+:100F500058A50004B740B54040A5180258A5002088
+:100F6000B740B54040A5100258A50100B740B540B4
+:100F7000444FF1FF40A5100258A50800B740B54006
+:100F800040A5080240A51404B740B540F40140A5AF
+:100F9000100240A52404B740B540F40240A5100259
+:100FA00040A51C04B740F403B54040A5100240A57D
+:100FB0007004B74004A00001444FFE3F40A5040266
+:100FC00058A5000214A0000104A0000140A51802C9
+:100FD00058A5002014A0000104A0000140A51002A3
+:100FE00058A5010014A0000104A00001444FF1FF26
+:100FF00040A5100258A5080014A0000104A000019B
+:1010000040A5080240A5200414A0000104A000018E
+:10101000F40140A5100240A5240414A0000104A07E
+:101020000001F40240A5100240A51C0414A0000118
+:1010300004A00001F40340A5100240A5700414A010
+:10104000000104A00002444FFE3F40A5080240A555
+:10105000140414A0000204A0000240A5040258A534
+:10106000000414A0000202A180124402013138A041
+:1010700028000201801542053C738808B54040A550
+:10108000040258A50004B740B54040A5180258A571
+:101090000020B740B54040A5100258A50100B74058
+:1010A000B540444FF1FF40A5100258A50400B740D9
+:1010B000B54040A5080240A51404B740B540F4016E
+:1010C00040A5100240A52404B740B540F40240A555
+:1010D000100240A51C04B740B540F40340A510021F
+:1010E00040A57004B74004A00001444FFE3F40A556
+:1010F000040258A5000414A0000104A0000140A5AA
+:10110000180258A5002014A0000104A0000140A569
+:10111000100258A5010014A0000104A00001444FD2
+:10112000F1FF40A5100258A5080014A0000104A07A
+:10113000000140A5080240A5140414A0000104A069
+:101140000001F40140A510024640010040A5100432
+:1011500014A0000104A00001F40240A5100240A563
+:101160001C0414A0000104A00001F40340A5100217
+:1011700040A5700414A0000104A00002444FFE3FEB
+:1011800040A5080240A5140414A0000204A0000217
+:1011900040A5040258A5000414A0000202A1801278
+:1011A0004402016D38A028000201801542053C73FD
+:1011B0008808B54040A5040258A50004B740B540D2
+:1011C00040A5180258A50020B740B54040A5100220
+:1011D00058A50080B740B540444FF1FF40A510022C
+:1011E00058A50800B740B54040A5080240A5140422
+:1011F000B740B540F40140A5100240A52404B74013
+:10120000B540F40240A5100240A51C04B740B5400B
+:10121000F40340A5100240A57004B74004A00001EB
+:10122000444FFE3F40A5040258A5000414A000014D
+:1012300004A0000140A5180258A5002014A0000138
+:1012400004A0000140A5100258A5010014A000014F
+:1012500004A00001444FF1FF40A5100258A508006A
+:1012600014A0000104A0000140A5080240A5140438
+:1012700014A0000104A00001F40140A5100240A543
+:10128000240414A0000104A00001F40240A51002EF
+:101290004640080040A5100414A0000104A000016D
+:1012A000F40340A5100240A5700414A0000104A09E
+:1012B0000002444FFE3F40A5080240A5140414A0BC
+:1012C000000204A0000240A5040258A5000414A0D6
+:1012D000000202A18012440201A938A028000201E4
+:1012E000801542053C738808B54040A5040258A506
+:1012F0000004B740B54040A5180258A50010B740FB
+:10130000B54040A5100258A50100B740B540444F74
+:10131000F1FF40A5100258A50800B740B54040A510
+:10132000080240A51404B740B540F40140A51002DE
+:1013300040A52404B740B540F40240A5100240A5E2
+:101340001C04B740F403B54040A5100240A570044A
+:10135000B74004A00001444FFE3F40A5040258A539
+:10136000000414A0000104A0000140A5180258A523
+:10137000002014A0000104A0000140A5100258A5FF
+:10138000010014A0000104A00001444FF1FF40A59A
+:10139000100258A5080014A0000104A0000140A5F7
+:1013A000080240A5140414A0000104A00001F401E7
+:1013B00040A5100240A5240414A0000104A00001CF
+:1013C000F40240A5100240A51C0414A0000104A0D2
+:1013D0000001F40340A5100240A5780414A0000108
+:1013E00004A00002444FFE3F40A5080240A514049B
+:1013F00014A0000204A0000240A5040258A50004A5
+:1014000014A0000202A18012440201E538A02800C5
+:101410000201801542053C7388088148B50046FFEB
+:10142000FE3F4084040258840002B700B50050F724
+:101430008FFF4084180258840020B700B500408414
+:10144000100258840100B700B500444FF1FF4084FA
+:10145000100258840800B700B50040840802408498
+:101460001404B700B500F401408410024084240441
+:10147000B700B500F4024084100240841C04B70099
+:10148000B500F4034084100240847004B700048067
+:101490000001444FFE3F408404025884000414803D
+:1014A0000001048000014084180258840020148048
+:1014B000000104800001408410025884010014805F
+:1014C000000104800001444FF1FF40841002588461
+:1014D0000800148000010480000140840802405488
+:1014E0001404A941A141F401FF664092A4041490A0
+:1014F0000001A141F402449F8FFFFF66FFEFA9C1E5
+:10150000A141F403FF664052F004A941A142444FB7
+:10151000F1FFFF4E58528004A942A142FF564052AB
+:10152000A804A9420201801240002804A607020173
+:10153000801844026CACA14192AB4052AC085852A6
+:10154000805FA941A14492AF4052BC085852805FCD
+:10155000A944A1C4465C000750528FFFFF7E46702D
+:1015600002F8FF7FA9444450005F10500019047036
+:101570000010FFF6147000101050001B04700010D3
+:10158000FFE6147000104470005E1070001C0480B0
+:101590000010444C7FFF408424021480001010701F
+:1015A000001D048000104084100214800010107090
+:1015B000001E04800010444FFE3F40843C02148013
+:1015C00000101070001F05E00010468FF1FF5084DE
+:1015D0000FFF41EF200215E000101050002405E03D
+:1015E000001141EF100215E000111050002505E038
+:1015F0000011444FF1FF41EF100215E000111050AF
+:10160000002605E00011444C7FFF41EF240215E065
+:1016100000111050002705E0001141EF100215E005
+:1016200000111050002805E00011444FFE3F40FF1C
+:101630003C0214F000111050002904F0001147E0A2
+:1016400005F04087A002148000111050002A04F019
+:101650000011468F8FFF50840FFF4087A002148037
+:1016600000111050002B04F00011468C7FFF5084B5
+:101670000FFF4087A002148000111050002C04803E
+:10168000001246F8000F408404021480001210502B
+:10169000002D0480001250F78FFF40841802148040
+:1016A00000121050002E048000124084100214809A
+:1016B00000121050002F04800012444FF1FF4084AC
+:1016C0001002148000121050003004800012444CAC
+:1016D0007FFF4084240214800012105000310480E7
+:1016E0000012408410021480001204800014930F32
+:1016F00040843C085884005F148000140480001467
+:1017000040843C0240847804148000140480001556
+:10171000930F40843C085884005F148000150480B7
+:10172000001540F43C024087F80414800015105066
+:1017300000590480002040841802148000201050BA
+:10174000005B04800020F40140841002148000201B
+:101750001050005D04800020444FF1FF40841002CF
+:10176000148000201050005F04800020F4034084A7
+:101770001002148000201070006004800020444F8C
+:10178000FE3F408424021480002010700061048019
+:10179000002140840402148000211070006204F0D3
+:1017A00000204688FFFF50840FFF40F7A00214F08E
+:1017B00000201070006304F0002140F7880214F04C
+:1017C00000211070006404F000214067980214604A
+:1017D00000211070006504600021FFA61460002144
+:1017E0001070006604600021F401FFA6146000215F
+:1017F0001070006704600021F402FFA6146000214D
+:101800001050007004600022444FFE3FFFA6146099
+:1018100000221050007104600022444FF1FFFF3697
+:10182000144000221050007204400022F602FF36DD
+:10183000144000221050007304400022F503EC1401
+:10184000FF2E144000221070007404400023FE6636
+:101850001410002310700075041000224010A40220
+:10186000141000221070007604100023FE8E142045
+:10187000002310700077041000224010A002141002
+:10188000002202018018880AA042922F4010BC0852
+:101890005810811CA842A043922F4010BC08581039
+:1018A000811CA84384201210000A1210000B0201B0
+:1018B00080124410003C400028040020000802016F
+:1018C0008017420104738940460FF3FF0415000599
+:1018D00050000FFFFE0E46100800FE0F1405000515
+:1018E00004150005460F3FFF50000FFFFE0E40009D
+:1018F0007004140500050405000546180000940254
+:101900009202FE0F140500053A6FAA84DD9EFC20AA
+:101910003C0C00BF441FFFCC4463F04A1010005140
+:1019200084003C0FFB78447000553C0C00BF000065
+:1019300000515A00BB06AFF049FFE6B0D5F74400AE
+:10194000003249FFBFDD84003C0FFBAFFCA08421C7
+:101950003E17EB813C1C00BF8801002000523C2B4D
+:10196000F61C001000534010A00888223C1BF61CF7
+:10197000001000543C1BF61B0000005540002008DE
+:1019800088013C0BF61BDD9EFC003C1C00BF840163
+:101990003E07EB860020805284003C0BF617840A39
+:1019A000FE143C0BF616000080515A08AB05840269
+:1019B00049FFFFCFFC80FC4184C081209FD13C6F58
+:1019C000FB7844A3F04A44800055E0E6E918F18131
+:1019D0001085000049FFF0A898F79061F1014C6371
+:1019E000C00538548E02D11138548E02941AE22563
+:1019F000E9088809A001E220E806D107841FD5067E
+:101A00009FD9D5E49D99D5E28003FCC1FC40852097
+:101A100080C33C4DFFC9804180E98069855B8505B5
+:101A2000B4A240F2A802E80F5A50060E04F10009D1
+:101A3000A1423852BD0100F2000640F79406E803C7
+:101A400010830002B4A250F2FFFF5CF78002E903AA
+:101A50005A58041B2251000502F2001EE0AFE9149F
+:101A600002F2001F40F79407E90F2251000402F22E
+:101A7000001CE0AFE90902F2001D40F79407E904F9
+:101A80008CE197F881238C6196D8502101085A384F
+:101A90000AC92E87FF53CF038400D51AA6325A00F5
+:101AA000051984035A78011550047FFFE602E80502
+:101AB0002E57FF504C54FFF244000108421480732B
+:101AC00084012220800422108005AE32D504AE327B
+:101AD00084208041A6325A0801593C5DFFC7A6E820
+:101AE0005A3801093C3DFFC8023180098E619A9A3B
+:101AF0009693A6E95A3801093C3DFFC80231800A95
+:101B00008E619A59964BA6EB01E280025A38013950
+:101B10003C5DFFC80232800950F1FFFF4FE3001A1D
+:101B2000A4EA51E1FFFF846240A78D5642A1787379
+:101B300040253C5702A2800AA56B8F418EA14035FB
+:101B40000C76423094734011A8379693964BD51D6E
+:101B5000A4EB85428E6140A7A95642A10C73402593
+:101B60003C5702A2800AA56A8F4184628EA140354B
+:101B70000C76423094734011A8379693964B5BE8ED
+:101B80000105806280418023E705E81844F0E230D7
+:101B90003887A00040F43C00DD0F060C0C161C003A
+:101BA0005A08010BD5105A00010CC80C8403D50B40
+:101BB000E602E808D503C806D5068400D5048402E9
+:101BC000D50284043E07FF538E01E60484604EF282
+:101BD00002A944F0E2783807810140F03C004A0055
+:101BE0003C0008006600CC01380584603C3FFFD211
+:101BF0003C3FFFD1846184003C3FF9F8443FFFAA99
+:101C00003C0BFFA63E07FF523E07FF513E37E7E47D
+:101C10003C2BFFA03C1BFFA13C2BFF9E3C1BFF9FCE
+:101C20003C2BFF9C3C1BFF9D3C2BFF9A3C1BFF9BCE
+:101C30003C2BFF983C1BFF993E07FF2E3E97FF5021
+:101C40003E07FF2C480002702E07FF2E0232001ABA
+:101C5000E203E8048C013E07FF2E3CF7FF9A3C2B81
+:101C6000FF98E04F3C1BFF99E8043C2BFF9AD507F7
+:101C70003C07FF9CE002E8033C2BFF9C3CF7FF9BEA
+:101C8000E02FE8043C1BFF9BD5073C07FF9DE001CC
+:101C9000E8033C1BFF9D3C07FF9E9B424E54000304
+:101CA000FF6A3C37FF9F9A194E040003FE02880525
+:101CB0005EF000B0E90484013E07FF2C3C97FFA0D2
+:101CC000400488014E040003FE023DE7FFA1403FAF
+:101CD00004014E340003FEDA02A200059958E345E0
+:101CE0004EF20222A5662E87FF51E205E90CE122A1
+:101CF000E805585400028540D50854540001854039
+:101D00008521D50480A885428520A527E264E90EB7
+:101D1000E03EE80458528001D509974E50448001B6
+:101D20009768549200FF58A500013C4DFFD188648C
+:101D30003C3FFFD13C3DFFD288033C0FFFD25A9875
+:101D4000020E2E07FF52C81D84013E07FF523C0DB4
+:101D5000F9F894023C0FF9F8D5255AA803132E0779
+:101D6000FF52C80F3C0DF9F89402580000023C0FD6
+:101D7000F9F884013E07FF5284023E07FF51D51255
+:101D80004C5400112E37FF52E667E80C3C0DF9F871
+:101D90008C619402FE2F3C0FF9F83E37FF523E57FC
+:101DA000FF513C2BFFA03C1BFFA1480001BD2E07AB
+:101DB000FF523C3DFFD1E6033C0DFFD2E8453C57C6
+:101DC000FF9E0212000CE0A1E93D0212000DE02589
+:101DD000E9393C17FF9F0222000EE022E93302227C
+:101DE000000FE041E92F3C27FF998A410212000BC6
+:101DF00052F08000E04FE8070212000AE201842955
+:101E0000E916D508E022E8060212000AE201842A57
+:101E1000E90E3C17FF98022200088A25FF52E025B0
+:101E2000E80902120009E261E80F842B3E17E7E49B
+:101E3000D50BE041E80902120009E261842CE9F7C0
+:101E4000D5038422AE72021200108803E2204EF203
+:101E500000EE2E07E7E45A00AA04480000E83C0719
+:101E6000FF9E02120011E0014EF300DF0212001289
+:101E7000E0204EF300DA3C07FF9F02120013E0015E
+:101E80004EF300D302120014E0204EF300CE4402C1
+:101E900077703C1DF9F84420003849FFFD8E5A0F39
+:101EA000FF04480000BD4410DF94380080003C1D52
+:101EB000FFC93E07E7E45A0821203C27FF993C0769
+:101EC000FF9FE040E8038406D57B8A024E040003AE
+:101ED000FE024430006442200C243CF7FF9B3C0788
+:101EE000FF9D8A0F400100160020802B9603E040E2
+:101EF0008400E966D5E95A0822363C27FF983C075A
+:101F0000FF9EE040E9E18A024E040003FE024430F5
+:101F1000006442200C243CF7FF9A3C07FF9C8A0F88
+:101F2000400100160020802D9603E040E9193C078F
+:101F3000FF9F3C27FF998A024E040003FE024430B3
+:101F4000006442200C243CF7FF9B3C07FF9D8A0F56
+:101F5000400100160020802E9603E040E8B584077B
+:101F6000D52F5A0802303C07FF9B3C47FF9D3CF7AA
+:101F7000FF9A8A803C07FF9C8A0F4E040003FE02F2
+:101F800044200064FE140030803040001016960398
+:101F9000FE9CE040E9133C07FF9F3C27FF999A8293
+:101FA0004E240003FE9244300064FE9C4001101653
+:101FB0000020802F9603E040E805440FFFAA3E076B
+:101FC000E7E42E07E7E4C8323C07FF9A3C47FF9C52
+:101FD0003CF7FF9B8A803C07FF9D8A0F4E0400035D
+:101FE000FE0244200064FE140030802C40001016D5
+:101FF0009603FE9CE040E9133C07FF9E3C27FF98B8
+:102000009A824E240003FE9244300064FE9C4001FC
+:1020100010160010802A9603E020E808440FFFAA5B
+:102020003E07E7E4D5038402AE322E47E7E43C0DD9
+:10203000FFC95CF20020E811A440A4C14010C00810
+:1020400040208C045212001F4011040E9646C90510
+:10205000441FFFAA3E17E7E4A440922C9646C163B2
+:102060002E17FF2F5A18012A2E27FF2E0210001AB2
+:10207000E241E8232E27FF2D0210001BE241E81D5C
+:102080002E17FF2CC91A3C17FF983CF7FF9402202B
+:1020900000198A2F4E140003FE4AE022E80E3C1776
+:1020A000FF993CF7FF958A2F4E140003FE4AE02269
+:1020B000E80484233E17E7E42E27E7E484203E1754
+:1020C000FF2D5A2003313E17FF2F2E17FF2CC92B4F
+:1020D0003C17FF990220001EE022E91D0220001F8C
+:1020E000E041E9193C27FF980230001CE043E91366
+:1020F0000230001DE062E90F2E37FF2E0200001AA9
+:10210000E260E81184013E07FF2F3C2BFF943C1B4B
+:10211000FF95D5098402AE32D5063E37FF2FD50391
+:102120003E37FF5384003E07FF543C2DFFC93C035C
+:10213000FFA6C70EA454E201E8038C01D521840157
+:102140003E07FF548404AE323E07FF53D51B2E17C3
+:10215000FF2F5A18010E2E17FF2D0231001BE2230C
+:10216000E8058C213E17FF2DD5033E77FF2FA454A1
+:10217000E201E905440FFFAA3E07E7E484003C0BB7
+:10218000FFA62E27E7E45CF10020E8198C4C96901E
+:102190008401E65FAE30AEB18401E903FA2ED502C8
+:1021A000802249FF9817840349FF981A84003E074C
+:1021B000FF53440FFFAA3E07E7E4D5038400AE3087
+:1021C000FCC0FC413CADFEF4224080002250800166
+:1021D00000150017F281B63F4410010842018473D4
+:1021E000B5000075001645C28A7444628A444412E0
+:1021F0008624449285E85A800107000000EAC8035B
+:102200005A88031D840038030E0A44628A14384039
+:102210008E0938730E0A446289E4380E0E0A387348
+:102220000E0A959A8826AD494412861838008C0803
+:10223000840138048E0A480000E438048E028C01C0
+:10224000E407E902840638048E0A38030E02449239
+:102250008A44E405E8038C01D502840038048E0A20
+:10226000380E0E02C80A38030E025A080507440247
+:102270008A74852138900E0A38030E02852C80C39B
+:102280004260247338409A0995B2882645E289E471
+:10229000AD4944128A1444F2862438608E02386FA5
+:1022A0000E0A4E07000951E07FFF8043422F24733E
+:1022B0008122D5035091803C39E7A61140948808CB
+:1022C000892F404F100122948001405494014E44C4
+:1022D0000003FF224E540003FF6A0295000D88A4FC
+:1022E000E3258089E9060245000CE2A44042BC1ABD
+:1022F000B45FE0C2E804225F8000D5069D71976B51
+:10230000E4A6E90284A638FE0E02E90438708E0ABB
+:10231000D5128F04E702E90F02F5000C40829C0100
+:1023200040A23C01424428248B2F404224979B2CFE
+:1023300038408E0A38408E0285438046422510730D
+:10234000808285E48C8240423C96E0C444928A14A8
+:1023500038408E0A44A28618E81138450C00508394
+:1023600000018C819720E10438450C08E80438848A
+:102370008E0AD50438648E0AD504848038450C084A
+:1023800038608E0244428A14E0C7E80438720E0AAC
+:10239000D505E0A6E80338520E0A444285E83850D5
+:1023A0008E0238420E02E085E80544528A14384213
+:1023B0008E0A84A038908E0280C58085447286245F
+:1023C000854C4C5480138023421028733883861127
+:1023D000944A882788882210800188C1C0038E0112
+:1023E000D50284058CA1D5EE842240028416888013
+:1023F000880640421496405014B69723976BF0011C
+:10240000AD00AD41FCC1FC4144600108420198733C
+:1024100044528588444285B8B4C022A080002280FE
+:102420008001F28138720E0238128E0283855A6062
+:102430000105000000EAC00B44028558842038A240
+:102440000E0A388E0E0A38100E0AD5535A68030742
+:1024500038A20E0A38828E0AD54C963B40650001A0
+:10246000964B4E640003FFB2405404014E540003E7
+:10247000FF6A3C7DFEF488C54452855838628E0A56
+:102480000253800EE0C5E8310093801E83C550746E
+:10249000FFFF43E398734272A4244023F801FE54E3
+:1024A000421F207340109C36381E0E0A441293E8D7
+:1024B00038108C008E24E626E80E401488085090D0
+:1024C000FFFF956A4254987395FC9A7DFE0C420278
+:1024D000A873D5068022FE448001420F2873407005
+:1024E0001CF638720E0AD50538A20E0A388E0E0A6E
+:1024F000F10138020E02AC084402858838000E0251
+:10250000AC09FCC1FC405050006050900AB08400FF
+:10251000804084C2848384E10032FFC054F1800192
+:102520000432FFE8E816C3150432FFF104A0800569
+:1025300094DA886A00F18000A6D9E9065A301119A8
+:102540001472FFFFD5195A3811141462FFFFD51405
+:102550008E61E663E8520432FFF104A0800594DA4C
+:10256000886A00F18000E808A6D9E671E8058C01C8
+:102570001422FFFF96000432FFFFCB04B685A8E9C2
+:10258000D53C5A38011522A2FFD65EF57FFDE8033F
+:10259000B645D521E54BE9065EF500298066403257
+:1025A0003C1A5EF500C9B665E827D5155A380226EB
+:1025B00022A2FFD65EF5043BE903B645D5165EF5CB
+:1025C000042DE903B6E5D50E5EF5040F40323C1B41
+:1025D000B665D50822F2FFD75EF7876FE90DA9E946
+:1025E000D50C5EF5036FE90822F2FFD75EF7876F1F
+:1025F000E903A9A9D502A8A9505281084C54FF8E1D
+:10260000FCC0FC408481505000B884E550000B08A9
+:1026100085248460854384C20022FF6854F1000150
+:102620000422FFD2E811C2100422FFDB04808005DF
+:102630009492884800F10002A693E9165A202315C7
+:102640001442FFFED5138E41E643E8470422FFDB28
+:10265000048080059492884800F10002E807A69360
+:102660005CF10023E8031432FFFE0422FFFECA0BD4
+:1026700022F2FFAB1462FFFF5EF7848140223C1A16
+:10268000B645D52B5A2801102282FFAB5EF47FFCA1
+:10269000E8041432FFFFD518E51F40233C1A14222A
+:1026A000FFFFD5125A28021A2282FFAB5EF40904FA
+:1026B000E9041432FFFFD5155EF408E140223C1A0C
+:1026C0001422FFFFD50E2222FFAA5EF101C3E81DEE
+:1026D0005EF400FBE822B6C550528108D89EFCC0CB
+:1026E0002222FFAA5EF101C3E8065EF40805E90BA9
+:1026F000B725D5F35EF10275E9065EF40805E90336
+:10270000B6E5D5EBB685D5E95EF10275E9065EF46E
+:1027100000FBE803B745D5E1B665D5DFFC47F18995
+:102720002E17E8D083825CF080C8E8048C213E1725
+:10273000E8D02E17E8CF5CF080C8E8048C213E1763
+:10274000E8CF3C9DFFE984E05014FFFFF18380C097
+:102750005014FFFE840AE2E1F087840114FF800D2B
+:10276000F085F784F782F7818107B4064E0203985B
+:102770005A080604480003945A0804044800031A3F
+:10278000F2090003002404A3002CA09494418822A1
+:102790009402A689A648F286F18AF109A04D880123
+:1027A000A643A602F18BF08C4EA2005C5AA0010A4F
+:1027B000841FF085FA12F088FB134412905CD50850
+:1027C00014AF800514AF80088500441290DCF00639
+:1027D0008801A60198885000002C94010031003730
+:1027E000880100210049A502F381F2828003C3031E
+:1027F0008E01D502F001F084F002E611E8039DC1DC
+:10280000D502FAE1F1028048807C84A1F00149FF01
+:10281000D647F208FA3483DC43E1047380BC844079
+:10282000425404738062F104E0E1E90D38428511FD
+:102830004E4700038864384F05114E470003884413
+:102840008C21D5F3F10484879A79FE4B4220907352
+:102850004E2600038441842AFE5C40208856D5031E
+:10286000804A800A001300209646C15AFA2E10139F
+:1028700000CE001F801812030063101300C84EA280
+:10288000001D8421101300C084231413002F842002
+:10289000101300C1F101C104F1025A1811064410CD
+:1028A000003C101300CEFA22F30642340473381EA3
+:1028B0000D1112130065D50C441FFFC8101300C082
+:1028C00084211413002F101300C112A300652213DA
+:1028D00000072E37E8D014130034E6718420121359
+:1028E0000061101300C4101300D4101300D510138E
+:1028F00000D6101300D7101300D8101300D91013EE
+:1029000000DA101300DB101300DCE802842110133E
+:1029100000CC2E17E8CFE6318420E83BD5390213EE
+:102920000063E220E803120300634EA20018F101E5
+:10293000C104F1025A1811064410003C101300CED5
+:10294000FA62001300C842140C7322330065381E6B
+:102950000511E061E80312130065001300C05CF08C
+:1029600080C8E80B8C2104330034101300C02213FC
+:1029700000078823141300342E17E8D0E631E8044A
+:102980008421101300CC2E17E8CFE631E80484210F
+:10299000101300CDF103E622E913441FFFC8101302
+:1029A00000C00433002F8421101300C1843DFE5E5B
+:1029B0005A1801071413002F84201413002C8420AC
+:1029C00010130068F103E622E8360413002CC1332B
+:1029D0005A1801075A98010C843F8482D50C5A1862
+:1029E00002095A980107843F8483D505F40DD50365
+:1029F0008421808144328F3038319000C31C44528E
+:102A00008F308885F30620520008FECCFE6CE02350
+:102A1000E912F305F10AFE5C20320004F405FEE43D
+:102A2000E061E909021300635CF08029E904842174
+:102A300010130068003300684E33008B0413002C21
+:102A4000C130041300115A10022D0413002F5A181C
+:102A500003070413002EE622E824D5035A180222A5
+:102A6000F10BF40C8C218A249648E622E91AE448FA
+:102A7000E81842F100245CF7815FE813001300833B
+:102A80005A180108001300C1C904842A10130082D7
+:102A900084211413002F101300C184201413002C60
+:102AA0000443002CC455041300115A10025204139D
+:102AB000002F5A1005058E22E622E84A5A480105E1
+:102AC000001300CCD5055A480244001300CDC9407C
+:102AD00022430046221300069A614E140003FE4A68
+:102AE0000253006344400BB844F003E8FF2C40421B
+:102AF0003C97E281E82D5CF08033E92A004300C86E
+:102B0000FAA2814442A414732253006538FE2911AD
+:102B100085424052A8B6E0AFE809F504E085E90334
+:102B2000E0E4E8165CF0812DE913001300835A18E5
+:102B30000108001300C1C904842A101300828421F3
+:102B40001413002F101300C184201413002C04133D
+:102B5000002C4E1200FF0443002F5A40030448008B
+:102B60000113004300C0005300CEE2A44EF300A8BE
+:102B70000453002DCD0B004300C48C81104300C4CE
+:102B8000004300DA8C81104300DA5EF1012DE80683
+:102B900042F100245CF7BA99E90B004300C48C8130
+:102BA000104300C4004300DC8C81104300DCE6A22B
+:102BB000E8285A1801165A98010822F300065EF711
+:102BC000821DE909D5145A98021D22F300065EF70A
+:102BD000821CE90D22130007E42BE813D5085A18CC
+:102BE000021122F300075EF788F5E90B021300617A
+:102BF0008C2112130061001300D48C21101300D417
+:102C00005A38010C021300618C2112130061001369
+:102C100000D58C21101300D55EF10029E805FE14C3
+:102C20005CF007D1E90B020300618C011203006123
+:102C3000000300D68C01100300D6020300635CF091
+:102C4000003DE90EF003E602E80B020300618C018F
+:102C500012030061000300D88C01100300D80403A4
+:102C6000002B5CF00065E90FF003E6024EF2008CE9
+:102C7000020300618C0112030061000300D98C0182
+:102C8000100300D90403002E5A9802095A000212B8
+:102C90005A08047A2E07E8CFD50E5A9801755A08BB
+:102CA00005072E17E8CFE631E86ED53D5A08036CCC
+:102CB0002E07E8D0E6118405E936D5650403003413
+:102CC000400010165A18020D5EF008F5E8270203BE
+:102CD0000061001300D48A0112030061D51F5A1845
+:102CE000011E5A98010A22F30006021300615EF7E2
+:102CF000821DE90DD50A5A98021222F3000602132A
+:102D000000615EF7821CE803E41FD502E40BE906CC
+:102D1000000300D48A201213006102030061E6065A
+:102D2000E90584021403002FD52E000300835A08FE
+:102D30000108000300C1C804840A10030082840152
+:102D40001403002F100300C184001403002CD51BB2
+:102D5000040300115A0002180403002F9E42E622C9
+:102D6000E9035A080511000300835A08010800030B
+:102D700000C1C804840A1003008284011403002FD8
+:102D8000100300C10403002EC8080413002F5A18B2
+:102D9000010E3E07E8D0D50A5A0801090403002FA6
+:102DA0005A08010584003E07E8CF44000032D5628E
+:102DB000000300209616C0730423002F8400100324
+:102DC00000CF84015A2805068401100300CF840037
+:102DD00000430092FA620013009342120C7338FE13
+:102DE00005110213003E8463944940108C36E02F95
+:102DF000E8058402100300CF8400021300635CF036
+:102E0000803DE908F103E622E8058403100300CFC2
+:102E10008400003300C00413003440108C368C242E
+:102E20005CF08908E808001300C4004300DA8A2433
+:102E3000101300C4004300C4E686E8059C599021A5
+:102E4000E024E8058404100300CF8400001300CEC2
+:102E5000E223E903E662E8058405100300CF84005D
+:102E60000413002B5CF08065E908F103E622E80515
+:102E70008406100300CFD5135A2001125A080110FE
+:102E8000041300221403002F5A18010A10030085AE
+:102E9000A4341203000CA4351203000DF007506394
+:102EA00001088E01F0874E03FC62FCC7FC5AF08AD1
+:102EB000814181028420FA54B01049FFF91C84201A
+:102EC000FA54B01949FFF9178420FA54B02249FF87
+:102ED000F912B02B8420FA5449FFF90D2E07E8CEE1
+:102EE0005CF000C8E8048C013E07E8CE2E07E8D16C
+:102EF0005CF000C8E8048C013E07E8D1800884201B
+:102F0000FA53443291DC4442905C44528F3049FF82
+:102F1000D13E8008FA21FA534432915C4442905CDD
+:102F200044528F3049FFD1338400B61FF082F084C1
+:102F300044029014F083B010F0858400446291DC68
+:102F4000F08180E6852008038025F0865063005CD0
+:102F5000F006E320E82608038001C020000380116A
+:102F6000F201F082000380238068B61FB43FF002B4
+:102F7000A53084A049FFD2945CF0005B4EF20509B5
+:102F8000F003F1028801F103B45F9A41E241E906DE
+:102F900008100001C1F9480004FC8D218CC2D5D96C
+:102FA000F0045A00010EFA01F081B019F0854402D4
+:102FB0008FCCF08384014462915CF084D5C384009B
+:102FC000441291DC44229014806AB11080A849FF19
+:102FD000D1F1FA014412915C44228FCC806AB1197C
+:102FE00080A849FFD1E7F00AF08780C044028F84AF
+:102FF000F08BF004F0888400F085F086F089B40648
+:10300000F08C4E0204765A080604480004725A08EE
+:103010000404480003D3804A00030024A054F08D28
+:1030200094018801A641A7C0F184000F801010739D
+:10303000009210030093F00DA05594028801A64160
+:10304000A600F18EF08F04030017F083C06B5A00C6
+:10305000010D44028F3CF08B841FF088FA01FB20A5
+:10306000F0814412915CD50B44028F84F08BF00305
+:10307000441291DCF08881208400F081980FA60131
+:1030800098885000002C94010031003788010021FD
+:103090000049A502F382B65F8003C3038E01D50207
+:1030A000F002F086B41F5CF00023E8038C01D50227
+:1030B000FA13F085B43FF201806884A0F00249FF62
+:1030C000D1EFF1068040FA02FE0CF10184809941B3
+:1030D00088099569940188A841E02000049F800632
+:1030E00080248064F005E009E90F38F290114EF772
+:1030F0000003886F38FF10114EF70003882F8D21D1
+:1031000050420024D5F0F4068A04FE03848742105E
+:1031100010734E1600038421840AFE1C409005366D
+:10312000D505F203812280228062000300209606EA
+:10313000C06EFA0E10030094F003107300A9C01CB7
+:103140008401100300698403140300228400100327
+:103150000083F002C004B41F5A0823064400003C58
+:1031600010030094FA02F4014243807338041111F1
+:1031700012030055D512440FFFC8100300698401E3
+:103180001403002210030083020F8006120300556F
+:10319000000F800C3E07E8CE84A084002243000686
+:1031A0001053006F12530036A577100300821003EE
+:1031B00000EB1243004612530047124300481443E9
+:1031C0000027F50D04450003122300381493002650
+:1031D0003842150110030085100300A0100300A160
+:1031E000100300A2100300A3100300A4100300A505
+:1031F000100300A6100300A7100300A81243003E0E
+:103200001413003F143300408400D567F003C0243A
+:10321000F002C004B41F5A0823064400003C100307
+:103220000094004300A9FA02F501425200732243C0
+:10323000005538041511E080E8031203005504031B
+:10324000003FE001E8031413003F04030040E003E3
+:10325000E80314330040000300695CF000C8E80E86
+:10326000504300988C0110030069B404A0618809E0
+:10327000B604220300068801A821F00C5A080108B0
+:10328000A43412030046A435120300470203003899
+:10329000E202E80312230038F10D040500033800B0
+:1032A00005010213003EE220E8031203003E220360
+:1032B0000046224300069B044E440003FF222213D3
+:1032C0000047220300079A084E040003FE0204137D
+:1032D000002B8804E220E8031403002B8400100371
+:1032E00000683C0DFFE9C82404030017C0215A0000
+:1032F0000103840344128F3038408000C4198801D0
+:10330000F408F5042010000842F21424FE64E02FB3
+:10331000E90F20000004FE7AFE02E001E909020341
+:1033200000385CF00029E904840110030068000300
+:103330000068C86904030017C066040300115A003E
+:103340000263F00EF10F8C018A0104130022960033
+:103350005A18030604430019C404D5085A18020772
+:10336000E602E951E5284EF303278E22E622E84BD8
+:10337000E602E949E52CE84742F488245CF7822715
+:10338000E84200030069E603E83E00030083C83119
+:10339000000300C15A08012E840A100300820203B0
+:1033A000004750F07FB95CF787F2E823221300460C
+:1033B0005000FFD396015CF003DEE80E22030048C4
+:1033C000E001E8055EF0002DE907D508E020E806F9
+:1033D0005EF0040BE9038402D5028401100300EBC4
+:1033E000F109F00AF28CF38349FFD0CFF20CF3031A
+:1033F00084011403002210030083840014030017C7
+:103400003E07E8CE000300682E57EC0DC00604030B
+:103410000017C86E4800013C04030017C0F90403FC
+:1034200000115A0002F6040300225A0005058E021C
+:10343000E602E8EE22130047220300079A084E0432
+:103440000003FE020243003844100C8044F003E8FD
+:10345000FE644010BC37E220E8DB5CF00033E9D8C2
+:10346000001300A9FA8204FF800142F09073224306
+:10347000005539E43D1185E240423C96E09EE80A61
+:10348000F406E024E904F405E081E8C25CF0012DD3
+:10349000E9BF44F00190405794B6E0A3E8B90013A7
+:1034A0000083C911001300C15A18010E5CF000C955
+:1034B000E80A840A10030082F109F00AF28349FF46
+:1034C000D064F2038401F10BF3061403002210030D
+:1034D00000838400140300178823F30BF4059ACBB0
+:1034E000E283E9961800800110008023D5F70403D9
+:1034F00000225A000304480000E30013006900039F
+:103500000094E201E97E04130018C90B0003006F68
+:103510008C011003006F000300A68C01100300A6AD
+:103520005EF4812DE80642F488245CF7BA99E90B31
+:103530000003006F8C011003006F000300A88C01D2
+:10354000100300A8E622E80B020300368C011203E8
+:103550000036000300A08C01100300A000030068E7
+:103560005A08010C020300368C01120300360003D6
+:1035700000A18C01100300A15EF48029E80642241A
+:1035800088245CF107D1E90B020300368C01120399
+:103590000036000300A28C01100300A202030038D1
+:1035A0005CF00047E90E3C0DFFE9C80B0203003652
+:1035B0008C0112030036000300A48C01100300A448
+:1035C0000403002B5CF00065E90E3C0DFFE9C80B1D
+:1035D000020300368C0112030036000300A58C01A3
+:1035E000100300A5040300198E01E602E8683C0DF3
+:1035F000FFE9C8652E07E8D1E6118405E932D55FF9
+:1036000004030026400004175CF00038E816FE842E
+:103610005CF10ABFE812409024018D2AE735E80DDD
+:10362000020300385CF00033E80802030036002390
+:1036300000A28A0212030036040300274000041689
+:103640008E0B5CF00422E80802030036001300A091
+:103650008A011203003602030036E606E9058402F9
+:1036600014030022D52C00030083C808000300C106
+:103670005A080105840A1003008284011403002201
+:1036800010030083840014030017D51904030011EC
+:103690005A000216040300228E02E604E81000031A
+:1036A0000083C808000300C15A080105840A1003FA
+:1036B0000082840114030022100300830403001716
+:1036C000C01C4402901438001C00C00A440290142C
+:1036D0008807F10420000024E0014EF20165440255
+:1036E0008FCC38101C00C121880720F00024F00482
+:1036F000E00F4EF20159D5194402901438001C0015
+:10370000C003F004C00944028FCC38001C00C00D77
+:10371000F0045A08110B840414030022F0044E0331
+:1037200001488401140300173C0DFFE9C839040364
+:1037300000228E04E602E934F004C80444028F84B7
+:10374000D506F0045A08112D44028F3C38001C00A5
+:10375000C02704130017840214030022C921F104B6
+:10376000C90284011403001704030017107300A991
+:103770005A000104FA01D5028400F081F101FA0235
+:10378000421380733804051112030055A436120346
+:103790000046A437120300478400120300380403D4
+:1037A00000225A08010584003E07E8D14400003297
+:1037B0001003006E4800009D0003002096164E0284
+:1037C00000988400003300921003006EFA22000378
+:1037D0000093420184730223003E381401118403D4
+:1037E000FE0C9451E0208401E80584021003006E71
+:1037F00084002E17EC0FC10B8423FE543C2005A837
+:10380000E022E805840B1003006E84000013006AB8
+:103810000423001D50108037E222E8102E17E8D153
+:103820008E215CF0803BE80A0413003D5EF080C905
+:10383000E90584031003006E84000023006904136B
+:103840000027401088368C235CF0843EE808001383
+:10385000006F003300A68A231013006F0033006F3F
+:10386000E666E8059C519021E023E80584041003F6
+:10387000006E840000130094E222E903E642E805AA
+:1038800084051003006E84000413002B5CF0806537
+:10389000E9083C1DFFE9C90584091003006E800199
+:1038A0000413002640F089F75CF784B1E80C043378
+:1038B000003F5EF18064E808043300409449FE9CB8
+:1038C000E241E8028400041300225A1001125A084F
+:1038D00001100413002F140300225A18010A1003C8
+:1038E0000085A4341203000CA4351203000DF00966
+:1038F000506301088C01F0895A000A0448FFFB81DB
+:10390000F00AB0EB50200A508481B162F007B40095
+:103910008E01E603E91CF00750000108F0874C0116
+:103920007FF7806AB12280A88400441291DC44228F
+:103930008F8449FFCD3FFA014412915C44228F3CB1
+:10394000806AB12B80A849FFCD35FCDAF00704006E
+:1039500000225A0002058E04E602E8DEF007041594
+:1039600000050000002494028801A642A783E2C15A
+:10397000E9D3F007040000175A080105380094083D
+:10398000D5055A08020438408C088C21D5F1F00284
+:10399000B43FE0204EF3FB03F1058441382080085A
+:1039A0008C01D5F784041403002248FFFEBF840273
+:1039B00048FFFEBA42F488245CF7815F4EF3FCE7CF
+:1039C00048FFFCD5000000000000000000000000DF
+:1039D00000000000000000000000000000000000E7
+:1039E0004CE00000AD1300004CE10000F6F441BAD9
+:1039F0004CE000002F100000FAF400004E3E0B0DCA
+:103A00004CE000008B1400002A050100A37CE55067
+:103A10004CE000000B080000B619010080CB746C6C
+:103A20004CE0000001180000C22101006A95CE029E
+:103A3000050000000000000001000000FFFFFFFF84
+:103A4000030000000700000001000000AA000000C1
+:103A5000120000001B000000480000004B000000A6
+:103A600052000000620000006300000072000000CD
+:103A7000730000001E010000210100002D01000064
+:103A80003B010000480100004B0100006C010000F8
+:103A900078010000870100008B0100009201000006
+:103AA0009B010000B2010000B3010000B40100005E
+:103AB000BB010000CB010000D2010000E1010000C9
+:103AC000E2010000E3010000EE01000078040000C4
+:103AD000B4040000BB040000ED0400002105000058
+:103AE0002D050000E1050000EE0500001E060000A7
+:103AF0004B0600006D060000CB060000D206000059
+:103B0000E2060000E3060000ED0600004B0700009F
+:103B1000870700008B070000B8070000ED120000C7
+:103B2000B81700004B1B00006D1B00008B1B000032
+:103B3000FFFFFFFF4040C8C8C8C800004E00560045
+:103B400060006B00760083009100A000B100C2000D
+:103B5000D600EB0002011A013501520170019101FA
+:103B6000B501DB0103022E025C028D02C102F802E4
+:103B700032036F03B003F4033B048604D404260528
+:103B80007C05D50532069206F5065C07C6073308A4
+:103B9000A30816098C09040A7E0AFA0A790BF80BA5
+:103BA000790CFB0C7E0D010E830E060F870F07109C
+:103BB000861003117D11F5116912DA124713AF1344
+:103BC00013147214CB141E156B15B215F2152C16A6
+:103BD0005E168916AC16C716DB16E716EB164E00F6
+:103BE000560060006B00760083009100A000B100D9
+:103BF000C200D600EB0002011A013501520170012A
+:103C00009101B501DB0103022E025C028D02C102AB
+:103C1000F80232036F03B003F4033B048604D404B8
+:103C200026057C05D50532069206F5065C07C60713
+:103C30003308A30816098C09040A7E0AFA0A790BCC
+:103C4000F80B790CFB0C7E0D010E830E060F870F0F
+:103C50000710861003117D11F5116912DA1247134E
+:103C6000AF1313147214CB141E156B15B215F21585
+:103C70002C165E168916AC16C716DB16E716EB1661
+:103C80004E00560060006B00760083009100A0009B
+:103C9000B100C200D600EB0002011A013501520149
+:103CA00070019101B501DB0103022E025C028D025D
+:103CB000C102F80232036F03B003F4033B0486042D
+:103CC000D40426057C05D50532069206F5065C0768
+:103CD000C6073308A30816098C09040A7E0AFA0AE3
+:103CE000790BF80B790CFB0C7E0D010E830E060F81
+:103CF000870F0710861003117D11F5116912DA1272
+:103D00004713AF1313147214CB141E156B15B21591
+:103D1000F2152C165E168916AC16C716DB16E716BA
+:103D2000EB1680008D009A00A900B900CA00DC00E3
+:103D3000F00005011C0135014F016B018901A9014A
+:103D4000CB01EF0115023E0269029602C602F8029B
+:103D50002D0365039F03DC031C045F04A504EE042C
+:103D600039058705D8052C068306DC063807960733
+:103D7000F7075A08C00827099109FC09680AD60AFA
+:103D8000460BB60B270C980C090D7B0DEC0D5C0E49
+:103D9000CC0E3A0FA70F13107C10E2104611A7119A
+:103DA00005125F12B512081355139E13E313221464
+:103DB0005B149014BE14E714091526153C154C1518
+:103DC0005615591501000000000000000000000019
+:103DD00000000000000000000000000000000000E3
+:103DE00000000000000000000000000000000000D3
+:103DF00000000000000000000000000000000000C3
+:103E000000000000000000000000000000000000B2
+:103E100000000000000000000000000000000000A2
+:103E20000000000000000000000000000000000092
+:103E30000000000000000000000000000000000082
+:103E40000000000000000000000000000000000072
+:103E50000000000000000000000000000000000062
+:103E60000000000000000000000000000000000052
+:103E70000000000000000000000000000000000042
+:103E80000000000000000000000000000000000032
+:103E90000000000000000000000000000000000022
+:103EA0000000000000000000000000000000000012
+:103EB0000000000000000000000000000000000002
+:103EC00000000000000000000000000000000000F2
+:103ED00000000000000000000000000000000000E2
+:103EE00000000000000000000000000000000000D2
+:103EF00000000000000000000000000000000000C2
+:103F000000000000000000000000000000000000B1
+:103F100000000000000000000000000000000000A1
+:103F20000000000000000000000000000000000091
+:103F30000000000000000000000000000000000081
+:103F40000000000000000000000000000000000071
+:103F50000000000000000000000000000000000061
+:103F60000000000000000000000000000000000051
+:103F70000000000000000000000000000000000041
+:103F80000000000000000000000000000000000031
+:103F90000000000000000000000000000000000021
+:103FA0000000000000000000000000000000000011
+:103FB0000000000000000000000000000000000001
+:103FC00000000000000000000000000000000000F1
+:103FD00000000000000000000000000000000000E1
+:103FE00000000000000000000000000000000000D1
+:103FF00000000000000000000000000000000000C1
+:1040000000000000000000000000000000000000B0
+:1040100000000000000000000000000000000000A0
+:104020000000000000000000000000000000000090
+:104030000000000000000000000000000000000080
+:104040000000000000000000000000000000000070
+:104050000000000000000000000000000000000060
+:104060000000000000000000000000000000000050
+:104070000000000000000000000000000000000040
+:104080000000000000000000000000000000000030
+:104090000000000000000000000000000000000020
+:1040A0000000000000000000000000000000000010
+:1040B0000000000000000000000000000000000000
+:1040C00000000000000000000000000000000000F0
+:1040D00000000000000000000000000000000000E0
+:1040E00000000000000000000000000000000000D0
+:1040F00000000000000000000000000000000000C0
+:1041000000000000000000000000000000000000AF
+:10411000000000000000000000000000000000009F
+:10412000000000000000000000000000000000008F
+:10413000000000000000000000000000000000007F
+:10414000000000000000000000000000000000006F
+:10415000000000000000000000000000000000005F
+:10416000000000000000000000000000000000004F
+:10417000000000000000000000000000000000003F
+:10418000000000000000000000000000000000002F
+:10419000000000000000000000000000000000001F
+:1041A000000000000000000000000000000000000F
+:1041B00000000000000000000000000000000000FF
+:1041C00000000000000000000000000000000000EF
+:1041D00000000000000000000000000000000000DF
+:1041E00000000000000000000000000000000000CF
+:1041F00000000000000000000000000000000000BF
+:1042000000000000000000000000000000000000AE
+:10421000000000000000000000000000000000009E
+:10422000000000000000000000000000000000008E
+:10423000000000000000000000000000000000007E
+:10424000000000000000000000000000000000006E
+:10425000000000000000000000000000000000005E
+:10426000000000000000000000000000000000004E
+:10427000000000000000000000000000000000003E
+:10428000000000000000000000000000000000002E
+:10429000000000000000000000000000000000001E
+:1042A000000000000000000000000000000000000E
+:1042B00000000000000000000000000000000000FE
+:1042C00000000000000000000000000000000000EE
+:1042D00000000000000000000000000000000000DE
+:1042E00000000000000000000000000000000000CE
+:1042F00000000000000000000000000000000000BE
+:1043000000000000000000000000000000000000AD
+:10431000000000000000000000000000000000009D
+:10432000000000000000000000000000000000008D
+:10433000000000000000000000000000000000007D
+:10434000000000000000000000000000000000006D
+:10435000000000000000000000000000000000005D
+:10436000000000000000000000000000000000004D
+:10437000000000000000000000000000000000003D
+:10438000000000000000000000000000000000002D
+:10439000000000000000000000000000000000001D
+:1043A000000000000000000000000000000000000D
+:1043B00000000000000000000000000000000000FD
+:1043C00000000000000000000000000000000000ED
+:1043D00000000000000000000000000000000000DD
+:1043E00000000000000000000000000000000000CD
+:1043F00000000000000000000000000000000000BD
+:1044000000000000000000000000000000000000AC
+:10441000000000000000000000000000000000009C
+:10442000000000000000000000000000000000008C
+:10443000000000000000000000000000000000007C
+:10444000000000000000000000000000000000006C
+:10445000000000000000000000000000000000005C
+:10446000000000000000000000000000000000004C
+:10447000000000000000000000000000000000003C
+:10448000000000000000000000000000000000002C
+:10449000000000000000000000000000000000001C
+:1044A000000000000000000000000000000000000C
+:1044B00000000000000000000000000000000000FC
+:1044C00000000000000000000000000000000000EC
+:1044D00000000000000000000000000000000000DC
+:1044E00000000000000000000000000000000000CC
+:1044F00000000000000000000000000000000000BC
+:1045000000000000000000000000000000000000AB
+:10451000000000000000000000000000000000009B
+:10452000000000000000000000000000000000008B
+:10453000000000000000000000000000000000007B
+:10454000000000000000000000000000000000006B
+:10455000000000000000000000000000000000005B
+:10456000000000000000000000000000000000004B
+:10457000000000000000000000000000000000003B
+:10458000000000000000000000000000000000002B
+:10459000000000000000000000000000000000001B
+:1045A000000000000000000000000000000000000B
+:1045B00000000000000000000000000000000000FB
+:1045C00000000000000000000000000000000000EB
+:1045D00000000000000000000000000000000000DB
+:1045E00000000000000000000000000000000000CB
+:1045F00000000000000000000000000000000000BB
+:1046000000000000000000000000000000000000AA
+:10461000000000000000000000000000000000009A
+:10462000000000000000000000000000000000008A
+:10463000000000000000000000000000000000007A
+:10464000000000000000000000000000000000006A
+:10465000000000000000000000000000000000005A
+:10466000000000000000000000000000000000004A
+:10467000000000000000000000000000000000003A
+:10468000000000000000000000000000000000002A
+:10469000000000000000000000000000000000001A
+:1046A000000000000000000000000000000000000A
+:1046B00000000000000000000000000000000000FA
+:1046C00000000000000000000000000000000000EA
+:1046D00000000000000000000000000000000000DA
+:1046E00000000000000000000000000000000000CA
+:1046F00000000000000000000000000000000000BA
+:1047000000000000000000000000000000000000A9
+:104710000000000000000000000000000000000099
+:104720000000000000000000000000000000000089
+:104730000000000000000000000000000000000079
+:104740000000000000000000000000000000000069
+:104750000000000000000000000000000000000059
+:104760000000000000000000000000000000000049
+:104770000000000000000000000000000000000039
+:104780000000000000000000000000000000000029
+:104790000000000000000000000000000000000019
+:1047A0000000000000000000000000000000000009
+:1047B00000000000000000000000000000000000F9
+:1047C00000000000000000000000000000000000E9
+:1047D00000000000000000000000000000000000D9
+:1047E00000000000000000000000000000000000C9
+:1047F00000000000000000000000000000000000B9
+:10480000050201016100BA0F00000000240105014A
+:1048100000030E59FF53C1630000000000000000B8
+:104820003C4E0000904E0000E44E0000384F000067
+:104830008C4F0000E04F000034500000200C0000BE
+:104840002088410AE6A004000000000000000000EB
+:104850000000000000280000888888888800000088
+:1048600088508454C054A05B405EC85DA85C4880FA
+:104870000000105C2F04090000C186002DB4180050
+:10488000137DDC0227060C0000090009000000006F
+:10489000080C00000C0000000000000000000000F8
+:1048A0000000000000000000000400000100000003
+:1048B000000000008850A854C054A05B405EC85D52
+:1048C000185C48800000105C2F04090000C106003D
+:1048D0002DB41800137DDC0227060C0000C900C9A6
+:1048E00000000000800000002088410AE6A00400CB
+:1048F0000000000000000000000000000028000090
+:10490000888808000000000088508454C054A05BD0
+:10491000405EC85D185C48800000105C2F040900F0
+:1049200000C186012DB41800137DDC0227010600AA
+:104930000009000900000000200C0000CD35D71C44
+:10494000CD3507000000000000000000000000005E
+:104950000028000088880800000000008850845467
+:10496000C054A05B405EC85DA85C48800000105C3D
+:104970002F04090000C186002DB41800137DDC024D
+:1049800027060C0000C900C90000000090000000CC
+:104990000F3EF8200F3E080000000000000000005D
+:1049A00000000000002800008888080000000000C7
+:1049B00088508454C054A05B405EC85D185C488039
+:1049C0000000105C2F04090000C186012DB41800FE
+:1049D000137DDC022701060000C900C900000000A9
+:1049E000200C00002088410AE620000000000000A2
+:1049F00000000000000000000024000055550100E8
+:104A000000000000885084548858A05B405EC85D58
+:104A1000185C48800000105C2F04090000C186006B
+:104A20002DB41800137DDC0227060C0000C900C954
+:104A300000000000200C00002088410AE6A00400CD
+:104A4000000000000000000000000000002800003E
+:104A500000000000000000008850A854C054A05B73
+:104A6000405EC85DA85C48800000105C2F0409000F
+:104A700000C186002DB41800137DDC0227060C004F
+:104A800000C900C900000000000000000909000082
+:104A90000010000020080000DF0F0000B4DC21003F
+:104AA000030003000000000094489648504A0000AC
+:104AB00020052005D00600000000000000000000D6
+:104AC00002000000000000000000010001100000D2
+:104AD00020080000DF0F0000B4DC0100030002002A
+:104AE00000000000DC06FE06F00B000022000000C3
+:104AF000100500000000000000000000020000009F
+:104B00000000000001010200011000002008000068
+:104B1000DF0F0000B4DC0100030002000000000011
+:104B2000DE06FC06F20B0000200002001205000069
+:104B30000000000000000000020000000000000073
+:104B4000020202000110000020080000DF0F000038
+:104B5000B4DC01000300020000000000E006FA06D9
+:104B6000F40B00001E00040014050000000000000B
+:104B7000000000000200000000000000030302002B
+:104B80000110000020080000DF0F0000B4DC01006D
+:104B90000300020000000000E206F806F60B000029
+:104BA0001C000600160500000000000000000000C8
+:104BB00002000000000000000404020001100000D8
+:104BC00020080000DF0F0000B4DC01000300020039
+:104BD00000000000E406F606000000001A000800CD
+:104BE00000000000000000000000000000000000C5
+:104BF0000000000005050200011000002008000070
+:104C0000DF0F0000B4DC0100030002000000000020
+:104C1000E606F4060000000018000A00000000008C
+:104C20000000000000000000000000000000000084
+:104C3000060603000110000020080000DF0F00003E
+:104C4000B4DC01000300020000000000E806F206E8
+:104C50000000000016000C00000000000000000032
+:104C60000000000000000000000000000707030033
+:104C70000110000020080000DF0F0000B4DC01007C
+:104C80000300020000000000EA06F0060000000039
+:104C900014000E00000000000000000000000000F2
+:104CA00000000000000000000808030001100000E0
+:104CB00020080000DF0F0000B4DC01000300020048
+:104CC00000000000EC06EE060000000012001000DC
+:104CD00000000000000000000000000000000000D4
+:104CE0000000000009090000001001002008000079
+:104CF000C00F0000B4DC210003000300000000002E
+:104D000094489648504A0000B005B005D00600000F
+:104D10000000000000000000020000000000000091
+:104D2000090900000010000020080000C00F00006A
+:104D3000B4DC210003000300000000009448964802
+:104D4000504A000040064006D00600000000000067
+:104D50000000000002000000810000000A090001BC
+:104D60000110000020080000D30F6000B4DC010631
+:104D7000030002000000000000000000000000002E
+:104D80001C3C1C3CAC3C000000000000000000008B
+:104D900002000000000000000909000000100000EF
+:104DA00020080000D30F0000B4DC2106030003003C
+:104DB0000000000094489648504A00002005200555
+:104DC000D00600000000000000000000020000000B
+:104DD0000000000009090000001000002008000089
+:104DE000D30F0000B4DC2106030003000000000024
+:104DF0000000000000000000200520050000000069
+:104E000000000000000000000000000000000000A2
+:104E1000090900000010000020080000D30F000066
+:104E2000B4DC2103030003000000000000000000C8
+:104E30000000000020052005000000000000000028
+:104E40000000000000000000000000000909000050
+:104E50000010000020080000D30F0000B4DC210384
+:104E6000030003000000000000000000000000003C
+:104E700020052005000000000000000000000000E8
+:104E8000000000000F00000010B43844693E00002C
+:104E9000030000002DB4B4C469020000000000004B
+:104EA0002D38B48410030000000000002DB4B4C4F9
+:104EB00069030000030000002DB4B4C469030000BE
+:104EC0005858585858585858585858585858585862
+:104ED0005858585858585858585858585858585852
+:104EE0005858585858585858585858585858585842
+:104EF0005858585858585858585858585858585832
+:104F00005858585858585858580058000000000031
+:104F100000000000000000005858585858585858D1
+:104F20005858585858585858585858585858585801
+:104F300058585858585858585858585858585858F1
+:104F400058585858585858585858585858585858E1
+:104F500058585858585858585858585858585858D1
+:104F60005800580000000000000000000000000091
+:104F700058585858585858585858585858585858B1
+:104F800058585858585858585858585858585858A1
+:104F90005858585858585858585858585858585891
+:104FA0005858585858585858585858585858585881
+:104FB0005858585858585858580058000000000081
+:104FC0000000000000000000585858585858585821
+:104FD0005858585858585858585858585858585851
+:104FE0005858585858585858585858585858585841
+:104FF0005858585858585858585858585858585831
+:105000005858585858585858585858585858585820
+:1050100058005800000000000000000000000000E0
+:105020005858585858585858585858585858585800
+:1050300058585858585858585858585858585858F0
+:1050400058585858585858585858585858585858E0
+:1050500058585858585858585858585858585858D0
+:1050600058585858585858585800580000000000D0
+:105070000000000000000000585858585858585870
+:1050800058585858585858585858585858585858A0
+:105090005858585858585858585858585858585890
+:1050A0005858585858585858585858585858585880
+:1050B0005858585858585858585858585858585870
+:1050C0005800580000000000000000000000000030
+:1050D0005858585858585858585858585858585850
+:1050E0005858585858585858585858585858585840
+:1050F0005858585858585858585858585858585830
+:10510000585858585858585858585858585858581F
+:10511000585858585858585858005800000000001F
+:1051200000000000000000005858585858585858BF
+:1051300058585858585858585858585858585858EF
+:1051400058585858585858585858585858585858DF
+:1051500058585858585858585858585858585858CF
+:1051600058585858585858585858585858585858BF
+:10517000580058000000000000000000000000007F
+:10518000585858585858585858585858585858589F
+:10519000585858585858585858585858585858588F
+:1051A000585858585858585858585858585858587F
+:1051B000585858585858585858585858585858586F
+:1051C000585858585858585858005800000000006F
+:1051D00000000000000000000000000000000000CF
+:1051E00000000000000000000000000000000000BF
+:1051F00000000000000000000000000000000000AF
+:10520000000000000000000000000000000000009E
+:10521000000000000000000000000000000000008E
+:10522000000000000000000000000000000000007E
+:10523000000000000000000000000000000000006E
+:10524000000000000000000000000000000000005E
+:10525000000000000000000000000000000000004E
+:10526000000000000000000000000000000000003E
+:10527000000000000000000000000000000000002E
+:10528000000000000000000000000000000000001E
+:10529000000000000000000000000000000000000E
+:1052A00000000000000000000000000000000000FE
+:1052B00000000000000000000000000000000000EE
+:1052C00000000000000000000000000000000000DE
+:1052D00000000000000000000000000000000000CE
+:1052E00000000000000000000000000000000000BE
+:1052F00000000000000000000000000000000000AE
+:10530000000000000000000000000000000000009D
+:10531000000000000000000000000000000000008D
+:10532000000000000000000000000000000000007D
+:10533000000000000000000000000000000000006D
+:10534000000000000000000000000000000000005D
+:10535000000000000000000000000000000000004D
+:10536000000000000000000000000000000000003D
+:10537000000000000000000000000000000000002D
+:10538000000000000000000000000000000000001D
+:10539000000000000000000000000000000000000D
+:1053A00000000000000000000000000000000000FD
+:1053B00000000000000000000000000000000000ED
+:1053C00000000000000000000000000000000000DD
+:1053D00000000000000000000000000000000000CD
+:1053E00000000000000000000000000000000000BD
+:1053F00000000000000000000000000000000000AD
+:10540000000000000000000000000000000000009C
+:10541000000000000000000000000000000000008C
+:10542000000000000000000000000000000000007C
+:10543000000000000000000000000000000000006C
+:10544000000000000000000000000000000000005C
+:10545000000000000000000000000000000000004C
+:10546000000000000000000000000000000000003C
+:10547000000000000000000000000000000000002C
+:10548000000000000000000000000000000000001C
+:10549000000000000000000000000000000000000C
+:1054A00000000000000000000000000000000000FC
+:1054B00000000000000000000000000000000000EC
+:1054C00000000000000000000000000000000000DC
+:1054D00000000000000000000000000000000000CC
+:1054E00000000000000000000000000000000000BC
+:1054F00000000000000000000000000000000000AC
+:10550000000000000000000000000000000000009B
+:10551000000000000000000000000000000000008B
+:10552000000000000000000000000000000000007B
+:10553000000000000000000000000000000000006B
+:10554000000000000000000000000000000000005B
+:10555000000000000000000000000000000000004B
+:10556000000000000000000000000000000000003B
+:10557000000000000000000000000000000000002B
+:10558000000000000000000000000000000000001B
+:10559000000000000000000000000000000000000B
+:1055A000B6ADB69DB6ADB6AD02000200B6ADB66DF5
+:1055B000B6A5B6A506000600B6ADB6ADB6ACB69CAF
+:1055C00006000600B6ADB6AD96AD966D06000600B7
+:1055D000B6ADB6ADB2ADB2AD06000600B6A5B6A585
+:1055E000B6ADB6AD06000600B6ACB6ACB6ADB6AD5F
+:1055F0000600060096AD96ADB6ADB6AD0600060047
+:10560000B2ADB2ADB6ADB6AD0600060092A49254EE
+:1056100092A4925402000200E4007000DE18000020
+:10562000BE807000BE807000DE006F00FFFFFFFFD5
+:1056300033DE33DEDDDDDDDD33323332DEDEDEDE92
+:10564000DEDEDEDEDEDEDEDEDEDE000001010101AA
+:105650000101010101010101000000000000000042
+:105660000000000000000000DE80DE80DE00DE00C2
+:1056700033DE33DE33DE33DEDDDDDDDDDDDDDDDDFE
+:105680003332333233323332DEDEDEDEDDDDDDDD9A
+:105690000101010100000000000000000000000006
+:1056A0000000000000000000670746003A190000F3
+:1056B0004107B2034107B2033A019D000706E40027
+:1056C0005A3A5A3A393939395A595A593A3A3A3A80
+:1056D0003A3A3A3A3A3A3A3A3A3A00000101010182
+:1056E00001010101010101010892240040922409F5
+:1056F00049920000000000003A013A013A013A01E3
+:105700005A3A5A3A5A3A5A3A393939393939393981
+:105710005A595A595A595A593A3A3A3A39393939F1
+:1057200001010101000000000812081249004900AF
+:105730004012401201000100670746003A190000BC
+:105740004107B2034107B2033A019D000706E40096
+:105750005A3A5A3A393939395A595A593A3A3A3AEF
+:105760003A3A3A3A3A3A3A3A3A3A000001010101F1
+:105770000101010101010101089224004092240964
+:1057800049920000000000003A013A013A013A0152
+:105790005A3A5A3A5A3A5A3A3939393939393939F1
+:1057A0005A595A595A595A593A3A3A3A3939393961
+:1057B000010101010000000008120812490049001F
+:1057C0004012401201000100030300000303030321
+:1057D000030303030303030303030101E8EBAAAA82
+:1057E000C0000000000000000303030303030303E1
+:1057F00001010101EB0BE80B00FC00FC00000000C4
+:10580000000000000303000003030303030303037A
+:1058100003030303030301010800A0AAC000000062
+:10582000000000000303030303030303010101015C
+:10583000EB0B080000FC00FC000000000000000072
+:1058400047185104440C21044100F1033EF4C00305
+:105850003BE8900338DC600335D0300332C40003EA
+:105860002FB8D0022CACA00229A0700226944002CE
+:1058700023881002207CE0011D70B0011A648001B1
+:1058800017585001144C20011140F0000E34C00094
+:105890000B289000081C6000051030000204000076
+:1058A0001290292540BAC8210AE2671ED409071BB5
+:1058B0009E31A617685945143281E410FCA8830D67
+:1058C000C6D0220A90F8C1065A20610324D80900E4
+:1058D0007602202540BAC8210AE2671ED409071BB8
+:1058E0009E31A617685945143281E410FCA8830D37
+:1058F000C6D0220A90F8C1065A20610324484026E7
+:105900001290292540BAC8210AE2671ED409071B54
+:105910009E31A617685945143281E410FCA8830D06
+:10592000C6D0220A90F8C1065A20610324D8090083
+:105930000090292540BAC8210AE2671ED409071B36
+:105940009E31A617685945143281E410FCA8830DD6
+:10595000C6D0220A90F8C1065A2061032448602765
+:105960000090292540BAC8210AE2671ED409071B06
+:105970009E31A617685945143281E410FCA8830DA6
+:10598000C6D0220A90F8C1065A2061032448602735
+:105990000090292540BAC8210AE2671ED409071BD6
+:1059A0009E31A617685945143281E410FCA8830D76
+:1059B000C6D0220A90F8C1065A2061032448602705
+:1059C00000000000000000000000000000000000D7
+:1059D00000000000000000000000000000000000C7
+:1059E00000000000000000000000000000000000B7
+:1059F00000000000000000000000000000000000A7
+:105A00000000000000000000000000000000000096
+:105A10000000000000000000000000000000000086
+:105A20000000000000000000000000000000000076
+:105A30000000000000000000000000000000000066
+:105A40000000000000000000000000000000000056
+:105A50000000000000000000000000000000000046
+:105A60000000000000000000000000000000000036
+:105A70000000000000000000000000000000000026
+:105A80000000000000000000000000000000000016
+:105A90000000000000000000000000000000000006
+:105AA00000000000000000000000000000000000F6
+:105AB00000000000000000000000000000000000E6
+:105AC00000000000000000000000000000000000D6
+:105AD00000000000000000000000000000000000C6
+:105AE00000000000000000000000000000000000B6
+:105AF00000000000000000000000000000000000A6
+:105B00000000000000000000000000000000000095
+:105B10000000000000000000000000000000000085
+:105B20000000000000000000000000000000000075
+:105B30000000000000000000000000000000000065
+:105B40000000000000000000000000000000000055
+:105B50000000000000000000000000000000000045
+:105B60000000000000000000000000000000000035
+:105B70000000000000000000000000000000000025
+:105B80000000000000000000000000000000000015
+:105B90000000000000000000000000000000000005
+:105BA00000000000000000000000000000000000F5
+:105BB00000000000000000000000000000000000E5
+:105BC00000000000000000000000000000000000D5
+:105BD00000000000000000000000000000000000C5
+:105BE00000000000000000000000000000000000B5
+:105BF00000000000000000000000000000000000A5
+:105C00000502010100000000000000000001040185
+:105C10000304075B0000000000000000000000001B
+:105C2000286200007C620000500C00002088414A7D
+:105C3000E6200040000000400000000000000000DE
+:105C400000240000EEEE010000000000D06280673A
+:105C5000BC672C6BB46D3C6D1C6C104F0000105772
+:105C60002F04095400C186012DB41C00137DDC22D1
+:105C70002701060000C900C900000000500C000008
+:105C80002088414AE620004000000040000000005B
+:105C90000000000000240000EEEE01000000000003
+:105CA00028658067BC67A46BB46D3C6D1C6C9C1D43
+:105CB000000010572F04095400C186012DB41C00A8
+:105CC000137DDC022701060000C900C900000000A6
+:105CD0000000000000080000001000002008000084
+:105CE000DF0F0000FF8E0300000000000000000036
+:105CF000DC06FE06F00B000012000000100500009C
+:105D00000000000000000000020000000000000091
+:105D1000000704000010000020080000DF0F000052
+:105D2000FF8E03000000000000000000DE06FC06FD
+:105D3000F20B000014000200120500000000000039
+:105D40000000000002000000000000000006050046
+:105D50000010000020080000DF0F0000FF8E03008D
+:105D60000000000000000000E006FA06F40B00004E
+:105D700016000400140500000000000000000000F0
+:105D800002000000000000000005060000100000F6
+:105D900020080000DF0F0000FF8E0300000000005D
+:105DA00000000000E206F806F60B000018000600EE
+:105DB00016050000000000000000000002000000C6
+:105DC0000000000000040700001000002008000090
+:105DD000DF0F0000FF8E0300000000000000000045
+:105DE000E406F606000000001A00080000000000AB
+:105DF00000000000000000000000000000000000A3
+:105E0000000308000010000020080000DF0F000061
+:105E1000FF8E03000000000000000000E606F4060C
+:105E2000000000001C000A0000000000000000004C
+:105E30000000000000000000000000000002090057
+:105E40000010000020080000DF0F0000FF8E03009C
+:105E50000000000000000000E806F206000000005C
+:105E60001E000C0000000000000000000000000008
+:105E7000000000000000000000010A000010000007
+:105E800020080000DF0F0000FF8E0300000000006C
+:105E900000000000EA06F0060000000020000E00EE
+:105EA00000000000000000000000000000000000F2
+:105EB0000000000000000B0000100000200800009F
+:105EC000DF0F0000FF8E0300000000000000000054
+:105ED000EC06EE06000000002200100000000000AA
+:105EE00000000000000000000000000000000000B2
+:105EF000080801000110000020080000DF0F00006A
+:105F0000F44120000300030000000000EC06EE0650
+:105F1000000000000000240048004A0000000000CB
+:105F2000000000000300000000000000000001016C
+:105F30000110000020080000DF0F0000B44800003E
+:105F40000000000000000000DC06FE06F00B000070
+:105F5000120000001005000000000000000000001A
+:105F6000020000000000000000010201011000001A
+:105F700020080000DF0F0000B4480000000000000F
+:105F800000000000DE06FC06F20B00001400020018
+:105F900012050000000000000000000002000000E8
+:105FA00000000000000202010110000020080000B3
+:105FB000DF0F0000B44800000000000000000000F7
+:105FC000E006FA06F40B00001600040014050000B9
+:105FD00000000000000000000200000000000000BF
+:105FE000000303010110000020080000DF0F000083
+:105FF000B44800000000000000000000E206F806BF
+:10600000F60B000018000600160500000000000056
+:106010000000000002000000000000000004030176
+:106020000110000020080000DF0F0000B44800004D
+:106030000000000000000000E406F606000000007A
+:106040001A0008000000000000000000000000002E
+:106050000000000000000000000503010110000026
+:1060600020080000DF0F0000B4480000000000001E
+:1060700000000000E606F406000000001C000A0014
+:106080000000000000000000000000000000000010
+:1060900000000000000603010110000020080000BD
+:1060A000DF0F0000B4480000000000000000000006
+:1060B000E806F206000000001E000C0000000000D0
+:1060C00000000000000000000000000000000000D0
+:1060D000000703010110000020080000DF0F00008E
+:1060E000B44800000000000000000000EA06F006CE
+:1060F0000000000020000E00000000000000000072
+:106100000000000000000000000000000008030183
+:106110000110000020080000DF0F0000B44800005C
+:106120000000000000000000EC06EE060000000089
+:10613000220010000000000000000000000000002D
+:10614000000000000000000008080300011000002B
+:1061500020080000DF0F0000F448200003000300C7
+:1061600000000000EC06EE06000000000000240025
+:1061700048004A000000000000000000030000008A
+:10618000000000002DB4B4C4690300000300000047
+:106190002DB4B4C4690300000F00000010B43844EB
+:1061A000693E0000000000002D38B4841003000098
+:1061B00000000000000000000000000000000000DF
+:1061C00000000000000000000000000000000000CF
+:1061D00000000000000000000000000000000000BF
+:1061E00000000000000000000000000000000000AF
+:1061F000000000000000000000000000000000009F
+:10620000000000000000000000000000000000008E
+:10621000000000000000000000000000000000007E
+:10622000000000000000000000000000000000006E
+:10623000000000000000000000000000000000005E
+:10624000000000000000000000000000000000004E
+:10625000000000000000000000000000000000003E
+:10626000000000000000000000000000000000002E
+:10627000000000000000000000000000000000001E
+:10628000000000000000000000000000000000000E
+:1062900000000000000000000000000000000000FE
+:1062A00000000000000000000000000000000000EE
+:1062B00000000000000000000000000000000000DE
+:1062C00000000000000000000000000000000000CE
+:1062D000000000002499249924A924A902000200A6
+:1062E0002469246924A524A50400040024A924A960
+:1062F000A498A4980400040024A924A9146914698A
+:106300000400040024A924A922A922A9040004004D
+:1063100024A524A524A924A904000400A4A8A4A8B1
+:1063200024A924A90400040014A514A924A924A9BB
+:106330000400040022A922A924A924A9040004001D
+:10634000000000000000000000000000FFFFFF3F11
+:10635000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F4D
+:10636000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F3D
+:10637000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F2D
+:10638000FFFFFF3FFFFFFF7FFFFFFF3FFFFFFF3FDD
+:10639000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F0D
+:1063A000FFFFFF3FFFFFFF3FFFFFFF3F00484002AF
+:1063B0003620A1056CF80189A2D0620CD8A8C30FC1
+:1063C0000E812413445985167A31E619B009471D08
+:1063D000E6E1A7601CBA08245292692700484002EF
+:1063E0003620A1056CF801C9A2D0620CD8A8C30F51
+:1063F0000E812413445985967A31E619B009471D58
+:10640000E6E1A7201CBA08245292692769076000B8
+:106410003A1900004707B3034707B3033A019D0049
+:106420000D06EE005A3A5A3A393939395A595A59F9
+:106430003A3A3A3A3A3A3A3A3A3A3A3A3A3A000030
+:106440000101010101010101010101010892240082
+:106450004092240949920000000000003A013A01EC
+:106460003A013A015A3A5A3A5A3A5A3A3939393982
+:10647000393939395A595A595A595A593A3A3A3A84
+:1064800039393939010101010000000008120812F0
+:10649000490049004012401201000100445985168C
+:1064A0007A31E619B009471DE6E1A7201CBA082495
+:1064B0005292692700000000000000000000000068
+:1064C00000000000000000000000000000000000CC
+:1064D00000000000000000000000000000000000BC
+:1064E00000000000000000000000000000000000AC
+:1064F000000000000000000000000000000000009C
+:10650000000000000000000000000000000000008B
+:10651000000000000000000000000000000000007B
+:1065200000000000000000000000000022992499F3
+:1065300024A924A9040002001469246924A924A51B
+:1065400004000400A4A824A92499A4980400040029
+:1065500024A524A9246914690400040024A924A9F9
+:1065600022A922A90400040024A924A514A924A96D
+:106570000400040024A9A4A8A4A824A904000400D9
+:1065800024A914A924A524A90400040024A922A94B
+:1065900024A924A9020004002499249924A924A947
+:1065A00002000200B69DB29DB6ADB6AD0200060077
+:1065B000B66D966DB6A5B6AD06000600B6ADB6AC26
+:1065C000B69CB69D06000600B6ADB6A5966DB66D36
+:1065D00006000600B6ADB6ADB2ADB2AD060006001F
+:1065E000B6A5B6ADB6AD96AD06000600B6ACB6AD76
+:1065F000B6ADB6AC0600060096ADB6ADB6ADB6A566
+:1066000006000600B2ADB6ADB6ADB6AD06000200EE
+:1066100000000000000000000000000042016000D7
+:106620003A19000000819F0000819F003A019D00FF
+:10663000FFFFFFFF5A3A5A3A393939395A595A59EC
+:106640003A3A3A3A3A3A3A3A3A3A3A3A3A3A00001E
+:106650000101010101010101010101010892240070
+:106660004092240949920000000000003A813A81DA
+:106670003A013A015A3A5A3A5A3A5A3A3939393970
+:10668000393939395A595A595A595A593A3A3A3A72
+:1066900039393939010101010000000008120812DE
+:1066A000490049004012401201000100420160000F
+:1066B0003A19000020819F0020819F003A019D002F
+:1066C000FFFFFFFF5A3A5A3A393939395A595A595C
+:1066D0003A3A3A3A3A3A3A3A3A3A3A3A3A3A00008E
+:1066E00001010101010101010101010108922400E0
+:1066F0004092240949920000000000003A813A814A
+:106700003A013A015A3A5A3A5A3A5A3A39393939DF
+:10671000393939395A595A595A595A593A3A3A3AE1
+:10672000393939390101010100000000081208124D
+:10673000490049004012401201000100030300001B
+:10674000030303030303030303030303030301011D
+:10675000EBEBEEEECE0000000000000003030303AD
+:106760000303030301010101EB0B0800000000001B
+:106770000000000000000000030300000303030307
+:106780000303030303030303030301010800E0EE13
+:10679000C00000000000000003030303000000002D
+:1067A00000000000000000000000000000000000E9
+:1067B00000000000FFFFFF3FFFFFFF3FFFFFFF3F25
+:1067C000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD9
+:1067D000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC9
+:1067E000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB9
+:1067F000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA9
+:10680000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F98
+:10681000FFFFFF3F0090292540BAC8210AE2679E8A
+:10682000D409071B9E31A617685945143281E4101C
+:10683000FCA8830DC6D0220A90F8C1465A206103F5
+:10684000244860277602202540BAC8210AE267DE84
+:10685000D409071B9E31A617685945143281E4906C
+:10686000FCA8830DC6D0220A90F8C1065A20610305
+:10687000244840260090292540BAC8210AE2671E14
+:10688000D409071B9E31A617685945143281E410BC
+:10689000FCA8830DC6D0220A90F8C1065A206103D5
+:1068A000244860270090292540BAC8210AE2671EC3
+:1068B000D409071B9E31A617685945143281E4108C
+:1068C000FCA8830DC6D0220A90F8C1065A206103A5
+:1068D000244860271290292540BAC8210AE2671E81
+:1068E000D409071B9E31A617685945143281E4105C
+:1068F000FCA8830DC6D0220A90F8C1065A20610375
+:1069000024D809000090292540BAC8210AE2671E50
+:10691000D409071B9E31A617685945143281E4102B
+:10692000FCA8830DC6D0220A90F8C1065A20610344
+:1069300024486027FFFFFF3FFFFFFF3FFFFFFF3FB0
+:10694000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F57
+:10695000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F47
+:10696000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F37
+:10697000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F27
+:10698000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F17
+:10699000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F07
+:1069A000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF7
+:1069B000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE7
+:1069C000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD7
+:1069D000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC7
+:1069E000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB7
+:1069F000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA7
+:106A0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F96
+:106A1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F86
+:106A2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F76
+:106A3000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F66
+:106A4000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F56
+:106A5000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F46
+:106A6000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F36
+:106A7000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F26
+:106A8000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F16
+:106A9000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F06
+:106AA000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF6
+:106AB000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE6
+:106AC000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD6
+:106AD000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC6
+:106AE000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB6
+:106AF000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA6
+:106B0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F95
+:106B1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F85
+:106B2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F75
+:106B3000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F65
+:106B4000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F55
+:106B5000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F45
+:106B6000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F35
+:106B7000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F25
+:106B8000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F15
+:106B9000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F05
+:106BA000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FF5
+:106BB000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FE5
+:106BC000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FD5
+:106BD000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FC5
+:106BE000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FB5
+:106BF000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3FA5
+:106C0000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F94
+:106C1000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F84
+:106C2000FFFFFF3FFFFFFF3FFFFFFF3FFFFFFF3F74
+:106C3000FFFFFF3F00000000000000000000000018
+:106C40000000000000000000000000000000000044
+:106C50000000000000000000000000000000000034
+:106C60000000000000000000000000000000000024
+:106C70000000000000000000000000000000000014
+:106C80000000000000000000000000000000000004
+:106C900000000000000000000000000000000000F4
+:106CA00000000000000000000000000000000000E4
+:106CB00000000000000000000000000000000000D4
+:106CC00000000000000000000000000000000000C4
+:106CD00000000000000000000000000000000000B4
+:106CE00000000000000000000000000000000000A4
+:106CF0000000000000000000000000000000000094
+:106D00000000000000000000000000000000000083
+:106D10000000000000000000000000000000000073
+:106D20000000000000000000000000000000000063
+:106D30000000000000000000000000000000000053
+:106D40000000000000000000000000000000000043
+:106D50000000000000000000000000000000000033
+:106D60000000000000000000000000000000000023
+:106D70000000000000000000000000000000000013
+:106D80000000000000000000000000000000000003
+:106D900000000000000000000000000000000000F3
+:106DA00000000000000000000000000000000000E3
+:106DB00000000000000000000000000000000000D3
+:106DC00000000000000000000000000000000000C3
+:106DD00000000000000000000000000000000000B3
+:106DE00000000000000000000000000000000000A3
+:106DF0000000000000000000000000000000000093
+:106E00000000000000000000000000000000000082
+:106E10000000000000000000000000000000000072
+:106E20000000000000000000000000000000000062
+:106E30000000000000000000000000000000000052
+:106E40000000000000000000000000000000000042
+:106E50000000000000000000000000000000000032
+:106E60000000000000000000000000000000000022
+:106E70000000000000000000000000000000000012
+:106E80000000000000000000000000000000000002
+:106E900000000000000000000000000000000000F2
+:106EA00000000000000000000000000000000000E2
+:106EB00000000000000000000000000000000000D2
+:106EC00000000000000000000000000000000000C2
+:106ED00000000000000000000000000000000000B2
+:106EE00000000000000000000000000000000000A2
+:106EF0000000000000000000000000000000000092
+:106F00000000000000000000000000000000000081
+:106F10000000000000000000000000000000000071
+:106F20000000000000000000000000000000000061
+:106F30000000000000000000000000000000000051
+:106F40000000000000000000000000000000000041
+:106F50000000000000000000000000000000000031
+:106F60000000000000000000000000000000000021
+:106F70000000000000000000000000000000000011
+:106F80000000000000000000000000000000000001
+:106F900000000000000000000000000000000000F1
+:106FA00000000000000000000000000000000000E1
+:106FB00000000000000000000000000000000000D1
+:106FC00000000000000000000000000000000000C1
+:106FD00000000000000000000000000000000000B1
+:106FE00000000000000000000000000000000000A1
+:106FF0000000000000000000000000000000000091
+:107000000000000000000000000000000000000080
+:107010000000000000000000000000000000000070
+:107020000000000000000000000000000000000060
+:107030000000000000000000000000000000000050
+:107040000000000000000000000000000000000040
+:107050000000000000000000000000000000000030
+:107060000000000000000000000000000000000020
+:107070000000000000000000000000000000000010
+:107080000000000000000000000000000000000000
+:1070900000000000000000000000000000000000F0
+:1070A00000000000000000000000000000000000E0
+:1070B00000000000000000000000000000000000D0
+:1070C00000000000000000000000000000000000C0
+:1070D00000000000000000000000000000000000B0
+:1070E00000000000000000000000000000000000A0
+:1070F0000000000000000000000000000000000090
+:10710000000000000000000000000000000000007F
+:10711000000000000000000000000000000000006F
+:10712000000000000000000000000000000000005F
+:10713000000000000000000000000000000000004F
+:10714000000000000000000000000000000000003F
+:10715000000000000000000000000000000000002F
+:10716000000000000000000000000000000000001F
+:10717000000000000000000000000000000000000F
+:1071800000000000000000000000000000000000FF
+:1071900000000000000000000000000000000000EF
+:1071A00000000000000000000000000000000000DF
+:1071B00000000000000000000000000000000000CF
+:1071C00000000000000000000000000000000000BF
+:1071D00000000000000000000000000000000000AF
+:1071E000000000000000000000000000000000009F
+:1071F000000000000000000000000000000000008F
+:10720000000000000000000000000000000000007E
+:10721000000000000000000000000000000000006E
+:10722000000000000000000000000000000000005E
+:10723000000000000000000000000000000000004E
+:10724000000000000000000000000000000000003E
+:10725000000000000000000000000000000000002E
+:10726000000000000000000000000000000000001E
+:10727000000000000000000000000000000000000E
+:1072800000000000000000000000000000000000FE
+:1072900000000000000000000000000000000000EE
+:1072A00000000000000000000000000000000000DE
+:1072B00000000000000000000000000000000000CE
+:1072C00000000000000000000000000000000000BE
+:1072D00000000000000000000000000000000000AE
+:1072E000000000000000000000000000000000009E
+:1072F000000000000000000000000000000000008E
+:10730000000000000000000000000000000000007D
+:10731000000000000000000000000000000000006D
+:10732000000000000000000000000000000000005D
+:10733000000000000000000000000000000000004D
+:10734000000000000000000000000000000000003D
+:10735000000000000000000000000000000000002D
+:10736000000000000000000000000000000000001D
+:10737000000000000000000000000000000000000D
+:1073800000000000000000000000000000000000FD
+:1073900000000000000000000000000000000000ED
+:1073A00000000000000000000000000000000000DD
+:1073B00000000000000000000000000000000000CD
+:1073C00000000000000000000000000000000000BD
+:1073D00000000000000000000000000000000000AD
+:1073E000000000000000000000000000000000009D
+:1073F000000000000000000000000000000000008D
+:10740000000000000000000000000000000000007C
+:10741000000000000000000000000000000000006C
+:10742000000000000000000000000000000000005C
+:10743000000000000000000000000000000000004C
+:10744000000000000000000000000000000000003C
+:10745000000000000000000000000000000000002C
+:10746000000000000000000000000000000000001C
+:10747000000000000000000000000000000000000C
+:1074800000000000000000000000000000000000FC
+:1074900000000000000000000000000000000000EC
+:1074A00000000000000000000000000000000000DC
+:1074B00000000000000000000000000000000000CC
+:1074C00000000000000000000000000000000000BC
+:1074D00000000000000000000000000000000000AC
+:1074E000000000000000000000000000000000009C
+:1074F000000000000000000000000000000000008C
+:10750000000000000000000000000000000000007B
+:10751000000000000000000000000000000000006B
+:10752000000000000000000000000000000000005B
+:10753000000000000000000000000000000000004B
+:10754000000000000000000000000000000000003B
+:10755000000000000000000000000000000000002B
+:10756000000000000000000000000000000000001B
+:10757000000000000000000000000000000000000B
+:1075800000000000000000000000000000000000FB
+:1075900000000000000000000000000000000000EB
+:1075A00000000000000000000000000000000000DB
+:1075B00000000000000000000000000000000000CB
+:1075C00000000000000000000000000000000000BB
+:1075D00000000000000000000000000000000000AB
+:1075E000000000000000000000000000000000009B
+:1075F000000000000000000000000000000000008B
+:10760000000000000000000000000000000000007A
+:10761000000000000000000000000000000000006A
+:10762000000000000000000000000000000000005A
+:10763000000000000000000000000000000000004A
+:10764000000000000000000000000000000000003A
+:10765000000000000000000000000000000000002A
+:10766000000000000000000000000000000000001A
+:10767000000000000000000000000000000000000A
+:1076800000000000000000000000000000000000FA
+:1076900000000000000000000000000000000000EA
+:1076A00000000000000000000000000000000000DA
+:1076B00000000000000000000000000000000000CA
+:1076C00000000000000000000000000000000000BA
+:1076D00000000000000000000000000000000000AA
+:1076E000000000000000000000000000000000009A
+:1076F000000000000000000000000000000000008A
+:107700000000000000000000000000000000000079
+:107710000000000000000000000000000000000069
+:107720000000000000000000000000000000000059
+:107730000000000000000000000000000000000049
+:107740000000000000000000000000000000000039
+:107750000000000000000000000000000000000029
+:107760000000000000000000000000000000000019
+:107770000000000000000000000000000000000009
+:1077800000000000000000000000000000000000F9
+:1077900000000000000000000000000000000000E9
+:1077A00000000000000000000000000000000000D9
+:1077B00000000000000000000000000000000000C9
+:1077C00000000000000000000000000000000000B9
+:1077D00000000000000000000000000000000000A9
+:1077E0000000000000000000000000000000000099
+:1077F0000000000000000000000000000000000089
+:107800000000000000000000000000000000000078
+:107810000000000000000000000000000000000068
+:107820000000000000000000000000000000000058
+:107830000000000000000000000000000000000048
+:107840000000000000000000000000000000000038
+:107850000000000000000000000000000000000028
+:107860000000000000000000000000000000000018
+:107870000000000000000000000000000000000008
+:1078800000000000000000000000000000000000F8
+:1078900000000000000000000000000000000000E8
+:1078A00000000000000000000000000000000000D8
+:1078B00000000000000000000000000000000000C8
+:1078C00000000000000000000000000000000000B8
+:1078D00000000000000000000000000000000000A8
+:1078E0000000000000000000000000000000000098
+:1078F0000000000000000000000000000000000088
+:107900000000000000000000000000000000000077
+:107910000000000000000000000000000000000067
+:107920000000000000000000000000000000000057
+:107930000000000000000000000000000000000047
+:107940000000000000000000000000000000000037
+:107950000000000000000000000000000000000027
+:107960000000000000000000000000000000000017
+:107970000000000000000000000000000000000007
+:1079800000000000000000000000000000000000F7
+:1079900000000000000000000000000000000000E7
+:1079A00000000000000000000000000000000000D7
+:1079B00000000000000000000000000000000000C7
+:1079C00000000000000000000000000000000000B7
+:1079D00000000000000000000000000000000000A7
+:1079E0000000000000000000000000000000000097
+:1079F0000000000000000000000000000000000087
+:107A00000000000000000000000000000000000076
+:107A10000000000000000000000000000000000066
+:107A20000000000000000000000000000000000056
+:107A30000000000000000000000000000000000046
+:107A40000000000000000000000000000000000036
+:107A50000000000000000000000000000000000026
+:107A60000000000000000000000000000000000016
+:107A70000000000000000000000000000000000006
+:107A800000000000000000000000000000000000F6
+:107A900000000000000000000000000000000000E6
+:107AA00000000000000000000000000000000000D6
+:107AB00000000000000000000000000000000000C6
+:107AC00000000000000000000000000000000000B6
+:107AD00000000000000000000000000000000000A6
+:107AE0000000000000000000000000000000000096
+:107AF0000000000000000000000000000000000086
+:107B00000000000000000000000000000000000075
+:107B10000000000000000000000000000000000065
+:107B20000000000000000000000000000000000055
+:107B30000000000000000000000000000000000045
+:107B40000000000000000000000000000000000035
+:107B50000000000000000000000000000000000025
+:107B60000000000000000000000000000000000015
+:107B70000000000000000000000000000000000005
+:107B800000000000000000000000000000000000F5
+:107B900000000000000000000000000000000000E5
+:107BA00000000000000000000000000000000000D5
+:107BB00000000000000000000000000000000000C5
+:107BC00000000000000000000000000000000000B5
+:107BD00000000000000000000000000000000000A5
+:107BE0000000000000000000000000000000000095
+:107BF0000000000000000000000000000000000085
+:107C00000000000000000000000000000000000074
+:107C10000000000000000000000000000000000064
+:107C20000000000000000000000000000000000054
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000034
+:107C50000000000000000000000000000000000024
+:107C60000000000000000000000000000000000014
+:107C70000000000000000000000000000000000004
+:107C800000000000000000000000000000000000F4
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000000C4
+:107CC00000000000000000000000000000000000B4
+:107CD00000000000000000000000000000000000A4
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000084
+:107D00000000000000000000000000000000000073
+:107D10000000000000000000000000000000000063
+:107D20000000000000000000000000000000000053
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000033
+:107D50000000000000000000000000000000000023
+:107D60000000000000000000000000000000000013
+:107D70000000000000000000000000000000000003
+:107D800000000000000000000000000000000000F3
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC00000000000000000000000000000000000B3
+:107DD00000000000000000000000000000000000A3
+:107DE0000000000000000000000000000000000093
+:107DF0000000000000000000000000000000000083
+:107E00000000000000000000000000000000000072
+:107E10000000000000000000000000000000000062
+:107E20000000000000000000000000000000000052
+:107E30000000000000000000000000000000000042
+:107E40000000000000000000000000000000000032
+:107E50000000000000000000000000000000000022
+:107E60000000000000000000000000000000000012
+:107E70000000000000000000000000000000000002
+:107E800000000000000000000000000000000000F2
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000000000000000000000B2
+:107ED00000000000000000000000000000000000A2
+:107EE0000000000000000000000000000000000092
+:107EF0000000000000000000000000000000000082
+:107F00000000000000000000000000000000000071
+:107F10000000000000000000000000000000000061
+:107F20000000000000000000000000000000000051
+:107F30000000000000000000000000000000000041
+:107F40000000000000000000000000000000000031
+:107F50000000000000000000000000000000000021
+:107F60000000000000000000000000000000000011
+:107F70000000000000000000000000000000000001
+:107F800000000000000000000000000000000000F1
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000000000000000000000B1
+:107FD00000000000000000000000000000000000A1
+:107FE0000000000000000000000000000000000091
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000000000000000000000B0
+:1080D00000000000000000000000000000000000A0
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000005F
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000000000000000000000AF
+:1081D000000000000000000000000000000000009F
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000005E
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000000000000000000000AE
+:1082D000000000000000000000000000000000009E
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000005D
+:10832000000000000000000000000000000000004D
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000000D
+:1083700000000000000000000000000000000000FD
+:1083800000000000000000000000000000000000ED
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000000000000000000CD
+:1083B00000000000000000000000000000000000BD
+:1083C00000000000000000000000000000000000AD
+:1083D000000000000000000000000000000000009D
+:1083E000000000000000000000000000000000008D
+:1083F000000000000000000000000000000000007D
+:10840000000000000000000000000000000000006C
+:10841000000000000000000000000000000000005C
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000000C
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000000000000000000000AC
+:1084D000000000000000000000000000000000009C
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:10851000000000000000000000000000000000005B
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:10856000000000000000000000000000000000000B
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C00000000000000000000000000000000000AB
+:1085D000000000000000000000000000000000009B
+:1085E000000000000000000000000000000000008B
+:1085F000000000000000000000000000000000007B
+:10860000000000000000000000000000000000006A
+:10861000000000000000000000000000000000005A
+:10862000000000000000000000000000000000004A
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:10865000000000000000000000000000000000001A
+:10866000000000000000000000000000000000000A
+:1086700000000000000000000000000000000000FA
+:1086800000000000000000000000000000000000EA
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000000000000000000000CA
+:1086B00000000000000000000000000000000000BA
+:1086C00000000000000000000000000000000000AA
+:1086D000000000000000000000000000000000009A
+:1086E000000000000000000000000000000000008A
+:1086F000000000000000000000000000000000007A
+:108700000000000000000000000000000000000069
+:108710000000000000000000000000000000000059
+:108720000000000000000000000000000000000049
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000000000000000000019
+:108760000000000000000000000000000000000009
+:1087700000000000000000000000000000000000F9
+:1087800000000000000000000000000000000000E9
+:1087900000000000000000000000000000000000D9
+:1087A00000000000000000000000000000000000C9
+:1087B00000000000000000000000000000000000B9
+:1087C00000000000000000000000000000000000A9
+:1087D0000000000000000000000000000000000099
+:1087E0000000000000000000000000000000000089
+:1087F0000000000000000000000000000000000079
+:108800000000000000000000000000000000000068
+:108810000000000000000000000000000000000058
+:108820000000000000000000000000000000000048
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850000000000000000000000000000000000018
+:108860000000000000000000000000000000000008
+:1088700000000000000000000000000000000000F8
+:1088800000000000000000000000000000000000E8
+:1088900000000000000000000000000000000000D8
+:1088A00000000000000000000000000000000000C8
+:1088B00000000000000000000000000000000000B8
+:1088C00000000000000000000000000000000000A8
+:1088D0000000000000000000000000000000000098
+:1088E0000000000000000000000000000000000088
+:1088F0000000000000000000000000000000000078
+:108900000000000000000000000000000000000067
+:108910000000000000000000000000000000000057
+:108920000000000000000000000000000000000047
+:108930000000000000000000000000000000000037
+:108940000000000000000000000000000000000027
+:108950000000000000000000000000000000000017
+:108960000000000000000000000000000000000007
+:1089700000000000000000000000000000000000F7
+:1089800000000000000000000000000000000000E7
+:1089900000000000000000000000000000000000D7
+:1089A00000000000000000000000000000000000C7
+:1089B00000000000000000000000000000000000B7
+:1089C00000000000000000000000000000000000A7
+:1089D0000000000000000000000000000000000097
+:1089E0000000000000000000000000000000000087
+:1089F0000000000000000000000000000000000077
+:108A00000000000000000000000000000000000066
+:108A10000000000000000000000000000000000056
+:108A20000000000000000000000000000000000046
+:108A30000000000000000000000000000000000036
+:108A40000000000000000000000000000000000026
+:108A50000000000000000000000000000000000016
+:108A60000000000000000000000000000000000006
+:108A700000000000000000000000000000000000F6
+:108A800000000000000000000000000000000000E6
+:108A900000000000000000000000000000000000D6
+:108AA00000000000000000000000000000000000C6
+:108AB00000000000000000000000000000000000B6
+:108AC00000000000000000000000000000000000A6
+:108AD0000000000000000000000000000000000096
+:108AE0000000000000000000000000000000000086
+:108AF0000000000000000000000000000000000076
+:108B00000000000000000000000000000000000065
+:108B10000000000000000000000000000000000055
+:108B20000000000000000000000000000000000045
+:108B30000000000000000000000000000000000035
+:108B40000000000000000000000000000000000025
+:108B50000000000000000000000000000000000015
+:108B60000000000000000000000000000000000005
+:108B700000000000000000000000000000000000F5
+:108B800000000000000000000000000000000000E5
+:108B900000000000000000000000000000000000D5
+:108BA00000000000000000000000000000000000C5
+:108BB00000000000000000000000000000000000B5
+:108BC00000000000000000000000000000000000A5
+:108BD0000000000000000000000000000000000095
+:108BE0000000000000000000000000000000000085
+:108BF0000000000000000000000000000000000075
+:108C00000000000000000000000000000000000064
+:108C10000000000000000000000000000000000054
+:108C20000000000000000000000000000000000044
+:108C30000000000000000000000000000000000034
+:108C40000000000000000000000000000000000024
+:108C50000000000000000000000000000000000014
+:108C60000000000000000000000000000000000004
+:108C700000000000000000000000000000000000F4
+:108C800000000000000000000000000000000000E4
+:108C900000000000000000000000000000000000D4
+:108CA00000000000000000000000000000000000C4
+:108CB00000000000000000000000000000000000B4
+:108CC00000000000000000000000000000000000A4
+:108CD0000000000000000000000000000000000094
+:108CE0000000000000000000000000000000000084
+:108CF0000000000000000000000000000000000074
+:108D00000000000000000000000000000000000063
+:108D10000000000000000000000000000000000053
+:108D20000000000000000000000000000000000043
+:108D30000000000000000000000000000000000033
+:108D40000000000000000000000000000000000023
+:108D50000000000000000000000000000000000013
+:108D60000000000000000000000000000000000003
+:108D700000000000000000000000000000000000F3
+:108D800000000000000000000000000000000000E3
+:108D900000000000000000000000000000000000D3
+:108DA00000000000000000000000000000000000C3
+:108DB00000000000000000000000000000000000B3
+:108DC00000000000000000000000000000000000A3
+:108DD0000000000000000000000000000000000093
+:108DE0000000000000000000000000000000000083
+:108DF0000000000000000000000000000000000073
+:108E00000000000000000000000000000000000062
+:108E10000000000000000000000000000000000052
+:108E20000000000000000000000000000000000042
+:108E30000000000000000000000000000000000032
+:108E40000000000000000000000000000000000022
+:108E50000000000000000000000000000000000012
+:108E60000000000000000000000000000000000002
+:108E700000000000000000000000000000000000F2
+:108E800000000000000000000000000000000000E2
+:108E900000000000000000000000000000000000D2
+:108EA00000000000000000000000000000000000C2
+:108EB00000000000000000000000000000000000B2
+:108EC00000000000000000000000000000000000A2
+:108ED0000000000000000000000000000000000092
+:108EE0000000000000000000000000000000000082
+:108EF0000000000000000000000000000000000072
+:108F00000000000000000000000000000000000061
+:108F10000000000000000000000000000000000051
+:108F20000000000000000000000000000000000041
+:108F30000000000000000000000000000000000031
+:108F40000000000000000000000000000000000021
+:108F50000000000000000000000000000000000011
+:108F60000000000000000000000000000000000001
+:108F700000000000000000000000000000000000F1
+:108F800000000000000000000000000000000000E1
+:108F900000000000000000000000000000000000D1
+:108FA00000000000000000000000000000000000C1
+:108FB00000000000000000000000000000000000B1
+:108FC00000000000000000000000000000000000A1
+:108FD0000000000000000000000000000000000091
+:108FE0000000000000000000000000000000000081
+:108FF0000000000000000000000000000000000071
+:109000000000000000000000000000000000000060
+:109010000000000000000000000000000000000050
+:109020000000000000000000000000000000000040
+:109030000000000000000000000000000000000030
+:109040000000000000000000000000000000000020
+:109050000000000000000000000000000000000010
+:109060000000000000000000000000000000000000
+:1090700000000000000000000000000000000000F0
+:1090800000000000000000000000000000000000E0
+:1090900000000000000000000000000000000000D0
+:1090A00000000000000000000000000000000000C0
+:1090B00000000000000000000000000000000000B0
+:1090C00000000000000000000000000000000000A0
+:1090D0000000000000000000000000000000000090
+:1090E0000000000000000000000000000000000080
+:1090F0000000000000000000000000000000000070
+:10910000000000000000000000000000000000005F
+:10911000000000000000000000000000000000004F
+:10912000000000000000000000000000000000003F
+:10913000000000000000000000000000000000002F
+:10914000000000000000000000000000000000001F
+:10915000000000000000000000000000000000000F
+:1091600000000000000000000000000000000000FF
+:1091700000000000000000000000000000000000EF
+:1091800000000000000000000000000000000000DF
+:1091900000000000000000000000000000000000CF
+:1091A00000000000000000000000000000000000BF
+:1091B00000000000000000000000000000000000AF
+:1091C000000000000000000000000000000000009F
+:1091D000000000000000000000000000000000008F
+:1091E000000000000000000000000000000000007F
+:1091F000000000000000000000000000000000006F
+:10920000000000000000000000000000000000005E
+:10921000000000000000000000000000000000004E
+:10922000000000000000000000000000000000003E
+:10923000000000000000000000000000000000002E
+:10924000000000000000000000000000000000001E
+:10925000000000000000000000000000000000000E
+:1092600000000000000000000000000000000000FE
+:1092700000000000000000000000000000000000EE
+:1092800000000000000000000000000000000000DE
+:1092900000000000000000000000000000000000CE
+:1092A00000000000000000000000000000000000BE
+:1092B00000000000000000000000000000000000AE
+:1092C000000000000000000000000000000000009E
+:1092D000000000000000000000000000000000008E
+:1092E000000000000000000000000000000000007E
+:1092F000000000000000000000000000000000006E
+:10930000000000000000000000000000000000005D
+:10931000000000000000000000000000000000004D
+:10932000000000000000000000000000000000003D
+:10933000000000000000000000000000000000002D
+:10934000000000000000000000000000000000001D
+:10935000000000000000000000000000000000000D
+:1093600000000000000000000000000000000000FD
+:1093700000000000000000000000000000000000ED
+:1093800000000000000000000000000000000000DD
+:1093900000000000000000000000000000000000CD
+:1093A00000000000000000000000000000000000BD
+:1093B00000000000000000000000000000000000AD
+:1093C000000000000000000000000000000000009D
+:1093D000000000000000000000000000000000008D
+:1093E000000000000000000000000000000000007D
+:1093F000000000000000000000000000000000006D
+:10940000000000000000000000000000000000005C
+:10941000000000000000000000000000000000004C
+:10942000000000000000000000000000000000003C
+:10943000000000000000000000000000000000002C
+:10944000000000000000000000000000000000001C
+:10945000000000000000000000000000000000000C
+:1094600000000000000000000000000000000000FC
+:1094700000000000000000000000000000000000EC
+:1094800000000000000000000000000000000000DC
+:1094900000000000000000000000000000000000CC
+:1094A00000000000000000000000000000000000BC
+:1094B00000000000000000000000000000000000AC
+:1094C000000000000000000000000000000000009C
+:1094D000000000000000000000000000000000008C
+:1094E000000000000000000000000000000000007C
+:1094F000000000000000000000000000000000006C
+:10950000000000000000000000000000000000005B
+:10951000000000000000000000000000000000004B
+:10952000000000000000000000000000000000003B
+:10953000000000000000000000000000000000002B
+:10954000000000000000000000000000000000001B
+:10955000000000000000000000000000000000000B
+:1095600000000000000000000000000000000000FB
+:1095700000000000000000000000000000000000EB
+:1095800000000000000000000000000000000000DB
+:1095900000000000000000000000000000000000CB
+:1095A00000000000000000000000000000000000BB
+:1095B00000000000000000000000000000000000AB
+:1095C000000000000000000000000000000000009B
+:1095D000000000000000000000000000000000008B
+:1095E000000000000000000000000000000000007B
+:1095F000000000000000000000000000000000006B
+:10960000000000000000000000000000000000005A
+:10961000000000000000000000000000000000004A
+:10962000000000000000000000000000000000003A
+:10963000000000000000000000000000000000002A
+:10964000000000000000000000000000000000001A
+:10965000000000000000000000000000000000000A
+:1096600000000000000000000000000000000000FA
+:1096700000000000000000000000000000000000EA
+:1096800000000000000000000000000000000000DA
+:1096900000000000000000000000000000000000CA
+:1096A00000000000000000000000000000000000BA
+:1096B00000000000000000000000000000000000AA
+:1096C000000000000000000000000000000000009A
+:1096D000000000000000000000000000000000008A
+:1096E000000000000000000000000000000000007A
+:1096F000000000000000000000000000000000006A
+:109700000000000000000000000000000000000059
+:109710000000000000000000000000000000000049
+:109720000000000000000000000000000000000039
+:109730000000000000000000000000000000000029
+:109740000000000000000000000000000000000019
+:109750000000000000000000000000000000000009
+:1097600000000000000000000000000000000000F9
+:1097700000000000000000000000000000000000E9
+:1097800000000000000000000000000000000000D9
+:1097900000000000000000000000000000000000C9
+:1097A00000000000000000000000000000000000B9
+:1097B00000000000000000000000000000000000A9
+:1097C0000000000000000000000000000000000099
+:1097D0000000000000000000000000000000000089
+:1097E0000000000000000000000000000000000079
+:1097F0000000000000000000000000000000000069
+:109800000000000000000000000000000000000058
+:109810000000000000000000000000000000000048
+:109820000000000000000000000000000000000038
+:109830000000000000000000000000000000000028
+:109840000000000000000000000000000000000018
+:109850000000000000000000000000000000000008
+:1098600000000000000000000000000000000000F8
+:1098700000000000000000000000000000000000E8
+:1098800000000000000000000000000000000000D8
+:1098900000000000000000000000000000000000C8
+:1098A00000000000000000000000000000000000B8
+:1098B00000000000000000000000000000000000A8
+:1098C0000000000000000000000000000000000098
+:1098D0000000000000000000000000000000000088
+:1098E0000000000000000000000000000000000078
+:1098F0000000000000000000000000000000000068
+:109900000000000000000000000000000000000057
+:109910000000000000000000000000000000000047
+:109920000000000000000000000000000000000037
+:109930000000000000000000000000000000000027
+:109940000000000000000000000000000000000017
+:109950000000000000000000000000000000000007
+:1099600000000000000000000000000000000000F7
+:1099700000000000000000000000000000000000E7
+:1099800000000000000000000000000000000000D7
+:1099900000000000000000000000000000000000C7
+:1099A00000000000000000000000000000000000B7
+:1099B00000000000000000000000000000000000A7
+:1099C0000000000000000000000000000000000097
+:1099D0000000000000000000000000000000000087
+:1099E0000000000000000000000000000000000077
+:1099F0000000000000000000000000000000000067
+:109A00000000000000000000000000000000000056
+:109A10000000000000000000000000000000000046
+:109A20000000000000000000000000000000000036
+:109A30000000000000000000000000000000000026
+:109A40000000000000000000000000000000000016
+:109A50000000000000000000000000000000000006
+:109A600000000000000000000000000000000000F6
+:109A700000000000000000000000000000000000E6
+:109A800000000000000000000000000000000000D6
+:109A900000000000000000000000000000000000C6
+:109AA00000000000000000000000000000000000B6
+:109AB00000000000000000000000000000000000A6
+:109AC0000000000000000000000000000000000096
+:109AD0000000000000000000000000000000000086
+:109AE0000000000000000000000000000000000076
+:109AF0000000000000000000000000000000000066
+:109B00000000000000000000000000000000000055
+:109B10000000000000000000000000000000000045
+:109B20000000000000000000000000000000000035
+:109B30000000000000000000000000000000000025
+:109B40000000000000000000000000000000000015
+:109B50000000000000000000000000000000000005
+:109B600000000000000000000000000000000000F5
+:109B700000000000000000000000000000000000E5
+:109B800000000000000000000000000000000000D5
+:109B900000000000000000000000000000000000C5
+:109BA00000000000000000000000000000000000B5
+:109BB00000000000000000000000000000000000A5
+:109BC0000000000000000000000000000000000095
+:109BD0000000000000000000000000000000000085
+:109BE0000000000000000000000000000000000075
+:109BF0000000000000000000000000000000000065
+:109C00000000000000000000000000000000000054
+:109C10000000000000000000000000000000000044
+:109C20000000000000000000000000000000000034
+:109C30000000000000000000000000000000000024
+:109C40000000000000000000000000000000000014
+:109C50000000000000000000000000000000000004
+:109C600000000000000000000000000000000000F4
+:109C700000000000000000000000000000000000E4
+:109C800000000000000000000000000000000000D4
+:109C900000000000000000000000000000000000C4
+:109CA00000000000000000000000000000000000B4
+:109CB00000000000000000000000000000000000A4
+:109CC0000000000000000000000000000000000094
+:109CD0000000000000000000000000000000000084
+:109CE0000000000000000000000000000000000074
+:109CF0000000000000000000000000000000000064
+:109D00000000000000000000000000000000000053
+:109D10000000000000000000000000000000000043
+:109D20000000000000000000000000000000000033
+:109D30000000000000000000000000000000000023
+:109D40000000000000000000000000000000000013
+:109D50000000000000000000000000000000000003
+:109D600000000000000000000000000000000000F3
+:109D700000000000000000000000000000000000E3
+:109D800000000000000000000000000000000000D3
+:109D900000000000000000000000000000000000C3
+:109DA00000000000000000000000000000000000B3
+:109DB00000000000000000000000000000000000A3
+:109DC0000000000000000000000000000000000093
+:109DD0000000000000000000000000000000000083
+:109DE0000000000000000000000000000000000073
+:109DF0000000000000000000000000000000000063
+:109E00000000000000000000000000000000000052
+:109E10000000000000000000000000000000000042
+:109E20000000000000000000000000000000000032
+:109E30000000000000000000000000000000000022
+:109E40000000000000000000000000000000000012
+:109E50000000000000000000000000000000000002
+:109E600000000000000000000000000000000000F2
+:109E700000000000000000000000000000000000E2
+:109E800000000000000000000000000000000000D2
+:109E900000000000000000000000000000000000C2
+:109EA00000000000000000000000000000000000B2
+:109EB00000000000000000000000000000000000A2
+:109EC0000000000000000000000000000000000092
+:109ED0000000000000000000000000000000000082
+:109EE0000000000000000000000000000000000072
+:109EF0000000000000000000000000000000000062
+:109F00000000000000000000000000000000000051
+:109F10000000000000000000000000000000000041
+:109F20000000000000000000000000000000000031
+:109F30000000000000000000000000000000000021
+:109F40000000000000000000000000000000000011
+:109F50000000000000000000000000000000000001
+:109F600000000000000000000000000000000000F1
+:109F700000000000000000000000000000000000E1
+:109F800000000000000000000000000000000000D1
+:109F900000000000000000000000000000000000C1
+:109FA00000000000000000000000000000000000B1
+:109FB00000000000000000000000000000000000A1
+:109FC0000000000000000000000000000000000091
+:109FD0000000000000000000000000000000000081
+:109FE0000000000000000000000000000000000071
+:109FF0000000000000000000000000000000000061
+:10A000001BE412243804E8080E0A000101010812BA
+:10A010002400380400090000000C000400000000C7
+:10A0200000000E5900000000000000000009010AB5
+:10A0300000013C4088020000281E2000C0314F0073
+:10A04000000E0100000E0100C0314F00C0314F0072
+:10A05000000E0100000E0100C0314F00C0314F0062
+:10A06000000E0100000E0100C0314F00C0314F0052
+:10A07000000E0100000E0100C0314F000000000082
+:10A0800000010100000000000000000000000000CE
+:10A0900000000000000000000001010101010100BA
+:10A0A00000010100000101010101010100000100A6
+:10A0B00001000000000000000F0F000001012D0052
+:10A0C0002D000A00640078000100320001015F00E9
+:10A0D0005F0014000A007800000064002D000000FA
+:10A0E00000000000000000002C01F4012C012C01F4
+:10A0F0002C010A0A000120000001F40105050000FE
+:10A1000007010000CEFFD3FF3700F6FF1200E4FF87
+:10A11000FF7FFF7FFF7FFF7FFF7FFF7F960096001F
+:10A120003C003C320A08CECE323228050000000046
+:10A1300001070D1200240D00000000122424242425
+:10A140002424242424242424242424242424000017
+:10A1500000000000000000000000000000000000FF
+:10A160000A05000A000000002328011E1114000047
+:10A170000000000000000000010200030400FA0FCC
+:10A18000000000000F1E324650000000736C5A5A47
+:10A190005555555508000000000000000F1E3246BE
+:10A1A00050000000736C5A5A555555550F141E280F
+:10A1B000000000000A0A0A0A0A0A0A0A0F1E3246AA
+:10A1C00000000000645F553C3C3C3C3C000000004B
+:10A1D00003081C004200ECFF1700B0008200BC0224
+:10A1E000000000000010000055002D00C8002800ED
+:10A1F0000F000F00C800C800C800C80000003704E6
+:10A200000000E708F401000037040000E7083214FA
+:10A21000021E1E320200AF00280028006400D40392
+:10A2200064008408000000003804300020000100B1
+:10A23000220000003A00520070008F00AF00CF00F3
+:10A24000EF000F012E014F016E018E01AD01CE0115
+:10A25000EC010F022D024D026D028D02AC02CC0208
+:10A26000EB020B032B034A036A038903AA03C90306
+:10A27000E703FF03370400000000000000000000B7
+:10A2800000000000000000000000000000000000CE
+:10A2900000000000000000000000000000000000BE
+:10A2A00000000000000000000000000000000000AE
+:10A2B000000000000000000000000000000000009E
+:10A2C000000000000000000000000000000000008E
+:10A2D000000000000000000000000000000000007E
+:10A2E000000000000000000000000000000000006E
+:10A2F00000000000000000000000000930004600DF
+:10A300000100480000003C00430066008500A900F1
+:10A31000C800E90009012A0149016B018901AB016B
+:10A32000C901EB0109022B024A026C028A02AC024B
+:10A33000CA02EC020B032D034B036D038B03AE0328
+:10A34000CB03EE030C042F044C046F048B04AF0406
+:10A35000CC04EF040D0530054D0570058D05B005E5
+:10A36000CD05F1050D0630064E0672068E06B106C5
+:10A37000CE06F2060F073207500773079007B307A0
+:10A38000D107F40711083408520875089108B1087C
+:10A39000C608E70800000000000000000000000000
+:10A3A00000000000000000000000000000000000AD
+:10A3B000000000000000000000000000000000009D
+:10A3C000000000000000000000000000000000008D
+:10A3D00002022000F16C0000409C000084D90600BD
+:10A3E00029B1010010270000C4090000010101018A
+:10A3F000010101010101014B0F00460000000000B6
+:10A40000020101010101010101010100F16C0000E3
+:10A4100002010101010101010101010084DE0100CD
+:10A42000000000000F0F0A0A1E00000000000000DC
+:10A430000F0F141400010101010140003200E80374
+:10A440000F0008000500E100000006060A001400E5
+:10A4500014000400000000001400140064009001C7
+:10A460000000000141020000000000006801000D32
+:10A470000F006400640064000A0064002C016400A2
+:10A480002C010A02E8E8F800F800010201001900B6
+:10A490006A00750081008E009D00AC00BD00CF00F9
+:10A4A000E200F7000D01260140015C0179019901EC
+:10A4B000BC01E001060230025B028902BA02EE0230
+:10A4C00024035D039A03D9031B046004A904F40464
+:10A4D00043059505E90541069C06FA065B07BE079C
+:10A4E00024088D08F8086509D409450AB80A2D0B17
+:10A4F000A20B190C900C080D800DF80D6F0EE60ED6
+:10A500005C0FD00F4210B31021118C11F4115912AD
+:10A51000BA1217137013C41313145D14A114E014AA
+:10A5200018154B1577159C15BB15D415E515EF15AA
+:10A53000F3156A00750081008E009D00AC00BD001F
+:10A54000CF00E200F7000D01260140015C01790116
+:10A550009901BC01E001060230025B028902BA02E5
+:10A56000EE0224035D039A03D9031B046004A904CB
+:10A57000F40443059505E90541069C06FA065B07C8
+:10A58000BE0724088D08F8086509D409450AB80AE9
+:10A590002D0BA20B190C900C080D800DF80D6F0EF1
+:10A5A000E60E5C0FD00F4210B31021118C11F41184
+:10A5B0005912BA1217137013C41313145D14A11493
+:10A5C000E01418154B1577159C15BB15D415E5151A
+:10A5D000EF15F315A500B300C300D400E700FA009F
+:10A5E0000F0126013E01570172018F01AE01CF011B
+:10A5F000F10116023C0265029002BD02ED021E034B
+:10A6000052038903C203FE033C047C04BF04050516
+:10A610004D059805E50535068706DB0632078A07EE
+:10A62000E5074208A10801096309C7092C0A920A33
+:10A63000F90A600BC80B310C9A0C020D6B0DD20D90
+:10A64000390E9F0E040F670FC80F27108410DE10FD
+:10A6500035118911DA1128127112B712F812351357
+:10A660006D13A013CF13F8131C143B145414681467
+:10A6700076147E1481149800A600B500C500D7009A
+:10A68000EA00FE0013012B0143015E017A019801EB
+:10A69000B701D901FD0122024A027502A102D002CE
+:10A6A000010335036B03A403DF031D045D04A00451
+:10A6B000E6042E057905C70517066A06BF061607C4
+:10A6C0007007CC072B088B08ED085109B6091D0A45
+:10A6D000850AEF0A590BC40B2F0C9A0C060D710D4D
+:10A6E000DC0D460EAF0E170F7D0FE10F4310A310C8
+:10A6F00001115B11B21106125612A212EB122E13A7
+:10A700006D13A813DD130D1438145E147E14981401
+:10A71000AD14BB14C414C7145500550045004200C5
+:10A720000000000001036400640264005A008C0011
+:10A73000BE00140005000000000000000000000042
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000000F9
+:10A7600000000000000000000000000000000000E9
+:10A77000000000001B0000000000000000000000BE
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000000000000000000000079
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000000000048
+:10A810000000000000000000000000000000000038
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000000F8
+:10A8600000000000000000000000000000000000E8
+:10A8700000000000000000000000000000000000D8
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000000000000A8
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000000000000000000000078
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000000000047
+:10A910000000000000000000000000000000000037
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000000000017
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000000F7
+:10A9600000000000000000000000000000000000E7
+:10A9700000000000000000000000000000000000D7
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000000A7
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000000000000000000000077
+:10A9E0000000000000000000000000000000000067
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000046
+:10AA10000000000000000000000000000000000036
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000000000016
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000000F6
+:10AA600000000000000000000000000000000000E6
+:10AA700000000000000000000000000000000000D6
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000000A6
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000000000000000000000076
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000000F5
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000000000000042
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF00000000000000000000000000000000000041
+:10AF10000000000000000000000000000000000031
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF000000000000000000000000000004E565459
+:10B00000000076425C0F88431900CE400C001741C7
+:10B010000000000000000000000000000000000030
+:10B02000002492000000000020204801204E02076A
+:10B0300041B428122342B428122243B428122344D4
+:10B04000B428122345B4281223469428122348B466
+:10B050002812220000000000000000000000000094
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B090000000000000000000000000000000610E41
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D0000000000000000000000000000000000070
+:10B0E0000000000000000000000000000000000060
+:10B0F0000000000000000000000000000000000050
+:10B10000000000000000000000000000000000003F
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000000000000000000000000F
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000007F
+:10B1D000000000000000000000000000000000006F
+:10B1E000000000000000000000000000000000005F
+:10B1F000000000000000000000000000000000004F
+:10B20000000000000000000000000000000000003E
+:10B21000000000000000000000000000000000002E
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000000000000000000000000E
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000007E
+:10B2D000000000000000000000000000000000006E
+:10B2E000000000000000000000000000000000005E
+:10B2F000000000000000000000000000000000004E
+:10B30000000000000000000000000000000000003D
+:10B31000000000000000000000000000000000002D
+:10B32000000000000000000000000000000000001D
+:10B33000000000000000000000000000000000000D
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000000000000009D
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000007D
+:10B3D000000000000000000000000000000000006D
+:10B3E000000000000000000000000000000000005D
+:10B3F000000000000000000000000000000000004D
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000000002C
+:10B42000000000000000000000000000000000001C
+:10B43000000000000000000000000000000000000C
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000000000000009C
+:10B4B000000000000000000000000000000000008C
+:10B4C000000000000000000000000000000000007C
+:10B4D000000000000000000000000000000000006C
+:10B4E000000000000000000000000000000000005C
+:10B4F000000000000000000000000000000000004C
+:10B50000000000000000000000000000000000003B
+:10B51000000000000000000000000000000000002B
+:10B52000000000000000000000000000000000001B
+:10B53000000000000000000000000000000000000B
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000000EB
+:10B5600000000000000000000000000000000000DB
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A000000000000000000000000000000000009B
+:10B5B000000000000000000000000000000000008B
+:10B5C000000000000000000000000000000000007B
+:10B5D000000000000000000000000000000000006B
+:10B5E000000000000000000000000000000000005B
+:10B5F000000000000000000000000000000000004B
+:10B60000000000000000000000000000000000003A
+:10B61000000000000000000000000000000000002A
+:10B62000000000000000000000000000000000001A
+:10B63000000000000000000000000000000000000A
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000000EA
+:10B6600000000000000000000000000000000000DA
+:10B6700000000000000000000000000000000000CA
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A000000000000000000000000000000000009A
+:10B6B000000000000000000000000000000000008A
+:10B6C000000000000000000000000000000000007A
+:10B6D000000000000000000000000000000000006A
+:10B6E000000000000000000000000000000000005A
+:10B6F000000000000000000000000000000000004A
+:10B700000000000000000000000000000000000039
+:10B710000000000000000000000000000000000029
+:10B720000000000000000000000000000000000019
+:10B730000000000000000000000000000000000009
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000000E9
+:10B7600000000000000000000000000000000000D9
+:10B7700000000000000000000000000000000000C9
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000000000000000000000000A9
+:10B7A0000000000000000000000000000000000099
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000000000000000079
+:10B7D0000000000000000000000000000000000069
+:10B7E0000000000000000000000000000000000059
+:10B7F0000000000000000000000000000000000049
+:10B800000000000000000000000000000000000038
+:10B810000000000000000000000000000000000028
+:10B820000000000000000000000000000000000018
+:10B830000000000000000000000000000000000008
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000000E8
+:10B8600000000000000000000000000000000000D8
+:10B8700000000000000000000000000000000000C8
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000000000000000000000000A8
+:10B8A0000000000000000000000000000000000098
+:10B8B0000000000000000000000000000000000088
+:10B8C0000000000000000000000000000000000078
+:10B8D0000000000000000000000000000000000068
+:10B8E0000000000000000000000000000000000058
+:10B8F0000000000000000000000000000000000048
+:10B900000000000000000000000000000000000037
+:10B910000000000000000000000000000000000027
+:10B920000000000000000000000000000000000017
+:10B930000000000000000000000000000000000007
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000000E7
+:10B9600000000000000000000000000000000000D7
+:10B9700000000000000000000000000000000000C7
+:10B9800000000000000000000000000000000000B7
+:10B9900000000000000000000000000000000000A7
+:10B9A0000000000000000000000000000000000097
+:10B9B0000000000000000000000000000000000087
+:10B9C0000000000000000000000000000000000077
+:10B9D0000000000000000000000000000000000067
+:10B9E0000000000000000000000000000000000057
+:10B9F0000000000000000000000000000000000047
+:10BA00000000000000000000000000000000000036
+:10BA10000000000000000000000000000000000026
+:10BA20000000000000000000000000000000000016
+:10BA30000000000000000000000000000000000006
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000000E6
+:10BA600000000000000000000000000000000000D6
+:10BA700000000000000000000000000000000000C6
+:10BA800000000000000000000000000000000000B6
+:10BA900000000000000000000000000000000000A6
+:10BAA0000000000000000000000000000000000096
+:10BAB0000000000000000000000000000000000086
+:10BAC0000000000000000000000000000000000076
+:10BAD0000000000000000000000000000000000066
+:10BAE0000000000000000000000000000000000056
+:10BAF0000000000000000000000000000000000046
+:10BB00000000000000000000000000000000000035
+:10BB10000000000000000000000000000000000025
+:10BB20000000000000000000000000000000000015
+:10BB30000000000000000000000000000000000005
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000000E5
+:10BB600000000000000000000000000000000000D5
+:10BB700000000000000000000000000000000000C5
+:10BB800000000000000000000000000000000000B5
+:10BB900000000000000000000000000000000000A5
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD0000000000000000000000000000000000065
+:10BBE0000000000000000000000000000000000055
+:10BBF0000000000000000000000000000000000045
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000000000000000000000014
+:10BC30000000000000000000000000000000000004
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000000000000000000000C4
+:10BC800000000000000000000000000000000000B4
+:10BC900000000000000000000000000000000000A4
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000000084
+:10BCC0000000000000000000000000000000000074
+:10BCD0000000000000000000000000000000000064
+:10BCE0000000000000000000000000000000000054
+:10BCF0000000000000000000000000000000000044
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000000000000000000000013
+:10BD30000000000000000000000000000000000003
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000000000000000000000D3
+:10BD700000000000000000000000000000000000C3
+:10BD800000000000000000000000000000000000B3
+:10BD900000000000000000000000000000000000A3
+:10BDA0000000000000000000000000000000000093
+:10BDB0000000000000000000000000000000000083
+:10BDC0000000000000000000000000000000000073
+:10BDD0000000000000000000000000000000000063
+:10BDE0000000000000000000000000000000000053
+:10BDF0000000000000000000000000000000000043
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000000000000000000000012
+:10BE30000000000000000000000000000000000002
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000000000000000000000D2
+:10BE700000000000000000000000000000000000C2
+:10BE800000000000000000000000000000000000B2
+:10BE900000000000000000000000000000000000A2
+:10BEA0000000000000000000000000000000000092
+:10BEB0000000000000000000000000000000000082
+:10BEC0000000000000000000000000000000000072
+:10BED0000000000000000000000000000000000062
+:10BEE0000000000000000000000000000000000052
+:10BEF0000000000000000000000000000000000042
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000000000000000000000011
+:10BF30000000000000000000000000000000000001
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000000000000000000000D1
+:10BF700000000000000000000000000000000000C1
+:10BF800000000000000000000000000000000000B1
+:10BF900000000000000000000000000000000000A1
+:10BFA0000000000000000000000000000000000091
+:10BFB0000000000000000000000000000000000081
+:10BFC0000000000000000000000000000000000071
+:10BFD0000000000000000000000000000000000061
+:10BFE0000000000000000000000000000000000051
+:10BFF0000000000000000000000000000000000041
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000000000000000000000010
+:10C030000000000000000000000000000000000000
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000000000000000000000D0
+:10C0700000000000000000000000000000000000C0
+:10C0800000000000000000000000000000000000B0
+:10C0900000000000000000000000000000000000A0
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000000000000000000000080
+:10C0C0000000000000000000000000000000000070
+:10C0D0000000000000000000000000000000000060
+:10C0E0000000000000000000000000000000000050
+:10C0F0000000000000000000000000000000000040
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C12000000000000000000000000000000000000F
+:10C1300000000000000000000000000000000000FF
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000000000000000000000CF
+:10C1700000000000000000000000000000000000BF
+:10C1800000000000000000000000000000000000AF
+:10C19000000000000000000000000000000000009F
+:10C1A000000000000000000000000000000000008F
+:10C1B000000000000000000000000000000000007F
+:10C1C000000000000000000000000000000000006F
+:10C1D000000000000000000000000000000000005F
+:10C1E000000000000000000000000000000000004F
+:10C1F000000000000000000000000000000000003F
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C22000000000000000000000000000000000000E
+:10C2300000000000000000000000000000000000FE
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000000000000000000000CE
+:10C2700000000000000000000000000000000000BE
+:10C2800000000000000000000000000000000000AE
+:10C29000000000000000000000000000000000009E
+:10C2A000000000000000000000000000000000008E
+:10C2B000000000000000000000000000000000007E
+:10C2C000000000000000000000000000000000006E
+:10C2D000000000000000000000000000000000005E
+:10C2E000000000000000000000000000000000004E
+:10C2F000000000000000000000000000000000003E
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C32000000000000000000000000000000000000D
+:10C3300000000000000000000000000000000000FD
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000000000000000000000CD
+:10C3700000000000000000000000000000000000BD
+:10C3800000000000000000000000000000000000AD
+:10C39000000000000000000000000000000000009D
+:10C3A000000000000000000000000000000000008D
+:10C3B000000000000000000000000000000000007D
+:10C3C000000000000000000000000000000000006D
+:10C3D000000000000000000000000000000000005D
+:10C3E000000000000000000000000000000000004D
+:10C3F000000000000000000000000000000000003D
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C42000000000000000000000000000000000000C
+:10C4300000000000000000000000000000000000FC
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000000000000000000000CC
+:10C4700000000000000000000000000000000000BC
+:10C4800000000000000000000000000000000000AC
+:10C49000000000000000000000000000000000009C
+:10C4A000000000000000000000000000000000008C
+:10C4B000000000000000000000000000000000007C
+:10C4C000000000000000000000000000000000006C
+:10C4D000000000000000000000000000000000005C
+:10C4E000000000000000000000000000000000004C
+:10C4F000000000000000000000000000000000003C
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000000000000000000001B
+:10C52000000000000000000000000000000000000B
+:10C5300000000000000000000000000000000000FB
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000000000000000000000CB
+:10C5700000000000000000000000000000000000BB
+:10C5800000000000000000000000000000000000AB
+:10C59000000000000000000000000000000000009B
+:10C5A000000000000000000000000000000000008B
+:10C5B000000000000000000000000000000000007B
+:10C5C000000000000000000000000000000000006B
+:10C5D000000000000000000000000000000000005B
+:10C5E000000000000000000000000000000000004B
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C61000000000000000000000000000000000001A
+:10C62000000000000000000000000000000000000A
+:10C6300000000000000000000000000000000000FA
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000000000000000000000CA
+:10C6700000000000000000000000000000000000BA
+:10C6800000000000000000000000000000000000AA
+:10C69000000000000000000000000000000000009A
+:10C6A000000000000000000000000000000000008A
+:10C6B000000000000000000000000000000000007A
+:10C6C000000000000000000000000000000000006A
+:10C6D000000000000000000000000000000000005A
+:10C6E000000000000000000000000000000000004A
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000000000000000000000029
+:10C710000000000000000000000000000000000019
+:10C720000000000000000000000000000000000009
+:10C7300000000000000000000000000000000000F9
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000000000000000000000C9
+:10C7700000000000000000000000000000000000B9
+:10C7800000000000000000000000000000000000A9
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B0000000000000000000000000000000000079
+:10C7C0000000000000000000000000000000000069
+:10C7D0000000000000000000000000000000000059
+:10C7E0000000000000000000000000000000000049
+:10C7F0000000000000000000000000000000000039
+:10C800000000000000000000000000000000000028
+:10C810000000000000000000000000000000000018
+:10C820000000000000000000000000000000000008
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000000000000000000000C8
+:10C8700000000000000000000000000000000000B8
+:10C8800000000000000000000000000000000000A8
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B0000000000000000000000000000000000078
+:10C8C0000000000000000000000000000000000068
+:10C8D0000000000000000000000000000000000058
+:10C8E0000000000000000000000000000000000048
+:10C8F0000000000000000000000000000000000038
+:10C900000000000000000000000000000000000027
+:10C910000000000000000000000000000000000017
+:10C920000000000000000000000000000000000007
+:10C9300000000000000000000000000000000000F7
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000000000000000000000C7
+:10C9700000000000000000000000000000000000B7
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B0000000000000000000000000000000000077
+:10C9C0000000000000000000000000000000000067
+:10C9D0000000000000000000000000000000000057
+:10C9E0000000000000000000000000000000000047
+:10C9F0000000000000000000000000000000000037
+:10CA00000000000000000000000000000000000026
+:10CA10000000000000000000000000000000000016
+:10CA20000000000000000000000000000000000006
+:10CA300000000000000000000000000000000000F6
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000000000000000000000C6
+:10CA700000000000000000000000000000000000B6
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB0000000000000000000000000000000000076
+:10CAC0000000000000000000000000000000000066
+:10CAD0000000000000000000000000000000000056
+:10CAE0000000000000000000000000000000000046
+:10CAF0000000000000000000000000000000000036
+:10CB00000000000000000000000000000000000025
+:10CB10000000000000000000000000000000000015
+:10CB20000000000000000000000000000000000005
+:10CB300000000000000000000000000000000000F5
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000000000000000000000C5
+:10CB700000000000000000000000000000000000B5
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000000000000000000075
+:10CBC0000000000000000000000000000000000065
+:10CBD0000000000000000000000000000000000055
+:10CBE0000000000000000000000000000000000045
+:10CBF0000000000000000000000000000000000035
+:10CC00000000000000000000000000000000000024
+:10CC10000000000000000000000000000000000014
+:10CC20000000000000000000000000000000000004
+:10CC300000000000000000000000000000000000F4
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000000000000000000000C4
+:10CC700000000000000000000000000000000000B4
+:10CC800000000000000000000000000000000000A4
+:10CC90000000000000000000000000000000000094
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000054
+:10CCE0000000000000000000000000000000000044
+:10CCF0000000000000000000000000000000000034
+:10CD00000000000000000000000000000000000023
+:10CD10000000000000000000000000000000000013
+:10CD20000000000000000000000000000000000003
+:10CD300000000000000000000000000000000000F3
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000000000000000000000C3
+:10CD700000000000000000000000000000000000B3
+:10CD800000000000000000000000000000000000A3
+:10CD90000000000000000000000000000000000093
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000053
+:10CDE0000000000000000000000000000000000043
+:10CDF0000000000000000000000000000000000033
+:10CE00000000000000000000000000000000000022
+:10CE10000000000000000000000000000000000012
+:10CE20000000000000000000000000000000000002
+:10CE300000000000000000000000000000000000F2
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000000000000000000000C2
+:10CE700000000000000000000000000000000000B2
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000092
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000052
+:10CEE0000000000000000000000000000000000042
+:10CEF0000000000000000000000000000000000032
+:10CF00000000000000000000000000000000000021
+:10CF10000000000000000000000000000000000011
+:10CF20000000000000000000000000000000000001
+:10CF300000000000000000000000000000000000F1
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000000000000000000000C1
+:10CF700000000000000000000000000000000000B1
+:10CF800000000000000000000000000000000000A1
+:10CF90000000000000000000000000000000000091
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000000000000000000071
+:10CFC0000000000000000000000000000000000061
+:10CFD0000000000000000000000000000000000051
+:10CFE0000000000000000000000000000000000041
+:10CFF0000000000000000000000000000000000031
+:00000001FF
diff --git a/firmware/synaptics_boe_4320.fw.ihex b/firmware/synaptics_boe_4320.fw.ihex
new file mode 100644
index 000000000000..5bec9460d815
--- /dev/null
+++ b/firmware/synaptics_boe_4320.fw.ihex
@@ -0,0 +1,7447 @@
+:100000002B471848050000001C000000C00000003D
+:10001000C4590100466701006A87010016E5057CA6
+:10002000424F4F545F434F4E4649472020202020E7
+:1000300000000000C00F00008000000053344FDEBD
+:10004000A045000000000000FFFFFFFFFFFFFFFFD3
+:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
+:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
+:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
+:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
+:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
+:1000C00016E5057C4150505F434F444520202020D9
+:1000D000202020200100000000100000E058010056
+:1000E0006DBCB6711C2BE0E62B003A06AAC1CC9D74
+:1000F0007FC719881DB20C87A02A35030549205AED
+:100100000BEC8A5073C6F6A83AB06F906FF45A346D
+:100110006485C78FFFA5525E2E133B7C83E76D6815
+:10012000DD4905A56BA08D6FED45FABDE08D83D04F
+:10013000B000F3EF1A8BB68D87BA3F892B2DCAE03A
+:10014000AF719A18D53B3FB87A525F8334F6482C8A
+:10015000C51CDFE91F723531C8EA841ACFB6AFCCAF
+:100160009065EC3B686BB461B84A3072AF6C923208
+:10017000E1CBA0939EA76311B6ABFA581922C69D96
+:10018000CB4DF0F558B8B4F9DD9006B063F3D43137
+:100190009AE0E7025E42A02FB805A69B0F5CA85C20
+:1001A000A1C68EBFB727107768DA031FC2FCF3EA37
+:1001B00041D26DE0B4A212B1D8AFF8A5FE5413AB92
+:1001C000BE8FDEFCA166972B35ECDBC7192F16AE70
+:1001D0002473E6B2F4B7056E6BA4CAD67DEFEFE1E7
+:1001E000090B7EF51368741EE098DEAEF319F25128
+:1001F00028118C7A2112FC7244F441BEBA9738441B
+:10020000740CEAD78FD8DF7D0CB315EAA8D7FD4070
+:10021000AEDD478EA3FC5F1062747588B4DC6F643A
+:10022000800E095A39C4D5848EF4CD02432FD29062
+:100230004670F3AE423DA664F59739FB4AEC77A0D1
+:10024000BBF5FF56F3456E705BC6218A631150867D
+:1002500075320C3CCDA4CC58676468E3ABE8F8AECB
+:1002600040AA5539D760A84FA141B71F09967A1601
+:100270006D50D61812FCC5A340CE08EE413D7BBFA1
+:100280008D24BFA126840F96D5DD7CE4D2FFC5BBAB
+:100290009AA8998FE62B9937A101F95F07D6BE443A
+:1002A000015F773C9AD8D03BEFA5B4978E545E2976
+:1002B00087CDCE431561CC439022103FCF9504E704
+:1002C0004E3FA47CA011B69A6A549BC8B38663F0D3
+:1002D000542D2CECD051B81DBCA5A9E32E335F27BB
+:1002E000A6A5234EB266205D753A9475E6EF636D60
+:1002F000BD7DDA83AA8EE3355B2529A6704B67AEF8
+:10030000D86FCBEC0B14ECB301CD5A7FD3A3375885
+:100310009FAF3229E618B3572A0763B65B19C33972
+:10032000A7E0D2EB1240291B4B2044009B3D07B1B4
+:10033000C1C2FF8E0946A3766FC2D036D870867AC6
+:10034000F7940869E748F1CD7EAB21D9E8807524A0
+:1003500086AA2B300A262C1DEC3DE3B6B8FAC12D37
+:10036000C2F96FF3F9B19139602FA5337F0B3F2CA0
+:100370000C3E782BB6DCEB792B2E0F3B6F297DBD25
+:100380009A00A566C87CE4BF606A4D7D180443CD21
+:1003900036042D6C6C47B4FE41CC07AB510FA8005E
+:1003A00084223AEC4DBCDC39FC9005B9C066715032
+:1003B00071E9972EBEB9F0D90FCA764E342483F86E
+:1003C0002CD45C0ADEFD6500B842F21F316E8E2E21
+:1003D0002421FD9A5DC5140901D0AD236E559B8182
+:1003E0007ECA0F63A4125702D4B6DC865B76F5DAB8
+:1003F000A3C6D1A348158C66BD218A3E635519D585
+:10040000E13565B814B9467697E7F2459EA4D3EB7B
+:100410007DA07C3950BDFD4B57EB8E4169818B31FE
+:10042000D680B3FADF4682AEDCC9E8BB70DA547F0F
+:10043000C293E6986521634E812414B8C953CDD880
+:10044000D27317BB96A82EDF108B28BA42F0B7FAEA
+:1004500038670747D59CFA3C7F62BA2E0614582E9F
+:10046000A6B66E602FF6748C97D4F361135D3B6D66
+:100470008D340752BCE1E587A2017C28F9BB62D428
+:1004800071E7CEE8E3E92A70D7DC515CBA1866B1AF
+:10049000A9CA8DE5B47D343435940EBA39C196BEFF
+:1004A00034DAC1D2C2DE9A4A6E763AC433EE1629E5
+:1004B0005021A6B98C537A29398671112871EEBF63
+:1004C000BA274E5227D4B4396FCB1F9D312055AD7A
+:1004D0000A43BEFA722057D0D966387AE598DE48CA
+:1004E0001EB05A9CFFCFC9E62D0734D4DA631482BC
+:1004F0000F0F1694090293D7B8AD6ADE516A7F795F
+:1005000096B47415793E097BAA25D0E27F7684677C
+:10051000974C74F242BACBE3F9B4B41F9AC458278B
+:100520007706C96D6A669ADC9B666A70531B5C1C11
+:10053000FCFA7B01EDAC46D622617DCCE24FB37272
+:10054000156510824F113B1D426EC41FA86AD089E9
+:100550006EC9FF8A77F4AF9B1603B2C0CF267954D9
+:10056000358D92ADB0BB5C20554EA6CFC25DC25951
+:100570005E2FADF03457BB16DE106E0576E500DF5A
+:10058000D58A14B3E3CD16E79C3D12DFCE0E207B57
+:1005900050A2FD19D376A75DAF8EBE2A0811DA7E70
+:1005A000858F155EEB07B827D9A660FEADB984121A
+:1005B000D3B39C0708314029940F3A877FC1A1D754
+:1005C00013F52548B16BCCE62350E050BC81FD57B4
+:1005D000D0F6E20782E8DEB295FD0AC5B724B7EA95
+:1005E00010047B835EB7A75E23FE47F28F22B41907
+:1005F000255667451D2CDD606985C8D76A5A623A61
+:10060000CAFAAFBB970FD7E8D17FB97B6A3BE8C383
+:100610003BBB75EA964E77789C43936C98EEE8085E
+:10062000CDAF54A0FF06486331E8B515AE41F8815F
+:10063000378D7100E865063D86B0859B03756C5D5E
+:10064000CE75A8DA8A54870898DE0AFE7980EB60B6
+:10065000D733C9F30B05F7C680BEA5F6B591A11532
+:10066000EA379B044805B81A76D757E060825F01E5
+:1006700095ECE6E17C076B5271C5EB9AAAEF94F218
+:100680006CAFCC52EE2E4F33295F8945D66DF86D95
+:10069000BF7CB9326007270EBE80221BF8EEDA223B
+:1006A0005EB22BBE96C0C2D3FE81187831B60ECC96
+:1006B00090FB9EDF868683F8348ECE9D5863A20E13
+:1006C000BEA7619717C7ECD28CADE9DC1055012F9E
+:1006D000C01B3802F7BA501DE2F2DAACE96321E838
+:1006E000F301D392C38D0F4D6A23F360802F31083D
+:1006F000035848204D7DA810F450C756BDEF40E286
+:100700000234BAE4D1C0DA0912E5FE3C4CCCB3881D
+:10071000874A61D4B3ED083931092748028F20F4A4
+:10072000B23F588BFF3AEF0DA064DB6A96A21E74AD
+:10073000A7B75D989F53B119723C0702612AD03365
+:10074000156DC8DFFD7D57ADFBFDEC41A072A4AC7B
+:10075000FA9DF01E8644F785C7613E9F4652856B21
+:10076000E6A38368DAE84A957A994E33A393BCA945
+:1007700061046762BD1E533FD15EB71FE3DD36BB28
+:10078000DDD65BCAC6A1DB76A255F30A03712CC382
+:100790007C8D744E41F0369A8076F0FA7E3AB0B68F
+:1007A00014EF74AA262A5C53DA5FE5A14C469FEA4F
+:1007B000CBAD403FBC316AB19E7AAECEFC5E5836BE
+:1007C0001275F9D35174CDD7D7F6B91D8AEB6B7377
+:1007D0004BFC87E52F7EB6DCCC08ECDCC06A8E7D56
+:1007E00093E33B3D1F5FE51EDF3A70B90337AE1A56
+:1007F000AF5B7F208B199F98936BF113A16B5CE02B
+:100800004D6F25FB8F1EFDAF4A82657BEA5C92EA45
+:10081000036CF5B09952586FA8F801F8F837FCDB73
+:100820007F78E7EBD3BC1773BE08C9952DAE984807
+:10083000C3DB17E8E8F292B589968615F1745D0975
+:10084000E64A325225D7B59DD81A575E2F54664FC7
+:10085000000756F0AFF9131A732B6DC08B8FEB574F
+:100860009056300068B4061C6A5E6D81F74A29CD47
+:10087000B9157596BE1E555E621EA9E94E0A15A3EE
+:1008800085E1525A59654D27C8287F3ABF28472825
+:10089000C8C545A51B93F75DB42FD1534F26AB8335
+:1008A000033D35C2392473ABE69FEFEFC49F2DB7EC
+:1008B0002C5AE4034B7BD37E1C5DC3B52EB9B6DF47
+:1008C00086464375DEC9A4B351BA1DD5220D988F53
+:1008D000D4C5A96D35C342CBA3FBF5E2455A2CAC78
+:1008E0009A563EFD0EB901705AC5E39DF448069E26
+:1008F00006057C5A02A1B1227122C8E558F6D0CF74
+:1009000070DE436FDA78BE22CFC53D481B5DE0D470
+:1009100042AEA800A454F5A930D46E6B197BD78DD4
+:10092000FAB833290364FB53D755F327C3284EFA8B
+:1009300097493512340A104B41DF57B1B15AE2E3FF
+:10094000063C2AD785465B4A02D0EF92757C972BEE
+:10095000A899845589434A08468C8D2757115755C5
+:10096000AF8D9AB4B23F0550DCD4287E08F54D2EE9
+:10097000F6AF5C6F77F18F2C808224852DCF258890
+:10098000EC31BAA6243CC8D0C348F662741BA0045C
+:10099000254E49F2B7B666700D1ADB1F604CD82F92
+:1009A000DD0824137975B39A5D607B27A9C3391ECE
+:1009B0007E1A016C3BD0F821904B09DAFDB5D0EDE1
+:1009C00003B0B83FF09DAEDDFDA6DA380079991589
+:1009D00027F2C280662CA48FEDF3A8641EA42BB965
+:1009E000C29FDDD8453DEBDA92A9B9B17A664029BC
+:1009F0000B16A8A8EF82C2CFE6703616F9C17AA30B
+:100A00007E55674568C4CEF8F6F1973A5403FEC0A8
+:100A1000A537874ADF8CCE1689F5C20542D7D1E1CA
+:100A200019FA8D754C500743CCC03818CEDACE1C5D
+:100A300069852A86CE659A767245FD1701CC65A632
+:100A400094C2323CF6C44F68F743EA2880BADF0309
+:100A50007285224A0A7511840700E39FB67F00FD64
+:100A6000C77A9AF82F09D4AA5DAF9FFC0066EBFE07
+:100A700026B0010C2F4BC9425BB5601851ACB0D900
+:100A80005EA7A513AD713AD00205B42D461EFA5CDF
+:100A90003C4171E2B447C32F9B50EE489087061348
+:100AA000C44C33EE802C90041D819131FDDCED3B74
+:100AB0009EFDD5833373008D08D07CEFE8D504818B
+:100AC0003BACC5BEE6562219E34B0B90EF9CCE859E
+:100AD000D704D501A17E56A91DDD06FB0736B02936
+:100AE00080548B7B6A41B88BB25A410920A93E2EB3
+:100AF00045F43C26E8B42CF876076C495A72EF8727
+:100B00009DFA8CA09C815E9CA1E7FDB80993388179
+:100B100070377337E1DC0897AB7F0FEEDFCA3ADE40
+:100B20006344C216A5BBEF5CBDB98C1D3B9710DEBC
+:100B30002BC120B6435ECA63F2C3A938EFB8CA57C7
+:100B40004F020D55DCFFFD4557EBF8B79693805FDC
+:100B50000DCDC2BD575FFE6D3C3A9E82D3C6EB827F
+:100B6000C7A0DC6444A06B2EBEFECA77B65835E041
+:100B7000F22C4602DE2792757E14126408A967A241
+:100B8000FCB99865F472BDFB130F38A4E584AE4B35
+:100B900093F0E31E46D2DAA821B19AAC3BF8002DBF
+:100BA000A93C20C25F01688AB203C69F4C9BF38DAB
+:100BB00039E99503298E67FC76A9C806D1D650334A
+:100BC000C17A495855B94F353575C799F1CC153F9C
+:100BD000C5D119D531EDE2454AEAE7C14A6E03E5D0
+:100BE000C8FB8A5AF8059C10EA1B02C791A5083376
+:100BF000260B9D04568DB690CF43A098E118FE5663
+:100C0000F154CC83D31CF762BA529B468A14935694
+:100C10007FF4982F32C3D59C5A1E6D72A131333F99
+:100C2000FBA4BE58FAC5F0CD5915EF34176C8A50A5
+:100C300046E3321BC20223F8233464E98B5A76D888
+:100C40001F6A80609D76F50FA3C695D633D455E212
+:100C5000D4B0DCB3AF6A41E9A384DF455EDBBE0FED
+:100C6000C4665C068D2662154F537E8F0C0BE3B471
+:100C7000405A0CAE53847FE98BFFC9FAB04D427CD9
+:100C8000ACD761F22FFF0F34776AAD969629D42C3A
+:100C9000F6383BD6F366F56319CBCAAFEAAE734FAD
+:100CA0004D0F692C03EC08FA8AFDEEC5C9E322E179
+:100CB00061B420D059107B97CA49AB95E7D2A3B84D
+:100CC0005EE14E2BFAA84BC4CEA28A88940281F131
+:100CD00037FFF297655548B321A83364013A2326BC
+:100CE000B8F854DC9507C2C2177026B8F77CC21357
+:100CF0005FCF922B0C89C9B2D53AD61C5331EA2565
+:100D00006987C24D4145C048B9F3BDF4AC2696A6EB
+:100D100045454AE4CC9D764AC2060ADC3C4DEBF0E0
+:100D20001F485F753DF21016C76BAB80C92D4F444D
+:100D3000F14720B8EFF83707A7E244454E8CF04F53
+:100D4000FC3DEF953D6B302DD82F446F43F964BCCB
+:100D5000CA804DE0914E8C15DB7E2AC964AB939717
+:100D6000A62313D155539A040BBFE9FAD68D859269
+:100D700056C9CB4FBD527EED3E65839B89B298FF2D
+:100D800071B161D5A82A8985145E94E9606CDB5E37
+:100D9000812C8C7D44F6521105DB01C519BC65160A
+:100DA0005073F57641F12D919B78B0C1A1C124D546
+:100DB000E9F84A6341B0AA0BA5AD540CF4966A7EDB
+:100DC000D85BDFE88A10BBCCF5934CB72C6F21F7CA
+:100DD0007505992EA9AD866F8F3516BD1F23960E0A
+:100DE000844698620DD1F5A2ED188D6A0D12F5803A
+:100DF000AEC92EB5208A2CEAE31CDF5E20AE172C8C
+:100E00008E4600ED35959F64048C3F6A612876FB21
+:100E10007033685EC2EDF6A9B0F1854B2EFF9ACF14
+:100E2000FD38F794E6910F5459AE36368D3068DDB3
+:100E3000E05C04098AE5471B6E7F07D16EDA022069
+:100E4000F3C5CCC12ACFE97BAA992A58D7DC402820
+:100E5000D50BD386DAFBC4E0F7B75388A2E8FAE3F0
+:100E600082920A6E7F296E44A978C3A65359ECFC7E
+:100E70009360B7D861A99FCF97DBA35D91FF4CFB2F
+:100E8000D311E8DD71D329296624FCDF017CFC87BE
+:100E900035A18A0A311B7E5075C10E57AD176BBF45
+:100EA000AD38369BEAA52DCCA502885DC65E63BA37
+:100EB000CE68ABF9C60D1D9403D7193EACE9E69A8E
+:100EC00084D0B48A8B0EA0AA82C18DD50ACF89673F
+:100ED0000C77EEA6125BA9F0C24ECAC62BDD43C644
+:100EE000B0E7181376083CCE242F665AB51383ADAD
+:100EF00082B5B07B95C52C0B80806ECADFD5DD1D19
+:100F00004E7434C1B0FB4E7DE4382C147CD8FCEE1A
+:100F10006F2968833A380D2F1F1190BA6F6174756D
+:100F20007F0543E2F6A66FD2656373C24F54064A4B
+:100F3000D4D34EE9A43DCC07C15C0B558E05972157
+:100F4000ED838E40B8541CFADB14BD34BFDA8FBC7D
+:100F5000482D93C0F9F45264E2ECFA99D677157AE9
+:100F6000F9557020FD01E59E58861069C8A8EE6409
+:100F7000EE848B45248858B752429ADADCC5822821
+:100F8000D4A2833A1EA0C0D230DCFE8692D10DC519
+:100F90003365AB0852E445A9E842EAAFC9BE126F17
+:100FA0003F13A9C319AFB860556BB49B4ABA838489
+:100FB0004C6AA41B7AE909A3C7AB10E8230E09B257
+:100FC00025FDDD04C4099AB7D0E8CF59564480CA3C
+:100FD0006A78E11F91AA47B943651D670C0E211677
+:100FE0005816C08B5BFC1A4781264041299E7ED44F
+:100FF000BCCCD6879E62D33C3DA54F4CDAA3342DA2
+:101000004AE72A18474E7E07869AFFA31EE3CFC001
+:10101000F2F921F4C65C0A4D96250609F97038F6F6
+:10102000A91E564D64795C1BCB7AC96A91D7DDCE77
+:10103000AEDA1769D7904004EE7FC06D868DD90572
+:101040005B90EC01E2878C52D741F208714329761C
+:10105000F9459186866DB178D08679B2F73AE094F9
+:1010600077367967422D27CC35CE5D2BE3C9E41165
+:10107000703CF3BC7ACF10EEF1FF141704A2A2F477
+:10108000242B2482E350B6C7B49E69B2D2896F780C
+:1010900040815CC5CED3FAB6F3D5EB674C607AE5F8
+:1010A0008E706963C1579F51E619797CC0DEDB18E9
+:1010B0004A1542AE560AF27DADCDFE6251F31115CE
+:1010C0003141F888A94D84D3EE195102D1DA3F8518
+:1010D00061C5E23C281FA1365DFE9FF4D26E40AE92
+:1010E000F7A45AF5D92489B37489EEB3F8D0B313B1
+:1010F000A065C97AEA43697A4DB3AD88490D3A6A69
+:10110000CD44530C83FB126705DD5E0BEDBB1A75F6
+:10111000B2D1645AA6732DD7211A2A6949549B87E4
+:1011200065678EDA16BC7D71EAEE2219AD864CCA6F
+:101130005C241F7FDE980378AA5F57DD03C44D3F10
+:10114000BAC8468AE57293BC08D6521D1C56239A2B
+:10115000E0EBD90FC372528BA6EBB98A87F001700E
+:101160007772E927E9C6BBB66DF40FD66001B4B556
+:10117000116585CC42EBF49C93C038680728E17177
+:10118000E2F8DAFE732CEE451F04A2BED44977893B
+:1011900037EB155FFBD7710F98A56AD75569515684
+:1011A00066E2EA9CF2FD493DA3320432DC58FAA51E
+:1011B000243F185240F4E6449189C233B25F6CF880
+:1011C000ADBF95174902360855BAF6AE43184D140F
+:1011D0000F1E1DC34CBAB206BE5C6DCE24AD907D11
+:1011E0009FA128787B599A3A38F486D8477CA41571
+:1011F0000456B3B193D596A7EED95A317BC7E98D82
+:10120000CECECC5723A052A05DFBB3C3A34F03D9CE
+:10121000B717A2C1895A7C66466A6A2F29835CF295
+:10122000C162ED533EFD201E2CBA8CAA3AE45AC886
+:10123000E3E5B925E9D3A7F7B58E87AF8FE236404E
+:10124000DD515BE32818B72EE1E297885F7F8A19AA
+:1012500018C086D1926BCDE6FCE3D779FCADA665CC
+:10126000A75130138826FB0FE17C88860D474D82FD
+:10127000F8305E2EB55AB20C501BCA3586E2F7FC28
+:10128000FE9276C1852AD9BD30A944A9FDD2C250AB
+:10129000C89C9D4A44CA3812DA1F956C103E40A083
+:1012A0008F18AB8A6F8B43693FCC86AEE194E93BE4
+:1012B000435EE55938950E95A967A16227109E9265
+:1012C000A9D32C0930FF75250A0CA56558281647A7
+:1012D00054B864FEC4172D99638C3574A7B90A2AD3
+:1012E000E6F086A8359825BEED400299629635DD78
+:1012F000346A4DAE7454D6C1555B0A938EEB3123DC
+:10130000EE333C873863A696B8D42BC5B77F5734E5
+:101310005E2405F4E772DEC67D7F98F33293B65EF5
+:10132000EECF2019B1DF0576709E794CA1118FAFF9
+:10133000A2F581C29702B5FE130515EBB3931ACB44
+:10134000CC08049CB06E697C1E98D0E3676296E37B
+:10135000FCE33FF9867DBA273C95801961870CCB69
+:10136000C6E91B68DC2286945D32EC00D26B1F90CC
+:101370002D522C8D7337E145164917683537DADE63
+:101380003AF0B8AC269B2208F90C73666E3738EE3B
+:101390002D5D7BAFF502E8482AC2B01CF07A7710C9
+:1013A000B191EB29228A989884A549C88137EDF735
+:1013B0001442EA56F6371BEB238C820E5DA6248C72
+:1013C000520FBC772660F7A87B6B83D510E9A48AFF
+:1013D0000C4F4C9B3A6722D6F18A225D639723CA51
+:1013E000521790777C8C0A306C3F9C57CF8E92CAF4
+:1013F000C90D513BA8026E9B467A8F970CBA7B5958
+:1014000025E1A7C579E0E9D349B7A885F23C1EF6E6
+:10141000037BBC4B62FA68525F8AA3A15C0953A5A7
+:10142000F70FDDDB0180A2DCA0C96C5AFA6E69FA05
+:1014300054089E7681153D5950F807BE589E7C99F8
+:10144000349A76E456981F26FEED19B4B59A899C15
+:10145000D110579FFA8AEE9971BFEC534E0645772B
+:101460009172582EAB8041BAD43444CE37104F67B6
+:101470005302801F85AD8565FAE723D4F23907034F
+:101480004979BEF62E70C12D06C8DCBD37B027F9EC
+:1014900072F459C73249FD1804A2D864461437C8FB
+:1014A0005752897FF2243D55E0E374D2F1F593B8A9
+:1014B000F2E778793C032F83F2648BCC8E497B2B47
+:1014C0005EDA5FE536D7BCD7C87F759AD39ED94818
+:1014D0009EDB635B360C4EF6D55A9700443D0E2BCF
+:1014E000E7B46E4A2428AE3C7EC0D15519B7399373
+:1014F0005F535C8DF6C183FB23B36B88700EB4B46D
+:10150000E30541DBF21DDE7B0379D78FBD8607D76C
+:10151000A2FDFE64E6C54B29FE77F0760099B05730
+:1015200089C9410A8C06F82F953036A9845142CEDC
+:1015300019779B1128C51CF1A99D6381B29A295482
+:101540007DF9FFD1961B2C20C3EBC55D1B68378F3F
+:10155000CDA950B8747B82DA23A587044F8A15EA97
+:1015600002263BF774FDEBF1140692FC70300BBFC2
+:10157000A991F1999445405C59525726A3C89B61A3
+:101580004241A41532B40A79328B5911AA3018633A
+:101590003F2D0CC9982D7CAFA7E356053E794F69C6
+:1015A00014503C1D1864785743C88EA3EBAE034E0D
+:1015B000E16EA7276739A96851477E8D61BF73B077
+:1015C000EF429FE4502B69E9DBA854FC943AB33C0A
+:1015D000A696CBEBDBA5108AC1EFCBD9E3C1619412
+:1015E0000D529C74B2D71451E4D0BF528F4650B8FC
+:1015F00036098AC601FB13FF451C17FF6DEAEFB4DD
+:10160000A4C90C90D57A2C5E98818185784B46438D
+:101610003C58EB35548A93BB7E110C79DAFC135F8E
+:10162000EFAC620707FCDEF6721DAFB06A6216AC63
+:101630007B4D9585CCDEC1B40488922DF77F78D898
+:101640002300929740F8FD51AA1DD721DC303D3D83
+:10165000B8E3B3FF66C0D68269AC88B6978561D01F
+:10166000736E5028068690FB3B2688E89AD20924A0
+:10167000F95E17F8A5957CEEE19247C68FCA2C3922
+:101680000C5141EEE4DF10211A5B8416CFC8E494BC
+:101690007FA729E2B68440CE86BFB379C0A98A1E4F
+:1016A00014874FCA075DEB69F5A82BA2A49DFDAD79
+:1016B000DE4E5F6F63D85C94BB98DB078ECFE998F2
+:1016C000CB6057C018BD2289D3A7714764BCBDCE7B
+:1016D0009BC44252A48ABFA11EF2FD44558DA1B7FE
+:1016E000B45C98BA00E37FC2D9EE41B625ACA48CB5
+:1016F0000A287838E7C8CEDC39F4E776F37D7BBD7D
+:1017000010C9A0069504D0BD40569EFBDA31B1B792
+:10171000B6086025A90D982AF7552F1F90A3CEDE95
+:1017200096117D86D080781448ABC8CD123A96DDEC
+:1017300091CC22E67B9BC5414E3B70E335AE08A6BB
+:10174000A6E1FDDB2D9D571CE3AA64DE5D79DED5A5
+:10175000415D9C7EE897E8A4B5A80C35138A8DB747
+:101760009F24D5AB8B757A14DFB648806A0A186C53
+:10177000F6E73C7A40475B8EBAFAC880462D71ADD9
+:1017800094A16533611C3C4E03F06B63C4A30E2B24
+:10179000EA1F89E0D54644B9DEBDCE5E26D7717218
+:1017A000EF64C5F5EB990DDA810875F859896FEA90
+:1017B0001E8E4D74932450D3CBD4AC80E86B4F6510
+:1017C00061A96C6D10702B7D7025BA876B99597863
+:1017D0003FB71FA13BE9C8E9BFDBCE921BF363C350
+:1017E00024420174AF5ACA662D3FC95F5AA15CAC4E
+:1017F0001B4FB1E0365BC2DDABEC3C00EC4FEB5B6A
+:10180000627D065054DC42DEBCA6BD77EB6C4C60BA
+:10181000FB775943ADFAC36C91CBABB1F7E6FE6FE2
+:101820006C45E9C57F7AEFD1F9E0BFDE09A87741C1
+:10183000A86C4E7254804C9094962EF60AD439655A
+:10184000EDD50881F920F337133DD1D32C016E0C6F
+:1018500047BD2839F126870A6A8774D935D90F938D
+:10186000011DF0FCD9D647E67703B0651232F1E7E7
+:101870003F07700CCEB13CEFD4D9B6028442F321BD
+:10188000DB58EA402AC5DFF4AEB58F1DC195139829
+:10189000E8FED649D64FF1E85F25BCE8379E8BA01D
+:1018A00016FE1BB640598476CB993D31AE2A2748A7
+:1018B000C88090CEAEF9F24E0DE312CE429C5E5837
+:1018C0005056954FD8BFE19EE74A0A63F80D421083
+:1018D000F88ED2327DC87C902AF7A18B300459460D
+:1018E000BDE3418C411C25FCEC59E5D1B99AC5C931
+:1018F00018FF56A7664912FF1D80F4283306561EAE
+:1019000021983AA987C90DBBA2DE573BFE53EAA72F
+:101910009C22F2A2073AB3F6ECD2EFFA134A8117EF
+:10192000F3F6447EF2367EF8E569C1A9D1AC144BDA
+:10193000AA4E5104A73A55CF6811C1EF1B46921425
+:101940002D274E6143D23A10BBD89A98A3D3E167B2
+:101950000842F5BEF22EBF7285DD1DCF6AA12CA212
+:101960003A34CBF1C5877204EBC0BF5C634B814C4A
+:1019700074BCC1109AD949581627381AF6F3CB5FB0
+:10198000ECDEE1A6E5909CBE51C690D4BFFA8CACCB
+:10199000DBF4B09BE887412A4B86F92B59294F8B02
+:1019A00044642CFC3CA2C592E495594EE520840782
+:1019B000A4CB72FE6F5DF8394EE44D9EAAF1A20FE2
+:1019C000DDFE4279DA0FFFFFB0A5BA2AF75C24B436
+:1019D0004C555C5779C00E9D35E94CD8829639D963
+:1019E000C50F8B83B86D858446090552A1CC5BBFBA
+:1019F000EAE82B8F3DF0985A9051612E131AD63792
+:101A0000D4035A86D20D7C233CC3E29385BBFF39B5
+:101A10005D81460A7C734A17B4C893193CC1933759
+:101A20005905E87B2A5AA24F825372D9042B6E06BD
+:101A3000F2400AF6360212B5AF697521A0AC64FC1B
+:101A40002307799350440B96676867C18E60C3BBC8
+:101A5000EEBE7A089FCBEEB0E98416781AE168BC36
+:101A6000A70D2828B05E060F59A071B8B4672BD314
+:101A700012522077A7F2185AE27B2BD83A9F4C7E5D
+:101A8000E71A9BB3D7616C4966385C18EA234CB8F7
+:101A9000EE54F498F1906C5DCD6163A8BE2799A1D6
+:101AA0002F3328B59273D222069A118EC1B82BCB50
+:101AB000A6D936CD82ED668F4D4321A3E29A120757
+:101AC00025585FC49950AB16796ED8BB4F422A0A8D
+:101AD000FD88B0F994ECFF87ED3B4EF1F4A3257A35
+:101AE0001CCCD3EBAD2D8A70AD0A71B4C7FE48177C
+:101AF000F1668311A3FF4B253AF7DAEC97B7C3DD04
+:101B0000B6F3FF353FBF471ABBFE40700090A80BED
+:101B1000119D046827592F663C941AF929F407206F
+:101B2000CA1B3F966BCF530AB9B5B2026229920322
+:101B3000066801DCDC3A28115E2C18EEC716C800D6
+:101B40002C41890792503F1F60292AAF1E9D34A562
+:101B50002B9A16B737F0D9E189B04329E188DFFC29
+:101B600098122FEAE69608189A69F0DC85F549AED6
+:101B7000C1E203BF89591C06020BB9C61DA3172376
+:101B800042FD68766B007D5CDCDCBA28D7EF4093C1
+:101B9000657E615EF1320CD15866A3F364BB052506
+:101BA0006353EC71D28E3B026B4A5E3007E2299C94
+:101BB00056D214D4C7D1BCAE3DFBAB504A705CAF1B
+:101BC000EF85B8095C9D39BC33611A1A077DBCA248
+:101BD0002B579F7C44A408EBF323672124DDFBBB38
+:101BE0000CA82897FDCB5C3BC59425AAAC4C43E8D8
+:101BF000D9520846E043A86772375B9B4CB7245024
+:101C00003777274A9AF137F520B9922B8EB72BC632
+:101C100045E3AC5CDA9F97CC3CEBE4691AF104171E
+:101C20009A2AEFCED2A93FADEFCB3C472B59751C7A
+:101C3000FEE608007C4367FF0AAAAEA18000E20529
+:101C400088AD1E8C19679F44B9BB76B5FB72396F9E
+:101C5000E60F0B14996B163FF2189C17784575D355
+:101C6000FA1CBD78F97D1253A925180AE13C60B52C
+:101C7000B1E6F9E028BD2781775348FB8098E5B0AD
+:101C8000B7637FC9042AB46DCBA34A31320B47A88E
+:101C90008C363C381A59602742F8FE80E0F1C18545
+:101CA0004958C575D45FEE84769612855302369BEB
+:101CB000857AFFD04F291B1117886C1BF73F113C09
+:101CC0005FBDD54E5E64F12C22FBF307305A638B67
+:101CD00099BEBF0E8227093B240A501812D10D9CD1
+:101CE000E5AB43A11403B910C536526252F611FB9D
+:101CF00018BB8278ED2AF5D5DF8D51D30378B5B6C0
+:101D0000A77FB8D9529586E56836AA5112B8E1770F
+:101D1000EADC178C2FA084A2798122D8E83DD1C2B9
+:101D20002EA9585A324474770421F4AC9361ACF173
+:101D30009F35EE41B7A3093C2407910E61D3B8F457
+:101D4000F7DB20E3F7FB5D78F64F3CE844B92F5B07
+:101D500037E890F12C6B6AD28B8E11AD54CA69575B
+:101D6000D040D865E91697B7610E9965CE342E60DC
+:101D70006AE8C17799F04492FC389255F3DF126D0E
+:101D8000C6C88F1842F42A4B3025F9745C1195129D
+:101D900086DF8789892092D3FA8B7AF326E470262E
+:101DA000F82794D34BA1EF70DB0FD86D54479B4BB2
+:101DB000E683F9496E12E95333846EF97EC429181B
+:101DC0001649DB2498DB5619C156A634FC6CDFA0FB
+:101DD0005D890318C8F7A2EDCA866DEDE7B8E25138
+:101DE000E36E001A48DA2D4FD0CD004D9428DB4F1A
+:101DF0007ABFDA325F23F5A98AE5D9F36D293F6B03
+:101E000043AFE26FBF9C6844DBCC3ADA8332D991AE
+:101E1000FD69F40EDF7512A4E100994B04CC57B3B1
+:101E2000DBDB96404ADA96B0FB3A3FD4711CAD0535
+:101E300053B3BE1BBC10281D0C7C4543EFA79C3B35
+:101E400077D52E42691AA20A0FD8D07F5C5E26E1B0
+:101E5000E93E2B183D827A889EF5F46A96F5C3F622
+:101E6000A155FA2421B43935A0EB748EF16B3D16DF
+:101E700037AFF905AFB9D77CDBAC0B5F24D82A4E5E
+:101E8000A6D41AC9ABD0EEF60ACD4677B46CC68399
+:101E90006FBB6ADE3D3404C3804B915E5324D3E7AD
+:101EA00028B7FA719FFA98E9E379DFE3D1758BDF00
+:101EB000CA953D6C4C7B2953DECAA8FD0A528CECB6
+:101EC0003099F25C7BD0C95F47A93073C6871F5534
+:101ED000C3CF77016E405AA3AB294002C60F85ECF1
+:101EE00011A92561566776FBEA8F2498B45D6BC310
+:101EF00066B62648108A399947A8DF141C852C7FBE
+:101F000084212B6CC351F47E12CC9FD9D5D060E3D1
+:101F10000A252943CAB6D7FDD0BD2AC3B07BD30F4B
+:101F20006337305460D836F156598E32546BD680B0
+:101F300022148C41EF7A7C7E492FCC76A6A823B15F
+:101F4000CCEF5E10A8568753FC678800417D24962D
+:101F500091B486493F92B4622E9A1CF32442D9A8C8
+:101F6000A62ABFA6629FE4E709A0C48F2DF1A1B302
+:101F70007B7F42C363340135C9BCDB289B1A40C157
+:101F8000AF87A0F2BD220E09E19DF76899D4035BEB
+:101F9000534C58EA05BF7B7C7204FB1AC53BB40462
+:101FA0009258929C5B9DD156AB1725BC4390B331A0
+:101FB0006FC818FCEC369F399E16BFE98EB95E02D9
+:101FC00051F0668AC999717057EC7331C7862FBF7B
+:101FD0009D9517C04635E03C5CB51BAE8A452997F8
+:101FE00069F5DE293DAC33D9ADA5BF4C1ED4A8C2DE
+:101FF00097891970778063CEEC44CE5506624D6B9D
+:10200000E5F2553E56E08C2F8687F95E234DB0638E
+:1020100025C9BDDE4FBCA643F2F679FD4F3DE674FF
+:10202000CB48E2741C90A85A337609BA41244C8EEE
+:10203000CBD225765E0F8A8E6E93BA8A3F3EBAA0C7
+:10204000C08634587DE825F006944BABBF45EE02C0
+:10205000C48464611C724E713A10436FA297762B50
+:102060004C95AC553E1D34C51E5C0B61CF40FC2C1D
+:102070009ECF237756B63A9888CE8CF8C2CB6BF0B9
+:10208000BD09217B6F292A7CDBE78746F76FB06AA1
+:1020900092CB8220CE83A4FAEE1764D396D55871E2
+:1020A000A21710BC3F47D2D0702A264097DED05CE2
+:1020B0002631D124F32A4AAA41C6D05C60F866A929
+:1020C000B00D6B1687EEEF47A8F9EF1FD781C9D582
+:1020D00048B877348D51E72C481CDF09089DFD3640
+:1020E0005A585B6CA20BA63E9DE989DEE08898EF0A
+:1020F000DD8E1F8A56AB61B4E339E587ECF62827FD
+:10210000550B21D5A6FC7AB9FFEEA885378331B4EB
+:102110004C525A5F007EF52DC3ADF653D5F06ADD03
+:102120001E6BA56261350CA0539410CD3A348562C4
+:1021300097533E61890F68D46C23A4058D0B8B6483
+:10214000E413B2D3EB9676BA28069E89BE0FB26826
+:10215000BD62C3EEDF9C0308E73794941CC107A758
+:10216000B6368B9CC963675F0B271598C324EE7541
+:1021700050DF1D0B4A6A99F5D2E7EB9759BD7245BE
+:1021800004CADBAE24F48E4DD0EB48588B480AB11C
+:102190000AFB9CB7EBD951DFC8239EE4407B1E7934
+:1021A0005B18D1FC226FEA610BBFF08EC2FBBFBC93
+:1021B000C5A17ACCC2278F2BBA30439E70DEFDD2E8
+:1021C0008158B50D40E2490B1ADF38D3844DFC1C11
+:1021D000F04112AE4017A2225AFEE01BE06898BF01
+:1021E000129B11DB957B71D71BFEEDCB251085472C
+:1021F000E34EB8F8FBA67CA7EABF0929B9D327F1BB
+:10220000055FEC4F2A3D565448489873A09D7BC00B
+:10221000FCB1CFB22AB93245D4AA785676C2D3FCE3
+:102220002DB5B612900FAC93E978ADD025A5E2207C
+:102230007B84E2349140AD4B1B59178A09954BA022
+:1022400031FCB51457303BC68D468A5138B1AE7754
+:102250008C4AEF9608FC32CD6CA707A26829889DAE
+:10226000CB9D6D5846346411083734340AB5D9888B
+:10227000A038BDB7AA2A3F7BDC7FFB1E8B732F6380
+:1022800078E19DC225C1AF72E9A48216BBAF686F29
+:1022900059ADBCD34827E88CC216B2846778FC508D
+:1022A000BC3D3E5CE5C8E41816F9B8AD7AD6368C6C
+:1022B000AA13C35C44CCBED58DAD6CD7661D9838CF
+:1022C000706B287BCDBF0FA36464A870BB84FABE7B
+:1022D000FA7F0F6141F47FC5FF6EC7D714674F6265
+:1022E0009625162719854B2D9FF2E88D4A905F7928
+:1022F000B77701D9625F128F1514B0C543B5558EFB
+:1023000054ACC20F60AA13B5012D51BC6373638D29
+:102310006C59B3A84197DF2197E1EFA3C0866AB358
+:102320001B8DDC7C478491676B26E702F85BAE8CE3
+:1023300079BF63AA9B6D93026BBE00C3781A4E03EC
+:10234000DCB494AECDFBB978AF99159CBB207FDB94
+:10235000DE03C70007DA299677ADA90EB39C1EDE0F
+:10236000516418466616F775E28AE36D50A68188B7
+:102370004680F2C130516A5E45D4ED98FD841D4F10
+:10238000E3481CBAABC0952FE6DC9C98B60F7B687F
+:102390000E3C324D1020D228F875EEA539E33D0DE4
+:1023A00061732FD8AA2E4CF0A83983945E397C2E05
+:1023B000A6A7C74946F9367F2D392680485AF0D757
+:1023C000F4AD024CE8FF4E9B19B423762D801262C7
+:1023D0006D1DBE2B222231929F6B5CC4440700CC42
+:1023E0002B13B8C2D4A19F32CE872C552B128E2628
+:1023F00031374C76E437F00A087A23B8768CE03A25
+:102400002B0F64844B5F019D9E7A3B37E338A86BAA
+:102410007E3B5B71303EA563C50390E3877EE81980
+:102420007FD834ADF145620708E3088BD2F496BB40
+:1024300050A75EFDE27A4EE19EC413C3A66AA59042
+:102440003EAC420FAD56E8EDC19619E354FD2ACDDE
+:1024500092B5EEB2F18B176D3352ECCBD98DDA9485
+:1024600057C319C0285E268CFD03F90C519603143E
+:10247000DB15480C28DDFD61D8F6C257B1391C6D5B
+:1024800035E2547AEB85380DD935BE49B3FB0105E9
+:102490004D2336C526B77A8D55A6C014C81A05CF68
+:1024A000BEB1588DC6B52E900A9A6556B3592441CF
+:1024B000CB70BA03FD5547759E8CA55395B1D24A92
+:1024C0006143A6E343E8E489D4FAA1B7583C713EDE
+:1024D0008A0B834E5BD1153129684914A945A84A56
+:1024E0002CD409A84522C86FF8E1D69013FC146ECD
+:1024F000C35551800BE197856979E8FE7796E30C27
+:10250000772C8A542191AD8951E32BB9E15D4F7A43
+:102510002CBD48AD602183367F92F86EDB32CDE270
+:102520004C0DAA007431369A5F1D18023FA84C3436
+:10253000E31F4A0DE13B7C7C5883B755EAD2B510C6
+:10254000E1469D010CF75371C96A0AA78D55025DDA
+:1025500048AB2A3AB646DAEED11891DF8F38EE69E9
+:10256000610AFBEB04D857FE071F1D11AB4D4BB999
+:10257000FAB301469DFB33CBA482D5E99A4A6CCAD3
+:1025800043699AD9AA28600634288A214B282F9BB0
+:102590002FA337ED7AB4653753E689EF0E302E0F4F
+:1025A000D5A3E4AEEB888B85FC5864C39568D15203
+:1025B0007AD052D29FEE5F114BA32B56B299F77A85
+:1025C0008FC678A12876E088F70E74DDAD8B836323
+:1025D000E23D64372F66D2B11F1B314A5FD44518E4
+:1025E000331038E5362EBD3EFFE31021A6662D746C
+:1025F0002642DA088497FA0A6240318042DEFB59AB
+:10260000D3446F91B2433518A4A4E9A6647D227C1B
+:1026100002A98727463B16CA1755C659AAC022AF3A
+:102620007F088F38B96A1C1A1076ABF0E7CF1E9579
+:10263000206A72DCF25821AD673AAB9D3DD5109F00
+:102640007646C2E550C3F77D57B4F6BE874CD482B8
+:102650001F775679E41D72E5937A221467CEBAD4B7
+:1026600050D7C22B7BB96D0B35DE176814EC8C4349
+:102670002D0EF27F0E28C126351B68DE7209E91582
+:10268000D439FE23840467635CFA9CA9CF4259774E
+:102690004AD15B45A3292C4CA9E9FF4ED70EFD0B6F
+:1026A000CE115680A4B5CE386FE01F119356087333
+:1026B0000F438284CFD0A4DB0A7F7FEA7D58E70AEC
+:1026C00010980AF58ECD2C62C468894D781911E9ED
+:1026D000750F4CEACA151DA5457FDC803DB2B8E9EF
+:1026E0001CE031294C1756A939C9A394ED0797323C
+:1026F000713200ED4ABAE6AE35801EA1E636944846
+:102700008883C07567BAEAB7AF8643D629B3F74A5C
+:1027100080573E064F3C0F0E033BF6ADFCD590B400
+:102720002330243B5E87518CC90381B485209CBF34
+:102730009C8389A81A4A1DD470D95C8830181390DC
+:10274000EC5879D2A67B113028C80DCF7C812DBBE7
+:10275000A39A5071F8E1CEA5F63FFBB8C7CF3883F6
+:10276000E404A32AB0586F4792CCD94B2DCFCEE2C8
+:10277000A53833EBE5D9E5204A77646C9D20AD4858
+:102780008A462D09E9BC47341641F0AA63BFC176D9
+:102790004D3DE820D2BE04CF69D4D30D714703303C
+:1027A000517987F6FBD1618F88C35AF42B438A682D
+:1027B00011AE1D00B90BC787B99EF0A3E5D09FD31A
+:1027C000B52F57F43F9D9FAA6E1AA9C4220D9EE211
+:1027D000338577E3BF53F2FB9ADF2F375B8656B220
+:1027E00079ED8C7E13C2338DC62C17B6FF1641854A
+:1027F000F294D3CC62A0C41E34636086A09C51E8DE
+:102800004218890588A6AEC0750BAEE9508540E137
+:102810005301429427259D39915D7C726E12E071BF
+:1028200040DB5DF9343A26988467B84F3EA716EF2F
+:1028300001F104593FBD399743B23159702B0A5009
+:10284000DF17924CF692456EDB9B014645E755FE3D
+:10285000704132A0FDAE1FE6E7EB95810560554A59
+:10286000E2AC4CA212E3894DDCCCCDD19456E815F4
+:102870005DB026A4221CD540FFF537F03874B17244
+:102880008412633BF37CDA7A5707E6BEC99573314D
+:102890005B502F36A8498EAD6AE44E7B10F99FCC71
+:1028A000D4FECE449384DF5D53E5AAE1A044525B9D
+:1028B00013AFF715161DEB258DB3CF8D6B7D85F00E
+:1028C0005F8ED6C82A344EE819A499E8C68093B31F
+:1028D0005A6C9D912C01146F851A3E54B09305EDEE
+:1028E000CDB400CE1C5AF80D40824CF98BBA2F0C97
+:1028F0009956253466D2831B405725F0FE5573F94F
+:102900004E8B55C375EAA8FB2C6143040FE4308954
+:1029100020BD8478568E49CB03584F913E8411F1E7
+:102920008E9470D98134338A3C94E48F87B6ABFDA2
+:10293000BBDD253A1C920158FEA890ACA9ABF77DEF
+:10294000695366ACA5FEC0CB4CC6B557492C7B1D60
+:1029500028C37FD56F24EE69DF53A8E8AB1D2D7621
+:102960007AE2031DD0FCC63D63C84BD97CB3A99461
+:102970000548695253720AD0297836C5520BECD6F5
+:10298000ACA0ECCD846A24120F75AA3679B7F7CCC7
+:102990008E0B2DDD3E70D420B7A72DD7E0673520F4
+:1029A000F4120F80F326E6C3CF7C511A48B8DA0E32
+:1029B00042B9F0B177E37FB6613BF09778F2F6EB7E
+:1029C000FC1B3359E651DC957FDE25E60111CDFD78
+:1029D00040EC9944F8E3575A5EEABC321053E21FC8
+:1029E0003D6BCD43FDDAA4394063931218B5B19124
+:1029F00038AC365D947D5F94DA438651F118AF00B0
+:102A0000B9286D7C7A7BE735B14AC0D4E759685163
+:102A10005E4988105329CE69864D19170D39F8F291
+:102A2000676BB49952385BA9823F0C3D483F646C98
+:102A30008EBCE15C930379C1EFEB7EB9B5DEA27683
+:102A4000352A3C9E117D79A1C8303F2A2F9370888A
+:102A50004452CAA7C96EEF2C04E3422264B9C0FBFA
+:102A600092E0D648077A81DE69B34A058AD84FEAF0
+:102A7000A0AC964A5F736C88250C3BD4CEFFC2A6EF
+:102A8000217899FC69B3B967D5C943F9A6352136D0
+:102A9000286C3C08A5164A00009765FEAAB2D43DF2
+:102AA0005ECD615E71E63B8D87153243BEBB4ACE7B
+:102AB00080BDF6EAF35FD22575FB5863131ABEEAB0
+:102AC000E96E4308781A17E49658D73D8B8671ADA6
+:102AD000BB6A02680A253462CEF8B032A0EAF4BCC0
+:102AE000678EF967D232648810A09EC157CC015519
+:102AF000EF8BFA67E14DD1A81DDAFF81196F975A64
+:102B0000DA1C56CC79803CD4B890EAB0DB93861DB1
+:102B1000468AC2658D81ED361820730661C78E7BAB
+:102B2000AA6A617346D5A33F55F9B3CC6DC14AB5C6
+:102B3000EE258F9BA942DE3B25D7B331DEE3E4F2DD
+:102B4000E43845CD5F8DD2DAFCC2B8ABE28ED63D1B
+:102B5000FE9A77156E74DFF2AB77E1800AA29E7859
+:102B6000A956F5F2DE7AED36DB288C51778FB76DFA
+:102B70008B22C167A87027CEE574D87521C1CDAA74
+:102B8000B39DE158894DE47953FBA8772D945ABE43
+:102B9000EDF51F38E1CB6138B57B6FDB410B44D7D6
+:102BA00096D95793847DDCE5EBE21CE945C31AA571
+:102BB0006F586B1C1B4D0DFB2AD813167BFB18F4AA
+:102BC000E41B125C0F20FDF1DBEFAC784AF6853494
+:102BD00055CAA235CF9BEDBBB544C39FC99C63CEFC
+:102BE000C7EB96F583F107A80D4798F40D7D904843
+:102BF000B64787F1C1AFBEB027EE6F29419F2122B2
+:102C00007D7A187E9416CA4E2339AE7F2FA699235B
+:102C100075101933FC35E0803F2D6E4346AACB6416
+:102C20001332E68A8EE93CC7385A14EDF2C229F60F
+:102C3000E9B2EFBBDE2C68039E1814F4D8CAD2F3B5
+:102C4000F603649F6CD283021FF33C3CA699EE9777
+:102C50001DBA76E0F7181E23B65AFAE5118D29B48D
+:102C600059F4F42B8B16B63A8D7A1A8128797C6642
+:102C7000CA611C83892E849BB9498AD6034FDB0E17
+:102C80009CF961E111C76C3A8C59E9D0D6D9C45E80
+:102C9000680B84E98918D9AA17091CE50BB1EAE980
+:102CA0008B40A2B64F49AAE4DDA627FAF2938AAC7C
+:102CB000B4702669ACE3CA9A6E2FB98392FAD449EC
+:102CC00063162E34DB5AE1EDD6B1D7DAF6EBA3C4A6
+:102CD0002AFA540255A4A4CFAF4E880B4095437AEC
+:102CE00069ABA201B11F019C5D63708C80E746183F
+:102CF000BFF714F98EFEC708961EBF256E0C52064C
+:102D0000CF539D5E1009A0C18F8DB825EC85395237
+:102D10004A802F6770A57F209D10859EB780025E38
+:102D20001CB44C252D0086CE00B5CB7A94332C7480
+:102D30005F774272D67F569F770EBFC5FB9B4D399A
+:102D4000A1B62B2C0AE3E61DB6E1B06BE1F0D68309
+:102D5000CBEE586D61916BF50DDF4E8584DD877B81
+:102D6000C17D25D5BE8FA9B007D0A5957CD843AA33
+:102D7000D6452814FBD8FB3115B0FBBB6A772C1263
+:102D8000831CDC45A9B507CC4969449F3556D06CF6
+:102D90008859C4F9FDA2FF1E8A1517621B82F01C18
+:102DA000D2BCFFCBBC669A42E5668EA94BAFF396C8
+:102DB0009B93770FC96B95C51A329C06AB6106C20F
+:102DC00046F16B37B46DA955420A5B5532FCF45994
+:102DD000E1E0D190DBE6121869D4F430FEB04C7417
+:102DE0002F03F66BA9BF94B759CD09B661F331C86B
+:102DF0006531F00C7A5DC1E4936CCFA1F851655553
+:102E0000AE1E982186271E569417F9F8310BC5D6A9
+:102E100001621A7700A6713AF1FF8F303381301CBE
+:102E2000104389C0076B1CFBDAD64258A295AB8EC3
+:102E30005DB97FD7F2334A96C7E181FBA8AE44E97A
+:102E400016025056EADDB0A7F911EE62241A0532D7
+:102E500067094AB3F53AA942407D75A0833D371111
+:102E60000C4BE1DE295001452F259B550C37540EA4
+:102E70000DC04A24B0A25C54A64C73D7A1DA9C1AA8
+:102E80008F836D927F3FD91C16B700E8DB03BE79B4
+:102E9000F710FD5E48DE116F67ECE589B45ACB513F
+:102EA000B6554CB07C49E5B2982255BDC2FA011A1C
+:102EB000E333964FE628269622920FBF8A21AABABC
+:102EC000EDD60113A0F8893EE9026165D556397641
+:102ED000A84AB6D697E5FC6B3450453A5DA143A9A4
+:102EE000844B6567348FE0CC706E714F2B3E3A5146
+:102EF00005F52D2E9D44452CEF846CBC43F40D52FA
+:102F00003A09D8CFE8ACD1E009A5C9EE41BD9E5938
+:102F100038F9915509E5FD72F19CA07B83E5A3A8E2
+:102F200017915600A3FCA86E1CCB0E7C310506241D
+:102F3000F3377D7B81C2391063234DF8D6BE3AB694
+:102F40003DB4AC2738EABFD01F81AAEFF58DECB1B4
+:102F50003F981C4A30B40D420901EA1D997C6D6707
+:102F6000705358F03E07AAAAD70E47413512E8AE73
+:102F7000D6469C0A27E13D08C38B3815290B03234D
+:102F8000E173C979DE50FD4560267D26E0405CA9ED
+:102F900039DB5B845DE1EF49E67AC8EFE2758D5F6E
+:102FA000E73247B62FA6B4E5E2A93E54BFA7004BCF
+:102FB00056B0C0F7F9F90439ACCD28F2D75A41150B
+:102FC000FD5CEA539430A512F9A8A1F88DE559A744
+:102FD0008EEBC64D9789E6AEC4C3668BD0100B3F0F
+:102FE0001BCB0F288F38153C7C632FFA29A7DB6C8D
+:102FF000C137E678E7878544DE8511954BC9658C36
+:10300000DC47F59AA55391826585C0350E13F255BC
+:10301000089AFD1107EB791F11375C6BFF8DCE4EBF
+:103020005EAA7C7A4A9781EFDB579E06C3819A2479
+:1030300052C44A08D7FEB2EE227489B5091417B2F9
+:1030400043F15A97764813411FA8854674C450230C
+:10305000F0B5A17D2BDACB0776929E31387C341DFA
+:1030600051E6476E8C80E9688A517154B0BA46F1D6
+:103070008D7C9EF79584F0BD46FEB1397ABE093944
+:10308000874D1A412698773F33660310C3E7A64B56
+:1030900095C69E5560834A1D1A1B285DDC26744424
+:1030A000BE7C00FDE8D8B80E9A2CAFB59B9E9392DB
+:1030B0005D5C7D8C9E9159A899D377D0FD560EBD4D
+:1030C000E84EF64C44721753C1B92F6EC30B3C63E4
+:1030D000A6BA24CDEE05D568876EE59FE4E4821498
+:1030E0007FD1C4129873BEC471836DD8F7A88A3497
+:1030F0000F50CE3D20F4570C0A99A179526F32B58A
+:10310000645D8F54F2CE279CD7AD826062B192E0AD
+:10311000F06BF804E852F319C34FB543B8E812CD89
+:103120009BAD7FCB1062AD2D5D0EEDABDBEAF350B6
+:10313000C82D1DA77849983E37CF92D1AF4A7B3929
+:10314000E381CCFA28E655DD57B9878AAF7FF8D6F8
+:10315000C5A1FFA690D80FDF62D127278CE4D07ECF
+:103160009E4F8C64461D5D8F55B2B180C7EB239294
+:103170004A9F261936A992774A828C31CB25B88A84
+:103180005565923E750AEC0309115B8603E331CD68
+:1031900050F2D4BA02002DAFC4BF61F277FC5343A2
+:1031A0002B7C644B6552E37D74379252675F9D922E
+:1031B0007550B7C25D857772DF9F3CB93521844970
+:1031C000C375DACAD13AE50A7D859F3DF3840BF4D5
+:1031D000E4366D459409553325680344625415F768
+:1031E0003D9E42AACC5EF309014E99F3E9A5F9BDD3
+:1031F000813CBE5C772A6794D940C5364C7E1394D7
+:10320000BD245667D323D404FE150261568F5ABCE1
+:10321000D7DCC2C126DCB728FEAB905198AB4D88F5
+:10322000E51E70F783DE4881CBBE1ABC3CB18EEC44
+:10323000D5FF7AD3E353B0C03E0A76E5EA90419CCD
+:10324000A610F82978E3A9CB3427C7EC88AEB2578B
+:1032500030BBCC80AF7CBF1FCF274B5CA150DF5170
+:103260001A3FE6ED7B43AEBD8D27C528429F542A09
+:103270000FEA9F147A817D847EBC5DF8D05B107F5D
+:103280007E1B45C45AE33CE2944B07CFC88AA996FB
+:10329000F55045EEBD381C85E668D2B8EBF6D0781F
+:1032A00070C462DEC79A0BFC824C78721531C01371
+:1032B00044CB8AA6EADEE74B1CFE0B173CB1397EF5
+:1032C0004CE17998FF4532A98875A6D1E7F6BE6929
+:1032D0004B4FA3CE087E1239FED4F8F105BC96C33D
+:1032E00020137332A3804D3896EFFB7298767CA43E
+:1032F00019F75C3F7C552FB3C7237DF1C47EA6D15F
+:103300002AC4000B173859569EB434DC7D074D7122
+:103310000A34570596B1860F3ABDFDC76CE29A1282
+:10332000D38443B4FE253BCECCC6C4D30D041720B2
+:10333000E7B4F296C1FC7DAEAA2F6A63193E817E86
+:103340005DA5664861FD9171B2FF771EF782CB8E55
+:103350007058382478D30A0055CE3DBABD70C56D7B
+:103360009A713572BDA1651A3888F442C8AB6164A0
+:103370009AB6200E0E6966F97E6CDC67B3C7DD6C09
+:10338000F95F1358320EF481D89AA5DCA154803F1E
+:10339000330310026141A35C95725A146C935D6310
+:1033A0001A2BED0E89A4888918746AE0C36831B4B9
+:1033B000054AC11EAD8FF1DA6343BEFAB41FC3EAFA
+:1033C000EB775B98070A68110C63C30F69FD7BA458
+:1033D0002E9935AB99C1E19B48ED7FE010FF5CD59C
+:1033E00024FB385009C0B3ECF9EC5F7AB804C9BECD
+:1033F00015372A3A5D72C67AB2F3EC009826BD778B
+:10340000913579E1C53DB3A052B0450D51F16893B6
+:10341000968B77A18B19D3AFB3E67FCB91585065CC
+:10342000466470312824F6526CC54D90B2E67FA1F7
+:10343000DD8C864D9C6C751B92C9B38D6FC329F4CE
+:103440009D507E91E9F43E1496E8B610547E932385
+:10345000E81C6FFCAD24C121A03D92EA717E49B306
+:10346000AA76F6781C71C86871CC55EAAF7F16C68B
+:1034700068FA992314B7D30E549B31A7050A60D17B
+:10348000D924F2B0C7DEC8EA444D4A51AB6A5A7932
+:103490002101732AADAFFEF7013D4C3F8CF5490386
+:1034A000ED6C056E2987D893FDAC74C587356A5ECF
+:1034B000ECCA6F8657443065D3A1FF059CCAE53C32
+:1034C000DF7319595203730FB184F57F3E70B17EDB
+:1034D0006BA7F42AFC885BAF8F24C0329B95D55331
+:1034E000CF3B6465318A0674A72B10558CF1DCED57
+:1034F000D8E68157349CEBEA4B2C99B50C5774E70E
+:10350000D6D7F0E88A91A584B7F5CD5DB4EB15A3C5
+:10351000D00D977822C6625A107FFC55C0873B4277
+:10352000F225CBA79ECC15F9E4D021CCC78072DA66
+:10353000EEEB0BFE01B7E742139124ADE7579096EF
+:10354000180EED9C6C47FF5DA1EA30B2286F048B2A
+:103550009F96D6DFFB99A5429B5C183E65CF3FCE78
+:1035600020F64BA0BB6A3BCA8C43EF018C34D2BA25
+:10357000A41A82E0457088FD1E3E561638929D10B2
+:1035800043F0584E51F97896EF96B6F874A8DF3D9F
+:1035900018E3D5590FB0BE3714F8D408904D275F03
+:1035A0003FE1029FE0B8CD88C522D510CE00DEE70E
+:1035B0009767C7A312F6C43F65F74D0E867FBD7AA5
+:1035C0005800A545889B48CDD5BF04AA27FDB0DA91
+:1035D000791C509B9F0CC5B96F7C8A76C0EAA30604
+:1035E0007044A4861EA80420E83706CF897A99FF84
+:1035F0008736594E18BD428C708BAB999ADD1B50A3
+:10360000DBB03E71CF3EFBB58CF031AC4F38E5F806
+:1036100058CCE5887B1314587A66BEED71BF501004
+:10362000465C910BD795969F748ADC8B861EEC02C4
+:103630007038076F22EA8EE4AA6FB267FCC38BA7CB
+:10364000F4875EBDCD8E1A72D762913B20AEE82121
+:1036500039C9AE25F67A3384A8CAD6F59A41FE4216
+:1036600069DF4EE41BACA815D8A041A32BC1355F80
+:103670007C7E1C5513B9D313DBA3ADA385F4B12C09
+:10368000C5782CF46B9CCD2A55656617ACE534459E
+:103690002D0F527B0A1A79E53D89C6F8AA0E6905F5
+:1036A000E38EC48C1694183C8C6E9C077B520F35AD
+:1036B000E0C6D99808973BFC514CFCF23355766133
+:1036C000808BE3E9E5C69A4E869F5988A9F3426547
+:1036D000383090EF11FD555428724BE22A7F67294C
+:1036E000ACF86FE539210D3B7D38D3FB6F51B7CA7C
+:1036F000DEACE832B524D0B141F5B6D112115BF899
+:10370000DD9411CCC87AF25DA0A42E383D9745CB4C
+:103710006BC631831F4A5D3122AB4C8BC4924E1273
+:1037200023DDD1B67D6DE64989BDB6BC8A9D771093
+:10373000DD16568F85A16FA2BFBB89C84BF7BA179C
+:103740004CB369EE8271839094550839050997C985
+:103750008A8AA70DF969BB257C670056811712ED8F
+:10376000E7675FC0A0FA789AE065F14083A046372A
+:103770005F88F564B4E9723454E2CAF4E8DA8AC5C1
+:10378000B7F236929465E3A173AD599EE718759729
+:103790006E9C04AC82E6B6C490B30CC3B8A31119F6
+:1037A0007EA32F3451D9D5359E75851066199B3768
+:1037B0005D25F9AAF2A3790EF39AED5D1B6A04E583
+:1037C000497448F52C797F6101B71FA13BEB3F5F3E
+:1037D000496C98FCD0C98C37A331BB802D00417453
+:1037E0004E7FCED9E3A8A896CF4EC4502CB729B6A9
+:1037F000C41205CEDA8AC879C442744992508CF555
+:10380000E6B3402891200C9C79E47DC1C3A0C74158
+:10381000D98140CA81CD23403E033EFF08F1CD2B24
+:1038200094523AB6B55CAFAF0423AB7C98FDD1B6E9
+:103830004243CB64369AEA1DA5D493A3559FCBFC93
+:103840008D743F6DF7DA3EF855F3334F4AF30F9D11
+:10385000E30C99A838DEC9CEF8CAD634013C2BC097
+:10386000837FCC222FAF6F98E037183920D02C659A
+:103870009C8559145468ED287C0F1EF444BD0F3903
+:1038800085304F10EFEAAAA58952CD09FB3B8DFD8B
+:10389000B72EC7DD279ECC92BBD39D6A6F46C6F775
+:1038A00031C798B8FF3851CBD1BD18270EE1AB8690
+:1038B00063BF5909D50B66D593070F872E164E0E99
+:1038C000EABE80DF9EA8C1DCEDE08005B89CDDADDE
+:1038D000D0B4931027E67B6D55728F97D2E670C3F4
+:1038E000BA54FD1BEB59C75794673E7D53A342E082
+:1038F0001576BA3FA92B06E3DB2165A4ABED5A5C34
+:10390000E18AD435289868CE67AAF1425008AAFF08
+:103910003B7B6A09264A31460F0D133B03CE47B164
+:103920007907E7DB311D4528691879BAD756F9EFD1
+:1039300093DB444D9B56E0EC6837F79F522FD6043B
+:10394000503BD39E5C1F00415B98773C2EB77F179E
+:103950009F1595B9DCCB791823A2CCB3177D63F7FB
+:1039600037901A2E9D0022749278A2F148F828719F
+:10397000196E7C18E14871C74C629E959C89FBC406
+:103980008F1115C06D921886A875B3B3F64371DB1D
+:1039900016A2327133765AB305A342B929B080F525
+:1039A000E533E89D0E32466F91ADBBF65FE615CB71
+:1039B000814CEFF7714F943EB232920AD82BF1D17D
+:1039C00081904E19BC95E41D80738EF08BD58A5D75
+:1039D00023BFB0400420BECBB738C4CA82A87F231F
+:1039E00041FEB0B2C1BA11C367EE681CFE868509FC
+:1039F00012CE59A5D203E386372C539426C25B7EA0
+:103A0000926C421673D4C1023537F88B1E3DDF37F6
+:103A10005C8C87ABDDB4180AEE6D644D71EE273B0C
+:103A200017321F2B38FBE42FE302901E5C9CF899A1
+:103A3000810EB8A7263F0C6E39C87967F060C8A41C
+:103A40005D416091E1AB8EC156E0E32D3C04AD00D9
+:103A500084CEB43C1F0C0C7F8809D623B0D63DAD74
+:103A60004A97BA6D3392CC3283F072199AC7813F6C
+:103A70001B397D078E3B7F89589CB9E18C225C58AD
+:103A80003A4F5E971B7FB6B5128034330711FBE6C1
+:103A9000891B6FCC1CFC3F7C7C00DBA819A3BF45B5
+:103AA0009D5911DD0C64DF9400E04A2421D30E50AF
+:103AB0000AA28847BE27CEF1E5C93B5F8D9E305DE7
+:103AC000DF233B8372549268C6F6953611922D6EB1
+:103AD000C8192ADBE53A8ED08F7A6B7C1569A45F12
+:103AE0007FDB138EE964421F050D56C8315D1076E9
+:103AF000C74C7121DFDCE7030BF1279D0F50FB9AC8
+:103B0000554FA51E9CF8FBBE38F345776DB5FAC33B
+:103B1000F4E4CA6106F2A10FC5AA5D8AD95E688F76
+:103B200049209FD9438299884BC843C74D31D45E01
+:103B30009D36B78BDB58E01D763820961E38EADCC0
+:103B4000808305B67B31B2DACE92F0A9DCD31011B6
+:103B5000655880F33B389BE1510344B317EF9CB5A4
+:103B6000B63BA01DC4E3B97809AB4E1FCABB028C9B
+:103B7000073BDF61825DAE1EC712CD56D651EE9473
+:103B8000EC096AB8B08752C06232F35013FBFD6D86
+:103B9000B1805F284C5993969222804EEF048AD8C8
+:103BA000B0E84125F9C3D8677FB940989311BBEAC3
+:103BB000AEB37456A84AAE9B42F3797512C3D88B44
+:103BC00023AEF91F707331F96066574C90A8F60464
+:103BD000E5F2A9A9FD3C206F1E85E1DB7BE42630E0
+:103BE00086B70F58D313B26243073350F99A834E06
+:103BF0006C2EC2E0AE6F023D450EF256154FBA3143
+:103C0000EF7F6BC76CE8A9D5A082BDA23C1A3E9A93
+:103C1000E116B61FE406CB427A60CCEAFA9EBD52AA
+:103C20005907562683398246F2BB4AA7356CCA012A
+:103C300035495848E35675F2FE47F71359FF3D1EC4
+:103C400044865B852B8D5A1C63B2B832AB5CE68B25
+:103C50003F4A454B852FA77052D9F1447782E6162B
+:103C6000F5A3638D88D71F8A3AF980A45C6680EE3D
+:103C7000928F17BD1B7FE5F55FD912BCE2C99C147A
+:103C800025CAEAEAFE4DDCD2FC5F49F0471E7D4EB4
+:103C9000931F9A81AF275B6E57F5DDF4963CFA725D
+:103CA000E707C25F3664D4C47059E9504409029DE5
+:103CB00017DE65673DEBAA748FFC6ECA913362B65E
+:103CC000243E79FFD9BECC9AFC7646E07F30DC5C9E
+:103CD0005F7BD4BF9A54E383FA52A88D0F6F84FAA6
+:103CE000C3E21348DBC56FD0932E2B74C6B44F26A6
+:103CF0008E715C5D041141CB60358945F70B9F7E69
+:103D0000B2F6C44EB2B504117FDB7890E8DFC03F55
+:103D10008761CC2C6DAEEE29578EB68DC9BD680A71
+:103D20009EC4509C223F0BC74923990FD95CFCEAE3
+:103D30003012FE1C20AD47B86CB14EC7A5265A60A4
+:103D4000B718B490F6CC24E9273C5A477D18439223
+:103D5000F6726DB4BDF00FA2210C7AA4D2321FDF2F
+:103D600046FC51485F0A97A367572AA8D8693A6961
+:103D7000E1E3CB0078A8F19A9EB631234FCF2964B6
+:103D8000F7F9D0CA2D9C1F09DF5AFAFFF46AF31C19
+:103D9000A6C33F7458CB5B603FD85A90EBC15A80A2
+:103DA000B997B3138C3E69B03AE7C2E0F8049FAA12
+:103DB0004D0DE6E0CD32213EF80862EADCD6CC8C2F
+:103DC000E9F0293B83BDA9351B995A7772C05CE79E
+:103DD00061B688190AA78D8E71A805B42CD5802AE2
+:103DE000D5C0F2CB11597461E0462AD0A6D7D57A56
+:103DF0003407AAA59797B98221F2D9492FB6D0E204
+:103E00008F90A5FB9FD92F9A02FF563B643FE7CEC8
+:103E1000519AC605CD2A005110276E17F97DE36827
+:103E20003FB12EB7C570CDAAFC480F662CB0E3D9C0
+:103E3000ACA28A1CBB4DBA09BF9CFEC6BF3BF12990
+:103E40007B8D7F2DAE11F76E943F97C31E69D0ED29
+:103E500043D7A68D5899FC5C602DD029205609289F
+:103E600082D33C5394311DB3EB2082017626A715F3
+:103E7000188C9E254C611955AD67E0C28D0D32F14D
+:103E8000162B1ED597142AE46622A4B889E3B8102D
+:103E9000C2735A5A787AEB41A5621CB78917388DDC
+:103EA0000128EC7C99FE512D1FDA1E3F6890B1E786
+:103EB00093FD2C155A6239619516F9A912DB5695B6
+:103EC000A2784D28A22F3E16403DB40C33AB63E7D9
+:103ED00086E36112BE06C4B00AF0910A0C223B2EA2
+:103EE0002D096B8C2EB88892434215231AC6AF64F5
+:103EF000F2E02BB33442D15208F45B00EFA810F784
+:103F0000D37ADE9EE14B7D188CD4E16D44CEDC0B80
+:103F1000D25BF215BA0D20DE35A50828C2A8B7E598
+:103F200097AF6B45F389798ADF665CFA6AFBE293A7
+:103F3000D0BDF81071F6A47CCFFCC83E69D9D25B25
+:103F4000B247E830F0D8F9241FBE04F0818BCDE6EB
+:103F50009C1400B64C3CD72397E919E0A1C11B2063
+:103F6000ABC826C6FC151BED7EF881C947102A9AFE
+:103F700088A319A0744B72D2F102C8260AF2022F4C
+:103F8000D371D859FC9CA77A89C2CE5EEFA115CD1A
+:103F9000E722AB7E7D7C4BE1BDF45868FB1752DF16
+:103FA000EE211E2BE70D16B37FC97A9C0D80431AB4
+:103FB0008F1DF581C1C470D15A3B62B61A76A3E455
+:103FC000892B5EF4A701A805F5D5397C3FBF04E72E
+:103FD000347A195D5EC36538F14B1A1AB573DBC2CA
+:103FE00072CD695DFCF2AB123754FBF9C1387E0724
+:103FF000FA92F907AC91F33AEBC4EF7C7ED7150C3B
+:104000001B32F0ABDE11C7B8FFE852E69BC1746FFC
+:104010008082C48FF7B962A5872190612D0733791B
+:10402000E5BEE492399D7FE4C8B1178D55DBD663B8
+:104030008E397BF510B72779409E7897CABC5A070E
+:10404000656A50B84D1CF7E3DFFAC5DE3C5E3DEC17
+:10405000278EEBB71CD80C2852FB25BAEAB0552A9C
+:104060008091F24C4E1CBCDC7416BB701E9C2A3C2A
+:104070003CCB56E847F0DE6748E20AEEC03C7E558E
+:10408000E0C31D9CED8B77A35F20B82F6F086AF00B
+:10409000401D055137308EF1F7642424A4BEB1537E
+:1040A00082DD4039EA07A2ED0A5341B5A92B6AB770
+:1040B000E682E164821139D28FDAAFAFE84B5BE27E
+:1040C000BC03B84065B46331106D22F56B20EBE2A0
+:1040D0001BF727B7613AF580762056EC65D5C3F615
+:1040E00030B5B2316315B3C6684B6262D91745ABC0
+:1040F000953FF9EADD4C1713AB21217183D06B8218
+:10410000FF36EA4DB4B6181F730EBB2AB752C7F07C
+:104110008EA794673D6BDD0F6656AF043DBE483EEB
+:10412000B7C78B9EE550DA2EF2E482F92A1EBA2434
+:10413000DF5F3888164D25D5C6030BF45C44D32CBD
+:10414000648CD6D8315F076B40E39916D55500BA19
+:104150004E96E6E85011AE7EC2731AE2340F533524
+:104160002A0D73FEFA77AA1D132F5628D02FCA578F
+:10417000A500632C21A542E9F214C8784A11B6EBD8
+:104180001AAD7F0C48019A46D152ED39B75001FD66
+:10419000B9D28736A92ABD0FDB908F0E741904158A
+:1041A000278BE10BE08B08DE5B6081C8CBC7710C0D
+:1041B000A08ABF471257962E533F9BBF9E9C071B5A
+:1041C000BEB5E631603E96675A4D1111EDEA4CF4EA
+:1041D000B1C457EE1588E6F1B0670969FB0E09D244
+:1041E0009D11D59B5901249C0E8463F088365D7720
+:1041F000C7264C5FB513F223B4356CFB9F9CE2538A
+:104200008FDAD365577D44B0C858657C8ECC4EDFBD
+:104210001F04FEDFB26496DF2A1272BC1D5F0BA67C
+:10422000DCD1688B0522093D41156B2BB4272C0E80
+:10423000EAC587D77805E295010DD8979F1080D8F9
+:104240000DDF931E8720A448A61C1D49C6CE85DF1E
+:1042500044773A59125E429D7AD982A4C38AA4BE99
+:10426000F7D2587B4651BE1C7844DD860223FABB48
+:104270005977AC1DD4FBF7AF065C6F5C54E208FCC9
+:104280007F73104B723D0CC041EBAA4C6A779A07C2
+:10429000F866BC9A6E0B691524D4396CDEDEEFCE5D
+:1042A000EB9DFCCF953F632AFDFDC8FE810E09679B
+:1042B000813867AEBCC61B9F660D07B73D89561295
+:1042C00088BBDEE3C4D269EBEDEECD3534B2C2C6B5
+:1042D000FDF98CE12633E7014FE2EF56AB7353D281
+:1042E0005774DE76D2C8EC1F5768342D14C814AD4D
+:1042F000B8193C61571845374C53FC5A996EB09524
+:104300008AFB2563380C62E8D85A628259564759AD
+:10431000B76FC4C23CC55F840DAF9F18099951881F
+:1043200093B865CACC4A5BD3C35AB8872439140FF3
+:1043300009820DD1E7CE1E8D28C489379EFC6D21E0
+:104340003A988EEC85314024DE66B15E792DF358C3
+:104350004D09A1BCE686D20DBAF9C666BF36DA6150
+:10436000535B27766DB262014877D978233CC9C385
+:104370004BA50B9320BCB6B2DE13E9AE99A5F0FABB
+:10438000DBCE56E2F1D8E0C966ECC21BB8CFE9E259
+:1043900007B1FF715DF327197B53850AE57B8A140A
+:1043A000466AA7C728B5BF729B619AE4D0E6AEC43F
+:1043B0000E6C52986922DFE54FB108505D0A0A9FE2
+:1043C000E10E837B90B175262CD0BBA6DCAB1C77AD
+:1043D000FFEAAEC1C991736E6F83212F09D4035ACE
+:1043E000CA0A43BF400CE2210AEBB85FFEB54C5C41
+:1043F000105E8D475D9BAA0DCC78B6F6EE3E786DCB
+:10440000B892FDF957E3A4CE430AC050DD59F0F24B
+:104410003D2056256F817EAA2222BAD9AC1E61C5E5
+:104420000697F32B1B1292F6155FA91F57BFD3589F
+:10443000082E40707D4C25BB72F65733A35416C12D
+:104440006D1B5D8E53E902E5DCCFD1E239476D1675
+:10445000605153CACC48CF1194476C020DE62D939E
+:10446000060659CA01D8F0ED9D724BF1331CF1CC10
+:10447000BC46B55A61744715EDA8F70C5BBEA96739
+:10448000F4D81E51ACEBA30E540F1591A910623F46
+:10449000C843A29F9B22B9FEDEF6F990C86D359FF6
+:1044A000BFBC924A3E3D7876DBA2B5AC6F806FDD33
+:1044B000890BDEE01C8728657F1E55F7EB662968AF
+:1044C00067B28E0C9E84EEF1163BBAB222670A8761
+:1044D000BB3A0F8058E1D102928FF0912E15C7950B
+:1044E000D451E80F475A58E16397636F9585ACFD47
+:1044F0000C29E194941F37000D02C51953C9F6B079
+:10450000F3C8DB5D806BB3B190573922D5E936171C
+:104510005F953FA6A719B7A0C6FBFE7AF7CD39076E
+:10452000761EF60919F5699D063EC928AB01900271
+:104530000DD83A704C38BF33FBB67C25CC4F7F3E4C
+:1045400022799BD02467CCF34337B4CCEA2C58E6CD
+:10455000175FD1B9AD58A5CC2A2E4025F2B8807688
+:10456000C65F8E6944756CDB2F4891055477897C52
+:10457000F3DE99FE86EC8DCD4E5CD8864B73456B91
+:10458000F0680A1EE53E6073D40E44AE6CFC5F1208
+:10459000E894207D75F1A2C87A0820EE4D45A7EF7A
+:1045A000499ADE6EBBE935521E4045E29FAB4D7223
+:1045B00088B2F8B9C87608712ABD2F5BD9B2B58721
+:1045C000110EB9089F4BB94F6D010FBD65601948B9
+:1045D000860411ECE127D24FC2A8CC05790EEE0C6F
+:1045E00064818FEB7DF6655AA7CCCBC5CBE2F43A5C
+:1045F00025E5C966D99B96FAE9E0BEDADF3CF457B7
+:104600009C285083F7C34E56179C55B0606E68D6F1
+:10461000483730959FE48C3F49E41D461A52315784
+:10462000126A011F5AC050D85A43C041C7D4C1BEF4
+:10463000CAE87883279BB4AB10112307A71A6886B2
+:10464000745B218D2C2BF2DFF34B5EC1B25929E94B
+:10465000727631FFE02C6C9F635E7E4C9A3B84F453
+:104660007D539407DA225D360B0627487F923E88F9
+:10467000364373A1EBBC477561D60C825695715CCD
+:10468000A269BCE0C12FFA7603D2F73C6E11E24D6D
+:10469000489B20B64381ED626AE16DBC97CE42E84B
+:1046A000C1DB79CE456A774A8B448CA3751893AEEB
+:1046B00075760810942943122C55201AB37F0CC725
+:1046C00025B282B5A9AB8DDB44BD87ED6F026931A0
+:1046D0004BE825610AC7CB545481D45BD42EBB0769
+:1046E000193CD785B097F0EC8FBB98EC023ABFEB42
+:1046F000FE788DBA7554206BDD4E71FD5D7916F430
+:10470000B6A7455E972615391471C05D5A4787C410
+:104710003EAF555B49DD5EE5F98876EE4464743A58
+:10472000651F0374A279314267B644A8474BEDADCB
+:104730008BAF33C4A71C712DD01569A4ABBE26B6B0
+:104740001C82DEC27922D7C6F3CF631FD7086C0361
+:104750005ACD082339500E8BC50B41FF9A29D4CD71
+:10476000EFC2D71A8E56B556A95D945568515F2889
+:1047700074140122A452CD786F7F5F28E3FB8C175D
+:10478000687974AE7F0BB66E00EA40DA43E227D256
+:10479000BCDCD85A103F29DF98792F3562562A841D
+:1047A00064FCD867A15F16D7CDC45809D0D7B85BD1
+:1047B000958D73CA39DA036946B3067D08703C7873
+:1047C000F0E208EBFE1D006931FDF3B8B1B0402501
+:1047D000EE87487700EB0C31308D3B59C3DAAE0AD7
+:1047E00030FAC2F049002269FDFA0FD5B65AB64D2B
+:1047F000932ABF3FB8BD81E9F66E663977F158FE5E
+:10480000D7CF5DCB16135A2A06720C023586745C1C
+:10481000F1C11A878F800D47C7884828511BDD5B7F
+:10482000FE790DF884A1A5250C8BFD23F92558B43C
+:10483000EB43939D5CE13DB6797A76CB32DB8C0518
+:1048400024F8EDF40AB5FC3EDB11B6212A398CCDF3
+:10485000EDB2D0883DC14C25C790AB44AC2763581E
+:10486000BBA51239BC562F1A9D19C546E0E4ADAE62
+:104870002BCBCF733194F52E47D00FD37382624781
+:10488000A62B57FD1EF9341E857FAEFAD94ABA9D74
+:10489000ADEE3BD447FB1038430E91378498861811
+:1048A0006E4079F4DB2781495588302FA5AB11B0D4
+:1048B000B03366899EA3C92435BAC3FED57AF115F3
+:1048C0002CE05872F4B7DCA2DBFFDBD4DBD4237A14
+:1048D000D4751BEB86CB0A04B577296F9EC8926905
+:1048E000F5739863376EB5F61C80AE88AC529C8821
+:1048F000F7A19F0112839AEE7AE21CA1F1530DA455
+:10490000A49AFB8A6E17FC764FDCB887C3C01FDB06
+:1049100045F7009EFD0BC25886B8E5192E9FAAD810
+:10492000245D4B355B93A393988FA6A2EC375CB1C3
+:104930003E7F4DBB0FBC72233A0A10A9EE2F202BED
+:10494000FDA5C0735B46A3C806C968EA70CDF7AC85
+:10495000BD70291949D04BE045B0D10299D5BF7E31
+:1049600043A6D21710C47D0E0947E13B47A98A32FE
+:10497000C8FBCB834FB8E1F13A03D03109CD851B99
+:1049800041BA72C4A7D18C1180EEF8B6B48474EC2D
+:1049900090CDDCF0488A7C7E686DC89253C6BD9885
+:1049A000CE3053CA546A0199B0A93C396A53405F6A
+:1049B000C4E0D522D6B3CA77F5610ED2B984C11F3F
+:1049C000298AAA25DC0E519ADB421ADDE23AA706B3
+:1049D00006CC0B15AE7BEEF6A01ACED0927D2FA89A
+:1049E0004C8D71DD928F2B92B065F4AE85E2FE5B4B
+:1049F000B5635B047843D97CE1A57CC2B3FBBD42BF
+:104A0000502655B3F7BD19512A6DF5FE843FE3D406
+:104A100018C83D44FCF27ECF4ADFECD8A972C5B677
+:104A2000CA927C0D561C929A9A695DE7DDBCCAF960
+:104A30004FB2C7359F1BCBD53094CC6E21F74C5F5E
+:104A400076A80CAD3AC774F2D0EBD5FDFA76A3DDAB
+:104A5000BBE718CD578E572C9E62216A2519A5D128
+:104A60001A809B195E193ADBDD830594194C2B954E
+:104A70002E354079793DECF843CA86DCCE0B65884B
+:104A80009BF6C50531ABEBEBCD585C7FAC2E9F9B05
+:104A9000EE3C36174ED23CC96C169FAC08D0DEE611
+:104AA000DAD257FF882737DE328658844B5981F592
+:104AB000A4B4E0D573A012379D50791D41C444843D
+:104AC000C115BB22A4568449CD6CD4012FBBB03D87
+:104AD000E3E4C54993EE422E5FCE312A781CF360A1
+:104AE000EC590FB81BB8E728E344B996F08B21ECDA
+:104AF00054260D1ECE67A5ED8F2E5E8B6ECCD07723
+:104B00004714A8B69A94955CAA87F5BEB8EC9E7037
+:104B100049EAEEF63E6A52B8245C444115E81E9814
+:104B200061090ADCA15E85B176EC31D9AAFCA9D66F
+:104B300011B3D1F992214945210CC90DF742C6B4F0
+:104B4000DDAD961CDE10E7872E18E9C60B0BE1855C
+:104B50008E919F6CCE9C1317FD35C13C0FA09162C6
+:104B60006887468D3FF7F5C08569D7823048615C1C
+:104B7000E0F08E908931F0797D7655E58DE38B8A72
+:104B80008C657A7942CD0A4DDD0B390D872512DE11
+:104B900003C91A4F415C45B83DB0368DC2D68786F1
+:104BA0001D20F9EEF547569EA1B15552F7B61C20CF
+:104BB000A67BB6DC81E788C8E14918F0899DEC9FA7
+:104BC000B54AAEA887CD0B2588B4DB5EEFBD01F3F7
+:104BD00003C8455C9226FA38CDB62B4DB6E4367B39
+:104BE000AF90C96E0098EFAD6C3DBB3F4A7DF0B70A
+:104BF000A1000BD9F34C914DD64AC65612C8D60126
+:104C0000E8448DB082C53FA8164B77977BF1180E0C
+:104C100007AAC1E785FCC93E7171183004B4AC8F96
+:104C20003960A90165DF16A39504414E26CA66CEF8
+:104C3000FCDB9E6D6D267A87B70A230F9CD19D9869
+:104C400067AB233CF2B8A996E4B1AD3900F58D9875
+:104C5000989C9D939952921C5C0D6C1C2CEAAE9210
+:104C6000B59C724E846D0A0F7F332F0A6EDCA0E56F
+:104C700075E429E9C52520D5AE63BFFF2FA0A8257F
+:104C80001AA53FC472FAC89B3C1129179DD990C53B
+:104C9000FAA927F4DD3A8AC410219B694D3D31758C
+:104CA000A997D39BAFC0663DA55B345D161DF88701
+:104CB00099F346389D7EA3BB0933572AF8BDF97E88
+:104CC00042758B1B2AC26435BE8C9B4C7C82B6001D
+:104CD000511C5D959F4738FF0BC50D8D0B61AA4890
+:104CE00075C06410E93A2088DB2101A9034CC0B8E3
+:104CF000E3F6784BA96E3E6035EEB4060760F389A3
+:104D00000F1C39684DBF5EC2AE47600D653FA0A362
+:104D1000133B08B675CEADC79FD2D51175C819ED36
+:104D2000F2A28752D59239C6D389412CDD40DAE010
+:104D30005A12373D9DBBA2C41EB2BBA10F3692E7EB
+:104D40003459DA4018ACC01F83EC19C359CDA04DBB
+:104D5000712E893BD1C1ECEEBB53B2C55DA0C2D66A
+:104D60001D47C380AAB5EEBA64C5107181669FB8AD
+:104D700013A6DCFA07A6D84B3B459C12DC5677E815
+:104D8000BA7F235A02249F0E6544073322068BBA4A
+:104D9000AAF86758610285CA4A2E3D0751384E4825
+:104DA000123FF9B4C023001FCF055CF9F23E100793
+:104DB00087F9626C5CBD393BF4EAB1E02B6D9AE097
+:104DC0002FD5866C579F423771F2AA99FC6B5FCF43
+:104DD0006995B2B050F9B60A234A460741AB580F5D
+:104DE000712D679B54D0D6F4EED01F8A19AD56AA08
+:104DF000082B624138CE8C2E1CBAD41EE677C8DC54
+:104E000006B052DE388BC588FFE8488A68E036DF96
+:104E100077179E0E3F1F55E41DD0B435FD8CE789F2
+:104E200024D46E9849CF02C10B04373CF73DE652BB
+:104E3000073106F432C1279E227E5FA9FCB1B0E59E
+:104E40007FC94CED357604EB791DAB6EECFB7C3FF6
+:104E5000C274E78C60F748ACC456AB0AC2AC0F9181
+:104E60003D7BC683453327E5C0C1B98C8EBEB12AD0
+:104E700043EBBC3C08FA98C2C942A73DB852322E57
+:104E8000455F575F752031117358ADA9DD1A978AB8
+:104E90000AF19F41552125309C9BF270B7BD4A9184
+:104EA000EA07EE69BFB30DF33B3120294C97072485
+:104EB000A6252CD5FF3C9A9E7CA74F14C6FACF722C
+:104EC000BF5043EAFFBC83A3CFACA4914F283FABB4
+:104ED000A4F26FE8EEE5C5E3999A58D95FFCA99270
+:104EE0003E0672BA9C2BD3DCED47D9315ED079D423
+:104EF00040257EF8A5DD34960A30FD393384EBB0C9
+:104F0000C9A38EB77968E2118A56C044B1C9DE8A56
+:104F1000C7C5930C07EDAF3707134571856F96D55D
+:104F20007C2D71A1FC2627A12A96CBEE6BF2383599
+:104F300012B41B5EC598F68950725102064F274A7B
+:104F4000E0ABA320C99F3ED5C8D53EA580C6ADAA7B
+:104F5000E6383C934F4D1880D01A5018C93FF10CD9
+:104F6000602625AED570B8D2A6B45067F6F00C40D6
+:104F7000ACC40AAC39B15646784C52EC264FCE3808
+:104F8000F7313B2BC40336F18B87FEAE555C242BE7
+:104F900058D3DF8D3649D004632C6278BF329187B5
+:104FA000FCCE8FBFDA682CF5F5D3612F0CE37A06BF
+:104FB0002EB5989A0BFF660DFD0D059984DC7215D0
+:104FC0002049E088F83A95FB9A2B6B07FBB45B1EEF
+:104FD00048CDBEDCA848BDB5F88AF6B7F824D3BAE8
+:104FE0001820374E2011FCDFD54CB8930E66AA83EB
+:104FF0007E5272CA1F054695A31F62991C2969D269
+:10500000EF212CC62592BB32577E435FC3A668783A
+:105010003E24B49941D3350F336A979615023D9BD0
+:1050200016846AF8BF9AAEDFF2E0F20F93528E3B1D
+:105030002B2E88C707D9CF24C4A191AA5BBF6AA22F
+:1050400049A931FCBF956457179595ADBABD1B0BA7
+:10505000A610E26D459CF9DCC457559489F7F4E33A
+:10506000D39DE8E0CCD38C90359A6BF7775C806168
+:105070002514B60F030B894394C8BC7B176C0857E3
+:1050800001241C431B2D1E8054C08BE42399F12A5C
+:10509000ED461A82F6A92CD7682176FD362EFF112F
+:1050A0005C8513C86B53A127733EF47596D891990C
+:1050B00042090D504A0736723BFE9C96D878EDAEF9
+:1050C000EF673DAC6439DA99EC9CA3E66174D7577D
+:1050D0007FDBD8DBA4E456FC5541AA42515CA516FF
+:1050E0007DF0D713430E10ECDA0D21E35778EFADC6
+:1050F0002E86F45B8EAA9120A079C3D365B42C428E
+:10510000A2D4EC70868E2093EA6103A72F2160BDA4
+:10511000A0ED402D70E0E5CD37B1895AE14D538CBB
+:1051200039552C36DF62D517E59D784BD30BB5E7A3
+:105130008CC558A0ECFE2536B3DADDC332B5D6995E
+:105140004B745A8B3C4B7394D9B8BF595CA095E80B
+:10515000CB70B4EABB3A0BC7DB02189E6D99213DB8
+:105160003165357BB00EE393E11D466A955CED65D4
+:105170009ECC77AF92A5654C8DCE68E60858E4CEFC
+:10518000912AAB742FC45F8A659DCA198DAAA5B5F3
+:105190007F5D8300E1FBCCDCE752C2C54A115B9422
+:1051A0004747999EC6499D4FDBC33FF4F3E0A6A154
+:1051B0000F4F035F15C71FA0960C9F64B3B365A77D
+:1051C000460F2F80ABEC58BD79445D517AADC43C9D
+:1051D00095309E07146186C30ACDBA8733360FBA5D
+:1051E00091779B656F023C0CDCA6A8615CB5252E0F
+:1051F0003DA576319FBB725CD69DA321D4B6CA294A
+:10520000AE7DB39C409C21BCE413461F54EAB9C256
+:10521000CF231D78629B9205258DC83AEE932229F3
+:105220008F6863D8C10AED804185CE8B17E25D6936
+:10523000BD8D614BBDA53B9F01106B6E986CDEFF71
+:105240006B89C809A113C92C85E73A3F78182B83CD
+:1052500031DA9BD16175F675AB2E187502B23B162B
+:10526000AF3E0AE9DB63A37838CF7C25FC7980A3C5
+:10527000829CCA60B71E9BC94C869DC7CEB126DAF8
+:10528000B3008C9C3C4F7E744703BD699EF7F0963B
+:10529000C24E31FCFCC5B845CFB4106DD4E020AC93
+:1052A000866B016F3245DD31FFFB49D86D0EFB9EE9
+:1052B00002FDBA15A17B0F3DA69DBDB386753FE1EA
+:1052C0000F3227029B29FDE3C118F235EACC26EF05
+:1052D000BC5AA08A3FCFCEE479F8C739686BC8952D
+:1052E000843200FDFB2040AA0061CD07AD192CEBF4
+:1052F0000D2F2619EA174B0B40708730B33AA8914F
+:1053000021F69059274778F49676EE8CBFA0F911D4
+:1053100023F23B3FB7F3BF88B759F57402B4812835
+:10532000BE3F80E79FBB4C5C392F275AAD91717609
+:105330009550043FE5D62F35EC8A42C5541C31A761
+:10534000C5A4752062B82934617AB9A730E190E626
+:10535000FEBD141E6B1C0432D2EA73670FF02616D2
+:105360009B2534B5D501134FEDCC85A2E6883E923E
+:10537000512A53326DA56A8DB37E510C1A25D5651D
+:105380008BDAAA00691DD597F3981D2F62BE1E689F
+:10539000DF3DAC48C8D2375D7D7CF01985BF412523
+:1053A000BFE2785EE13E4C8ACEB6BB186575B57D2E
+:1053B0005F3B93553A7B50E7E06CC5597DE8C39954
+:1053C0005C7409133EC27362F32CC9445439FE2F36
+:1053D000F2AA74F42DA5ECD2C300872A198BD99BAD
+:1053E0004D6734C69FD2BF5E33A3B8373C3E4B6A8D
+:1053F000C99B93AE66D7D132FEB219059CA200D8E4
+:105400000A5D57C12DC6FFA308EEFCDEE036DC9036
+:10541000137D82263228A36A3F7555A60369484545
+:105420008C229A7D05922439E0802E561161DA672C
+:10543000EAE128591EA86281F6CE21EF503903987F
+:1054400082EF9C4D2827E0575929ABA38ADAA19116
+:10545000F29EAE0DBD9D10B268DF6434D9CFF990D5
+:105460005AEB5B26EC6FFAD671B34A287278421D6C
+:105470003AB1C11F648EB38294A2A79C767C910836
+:105480005086C5D65697EFB0340540F78899C7EADD
+:105490005886BB6475B793442F9A06A29C1E177E4C
+:1054A0003F7274966DC6EA06AC4ABA5AADD6ABCE18
+:1054B0007751737ADD201460BAF215B46B1C37E3B0
+:1054C0003D0BEA4343697186351124048AF962E988
+:1054D0002B5D2CFBD8AC3D6E99662D3723FD6B33CD
+:1054E000B16C7D60D209AD0E6071650670BF4A383F
+:1054F0007B26B53B6D30FCC89EE2B0A7D37BEC9019
+:10550000B64B98D40E4F26B994FA6F85E980DCB07B
+:10551000CF91F475D5711B4ED2644C6FFE2B2A27A8
+:1055200060BA999F7AE1D6DE6F7B2C900037A46336
+:10553000587F51427C984ECE1F9E4CA0B048892582
+:10554000025D5A702CD111CC719D80EEF9E550426C
+:10555000406BC8C1FCC6403CD6ABC1BC8A06063114
+:105560008577F9C05C3E6824FFFED05182119573A7
+:10557000C8ABF016F6043239527AE54C726BA13B97
+:10558000A134D0AF02A80695DDD22A8C7FABA33B15
+:105590000F20B68E1B61B7AF9538C5E67E7A1BF239
+:1055A0004FB855C727F930BA2DABE5A993AF3ED216
+:1055B000D3F9F1FC24C83E6CDA76A1E96CA0C39063
+:1055C000C2019C9848FE2CFDB74CBCF6B627C62DF0
+:1055D000FB043D501F0820701957F78A586A8DD771
+:1055E000F837390345794038177A300F68208BEF48
+:1055F0006C6C266FD91D32B95290F6F5F01F512F01
+:10560000A32057B014819294842F4FCA145E4FEC9C
+:10561000FCF3D361B58D7B8AFEAE2B9A06F48561CF
+:105620001041CED19C323651E252F26F7961B58A87
+:10563000817DB47E1C5889210AE1AA526AFD3EFF91
+:10564000CE9BB20CF2129B811380C358E1B608B313
+:10565000A65807E6736ECB1B1CA6BDF39AE968C774
+:10566000D3E3A91669E2309F8928A066D22A328244
+:105670005422582E76F4CC295898355F365503AB12
+:105680008CF086AB36FCB9302612F104F810C7094D
+:105690002DCE5E0D90491A0DFB081F920D14BF4EC2
+:1056A0009A6D00579D5EA56DC2E4CF42AA6AA46DB3
+:1056B0007C01C19C22E02CBC64F44AE78CA36B28DB
+:1056C0009EC5625550FAD7B8BDF27F890CC33BD452
+:1056D0000D8B85A6384957EE4FD379F22456EE51FB
+:1056E0009C5227DCBA04EDBF174788BF53C41E2F56
+:1056F0002A4B0F8762F20A6151486A0E007891B70F
+:10570000ED0FCE73C41EFE2BB29322CDAACAE23394
+:10571000A9C4B7E8552DD8274D52DEE574CF7118CE
+:105720006C4D847CD81CF51A10172546560A842C1B
+:105730003C4E01639E46ED49C794200DE7DC8E8107
+:10574000A145DB32717A73F23047F79492F3CE229F
+:10575000F7E5FA69C8BEA37A1B0B8BCF9A5DA4F359
+:105760006251CB4D6B9516B796B3E8317C6A2CE449
+:105770003F7A5DFEFC565A008858C1108A86A23CCA
+:105780002D4073FB1E1D799D2F3F630EA218AD2384
+:10579000933D6E4BFA8D149DA417017D19D823A853
+:1057A000C858B47C78380B55EEEEE03E66F0CF3644
+:1057B000206F40F2D4ACD6CD124DDD01612A4D5E92
+:1057C0003B578A9629332E7C479039453B578C06A8
+:1057D000C849BC272780EBDFC0ABF78C4FC9A7C7F0
+:1057E0003E93D6B8A72B285785EB1C2F858A259D7D
+:1057F000AC23ADCEA57D6CF99967D172D1CB4E7F2C
+:1058000017F685E55F84FA5ED47796586440E4C75E
+:1058100035CF8896E104AD018B34172873B628186C
+:105820005333481E8DAF1BFDD5164B183ACBB12D07
+:10583000251A0E47A4C7F623104784291EF6561AC8
+:105840004974D848DB7A5E5BAF08068EBC634F5E56
+:10585000985FF913B8D38CC47B950D57B5E40590C8
+:105860005C7F697E2E3727CFD9D28EDF69DC24FAA0
+:1058700004B32C1CB7B6B0BA65C7E3B8BC52543FEA
+:105880000EC80EB295C7518F9B5D309E3158D454CF
+:10589000D97BED1F76F2FB961D992A8B4961B0F3F7
+:1058A00032821106B3F10471825C387916520F030B
+:1058B000CC315ACA37705D0D5C4DC4EA5A6EB8B728
+:1058C00067F61EE98BEE6D07E026B5260D9175FA99
+:1058D00097DE54D38434DFA33B9AFCEF4C7320D67D
+:1058E000D957779422804344195DEC64C15857809E
+:1058F00059F62D834D6DC0BDA500F073040942A675
+:10590000D3D71BBDECE971862E56EBD29E6109EF11
+:105910004D7BBDD971449E6ABB23022034583FA6FB
+:105920009B6C2980E33C995405F3F52326B513AC11
+:10593000892933005A2A6BF1A841EC126209DAE195
+:1059400000D56F8161EC6736F272FA3923D59E6C0F
+:105950003BB5D9E9932E3AA6F612EB83B9FC2501A3
+:105960000CE1A36114D866C998B205180DFBFD7649
+:10597000B94DB5A3FF12064D4734AA458E8E548308
+:10598000A05CCD70D076BBE88077F90E7C9A57FC8E
+:10599000AB0C4D0CF9BB37EA7AEB6A669788E7CD1A
+:1059A00019418A3A3AEA2D14B77CE2490A3DEF2CB4
+:1059B0002A9E57C887DB5F8E042B39389178C159EE
+:1059C0006319F180DD6EE4A81CE2A2C71E431B161A
+:1059D000B2B7B4989CCD5F0FBF50EF25A46FE78599
+:1059E000E36F5F7F1A44986FD2AE680EA08AC0D072
+:1059F000B511B197A7D05E7FA4BC5A21FBA0EA33B2
+:105A000095C8B23530542BEDBB4281DB8806A8C85F
+:105A100025607CB43A95C08AD8D8FFB049101B06DF
+:105A2000D88B75898194D0074874B39D39565FA08F
+:105A3000073B8EE5FB4F4D3EB68CA11B49055F87AA
+:105A4000AE86C78E6CDB71AB46E747A7437D14BBC0
+:105A5000E39C32546DB56AF9A8AA0BCFCDC26AB7E0
+:105A600091AD9E94F5E057F16E4E8C64DA0818A360
+:105A7000C26C26DBD4268C7C50923A46859DC31B93
+:105A8000AB3AF78540019EDEA2C3636637540D6EC4
+:105A90009EAE282A5CD2E228CA6086A3D564BB7F6A
+:105AA00040B0DF011ECEF020C661E8E3D5A8CEFEEF
+:105AB00059B0145663C3D205FDF5090956310E16C7
+:105AC00085F6D76824842E42D5ACDA3E0C383129CD
+:105AD00091C4F0F57CAA5F9707C74A9556ED25A2B9
+:105AE0000133D778E8F12BEF5D32630E6A3903C3D7
+:105AF000E1A4B07FDC2CAAD4BBF2324005967674C8
+:105B000056A29C92FF3181841FB68631F51479D15B
+:105B100015A08D579E4EC8117D1DA9C8EE98460947
+:105B20000C921F7F4BF715F9FE39B67D9D96D4F484
+:105B3000788371CD8406AB044B93A1284D1FE51EDD
+:105B4000065978C4EFF7E1724E72FFF29C53CE987B
+:105B5000A9D1C80DACAB998F5D7BEA4B2A72A7988F
+:105B6000C661E43158BBC4F323066F038C0997C5A3
+:105B7000E840FE34AE94087B3DEC9EE8B6F253F864
+:105B8000F41DE2D7604E2E0574233349C18D9E2B40
+:105B90002AB157D70CF28C602595D28B62C9AB3BEA
+:105BA0003C1E8D33B7E382D91B5BA2032FAFD67E99
+:105BB00050F8B0980C2AFABC6DF323B515C236D054
+:105BC00063B44350B0E1A496BA44F53A89C6AE80B6
+:105BD00017A1D7917176F1AFF2646D32074036E7C5
+:105BE000E4BC02BA5A3FD70287561EC84DD593CDA2
+:105BF0009FFB51F95BE134444BE50863CC79300EEF
+:105C000075CC0051D8AC96E5D6CAD5218743F7E4C8
+:105C1000CAF8B68BB504ECF828377DA17A5CF46736
+:105C2000C5A9FCBF3AC57F6D5289A5178863BDAE73
+:105C30005F4E4826B950059A0771392A59606BC4DE
+:105C4000B5FF70EF723417CFCCB05A07F76775B74E
+:105C5000676864BB1F5DE96B2F8A8A72755B8EBAB9
+:105C60009D1AF232D587FA70D07B4F869BF5E74FAD
+:105C700095DDEF8F11F7FA269E3899E1B3F70821E9
+:105C800040EDCF74EDAB3EC55BBE5677EA925F3513
+:105C9000942F391E1299244AD0A0790E6AE3E14369
+:105CA000634DAABA23F4B1A3E9BB4D4B7331038909
+:105CB0003BE4D2D59B9C6B6372F3B71C4785854D43
+:105CC0002823AFD2A701BF91C799828D726736048E
+:105CD0006B36ED7FBC797278710B38EED11C9A5619
+:105CE0000F27E137141D3F9E948E6BAE502A6E3AFB
+:105CF000E93AA0798C50E31D791873EF5AFBCE84F2
+:105D00000A8A652FE92A53D49B51AEE49B8D387ED5
+:105D1000A72D949D2B72D49DD997C182078137BC42
+:105D2000F773EF9CC3DA668F9C13E33C56B1417066
+:105D30008E02521D043060731712A9933D19201A68
+:105D4000CEB9E4CAFB8F772DD8BAFD6E31F39F51DF
+:105D50005654002A20B16BF5E1AE2FF540DA7D7381
+:105D6000DA931B73C2437B1D137C000DDD0EB4BCA4
+:105D7000AD8C47F3723817562BE008CF74D24C091C
+:105D8000DC46036918A683390B73BED51EA304161F
+:105D900034189490E40FF2F5D80B9C460599C2CDC7
+:105DA0007F94A21562B95542AD3F39EEF74B3A47A1
+:105DB0001D4C99746E2197AC11D4C28E403C277152
+:105DC000C3DF401010C46ACF31DF7AD7334E35DCE1
+:105DD000887F2C7ED55EF29246623DD0E239F896FD
+:105DE000828723067AF3E39472D90DED9265BF534F
+:105DF000BB648CE1ABC728CF380E9C4B497E57FE65
+:105E000094833C82DC8DE3B18F748CAE3231C3E07D
+:105E10005ED04BFF704A49FCFA14DAB8BA86177E96
+:105E20001A38EC36F7F51DAEC447390E75179011C8
+:105E300087DCE48B76F311184B64AE8629C716977E
+:105E400068116C2D08B5D6DA972C4774BEAF3B6D40
+:105E50005175668818C7BFEACEEE06776C75167066
+:105E60003926EC035D5224A4ADCD3C62E477118F5A
+:105E70000F664798F9684A3B599DDD1A6B7A1701FE
+:105E8000A59B73568F447AC6A8A4EBCF64B6FB20BB
+:105E900069F721773BBA33595CF09BD3D8345FE97B
+:105EA000727080A9902DCF96200DC2A06919C337BA
+:105EB000C8C9E4985B9477488AE24235047413F2C7
+:105EC00042B338BDC2FAF676462CA026B7FAD04EB9
+:105ED000B2C1E2BC15B261E20DF3E59620A65DF712
+:105EE000EECC840A9EED973085A656DBAF628AB170
+:105EF0006FF95C6EB3AF68F8D3B2C6BDAC7CCB9221
+:105F0000F8C85DD883D9E8D47AAF05AE58C26EEA36
+:105F10006E2F737801F496922AD2E74AC038B3D430
+:105F200008E0DA86CF5D39D817D45C240D31FB1830
+:105F3000E4FC0B45B452E078F80C0BCB12F787BFAA
+:105F400039DD2A02C76FC83D62EA61AB5AE4C2106C
+:105F5000206023FE7EBCC9E6F8099F426C26EFF163
+:105F60003F275D53B522DE238ADE35B4F2214D652D
+:105F70008721B985F06E61B9ACDC54C89A14512FF1
+:105F80006019744BF8C5A236A6E3DD9BFA3BB99ABB
+:105F9000CBCF0C076943E19AC6C8DB4991E835DCF1
+:105FA00066F00A246508CA14C8AA7769320B7D31E5
+:105FB0006F265E827FFF823D72273FFA573EDE5A90
+:105FC000B10A46C188F1BF5559215708DB765C8676
+:105FD000A693E24FE86006915DEC7692C2C21E1B6A
+:105FE000628C8BC5DF8DFAB5D32C84779600895BE4
+:105FF000F4956A737A8FCE5D2391B7C68EA986A475
+:10600000EC15A18EE251B9D8B6C1CC07CF4ADCBAA3
+:106010001AFD2341C0475D1DB042DB09EA0FE6C906
+:1060200026BFF509E9A3304D7E938898E56B20FDE6
+:106030007229FF4F9FDA6E370B18CE4FEB6B3A3950
+:106040000DEDAF3D9305309B00A021444C80F94EEF
+:10605000DC84F8934CB6E7121C9E4CA97E4FC48397
+:10606000BCDA7343B646855F9B676AD540ACE1B640
+:10607000F8B3466B969DB14296271BA52C281EC7E8
+:1060800039E44BF91CDFA9F74BFBC681478BA34FC3
+:106090004D4A8F642AB936B9CC178AF1B7E4AF9A62
+:1060A000C06051FEC757F247B35DD0BC708C2D0E57
+:1060B000014FEDFAE4D7F2014C3EE3178D0C14C505
+:1060C0009533D99D67357EF06EFAC28796E3D0305E
+:1060D000609F9E424D6F0A76BC97859A681D7DCB66
+:1060E000D668DDA6860B51D5415777452B2A09C4C2
+:1060F00082188AF60A5EBC876EB9E838E8475AE823
+:10610000C868C8A400D60753EB200A6FC69209B22C
+:106110008E656FD1B238BDE07DF85E6859CE9D3591
+:106120007E119EC974ED0A435D95FE38A9D6766648
+:106130009AFEEAD5407C236F0FE0788246F6261F50
+:106140007F13879CF282DD9A3422CBBA1B30E68122
+:1061500005D21FBA4D79455DB5BB0B57E5CF003B66
+:106160008A138D2C8F2DD28A0E268A0B09B4A74450
+:10617000854D58F746A26C4C331F877E32D6AC57FC
+:10618000F9B65977AE533A3B7A49C8E4EF4F1482D7
+:106190009A77A52D7BB56B879567C54966136C0803
+:1061A00031C8F9179F6F2BF4CA258F2E25B1E496BD
+:1061B0001C83CA2D69C06E387A015E43CFE02B681C
+:1061C00087998B2D48F6EFEBADF6D20E96FF3A6726
+:1061D000874B7BF9491BE62836791074920A93C8DD
+:1061E0004A9C17B69D36A1D84A6598FCEA4B659B38
+:1061F0008F47A4D144EFA6A68A6454ADF3A1EE68FC
+:106200008227594AD67D21249EEA544F5E2F973C1F
+:10621000F7766079414D723930DE4A637AF1F32EB8
+:10622000403D770F4B28520C3808CEBD568CECE61B
+:10623000658B0FF86DD38619AD4BABEEF460DAF1D8
+:10624000A65F102AEE72A668CDEE399265DB2CD9D6
+:10625000272E50827D80717F1E272253ECE45456F6
+:106260001EE82794E9FC8D887C7103386195E096DF
+:106270004FDCB03A6146FEABE0C8D31EDC475FB7E7
+:106280009D85323B66E6416F542ABA95F01F06376A
+:10629000F2DBF5A19E7B9E4898DC4C26DA3635C2AF
+:1062A0000DF7C127422EA19C05476183143C77114D
+:1062B000A19B90EA8631D9590EA4F077EC1E0861B3
+:1062C0006E46FFD2E1217DF3D96CB03152152E9785
+:1062D0002761A92EA1496BC9C2E463CD1541A6402F
+:1062E0001BE815A0A8D78027F3F29510EDAB9BD53E
+:1062F000612EDE853A75E6E3949BEB7284EF946839
+:10630000723BF64F305042CD3A59A1FA9225A6A6DB
+:10631000398ACFB85A54FE65507EA8082092125987
+:10632000C4C5AAA894292FFACAF172824562130D36
+:106330000CA2642439E3D9E15E7D1E765A7E09DB26
+:10634000C32F90D39FD5B009CBA10BD605511570A3
+:10635000DD3DEC122F89539F88236C660AA3078DBD
+:10636000F7E473ECC13655D3A6142CC523471EDDC4
+:10637000CCD94659DAD91DED76C8FB489DD4263FC5
+:106380008D7C161618A1F2A2F50E26D88234261599
+:106390000B71675A1EE9D8F2C3E53F6AC44E27B6AF
+:1063A000BE1CB3169A2C1B7A1E735D96E6D0345E23
+:1063B00080467CD4ADED08A45D738C68C504BCEC4C
+:1063C000767D52083169386E7A470E995FEE5AD25F
+:1063D00092626040C750A97E5A0260736B33E2310B
+:1063E0006B3A4871CD0CADE9231D7B71938FC1CF02
+:1063F0003BE221D238F9EDECBBF88AC4050B173F1C
+:1064000050433A899427FBA9391A133166AA974F4A
+:10641000C01C75DE44DE744435EDE8B24D27070E2E
+:106420009F48076A160EB18319DD960DD18B17DCD4
+:10643000CA69266DD6186B67983E04CB49EEFC2BD3
+:106440006ACB1225864A236FAA8843F049F9F6429F
+:10645000C79B54BFB23B970EE40F171348592398BC
+:10646000747E5A57A71F554E3D4CB17BD82CB7C9E7
+:106470001ACC6EDEB9BE6365E4E9DB0711B8C30E62
+:106480004995BD81B29C298D9213BC814353C7AD00
+:10649000DE5CDB8FF79742CD897196254142D20FA2
+:1064A000AAC24879F42093B5AF5E59798B5C432337
+:1064B000225DCD878CCC44F7EA774845264552E6E5
+:1064C000CE036931B355521F56F2E63B528D042973
+:1064D0005101E93D9B299DEE0C2CD759960E5CD9B4
+:1064E0005DE94476B1FD779CF78E3E9D8A6B13BAC9
+:1064F000EDB41DB721854BB26E2C0A67D26B74BE0A
+:10650000CD2594F7E45881364310CBF699B38F59D3
+:10651000B15BC046D23CBD8C45A42D8F451753F9C5
+:1065200031F0E7FA687D398AFF38703BE143978C98
+:106530005A441DCBE5A53D1501908969D2B2A760EB
+:1065400047F88EA271C29CC082EA886AE24FFA8A3A
+:1065500014E5B155F9858FA66051DBACD2F3E1FDAE
+:10656000A69AB86F7D39475279BAA141182A1F5EA1
+:10657000FB33E1D1580693D8DD808A9E58C3FF953E
+:10658000545FDAE76530338395B5240D9A2E1112E6
+:10659000B4EEF8DBFFBE9ECDEB0CC4C9A6AF8BD129
+:1065A000C8AA3FD901A04399103656DD2CDD5FA85B
+:1065B00072D4709C4D3DE6C7BED2932872D8F3C901
+:1065C000F9D3709CAB494935EDD6E8B7DD92E1DBF4
+:1065D0002530502D9C72B4C2D156C8AB8A5F3304AB
+:1065E00021027AFFFCE74DFF364CC7F062D942F03A
+:1065F0003A382FB364C25D7064C48CBCBE88039605
+:106600007FC47B736BCCB648C18777C425A0C358C1
+:10661000C53CD133D138DD125485D4EE9B0A08CE67
+:106620007D1DF7912B0CB083026F6AD43C4F19D2B9
+:10663000D2694E1DF11C2911A2F953B1280CCCF0DE
+:10664000CCECB9E691E48246DB710EAD72B9D1CBE8
+:10665000BF88A30881714DFAA2B40C8B9BA728D0E8
+:106660004188FA60B4AC8CB73BEA4F3298289CEE74
+:106670009C94C4C1B9E22DBD595D0D360D53D4545F
+:106680006DD8BA5DFD69A535982BFFBD5297195499
+:10669000B90AE089E218CE4A7918886C7E288FE220
+:1066A00007FB209BBEE18A5A03435FCD67D321B32A
+:1066B0009FA04306FE0B343C372C31307DDAF51BAE
+:1066C00046F8A63DF2A2A57E909276E1254313FB03
+:1066D000A3673B36778846C73EAAFA260A785E72D9
+:1066E0000759C3FF0544D47D4F935673EE65F2C539
+:1066F0007D1AB063C4AEEF69DAA7D21173B8F47132
+:10670000D5A0AE73C02D632A3892F6B1BF15BE284E
+:10671000ED5BD66B0F44F6CEED759338179B477A39
+:1067200080ED83878044E9EA954B9F478E1645BFED
+:10673000E5537017746B67592FAAEAC53231847616
+:1067400035C36677F52EBA0126C088BFEFF5EBCBCF
+:10675000CD30591580254D4F5B647D8A92FCB3077F
+:106760007C91ED455A687F22506A4397F1EF2B18D0
+:10677000402446272B18551B699F9411697D0DE015
+:10678000E5943069174CCACC16F42244AA6F52BE65
+:106790000503B619A49164E09CAF8EBCC6BBD83982
+:1067A0001188A5B2E6E6CF21AE63A890438051B828
+:1067B00057F74ADEE7D011E9D51597C0620090A4DB
+:1067C000005C2849874619F29A1439D10FFC6EE310
+:1067D000B1A9658C828A797E6C40A25C6FD925E66E
+:1067E000FD89408815D5B974C01051599B6C9BF632
+:1067F000B00CEC0A183DB07B4BB63D8E71FC585581
+:1068000044B4256B88126FF31B10D153B1B00F4DF8
+:10681000BDDDFDE5D6D9A05EB185815631B29D0EB4
+:10682000CEC42860F449625750B64E28B0227A5D33
+:106830008A32BE4E7D93DB9ADDD3FCFD57201115C5
+:10684000BCEF0807F16F6A0064A421C8BDC7CA295C
+:106850008492CABECBD506722061AED4C257430D16
+:10686000F9CAC5FB9312C8C42AFF3DF703A9847F68
+:10687000EF9E05E12F72B4B7EC14A5370673B2751D
+:106880004F5041EF23FCE1FD08FA505849F494F8C9
+:10689000C5DAE3652D0464669C5D7F62B629799B49
+:1068A00057A34115712D5AB183D45A5C51091DB8B3
+:1068B00056C2B98E01D5702F2C5D611809E67DF89E
+:1068C0002502FE9F15008293B6E2A10F13FF183731
+:1068D0006CF6B456DFA06D9C02B680674486629861
+:1068E000986C2D544C58539F665B4801A532892102
+:1068F0003B106813F8716C0169608C56E0F8EB0B83
+:10690000058F80CF60AEED6634EE8DC537D9E8CB0C
+:10691000DED9958C052A4403D0CD81213EA3A5FA6A
+:1069200021EA2E07BD69E555EBCC0905AA50F241D5
+:10693000BAFA54DA9AA9CBB241E50E116D8E01076D
+:10694000D5B22A1CB12D1DF5B9A82C25173AE7930D
+:10695000C569D87287238829760AC2B3309A36B9B6
+:10696000205E240609FAC191CD849732CD6A5C7607
+:106970009C4CAD64AFDD377F7168BADD21C900037F
+:106980008C1AEE6B0AEAAFE5C2B4C516764D6FCF2E
+:106990003ABAAD269C6E98E1BF4F1F9AEA8196E7FE
+:1069A00049D935C2C8F324C94CE482D9096DC580E0
+:1069B000EA2B12FE2A96A68693344F7292D08B6BE6
+:1069C0000E59E93ABF0FE4A776ACF227E46CC83C55
+:1069D00029E120336F9D75B906FB8DA3A9300D0DFC
+:1069E0002D24258356BD30B2F46AD263564D857985
+:1069F000C92666EEB08D7C5AF13ADE7D20309DAF1F
+:106A0000763C7D30D2667A9DB48F8296FDE8B4865E
+:106A100046DAE4B1F312155C8B6F938DFF64AD1C05
+:106A200076095005B273E762F8BABF007DB7C3DDDF
+:106A3000D481B8B447DE3A87EFA3891EF31C3D43E7
+:106A40003E9E81CD3A9180AEA1562C0C81B0E1D70B
+:106A500039428A02AAC94574EFCE1CE2635C809871
+:106A60006D03C51C12981F28EF64D51AA52CAEC261
+:106A7000CA666FD28CB8CDBFC1AB871CEA1AC59A63
+:106A800027354D01E6A3C3E3F3465B08D480216DAF
+:106A90009DC849E80E6DB4F27397141D5D3ED65142
+:106AA0003AAA8891F0611AAE19F3D8C90E7619F88E
+:106AB000A884A2BE538CA1EF9AE03986BBB5BBBABD
+:106AC000FE02CC7F99E4D6782E3C0DA2F1362A5EE8
+:106AD0009548349A6F0085F1DC45AE49479D745C5A
+:106AE000131E6F78293282C7067DA6E7B92F962D2F
+:106AF0008E2074A60C1BD356C8C0AEC7D8A490670E
+:106B00008FB918342162284B7A4D016011B7490DB5
+:106B10002C6A077EDA986C4A897D29C562B97FA8FC
+:106B2000DE55A19A3827F17457A963F55E07E3A0F3
+:106B30005086526E9703BD99C9666830F6988CF6F8
+:106B4000B183DDF38AC88C998E15E817FB71DCC020
+:106B50005EA2146DC41288E924A567FCE564740C78
+:106B6000911BEFC6668B4D8B74CCB4E0121D64A7ED
+:106B700086368A7F7FCDC5F197CC1CA6B2470F7CA5
+:106B800044FE3FC7B5810C179FB292D4F70928A4E1
+:106B9000E3453EBFA57CAD39FCD50A7557A15C0A1B
+:106BA0001E460321C3B09848D6AC242EEA59B1FE44
+:106BB000579483E91ED5B77F93D685CCC3F5C66AB3
+:106BC000ADF3646699F41933A014C10DC230A2600C
+:106BD0006DBEE0249B32BBF8139FE22F6CF9855405
+:106BE000232CF91D682164B0CF57857857AC051860
+:106BF000DFB1C490C99E6E6718BA36BA5DCF29FD61
+:106C0000028B80009119D3F6AF221C459D31884735
+:106C10008F552904720383E2E36A17700D5C252403
+:106C200003281E35B8ED386B8DE003D30ACCE2871C
+:106C3000491AEA404DC0D68A0DCB3BCDA472E60975
+:106C4000A552BCA0CD4D242599B40286AC40964FE8
+:106C5000825912E5C3F75E6273B2705A3B60301519
+:106C60007B144E52D5C042529133F67E8C68D0C60A
+:106C70007482991A21147F07FD8E2C6F75CA70B328
+:106C8000068CEA6EF7B658250010E18BD04CF2FC6A
+:106C90005931D089786022FCD2D869ACBFEB894BDE
+:106CA00059CCBE2E6D535629CB8DB08DD1A316ED88
+:106CB000369A0FCE650226F7F89D298927EFDF184F
+:106CC000A6B9045CA5D048A5FF379C94BB4A86634F
+:106CD000FD7217E1F6C9DF139C9A9ABF22CC3E578A
+:106CE000ACB9DD95F232E501C0EDBA9D1DE4C06F8F
+:106CF0003984627F38BEBBE4709681040C7F29061C
+:106D00009848223DB8A8B0EABBE64C1F066B541069
+:106D100082548E778137BA918F9200F58B82384EEC
+:106D20004FE8D95496F9C727E7DF175FE9FA22B78A
+:106D300045D1D1D5C32B650CFC040EE9923A29F557
+:106D400034C7944FA2E732B74D02F7E06D0E044B03
+:106D5000167970E7522ABBAB5F9A98D79F0397B218
+:106D6000E81B81FB4FAF6E32F18E1A65D174BB8781
+:106D7000833B49BA7E1AC86BD6BFF68B29AFEFCBDF
+:106D8000AF7761C9165724CFB30152483D9B8D940C
+:106D9000C88E066193F646136829737F0F4C958061
+:106DA00072EE8B121F7DE1BB1635B2266B47E8A64B
+:106DB0009D1AE45A85C25DFD95BF1F8996FC723508
+:106DC0002B3F529381AF5676CD33B3B211B3C98105
+:106DD0006FB7F4476255B430655DBB5DE345D3F8EA
+:106DE000086184ED7968F8084503AFBC9C60E681D2
+:106DF0007AA93480AF74F6838267D0BE46960DDDE3
+:106E0000099A8A00251BB66CE9B22B38633A546A9A
+:106E10002791D8D9A057082C0ABD13409B17ABEF78
+:106E20006053D8E662E831D579E3350447DE860958
+:106E300033097903BE4C3FE24FB56946BD1184EB7F
+:106E4000A0CD604998B80DAFF167714D56B2DB43E4
+:106E5000CC8A1713D1BAD1A920EC129D06E73C4D7C
+:106E60001043D442B4FC5AD213668E657FC00957D2
+:106E700087548B24CDFB1665E974607DD014AEC5B4
+:106E8000D377752B8D2D40F8B6215CDF9955FF7FA8
+:106E900020F0850ACC96E94E4BB3AB52B3FFFE3CD3
+:106EA0003D6F8108FD14A1F1375BF1D2017809BA79
+:106EB0002B3354D57B1C0667C3421D94FE115C9690
+:106EC00043FF063CE33AAF18CFD09F8C6BD67210CD
+:106ED000256C423877F08981D8E33E8FD698A85B3D
+:106EE000D09A9F469CBAF31CE5E0D38BCD11E318F2
+:106EF0005F0D08C2C4214918285C4B9B3009C7B7F5
+:106F0000488658967DB75CE0AB50ACA2869CED57A6
+:106F1000F1A67298CF191D0A1358A9F027E9894ADA
+:106F2000C2562098EB3418733900F3A990234B090B
+:106F300097798306474756DA076298AF435D274F34
+:106F4000DC74D31F2E76B6EB84D961C71D03480EBF
+:106F5000CCE71C90D53119060054FB8B25BA9EA9AD
+:106F60000213E59FB193F31ADEB345D7CC4A15CA95
+:106F700024F6BCD3BC903A99C975E5B75DC580824B
+:106F80000F6CA5DB935362CC5615AB92081E537E53
+:106F900048D94C82719AF95BB61D544D4DF847D4CF
+:106FA000FF0064F4E722DDA491907AE9122FFBF947
+:106FB000693DEE2A3F97151809C0BC35437655AE9A
+:106FC000A2F365F39CE636F2E5BB1B64883BDC2349
+:106FD000E13916A4DF91F95D7621880216F4A34009
+:106FE00062F29ED6D2AC7372D1A92E6114C1045F35
+:106FF000B18D4A366BEDDFADC9D289B884490D59E0
+:10700000CDE90A2DAE70F8AB5B335C644194C19757
+:107010002A3C40E850FE88E15B8DE7EB5DFAEE2507
+:107020005A6468867D15D111F757E976486CD021EE
+:1070300004F872AFDB7463C7CFEFF1363334F6D99F
+:1070400099F316909C694FF5EC0A23292F8D1B2D7F
+:10705000F7DA3F40C19DFCD3756974F8862A654D07
+:10706000AA693D7B90FD9BCEA9FCFF6DA22A74FB13
+:10707000CBA969337B370BF6C5EBE2C1AF07E86DEF
+:10708000BDC19ED162266EB5AFE95EDA66A49BE90A
+:10709000084D2B4BDC74A22E8F54F268219AC6F750
+:1070A000617E196A634895F7E9348BE0E7832E40E7
+:1070B0009534911ECB32564A3EECC0A3FC46E10704
+:1070C0002F464DFE3421A1BC9E8A9ACB25938C90ED
+:1070D000E8598E0A89DF0C5804E46159131376913C
+:1070E000757D124E58C8CC44DEAE0A658B324F71A6
+:1070F0001B2DA6A5E24DD4F480AD09C6279C4750B0
+:10710000BF9382F25D1B3A09DD584A58195888C16D
+:10711000D66FF1E53F67391FD722D6125546DA6C94
+:107120003BEAA6F9D984BDCABD98D97408FE1E628F
+:107130000C7644CB7638545A00D7A3EA1810F59F42
+:10714000D43A5E73577149971D98709C2955B25A6D
+:10715000C0003C8F2E96F488710A5BAACE8A39470C
+:10716000C8BD65E1EFA2B58530608683DD80A83EAD
+:1071700026DF27B7E5A8F534D6CAFDCC52955314BF
+:107180004EAB1A2B50E6093FDD8DD5A44D6817ADE7
+:10719000D8A827C6417BC7296B512848805DD48970
+:1071A000F1F21F7ABEF371DBAF38CBE834C0E8AE42
+:1071B000FF7567C6E660A2C4E8E75795DF168AC880
+:1071C0004A80788AB62BBB5A5ABEBB3BB0D8A85768
+:1071D00033D7CC3D9F96DA8C2B178D2D272C250C81
+:1071E0006DB4F8D9B30CE09DEDCBDE8498A21A3FC4
+:1071F00055C8AA928553553D578C50651077289FE6
+:1072000091FC18F02429BB60F2D5C524CE2C3FDBBD
+:107210000C493692D75248309EE79CFF0E8AD5B271
+:1072200018362D1DC315854A8F884A05EF6A849D3F
+:10723000291028CBA28F9BAD6AC014F0EF691DA660
+:107240004860F8E97FC38DFAC16A36DBADE4C8084F
+:107250009676FCEBD8E87FE7D0A251153595B7516B
+:10726000FECFE975DFE25781F2D5B0ABDD953B3952
+:107270005F42AE235C7261A1D55403347339CF836E
+:10728000B0592FDF23A849F3650CA8D2C746614245
+:1072900019BD7A20796C684C764B573D1F109031A0
+:1072A00031B8F8789DADF8FA05290E094E45DAFA9D
+:1072B000D621E05C124C62AA977ADD2A445339A1A8
+:1072C000062427AA5F73430A55A9E3D2067DF2F983
+:1072D000F4955D711514D44D6B52CFFD1989C7E13A
+:1072E000B26E9FD2D93FE119CAEB7C05569374B0B8
+:1072F000A6246A204BB990F117136479DFD75DC6D5
+:10730000FA9F254941505387819CA3059366348F8A
+:10731000AE9D4B3BCFEFC1B4D32F6CBA6060962EBD
+:1073200086B67BCDAD12638C97AB3A35BCBC3B5C6B
+:107330006B869B002BEFCEA76EAB87783879E1BBCD
+:1073400007891BDF77F9F9F3AFAE09BB39152915AA
+:10735000909B4DE8079C0566EE9F407B4C6BBB8481
+:107360002BA708A06010A1923C682F7FB7B8B0414E
+:10737000359093496BF49781B592FC1B46BAFAD9C4
+:1073800034C969B4577A5CB446B8F8D3DF9B89AA8C
+:10739000B2BFAF4C94E11290F584BD25C124110F0A
+:1073A0004D23EA96FBE8764E5EECB507DD273A5DA5
+:1073B000DE6B9719AF59F7AFEA83382350A5445ACB
+:1073C000B02E047EFD22894678A0EAA320E6DA6288
+:1073D0009CCB89EA42C840E3BA8C4C70FA7D5B14BE
+:1073E000DDC163B072B1A1ABA10C3835777BBB5462
+:1073F000D5A38D5FF4373FCDE58D1CB6C438680F3B
+:10740000E6116D13B207841C68D523DF0E1F2552C9
+:107410001355C7270E79D7A15CC9056CD9BC5D2966
+:10742000052FEDA1DC85B2712F5EEBA59826FE3A03
+:10743000B2ABCC5FDC83A686FD9F2DCDA502E8AC68
+:10744000A76223B9CD85E5C47F2E70ECCB96E04BC7
+:10745000E194CC12555D44B17AD71FEEFBE08EFF6C
+:1074600033FB93DD209E8B505BAD4B29B91E44113D
+:107470008D0FBBCB83001131B22EE44555DDF403F3
+:10748000F9C8F1E63E31860D4DE2B0914E44F83038
+:10749000BB5E61B4D0F910006FB59B7A72F7F9A0AA
+:1074A000DE970BC555B8DC911568C3A23024781B54
+:1074B0002C8CFC6ABA3930BFF606545AF34C4A7326
+:1074C000075D7CD7CF3551CC3100B859A37337AAAB
+:1074D0007B89FA75D4889862C55C313DB7E95ECF87
+:1074E0004A07243390D30B4B9B63A7491D8A34ABC7
+:1074F00063BA3CF31DB895DBDD9F0534452CF0E500
+:10750000A20878F13B89B3653EF2047698BCBF4D82
+:10751000C692ACA8BB08F0CA8BF949E65A47BA4EE6
+:10752000ED0E33A1699C98829530D367506F403837
+:10753000D3F3D945E48C7AF89B2C217DDF945E99B6
+:107540003634C630B765E22E0921B9E361CAE63E9A
+:10755000C0B031B3A7E437BA6FF188AF0D6D99377A
+:107560003A8448DC2B44FD78240B04629F9374BE5C
+:10757000EAC085A143BD6914FD1D8BA28336098A2B
+:10758000486F7A5C0C54089658898B0039D2C7B47E
+:107590007887CCE1ADACD68D0D7851C0C8DD2A28F6
+:1075A000F0286FA0AD6F8F90A8C13FD73B8CEE3F06
+:1075B00099BC1F796F188C2A8E69214ECA38F8DF62
+:1075C0008AB510E0BE9B3B007EBB8EEDD296156B5C
+:1075D0004190FDA28EAC33850D89BB41ECACFA0124
+:1075E000F5A6A6BBA6CAEE65E24EE32E139A097E67
+:1075F0006817B57FBAB08E2A2A2FAF3708AF444C30
+:1076000016D5F234D197F14402FE6F2CD9F4F4CDA3
+:107610001B472514122DE1BA22B36B04C7E41E7375
+:1076200045E17E8DB5822FE65BD2985FC22B53D7A2
+:107630008B18D54D58ADEC9455EE580999A417D632
+:10764000A5ADAB43130D052C1C1B6C0892FA2887C3
+:10765000FDD5C92C0421442AAAB5C438D2547B9440
+:10766000E2C99B7F1CD1150CF4F5102356171E4759
+:10767000E8AB2CDA73AD250AE209DC4F3E857BCD01
+:10768000B7B3F24F2B7CDE3118A217AE9C0A1A4812
+:1076900023139E158FD2913B8E462A259180E613A7
+:1076A0004705B4C70B16A37F41C4F3EE033DBF2AC1
+:1076B0002B34CFCF014E0278A3D926E634ED37C65E
+:1076C0006A811292B44E9B0A04F8C44C643A81C495
+:1076D00041F08C3E7D3089CCFD597F00A227DB8AAA
+:1076E000C4D550445E8BA3876FB55F01D0D2C4561A
+:1076F0001FCAE386636874DF4E4146FCC589BEA09D
+:10770000494C37F65176809FD14765C09077AC6A77
+:10771000FD43EFCE94A41D4AF11FAE0A13881C0B43
+:10772000467B3015252D48BABE4DF7D9E639DCF831
+:107730003CD6B7C2082A160004D450A074A8357DE0
+:10774000303BA55919C6ACD6AC077B57EAFA37D5FA
+:10775000E19BB08A3776C0BD98738BCA8A67E4A86C
+:107760008B4B4AB2FC737384F872D79ACA46C9B578
+:1077700065B09C43F86419AF2A3A7531C95E32B6D8
+:10778000B11BE6695D2A76AC6078BC6E73EF8B2323
+:1077900069681AE9A7E0D4914E86221A1CF2249B4C
+:1077A000E76278CCC15E3BD44002C6CD2CE975DAE5
+:1077B000C4EE401C039695F3DF9B34705C30086D7B
+:1077C000DD8477708F3637D86C961714F2ADED4E96
+:1077D000C7A09F15783C46F101022147DC845FFF7A
+:1077E000D6379E87C0D91372EA8D896E78F4FEBCB5
+:1077F0008DC1C549DC9835C620567927BA9983D9F9
+:107800003A74A7B52A7AC1293118FBCE6BD7A538AF
+:1078100073D0D3FAA235365759650A7318885FDEDC
+:1078200073741F495A92F9C6E8D8584BD4E982AF0D
+:10783000B8DDB116C96CABDC477F72C9C89AAD041C
+:107840001BF8FB1365720354FDECE39B704FC0AC57
+:10785000EE91311062D02744770FCDF970D1C4F387
+:107860009D1FA4E8D7D787A0A81A84A24B71D5EC96
+:1078700048781BF12738A9DF534AC14F79BC90469D
+:107880009FF3853D88B554BDD39064E8AD3F7CE05F
+:1078900009AB2592B17EADAB89DB0F32CA71DC102A
+:1078A000F916E16F4053378578C0DF8022AE91E74B
+:1078B0005598B718467DCA3A2D5736195C2AC651D5
+:1078C0007C0E06F0074A4DF2781C9A4F11D1A4485D
+:1078D000D77ED28EE33376F51E6203FB2CF2580777
+:1078E00059F443718D62C5E4B20C79E9C4158DFE7B
+:1078F000126D88055C76D44B944F80C7EB6AA29FCB
+:107900006E222724D21C0E9ECEB91BD6920409D912
+:10791000D67B43D156C86CA6AF70878F3AF82A7DC4
+:1079200006904C5906609E550CFD5A727DCE59C981
+:1079300000DBA23D145DA250E646C1358F57ECFF37
+:107940005375E419637CD38C22EC56507126E1A167
+:10795000126F27CFDB7C563BAB9BD74432958567B4
+:10796000DEB0C16C93D30A50DBCC19F7F791A44A6F
+:10797000AD2083333D75E0745CB56075285DD2AC95
+:107980007D1A3FABDE58381896BBBF0F15BC420BB3
+:10799000305DAB45C25AB98CD19B6B958D84D47246
+:1079A00048575F6D03B0D7CCC12A88F13423357FA7
+:1079B000EF3F8908A56A5D9DEB47900CAFAEB91CFF
+:1079C0002B428027F1EFCD35C154F979370184ADD1
+:1079D0005DEA2691E1C3F14C974F748AF93C2BFA8A
+:1079E000C9DBCB1A4399609E2E85A3DD752A1375DA
+:1079F000A21DC6F954A72611F7F4AFD365E91F13EA
+:107A00006F9D7EF5682BE79A11887A2CF9E3043490
+:107A10004B2634A0F4ECE0793634F5197C62DF466D
+:107A20000FF05750CDB12FDE0061D3B4871BDA962B
+:107A3000342E55E8019F442CD9A06F1F6010D7DF6A
+:107A4000A6B6B73AA71136E7BFB7F87B8357DB3046
+:107A500037A9ED8E058BDF2112CC6227D3F281A9E5
+:107A6000D72B619D3F0BDFBAC5549F1451E932E417
+:107A70006FD362160C7ECBEADD8F30159484CD5126
+:107A800055120991999151D0FA5B74805E2C492767
+:107A900044D4B8C1045137DB8D096A220C859A544D
+:107AA0005194C3E2F6890D7FA93F27738C23BE80D2
+:107AB0002D0C22125DF3051AFACB2B598B73F94763
+:107AC000A915372E0EEC696726F0EF8C874C55AA66
+:107AD0008FA4DE38823C6233C2A293787CCF67EFFA
+:107AE0005B07F6CD5AE0CF0F459CB65F1B3EE0A882
+:107AF000F21B1853D6D6B11379F30D9CC87580C309
+:107B0000F786C8CCE015B27C8F7AF302D57EB162DD
+:107B1000CCBECF141359018D723EBAAB9122AA6428
+:107B2000ABE9461D54E4A7D9D8E44CF03F87BE0D1D
+:107B3000343AF39D514ADF89310C90D31A7128A849
+:107B4000C84EFE8BAB27A7ACFFAFA081430D05C687
+:107B5000902147F3BCCAFCC984988D9CCC9E6B4E87
+:107B600079C60009F11934DA44CACB63387D618CD7
+:107B700054BC5C0A552241177DF26CD51A9AF5B9AE
+:107B8000A64E9D5AC26CD9BE33AB18905073644553
+:107B9000002A6FFF7D0130A647C94C3F41869123E3
+:107BA000834CD0CBF92E25550A62D7B4DC460D9410
+:107BB0005978BBD7FDBEA63A14998A4A9662B9D7BE
+:107BC00004A2CF5F2A510A7BEDCD301C7B9BA22201
+:107BD000E954BEB84E290FD4D7A5D509FF3862C9DC
+:107BE0009FBC9E726A732E2C31E3141E42E1D12E8B
+:107BF000840915C740E39040BFC115FBD630068D00
+:107C000014D9A93C6FD54A9142AAE2072D4FF62A12
+:107C1000FD47050FD9775E781606F7C604E587920B
+:107C2000DA7A5D1EB51112C92176F81050A01969D3
+:107C3000007EC2E8CF87FAA24006AEC26A5781C171
+:107C4000DC9A2313FD72E3B30BC69977D826D2EDE5
+:107C5000A19CD03EBFD78AB4D2B07776D0DB213892
+:107C6000BEBA94E384D7D56B1708BE4B9762FC92DB
+:107C700084081280BFA44D1FCF7D82DD6BE83D15C7
+:107C8000679676BE9D807E57DFA36CCCFBCFB6BFD8
+:107C9000EBE472700E6AA6AA4F7D626D63740FEDFD
+:107CA0005C0537E76E88C5B77B79E7A3447D7BF831
+:107CB0008648241DB422E3C4C3FFE61EE6C5BEFC0D
+:107CC000EE846C74657235FE132F1ECA3F7C31D46E
+:107CD00070903774ED6B9BF4527B7122502A453FB4
+:107CE000CFBFEA09E75DB4268B23FA27824C16C47E
+:107CF0007135BFD190874E64FFD5C3F1E40AF423F8
+:107D00001228553A675F5B6287C2D45CD6D74F12A0
+:107D1000FC6090F2A19B08EFA035602F289175427E
+:107D2000257D8A7CB352D390A24444D661C5F98E96
+:107D3000ED3CD1E1C2D538F1F6F69A6A6F3434FDE4
+:107D40005F51ACB45B534361AFCA8CDB80AB24534F
+:107D500084B263D69935BDBBBFC1DC456B93F7DAFE
+:107D60008293E659367E55F2F9B58043654B823AE7
+:107D7000106738188774BBA38779537A8BB3B6869C
+:107D80001E6E9EB9FE5246B2E708899F1099C981BE
+:107D9000F80E7FDD21F74DD3D86D2CA9408244BC6D
+:107DA0008C44D4D1EA6A36E570CF33F3D3F65C8ADB
+:107DB00061C1A2CE85A4B616A6491A329A78DB1FF5
+:107DC000E87876F9C8C672FED08654F4DFD9D1318E
+:107DD000549F6630EC4E3FB1AD11B84F9B69D5A0B2
+:107DE0001B591402B644B64C978B0B4CDCF6CD589D
+:107DF000B68931656E804A09A5231B35E3E3D03E81
+:107E00006EBADA1AD024FD966ACDAA8F3AB4DC99FC
+:107E100060F838F3A660499C7DB536575CDB0E846C
+:107E20006A805933AC45C7446E953635238CC98A70
+:107E3000A9C7497CC5E4E3EAA0E09F6C9124A05463
+:107E400014EB2EA122F7A1DF5C40883CF92E6F5D78
+:107E5000D0082120E30CB9A2933123B9BE11E96AFD
+:107E60005E549CF1CE2F68564B760B42F27CBC3EA2
+:107E7000282BD5F2803AF8E78579D529A992D573D0
+:107E8000141EFAB8C50B2B4B1E1A4CB6FDA40C11D0
+:107E9000D3A0083CD5C7A9C6C757ACDB4198DE1BA9
+:107EA00074D03946521FCE4FE444B2FCD27E549275
+:107EB000767CBE4CE932FED762162EF6C2D38E2FE8
+:107EC00075BE79C31533BBE79B626B8BB8954C4588
+:107ED00053AEF79DEAB795B09243863339B52FCAB2
+:107EE00025774BB803ED71AF6EE5ECA8415E2882B3
+:107EF0003DB59B2F1CFBBF70A412CF1EA80591EFB0
+:107F00001A0204831508DD52937316C7AD8D6CB742
+:107F10003848203F7F6F031BB1A8ECFCAB8F71C8C2
+:107F20006AACD83D7D9CA31CB8728030EAC76988D2
+:107F30007478FA96A4E2F9CC0158EF36C2B29347AE
+:107F40009F18B1CAB5592E77ED69B649FFE268EBC3
+:107F5000CCBF8C60CEC1AE8B721A84157EEBBD098E
+:107F600012D14A285E23192BAB7B904332F815516E
+:107F70001B4E8E6D8710E7DF288E59CDDEC407D3E8
+:107F8000E0FFCC33515E1C41C25A5917B1E88C8DC9
+:107F9000202AC7A901E1DD6983A38CFAE30ECD4352
+:107FA000CACF4177CA1018AB1E4E9C209B1B829BE8
+:107FB000767367976A605E26927DCA2CE22B4B0926
+:107FC0005E7A1246909D4E92AC1089B78B4B69EB4E
+:107FD000AF590F23A796414739FB191B5D2B936FB0
+:107FE0000F2F3CCE96106D8F16A6234920CD45C18C
+:107FF0009D8EF1FDA262747E182F2522B000DFA1B4
+:10800000B2A54E9AED33F522D529FF17EEF7111DD3
+:10801000C49F32526AE41267F5F2CBB50CE6C62F64
+:10802000E851F43FAD804B8771440DF85CF457760E
+:108030004C7D45AB4289432E75A704C3195B51CED5
+:10804000A4CA2A108FFEA71A9A5A3B5CB57DDE6936
+:1080500014B67C93AAC72B827223533EB7F251E821
+:10806000BA9B053B70AB1CD3393E7D94CE805D5DE1
+:108070000359720D468BEF356129CE253D2046D13F
+:10808000F5FA5E0C0EBCE7F80FD75C121B91E9EC19
+:10809000990FEFE46085320D8FD2243CD53F89568D
+:1080A000B0680B23FA01EED656600A2AC17EB407E7
+:1080B000F14C0F59ABAEC2B2DBF96EDD1A53DB32B5
+:1080C000F2906456B501119FCABFBAC5F718FAB647
+:1080D0009273DC2E9E988442EC9FFEEF165B7F0726
+:1080E00054664B0FB1947E443FCC46815EB8DD713F
+:1080F0003B34F0B403FA172D932DC5F6FE1A8F64A6
+:10810000376C449438956A93478956259D602C3581
+:10811000156C950389A725F824D1C5B618A0074189
+:10812000121C7D028F6D731E2AACDCF7AB16BEC22B
+:10813000614106C8F6659B886A3392D4FCC674C256
+:10814000B2379429DA4C9713184C562EA969DFE4FC
+:108150009D141FD0CDBAC1AEF9DB0CA5E9B587D10E
+:1081600096E84D48DF92B10C3C79288455E2A86E20
+:10817000C7AC3AFF1A79FC026A829BAC894A6C69E7
+:10818000C678CC9EF0987D3579141EF92BABC4B01F
+:10819000BB42757AD859D973733C63BFC76A9F4293
+:1081A0005E1B349A1CB85557BDE829A33E5565E2BD
+:1081B00059E28173AC0F2C99E1CA5E19931DBC542E
+:1081C000755F9F1DB3B4EF6C5D71DA0B853FC6819F
+:1081D000EEAF8C8D7311958B185A36D5D7C804180D
+:1081E000D2B4BF7AF3B53554565DB7E17ED083265D
+:1081F0002C9D7AD3C005CA98B74C10FC0D0C814D4C
+:108200009B41099DD28E1442DF81BC9EC7BCC9BA76
+:10821000E8BE1525BA32CCE295450854E872120042
+:1082200063DD37E4CF6032AA9168E7A395DA1229BB
+:10823000322E53CD06C023FA15B33B3E71D14567AC
+:10824000685C62D64E725E36DC32E9B71FC1BAD9BD
+:10825000E522B4CCE6A00FB20111E93E1B81F23158
+:108260007810D4BAD2C0577E448B070B14638703AF
+:10827000BC299A8AB7CEE77A1019FCEFA6A44B6CFA
+:108280005B17F228619BB7868D7F39F519EF6A98E5
+:10829000846D5710D2AB1A15853DF47ACD5841E85C
+:1082A000E2CB292AB6480BFA976F4260309E5D6890
+:1082B0001E39B96EB4829AC400223EDD574093A89D
+:1082C0005A0CC307E3E995BC6FF50A86C37498EBB3
+:1082D000C904823E42D980FBE589B9734988C32E1F
+:1082E000F78E6B2A805A5D9BB99CB5D9B81E7E5615
+:1082F000A17DF09D7FD38E0ADF433B1FA53CB5AB2C
+:1083000066B01AA3234C4FD906D335D62FF82825AB
+:1083100007F7893A091511581DD7EF36E74A102D8E
+:108320003216318B78FAAA01F6B28C81EE6AF154DA
+:10833000A215C8DF8222E4B245695495ED4B2A1597
+:1083400009F8B182DE41074B5075B9D2FB12BCE986
+:10835000611E696EC61B5FAA4F7A4C5255B98DD308
+:10836000DE9B965EAB4F3F7761D87A4F7C04D2B4E8
+:10837000EA1547DB6F3EB6A4B05F0B0F3F93155570
+:108380006814AA9216C9A3E34C3A1CC2B778DB71F1
+:1083900065C7671A896691B534D45ECB08825231BD
+:1083A00095D9BC5862962637CB6089298D17DB9802
+:1083B0006B66B1268A4907D84CC3B89BCC16074ECA
+:1083C0008D32002FEB6C733B2890B668493755C14E
+:1083D000DC3450BF261AAFCE8F3B7AE18F220BB030
+:1083E000206164998D1FBAE75F77DA5085E9286FBD
+:1083F000CE8099586B446AA1066A5EA9473BDA5A57
+:10840000181746DC1A6DF59BE667D6C17D25DC0A98
+:108410008CDEEFE045AD9D23CB352C526655C00E6A
+:108420003061C7F0E03DD54536D4D2DD5A79BA1572
+:108430005D03E6C7B4AABAF93C0488276D2001435E
+:10844000407F7823F3504219A5E68B2CAAE9A48833
+:10845000A31585FCE61DA1A1DE41F4AFAD99673EF1
+:10846000346A87FE10D66997157700D48350333865
+:10847000F7FA316ED5243071C02EC5A5B1B2715E48
+:1084800012941D10466A1FDB7C9B442111E29C3232
+:1084900074215AA506B312206EAFA545FEDDE7E5AF
+:1084A00091D39D12F30A81720972BD8EAE08D35525
+:1084B000F3CD5F35FF4B0987D3F69A041D929837A9
+:1084C000EE7A3CEF985409424B69E5E782B8F2AD89
+:1084D00044F61816B1BC0F00156E759BB093DE26DE
+:1084E0001F25407AA216BB5F5412B6373DE67A5379
+:1084F0006069A65CC93C9FA1A73BA36C27FDCB1676
+:108500003BA0612807C733960A3B0E8671DEA21A8C
+:10851000EE36DAF7E01DD2885A5DDABD56F0E04B50
+:1085200034493EC3404BE5FD697A4796DF84885E57
+:1085300071858D92C21F24D6E954B10106FAD35633
+:10854000134CD47A6C959F33549F6106DEDB4E8AC0
+:1085500083034B4B3D03FFB65B5481BFEC575A413D
+:1085600018FFC8A37414E5D3CA1A3BB9EF1F1E8DB8
+:108570004497FEA4F9D97DC02BAA4223EB83B20E07
+:1085800017DAA4606474DDC20CF1528855A56A0F35
+:10859000E71C136AD6D99F781D22447AE7AEDA3BEE
+:1085A00062CFA4F6139CA26EB0990DB25236EF9C26
+:1085B000FFEB78EA7997863E949BF6C8C8A6897641
+:1085C000CC4FD96D8F0798BE3D3748814372ACE4DC
+:1085D000594A2456EEED0B2B3AFA058FBE6BD1D0DB
+:1085E000A14A187C080C863B37D6A1EBC0F7F8925D
+:1085F000AC8BB0B21FDD838B6C88C5A0AA91EAE278
+:10860000911B9B024180D980CAFC7E1E5A15A89AF4
+:10861000B171025B97F310053B9ADB38DEE67325F8
+:10862000F07051C11F98CAC5CEC5935F0B58DF5F6C
+:10863000A9CE0E5749E933BEF52967D868DBEFAC00
+:10864000F93D51C72C16666D60AEB676A7D59BC7AF
+:10865000548B2551F07E6728B247BB02E8BFC75B49
+:10866000E50120A145C9185E011CF26E9F3D92AC48
+:10867000A99B350C6CC3236D2EF717E3A4D75C3A86
+:10868000FED715A5A2479B2B5FE5DFF38E7EE1D9D0
+:1086900097F39F1D637934504FDC27D2DF4E3F9F05
+:1086A000E45F8A587A483F2464316C1BBA3EBFA706
+:1086B000688A14861DC302F0A74AF5CF44C7266B0B
+:1086C0006045ECD565A95BB8DE495AB59B33115EB0
+:1086D000D55F90E735945DF6573D13E5C0C75B8ED7
+:1086E000182ECB47DD404C93FFF21285476EB887BA
+:1086F0002E14984DC7BFB685D53832F473577CF029
+:108700000E421A6149086F41C1599A44C55F8117E9
+:1087100034E7F46520E96744BDDEE5FD150CA226CB
+:10872000D5DBC817E6D15164F3067C9A571175E57D
+:108730006BA3ACB4D915BB7F7A0A04D6E18180461D
+:10874000D11A206DD7AFCE8E50A6EC806126B77DB2
+:1087500001AA1CB56E9C777B9B9D03A39F1AF9779A
+:108760008A1DD35254B31B7E150342F39FDB373768
+:108770008FF86B4909230E34241552FE1654F9273D
+:1087800024086572B0AB28370B1BDE54E3C1C84523
+:1087900029AE8B9CACB8E5765A46651B69B2309B16
+:1087A00092394AB15EE2DE8A4238E07F4369B9110C
+:1087B000026491CD09C90ABC130374F9081F01872B
+:1087C000267B3410F339CD5BFE0FF91095C958ACF8
+:1087D000C57FC2772D78FF7E8175BE49B22289D1CF
+:1087E0009863625F2156BBB5939A24AE3664C0612C
+:1087F000E57AEE09C384A40F91263B5B610F67A95C
+:10880000B702151D492AD86D66547E33DDB8F36270
+:108810005A1C3BFAF5022B5C4C89D4DAFDFA34572A
+:108820004B7677AF72C23F95881F280D56EB6B0BC6
+:10883000C45496B7158307C7D8B778FD81401B038A
+:10884000C6C9F57486C7D19D369C976CA671475FE3
+:108850001BE33F97AB5211ACEFA7FF3DBDB20B4FEF
+:108860001C969F389E08DE3920BC58A625F9FB4986
+:1088700066EBF1C0E922B56998B2B4FD5237C1E3A5
+:1088800044F42DFA967F96A2EA1C5BE190E95BEB3B
+:10889000A750C6803497CE91C6AD0432515551D3FE
+:1088A0001CEC77CAFD004AA64B8EFCD83349FBC6A8
+:1088B00060911837CA4D85BE1C3E606E0D8501194A
+:1088C000128637A3DEAC0D72B8DA6356BBF2A33C56
+:1088D000464A246120F9D80B5B20B5B3B7E43611C2
+:1088E0005B33FB2848386EA873CAE5C7F5AD2E0088
+:1088F000D49076229BE1F589E1390233D2D3F2CCD0
+:1089000097928056E890FA7D428E86A7C8A7E80A1B
+:108910009462B804A899652228CDF5335BEF293D10
+:10892000C38885A069B191EC42A685AC9F93EA6E9D
+:1089300042B55CF830AA26730CE1CB7B0C7F57D88C
+:1089400060B2901E2034A2B73B80A4CDE20179270B
+:108950007120BE88585696B5CDB44DDB9FD44FE7F5
+:10896000733E5F81194B6CB4A80058433D22849F2D
+:10897000044809FB0FEBA502B1AC3767A7E705BABE
+:10898000DD53E939E1C9120B680EF63ECA6B6D6E14
+:108990001EB67653B4384C9C17605690057BACBC21
+:1089A0008C773A96776E74C3C2F814EECDC67D58B4
+:1089B000F88EDB43D924A008BA787F9CD0FC61FEF6
+:1089C000A2C453BDE9561AF904FBA95D8B3D8C1D69
+:1089D000AB2C4BC3204D28DDB18970BE76C595B355
+:1089E0004EF0C8F853EE854FC3530171A17523664D
+:1089F000CD9CA72FCDB5CA102A935CE2B67E8977AD
+:108A0000444B9C16B4C81BE6A092E6C502666CB740
+:108A100003F528DBC758E1318097F9C96A1FDA18D6
+:108A200025177A9174E4B6729BFD3A1028019502DD
+:108A300054A27FAAC163C5C3784A9D8EC529DFAF02
+:108A4000568D88CB4A7A92E5BF5DF5BEC3D906380C
+:108A5000BF71F35AA4ED6BE2576F115567D912F34A
+:108A6000D744E81B300A45B787C36CF7F96AB3549B
+:108A7000AFDF0F29FC6A725B505CBAB6F9DB308657
+:108A8000A43E439B5BCC5D55BBFD4BF9412EE441BD
+:108A90007D8A489E3271C5C0A405658FC060089D5F
+:108AA00006010248BD9DF710C41B4837023CF16D1A
+:108AB0009FC1A875DF70DEF9E33BD8CF17C2C3F7BB
+:108AC0003C7DABA29D918A33CB97CC025A8D1D83FE
+:108AD000776780505D2CD61A4F453BB5F0ADB96D28
+:108AE000AF2B6A32A45D71D3D26BEC3F54A2FF79F5
+:108AF000172F4055BE69C1CDF0F3C198B11E147F48
+:108B0000CB8C534D17B8290E74CAD567F01610A335
+:108B100072C55E667D44113745F9ED1BE35CDB6B86
+:108B2000418E81A0DEADFAD0913F1C46ADADD55847
+:108B3000E0CC106BB612C0571F578400A05D8CD4D8
+:108B400098F486C2C1453DE583DB93A5BD82CD2562
+:108B500008CBE70D9E8056E9C9323AD90AEBB551E8
+:108B60005AED319AA0C89AEC2B8E397253D9CD4068
+:108B70004C7C02EB46C2B3778B392E24578B6E9711
+:108B8000E75279D21AA1C9CED81547EDAB77026466
+:108B9000F7DDB13D551A065005C99164F1F6024062
+:108BA00018260AF512081F1D4BEE9540B2DF813FD3
+:108BB0002870CD306445B0FEDDA5F60B4030145F63
+:108BC000E735070EE7F65C346E377BA74672735FB6
+:108BD000D6C8B74ECA21FBEEFA3AD00CAFE47B1CE4
+:108BE00042EDA0AE79804EED444E308DE3C022E1DF
+:108BF00081A0EF6A7059336E4A45C3420F55A17A7E
+:108C00004D3D376ACF1CFC821108C6414389C070B4
+:108C10008A14EEE02E33E8463AB6729829C8AF6B54
+:108C2000C2405A5FDD612D99E7B1809275D95BA88A
+:108C30004C4FBB8B7609D7BCDFDD704B3D2D834C91
+:108C4000D8E6A9904CA60122A500C46A4318ABA798
+:108C5000AC89E289E89DCF1CB9F5809E2808C5E360
+:108C60009A9649D58518C5B4BBF68F43165C2C5728
+:108C70003BD2EC9DC854C5C68CA587BB7446C35374
+:108C80006370D3AE902C698FBFD1E5DDDC1D79BB5D
+:108C900051B45C631DF3EC836EB71D82DF4E4B391C
+:108CA0005B330A732E42F8CC476EE8F7EFA036012B
+:108CB000C9267B74713D4D3AA40D82CCB39F94CCF0
+:108CC0003FD0255A9F8EC31A94C91E8BEF3341DAC9
+:108CD000F262DFA7EB4DB65B4EF4E8B7C0C4156295
+:108CE000C8C07C7A8530B3825B2DDB3D398B62B3A3
+:108CF0005D034D4B715641FB1F9F037961A104FC3D
+:108D00004542B32D582B61A7AFD3BEC0E23B2FAD78
+:108D10000505EAC31576BC29D5A78185272EA14E66
+:108D2000EB5BE5F8F49648587E5F67E4FD7154B15B
+:108D300000C445A6CFE95458E39EC83578AF70907B
+:108D4000A3046BDD6EE513858817C1947D4E75878E
+:108D5000C4A5896FCED071A1443A79A154ACD78211
+:108D600041C1DAE7BF763856201B47C28646EA3D46
+:108D7000408C418FE91F8D589B13601987CC313986
+:108D8000DD3E0791604DEC98794285D2A0342DE705
+:108D9000B9261B0000B412171157FBB4BD8CA63DB9
+:108DA0002EA16CE44050602CF4C56D9B299833567D
+:108DB0003AD9A115F8F39FF64697C6F9E2492BDD9B
+:108DC000CBF303378C46F041ACD80AC206A6C0CD1F
+:108DD00018B35A9C006C8D71602C09258C4CBC75A5
+:108DE000916E305B422BE22A88B3006AB6D1246CC4
+:108DF000217061011DD30C14798170CB02DA2340FC
+:108E0000EF758889553526D886B7D7F595067E91B2
+:108E1000E8DE0D46DB3567469A1283C7B469AA08B7
+:108E2000BC9EF6A8CC09DEF22F391321913952C32A
+:108E3000C25A5B4B3E6EAAFD6C4A9B25641FDD84C3
+:108E4000A039EC65A061C07183BA3F8BC6BD0E34FA
+:108E5000058964CC73C70E763BAB14529A662D3AE3
+:108E60006ABC8CA8E33E83C7AE06B1BB081D78BBC5
+:108E7000AF3219EB1D7041F588C4FB0D438C864A57
+:108E80005C7B81173AEAC848D808CF2CEE29061D2A
+:108E90007CCC7110A37861C8DC2F654CA303E895E6
+:108EA0008AD5E8F220A2B39281B1F058758A327760
+:108EB000DD4BF8CD8446118D3FFD692DABBEE898A2
+:108EC000E056B2C9530D251AA47BA73092C1C846FB
+:108ED0006410CE84B52D59991B414D037A2C53A2B1
+:108EE000304028ED7E25FF531F79E1D7E64792CC2D
+:108EF00097C6FF73EBF22B198AC542AA7710BD1AE9
+:108F000026190BCD8058FBC93D845FB28F7FE6C325
+:108F1000E1AA16591EE6B3A61DC43DF393224A6189
+:108F2000688175FBA3BDABD66D44E90219774E137A
+:108F3000CAC3FE5AA84BD155F29C543DF6FD690FA9
+:108F40005BBDC9240610BC50D4B2E1388776BA8F15
+:108F500010E9393DE3054A9CE3D3BD53700DE03F72
+:108F60009B129AC07042F46F758CB318FDC3FD223A
+:108F700004452696DBF034420622B9D5DF4B269C09
+:108F800079FDE20CBDF28202DA95C395C8777EBE08
+:108F90001ECA8170A59AAF2E6EA32CE65215E2F080
+:108FA000B95C1DA3276919D824B912A5DE2F5DE588
+:108FB000FFD9388B9059167EECFF82B3E81AE797F9
+:108FC000BBFBBF2F5A665AD077B184CF4E32A31560
+:108FD0009F5C7D48CC907A7B91414D47D102E7B2AE
+:108FE00068B092C512DD1456DAFE9402217CCD2BB6
+:108FF000364E4598C0818A548638BD54D0026D1CC7
+:10900000F78203FC04D6D2F6CD11A24D7C11006F7D
+:10901000E1DBC7337F241FE18C8B42E2C1EA4BFCCA
+:10902000C1A742F3EC87216ED9A3DF1606193EE2F1
+:10903000B91F46B62E1CD3329DFA8BB2DDBF22DAA1
+:10904000BBBC337349192D2D2C9C0DE114A2A167D3
+:10905000DE547AD2D2CB726D1F23249F0D4B224156
+:109060009F146339880386C3A418171AF46A87BE4D
+:10907000C425023D5BC71784CF58E088E5721F9B6B
+:10908000CEC00269020FAE2CC081504049D3A0501F
+:109090008D1B607E453B9C09CF23702DA4F926765D
+:1090A0009E0B5FECA4BC2F81647A6B8A13EE1CFBD1
+:1090B000756B75FC1E9A042E35A63B4CEBB28E9D4B
+:1090C000EF2B321A4FECF413738F3E2ACE5831B97E
+:1090D0009534F39CD48E62BD68A87B2518772066F2
+:1090E0001CC787D206AEBF3F9A94C9E03CEED57F3D
+:1090F0009E794535F07D254CDC3F60697307B02DC6
+:10910000EA51EF2592789094CA5554381598F93D54
+:1091100018F9CBF44D079B6412053AD5F728923322
+:10912000F1B7732AE2F42F91BFC17567CA336F3567
+:109130005B5DCF2C0D8DB3FECB146BB59BAB82CAA0
+:1091400027DA15AD183F22048B51D1E3B3CB1C981D
+:1091500093594929A25E0E7098A2E8A56EE6FF0910
+:10916000A18F52A0878DBEE2B840AD78E42C882F45
+:109170009184129821682F1D69A1A9DABF2EE88376
+:10918000C869665CB99F9B4DF8F43EF944742C0E97
+:109190000474D62E2C90C8CF0EE11F9193559AD10E
+:1091A000627B986D0776CEDB4A1F1524B5A48A280A
+:1091B0003FAEE6B286B0C4DB915F0E26C2167A449B
+:1091C000DF9820DB87B4F2AAD2C553BC1D6CCBE379
+:1091D00097EFF9A0002C0AF91621F580E15258EE1C
+:1091E000DDD6C83F41383560F7CAAFEF0EC6213D26
+:1091F000B06C4E6751C54C30F4BD64551AA2F403EF
+:109200008D77BE4423FA441424D774E9702DD9D144
+:109210001CCF5EC8108F33A0B58CD91B8AA59010C7
+:10922000F59704EABD4C786934BE7B48411F9E1C0B
+:10923000048581C1679B1FB7BB67E211D90DDEA30F
+:10924000D75DA6192EF1058B6D0E1C88BC29D1485F
+:109250006F437D654FCFE50E2230389C72F7335156
+:10926000EC6769364C04AE559DF2AEC0D903CE080A
+:1092700062D457FF43A0EA002B998B454B35AF2DA5
+:10928000CEBA5C132510DEF5B1045BCB16F0EBDF34
+:1092900008EA83BBD2FFA9F60E3DB9ABCA42CFE7BD
+:1092A000FEFF7C57537530465E84FB115086F4A94F
+:1092B0005622667F45C8A8FE22F040ED1586816BD8
+:1092C000AFECB286E4EF9EFF1EE74E2BF80173145D
+:1092D0003953D87BFB196FCBC0A4E1885DAB3D232C
+:1092E00081374FECCF98163A105081749801D231E3
+:1092F000771A9FCBA490B6C49F752A741D84185CFE
+:10930000D092CA5F1F161A11F6493688049FFFE8EB
+:10931000071A1C689E806BC3363B7CE152273DE7F1
+:10932000343AE9F09D0BB014BB9DD7720C35ED5C5F
+:1093300058DE9864FD1AA70D62D9883A42AA834F75
+:10934000F277AA6F48F3B63F979CA4746115E6F3D1
+:10935000E35CE11F1752AC80102390210FB6773DDC
+:109360009162B36119481FEE27419854F785A7A968
+:109370007666B27BE5E1BF0C339A9F5820D6093957
+:10938000DC0F929615FD0D264AD2FFA9C90FD858B9
+:109390009FDF3F4F7A3011F7210141BE8A9B5F0763
+:1093A000424A054E06F38B7CF48320021B4070CBAF
+:1093B000756699413BE7133F9E4399CF7D6F87CAFE
+:1093C000B92CEA8050A7EF749F040E5329553C7BBB
+:1093D000C676C097385135665CC022277DAB7DBB11
+:1093E000A102D77AC09627786581EFDE55888E3046
+:1093F0007637649DDF3002249B1BFB23B9A5D6E1A1
+:109400009B30D57A72AC1CBA584AB2A57F16AA33E3
+:1094100075FA279D7D6A8C289263853224419CCD04
+:109420009543742A2AE973FF2674947D46DE541608
+:10943000B2E279603267E8A00A5E434B805F9879B8
+:10944000B49BF7E68ADEECAAC4E592A7B5FD7EC21E
+:109450002733B15374138B4CAD65E1A66F58CCAB79
+:10946000420167B1DD1843DDBFFA0DA8B93CB80170
+:10947000375FE170976FC50F6F03234373E7811A5E
+:10948000EFD5B91622D14C6A8BC0B87C617670A337
+:10949000250CBB19612C8E13730CBF231039D4809B
+:1094A000A03482E85F9529BA7EF19C003741EDA097
+:1094B00037070218D05B661C8167E8D22ECEF61BF8
+:1094C000035626B71DD329AF029ADCA821FCE0BBC6
+:1094D000C3D28D7B1718DE38926ED325773A89F781
+:1094E00018DDBCA8EA0048E0F99FE204CC30799D81
+:1094F000E8571059B782E2CA43497CF66725894983
+:10950000B5032171F37DAEA69ECDD51DFDD3207C84
+:10951000C54E43C7156F816AC4207630B3DC8A0418
+:10952000C7FDD6FF6B692DA4CEC615874FB857ABC4
+:109530009E5E7606B3A7CF0FC650090D65E1DB9F8F
+:10954000E4D1B1C7BB3D3EBE834468418E635B5AE4
+:1095500050AB1ED7E66DCDF6696E65E90460946781
+:1095600099B31EBB180A0D1C1FBF9AD9040DAC2C51
+:10957000F6C8FF7E06FBDA912AF94C0A49F57F8E80
+:10958000FBE354FE9CB7BEA14B22178E6E3C6A9E35
+:10959000019C0F93E029AD48D06D0527C92D01240A
+:1095A000CD5D9E7418025DD59523219C0E63BF96F8
+:1095B000E500C7A9AFD77B9CE9F45E7055127B1517
+:1095C000CE6AFCF3033E2E845DD0C1132A1545629A
+:1095D000FA95AC2E801E8A57C34ACD0A311A84F9F7
+:1095E000DCE40C14922FC63FD4A1C44FB210539E9A
+:1095F0000D28E3D8AA6E4891357D9F1E1006F852BB
+:1096000034F79B367BADA2A1EBFB1B1D9E9B72D05A
+:10961000F7EECF19B05B2C03F82E0971CE0525703B
+:10962000F14FA39FC8D5BD066F2CE31EEDF717853C
+:109630007C84650CD58BE38677D19E9BCBC1F18F63
+:10964000AFFF1BFE4CC9E9732B30381E05B3A84C85
+:10965000BD61B020B5EFF8EAFA3965D00408E6CE6E
+:1096600063FB9552B7B75BD75EAEF0C0F52070E7ED
+:10967000AA0087093B2AC5B1C633B5D864A45B3BB1
+:109680002A8782842F84ECD8E11440119557D51095
+:10969000BAB396248A6F8F5FB6DFF25FFC238B79B3
+:1096A00060A7E97BF266E9AF0F028B3A5B6A04F3CD
+:1096B00032739131DA8249A584AA6F3EAABD018F27
+:1096C000F7C1EC4561CB00AF88F07D96842B2C016F
+:1096D00056EB0C1945358F95480FFC7010B2086198
+:1096E00017E6D0D8D987A041D1D3E7C3232CD6E33E
+:1096F00009DF3A760BC0CB8DDF5B1FE9A2188A3FEA
+:1097000006391E05C72ACEFDBB19882C6249F4EB29
+:10971000D0DE98E47F59D345A222EDFC12717E98E9
+:10972000D28FA6C22A040A8150F39CB3B2D8BC7768
+:10973000C71C73EFCFA661EECD725228213E90C3B5
+:10974000D0E45B56FC060452AE281928C4B6110CAE
+:109750009FABB7116E05455797A581ABC0FFA542DA
+:10976000E80AF6EB89999112A30AF21B0F38BC4460
+:10977000B7EF0D1155DA142DB6F9967B8D763C7541
+:109780002EFD55261488D1E6E6AC932872071A629E
+:109790005D1EC64E6174BD4F3A1FD5AEF80A3DB38B
+:1097A00064FE480FF076BE6B4952DC6BB27DFA0B5B
+:1097B00078FA40F34B64F2899E20E043F742D536B5
+:1097C0004CE9EDE259B7303B4C7B642C5F876F2F3F
+:1097D000E80A4A4E08809FC1AFFEBCD2CA2A9E7FCB
+:1097E0008912CA636264CDE2C71C39687074370499
+:1097F000B004A30C45A53CFEF711F067B47620B485
+:10980000A1823A40E6C4E1AB2C544EABFF0124DB0D
+:10981000CC236446D64D71EFB783A725FA164C8347
+:10982000EEC42AB995956130A124B5E7EF9E3A7E42
+:10983000DFE5400A992A123E1DA3AD25F3488B01AE
+:109840005AE8101F7A3EDAB8746BB0149E971CA6C3
+:10985000A01512438BB55B96F6ACC7689D69FBD328
+:1098600054184DF18C6C8E1CC44F3D9D98F3AC0B7D
+:10987000FB6326F04B1225DC2D5FC9072B9E5BCCCA
+:10988000565DE613A720E46D8373E598469A75DF6D
+:10989000F584092D3AA3B7BA2E96C85DD36E7BD254
+:1098A000B42D254CFE6F0C210B27D65BF6D0516AE8
+:1098B0007AFE27622FD33874665D102E0A6E7C7E86
+:1098C000C6859A9EBC380A0A2C02E68633F1652CBE
+:1098D00086B27237DED740F79F097AADB1B228D988
+:1098E000490603B2A126A711FC185FEDBB7E3D74AB
+:1098F000B1C9106DD2A7058528E365076604708895
+:109900002DA7AE2443F41DCE19CF6E91C9689FB721
+:109910000B580735BD1DEB59607AA0DAC24B4B2EB0
+:10992000DE9B6B390ACB86CB4BF5B26AA6CBECA596
+:109930006C18E0D54190287E1E5B0996AB7873E8E1
+:10994000D981C7393E13083E34A47CD12D7E2668C8
+:10995000DEDCB2E6CACF52DE51339C7EED326C8C37
+:10996000CA37366B6C7C9689335F00F72BA6256E61
+:1099700066B20CBBF6DD52812F011A7F41820FD4F3
+:109980009C28651690C1A46853EF9BD4A20638A109
+:109990007A7E2505974B11161AE1965A8379F2972C
+:1099A0002FAE31DE4536CE34A1BBA6119BD309972D
+:1099B0005143F890F99E8F951ED640EF40253F57B2
+:1099C000AE1004F63B02FD3EB996ABDC50012279A5
+:1099D000175247E8984785869358451C348730AA24
+:1099E000FA204AB9719D58723D5986CA762E3D9B20
+:1099F000FAE331F7DA8E9F7361FAFF02C94480FB04
+:109A0000CD278E1B4EFAA2FCF010266E6BFA83DA7D
+:109A1000101F59614EC5D7D32322F0FBB189C2F282
+:109A2000EEF056859F89C4FB889434AEFC8FDB46EC
+:109A3000DADF48DC24C6513AB08C9FA14760CD22C2
+:109A4000A2721E660D0C0DF274D28D1F887FCEA8F7
+:109A5000F18667A73FAA6CD791F0218731797FCE35
+:109A60000FDCFB2F21E5872BFFD673DE99AB5CD390
+:109A700056178446E712239301B7A3E9642DA986FC
+:109A80002FC1DBB872FAEAA9515095BC4A2C0F6677
+:109A9000D96E090A61901FE55DADEA9D2E7AA5BFDA
+:109AA00065D788D408594E95A94149ED85F4D581EB
+:109AB000D7CCA25F695FFD608FF8C6E0FC8E73E7CC
+:109AC0003F0E2D9EB0A65ABEE833088BB2EB5CF277
+:109AD00039C1C836351EF09CE23B00814DE332AF00
+:109AE000AD064C638380E29496C317432E1B49EC6A
+:109AF00026AA3FA70FC7DA0824EE893871290C5827
+:109B0000DF07761AD97AE69F4B96F22BFF93E4B5DE
+:109B1000B37708B9178F2F1CF769C4C3A6CCB0431D
+:109B2000C61241DC1E78F7455C5FB5D6C2FF2FD068
+:109B3000CB6495881B5E3CD46BB3CF322713E28095
+:109B40001C5CC9338FF42E5F28F132F1AB862CB048
+:109B500085F4DEA2B9CAB095C4213B90AB417B50DD
+:109B60002AA2416F6C437A24A0C11C3B5C4DAB6CB4
+:109B7000A49D50AB9AE1CCF32850CC59A93F87174C
+:109B8000E5FB4B6433AD0B431C8E28A2C5B6B4BCB9
+:109B9000A623C052AA07791AF6B3901BCC9B857EE8
+:109BA0000634BACD8A0FAAA9336248DC04221732E0
+:109BB000D7D1A123F1694950F41FAD6F06D661B129
+:109BC0004897AC82D188972F5818B5635EA3623747
+:109BD0006AFC5D4C9A4B171E72D09683800095BA32
+:109BE000ABA6E75CC751841C51ECBB79E56A66897A
+:109BF00058CF36816C7184B7923F5652B4123223DB
+:109C0000EF12883BA721D51E3E9A67F6EAA4C5FC51
+:109C10005370CEF0B020BE8620F209377F7BB3951B
+:109C200027AC4CB017960AE0057A89E3BBCD4049D2
+:109C3000788EA57C115F05048061E60F5770089748
+:109C4000D75A5A648B696A44307B15933DC969F1D0
+:109C5000B948576642A7EF3405655A13418DBB6B6F
+:109C600054FF40C1583F3234C97F1243A516AA930E
+:109C70002506C354F11304BD0B5621DA575A745EFE
+:109C8000923C4322C1FA22D7F30C95F6AA6CCB4D35
+:109C9000F40FC5D0D7EE720E3EB23698A7A5C451C8
+:109CA000D16D1B818981B6117C5AAD6845003DF6A6
+:109CB00029AF635842726F496BC85538B187850523
+:109CC00073852F402A7BDC88E5EB39601F8A479C2F
+:109CD000CD4914C0A3CFBD7A9514EE92424859598C
+:109CE000343F5647B1FC0FB4A8F57B3EAB45365C1C
+:109CF000A441FE5D51691B04D3E5C56FE7A7C80DFC
+:109D0000F355A54B2AD72C5F572DFABED0FF21EA79
+:109D1000CB7E6C32302870E9A8E1F0059722C73F6E
+:109D20008A34383D6A6EB077785E8CCE399041EBDC
+:109D3000C77A73FAFE2E8A78B81BC9C948A9410AA6
+:109D40003FB99FCC2716FA407EFF8E41BDDED65C20
+:109D5000DD425AB5AB6F7249713A8FB3396E317CBF
+:109D60004557A0ED4E84EBD1A4EFE43704BB74C794
+:109D7000505B5DBC9EC8A9AFB1A29799B2B44742EF
+:109D8000C768394CF90B6390045E031F7BA5838F72
+:109D9000F5AA1143D59441FA13F785B7F03D7ABD82
+:109DA00015F2B9769F0B6622AA48DBBB5303625BB0
+:109DB0001D5C32F71435D5050F4DF072BEA2AA799D
+:109DC00054B443CC6B81E3ED40AE4A762E1AF36770
+:109DD000FED51735740F1BF138629E10361B84D4E4
+:109DE000C3E9A76938B21F39E421E7B6B6FFF70027
+:109DF00044CD63243DD2BEF1E2C143C0D7862AD010
+:109E00006C13B4559D5F7C56BB5C69FE16B588B07B
+:109E10008E9275865C61518E3E94517E46D16E4F16
+:109E200069C511126A314B2939B6D7C2E133AA1C70
+:109E30005B746B1BB0BBE9F7A6FCD91B5C7672B5F3
+:109E4000AEE4BF7E5C090DB2D511A066096DD5D414
+:109E50001BA343C1EF8BA1E05662C11300DA3A485D
+:109E600083C350BDB5B30B8DAE31ABA5153198EAA8
+:109E700047612A8E68C0C44A1CD9CD2187F2D31EFF
+:109E800015E5D5AACD8A6EC59213171FDEDE5B7A63
+:109E90001B9EBD6753291068DC5EAC6505BADDC644
+:109EA0002FB2FA685444FFE6AE36A7B96BFBA46242
+:109EB000670C3C8BD2DC92822CC719F7DFBD5C1F8C
+:109EC000FB67C36500A69168041129ECAF3185AA30
+:109ED0000B214A576B50FBFDB8F23C9739BD45FA50
+:109EE00071B6A8DEF9182863DEEC0A25A8DB5D74DC
+:109EF00069E4867684DC4277299A37D0EBDBC82D7B
+:109F00009AA07F0738E50994B50A170B7DD72DD5A0
+:109F100010D9EB6E2EB0AA4D613DD99EC9AE4F1F30
+:109F2000770981CAE6125014D8CF2B9B3E1E6CB025
+:109F3000965F8135012E8CAAB20B76DCEC222010C4
+:109F4000D8482BEE8E9A77BEB0578B019EF55559A7
+:109F5000B27F53AE324A24821119807E55990E1772
+:109F6000E7A4135E73E48517B591428D0117CE2ADD
+:109F700022FFAD5D689F4B6913C86230B2E3E37B9B
+:109F800008B624080492A593AB8308645E5DB8BD4F
+:109F90000E5FEB2F25FD173808CD34049AE145E21A
+:109FA000CE5DA9F1C24D8A5FC8E1C4E175999CE01C
+:109FB000BCA11FCC2DDD5A9A507339435B41502709
+:109FC0009EABDDA3C3045EEEF927D5865290CFBCCD
+:109FD000D314FF5B11F43E1114BDACD9CD2903128B
+:109FE000A20D469A2932C23A0231EDC1C306DFCE34
+:109FF00044B1A840AF5BFBF22990F5D01F3C4FCA9B
+:10A00000E77EA7269CC1E8B2F54697F1065D07E01A
+:10A01000F2ABE2232008C9267F12279FB110A6A029
+:10A0200074CDB96F5D2962CDEF6CEE7F41067EF590
+:10A03000E2BEDBAAB773A459A0EA48B140BE8AB217
+:10A0400085CAA49FBC2AA3E0111378ADBA6E7C4CDC
+:10A05000663A91B033D7F922B3FC5E2C3EB3BFBA57
+:10A0600096C8FD68BE2235C7AE5B70809176E65813
+:10A07000549570EA997735542098B37F4B992239DB
+:10A080001FE09CE6017075699C3213D0EF3725798B
+:10A09000583A274A830AE82FC904D332D67876B7CC
+:10A0A0005D287E50644B6BC8A9DF4DE4D5A22436F1
+:10A0B000090D3E9A0CAB0B2D03C00DCF9F6A55675F
+:10A0C00040CC0A0D4606763A29C2D386856879883F
+:10A0D0000A35388BEDC9321B47D4D509BD9C31FBFD
+:10A0E000CC87A9DF9BB983374F0E8B8A9769905B2A
+:10A0F000D02316B8A652B2A75E4DF670B44D6407D1
+:10A10000E9B43EDD7CC30788CBC7147BCB9DB2CDC1
+:10A110001DA338D6E959F3A19A6571FF35CDF8171B
+:10A120004A52CD684F4F5D94957552DB4DA5B7CC23
+:10A13000E1D833A20AE31E316A8562414F9EC80E00
+:10A1400078E6936AE6C0346B5CBF1818E256F90BE8
+:10A15000987F957EC9F248DA27EC2FBC092467CB9B
+:10A1600025DC42BCBE755836A6178B27E7DAD1F539
+:10A170001F5A58DD459C75E870D9A82CC605394A88
+:10A18000C892AF3FB3BF3E30B59F9A32A82F13811C
+:10A19000FEFCAABCBF69C48635976DAE256A88925D
+:10A1A0009E9E6F08CD12FA24AEFB596D28415A17B6
+:10A1B000F25DE46A9F662B43A8BD39FAD9C0FA72F2
+:10A1C0001CD42E80E2764731AF88B8B9C131A2479E
+:10A1D000FC731A1535DC378808BF4EDF94206150B8
+:10A1E00022FA38A188BF52D5EFC73E1D5835A73592
+:10A1F0005574E161023979FB5421F0E0B32F4EA48C
+:10A200008ABB50846A89E9136CA3AD61B331931B97
+:10A2100069CD31C8E3DC6E628F0B190ED49F401CF0
+:10A220005CC6CCDCBE5B0101184421ADD5A3A95EA0
+:10A23000852A2C9EAD75CF20FBBD9E67481B0575FA
+:10A24000AFB780355ADF0007F91C1A7BBAD3732FDA
+:10A25000AD6EBEB37444DB0394874148753F49003B
+:10A26000CB1C889FE91685434162B36C79F175B9BF
+:10A27000C98763399484533D8486CBD9E16869E00A
+:10A28000A195F75F90A5D6BA455928746795DD86E4
+:10A290003DEA18D6C91D85BD569C164B1051BB858D
+:10A2A000D6D26FADDE498EA915EF4B5D84435FA416
+:10A2B000E933E90960639396C8E5FB9803B816BAD9
+:10A2C00069A27A36779DEF2CF42460253B268AC755
+:10A2D0005437EE3EA9FAD497C2A9801B16281FD086
+:10A2E000409992D34F5C028DFF4C9CB3C896A0E37B
+:10A2F000C47BDB4FD4B1CBA100400F1AE023271160
+:10A300009AD1E577DBCB27E443DD2ED230075B32F1
+:10A3100098EA0004904BD78829B901789E3F7B7B4F
+:10A3200095B0AE082F96D1798665FCAEDE970BF41A
+:10A33000F1C4FD7DE426D260ACF8E248BA9840C38F
+:10A3400054FFB8D6F2571545A0AFDE45A140CCE486
+:10A35000FC2BA51CDE351C8C88798983FD50E91AFD
+:10A360005A44446FE10AE08AD335BD94CC9D9FB333
+:10A370007BD8624C220ED092B2B7E1DE39B2B8F28D
+:10A3800070F87489C571F33192550459556BB0A1B9
+:10A39000B59192937399B2981516F84224FD6D12F7
+:10A3A000AD07AEBF239F3B3EF15B327F310E4F07BF
+:10A3B000FC6CB2DBBF6FFD0968715B77DCF6DCF823
+:10A3C000D4AECBE70388D353292C83F06A2F805572
+:10A3D000C74AF81C7C61CBB7BA39679BBF14A53E4E
+:10A3E0001AA8660352475EB7B202CA0BFDDF2C45BE
+:10A3F000109937286E255A080ECD5E165B8F7AC8E5
+:10A40000E2EEB64DF6A1FA116381B93B47080FC9D8
+:10A41000F43AA9A63774730B7DC9C193808CE3F419
+:10A420004CCDE4C9BBE25C0756E6A43C9E206AC959
+:10A43000540C40F02386CD33F0870F02B704360763
+:10A440006159F2F386AC9AB88CBBD3BA4757F40B78
+:10A45000010738C81A063738919DBD34CF3596C2EA
+:10A46000CCDCA89930084FF60B0A5C090BCEC297DA
+:10A470003378086FB2BDE903286EB3CFAED0182A87
+:10A48000DBECC470B58C2581609CDF94F4F1CF9631
+:10A490008DF3D42EACD085E2A3F6CA5113A4FDEC03
+:10A4A0003FFA1D59896F22162F99BD419C84E8827D
+:10A4B0009F7BDB808AB1DD8827A889DDCF7D5D0B9E
+:10A4C0008D45A4FA8A4F1865312EC53B96E49C024F
+:10A4D000FA320DDE42586338CE763868582FA4C55C
+:10A4E00018165F74221C59197DA3BF8F57DE31BC2B
+:10A4F0005109C5EE0DF7BED8063E766DA5424D9DBD
+:10A500000E7891FF301AEC7186A81899AEA6CCECA3
+:10A51000F630F5F46AFF396D8976B0A38DCEB96D4A
+:10A5200014A4F543E836EB0B64D8E574061CE9FA8D
+:10A53000C688CCF181C93290134831ABC59A5277A5
+:10A54000512D55BC4E78B53A97DC8B3BC9CBDEB468
+:10A550007392DA2E9ECEC5D1BBE10C16301D982A1F
+:10A56000CDF19954AF91D6EF197726289E4ECD5B49
+:10A57000D5D6A5BE375444F85D1A58C7D0FF0A6631
+:10A580006DB8AF61A866563C47F620E8E240EEBAE7
+:10A59000016C8D1E6075F8AB7B275DBB837699A837
+:10A5A000C4B65B0F4E41F8EC081EB4F9D0B1224896
+:10A5B00014E89312D894985EC88282D7C3C088B139
+:10A5C000C2D382BBC866652D0EA51C6CC2D11FDC30
+:10A5D000F823D5D8C60D74A132C8340DA497B400A1
+:10A5E000828B9A5E69FB2DB36958997618786275EB
+:10A5F000529043BC2778C26EE9CE960FBD47596E84
+:10A60000F6DE57B2426C37A0A5AC093C63448D7EA0
+:10A61000630DD5C8FE372B3F7FB9226FC98C6CFA0A
+:10A620005245688AAA13442BDD65D9F81CDE5D7893
+:10A63000A981620B63798CD9E621C88B5AED920E01
+:10A64000852021AAB806D80066DE683BAE986DEB7F
+:10A65000202E4474415CDFB36F41F4D8D53FD1E67E
+:10A660007B11461B3DD792E50252F9E574F6D6AC54
+:10A670000F8B8C447BC3E64F96077C6064A64558DD
+:10A68000393DFAB8D82819779815FA635B05B16B8C
+:10A690002A841DBD4109E1FD99D309719B20BF7337
+:10A6A000AE494635552EDAC0964DCDB9C6C9497F5B
+:10A6B00095C128E5C27DE9107C7BDB10C998F53B8C
+:10A6C000CB3E7DE67E9D09AE56A9842C8E999B8457
+:10A6D000739B35BBDC38062F984D93A534513EA3B0
+:10A6E00088645408B1812C546A8796C44F15086D4C
+:10A6F0007011035761295EFCD44D9220242DDFF7A1
+:10A7000059184B669670AE3DADC907777B88955852
+:10A710009443BA41044E0158F2A8106F1BCFFA853A
+:10A72000F3E184B508AC93CCD559E047A912BC221B
+:10A730007D81EA0BAACEB3F06E68230177FAAAD026
+:10A740000B2205214216A5F4F79B80FF44574F4783
+:10A750008127A07EC78C1B4A1E954D3405C230BE92
+:10A7600095FE0C7D283AE5CAAEA847547635492BAC
+:10A770006B301179EE6CAA30E3EF16BA6C537C643F
+:10A78000095E63BCC680165A0B64BF9871BB1DE698
+:10A790001E4C0760D82B7FD5CEA325EA90D4A60BFC
+:10A7A000E73C9451CBD97A80C676409D160759C9AB
+:10A7B000BAEDB47AE5731F3E6F60A33112536F0098
+:10A7C000EF3F65662E7B96BCCEFBBF839BED65CDD0
+:10A7D00020E3785ACAE518279EEAEADBB0B8B64209
+:10A7E0008493CE988E9A64D3871C077ADCEDDF645D
+:10A7F000E8C025C63B59746151C7F8BBB5EDA4D577
+:10A8000011D02D0D30736C367EDDC7D345CAA12023
+:10A81000E1F2F90FCE57958675F68DF0A82363A166
+:10A82000C8C77965D7617BB6336876CFEBFFF4B3E1
+:10A830003C9BF5612290FD4372758561B2A982E16E
+:10A840005B5EC7C1CCEF8D2DEFA1A08C5DFFA83C56
+:10A85000DA97AEEFAC97A25051591D7A5D7DDA8739
+:10A86000F341AEFA6EC1AB6C4C20748B706DCF911E
+:10A87000C21FC06B7D3D3146C29D163838B860D0CE
+:10A8800075E12904FB4EDCE8E021F7D1472E6BA2ED
+:10A8900088D334D0FBFD51108F9A02C4E132C69F99
+:10A8A0002BA18863DE0E28515BC674A52CF33F7E76
+:10A8B000B869891F1FED0133438B471EFFF15EB658
+:10A8C0009F1E31CFCCA07E7655ABAC94C1674BEACE
+:10A8D00086D934A262A727C3F5B05BEF6ADD6C4F5F
+:10A8E000BCADADA1C98B37852079A405BE4938A27E
+:10A8F00054119D7DB9FAF5C634B6E3441B31BA3D17
+:10A90000666FBAA25C9B8C57556E072C15CE012D35
+:10A910001535C719525CDDE7ADE7CC5BD745578EDF
+:10A920002F8245549E75F473698F17C94619E1A5A6
+:10A9300055C57BA7D63E8633EB88BDA524B8D26B20
+:10A940006E874D9BA0943042A8E3E837E6322C1B7B
+:10A95000E2BB6F1CA25689072C47FEFB4F814DE7D7
+:10A9600036870AA82D7147D22857C24C29ED899DF8
+:10A970004C0574D998686F455DDD7D81099212A4FC
+:10A9800060B59D2B9465E37A5862DAA1B29099780C
+:10A99000A28390E270F942EF5C202F54C562DC4D37
+:10A9A0003DCA8B14B31D59BCD28B21B3F0872D3D0A
+:10A9B000BBB246A51DEC4EC2F83171AAFCC5FDB173
+:10A9C0008A7FFFA55155D7207F15806E075CC9C3CC
+:10A9D00017E991A9770718F1433ABCE9D81327E1A1
+:10A9E0005F0C021465C9012107FAB029231B611607
+:10A9F0003D853FEA2B76DAA3DFB78F4E1146CB4E6B
+:10AA00006EDB7F063E00F263CFD55D73D9BA59B8CD
+:10AA1000B12E1DF91351453A0968570594B747C33C
+:10AA2000CE0EF08E7660F664280C453F77E837B39B
+:10AA30009116C5043FBC861A6F2645C34548A046FB
+:10AA400025AD41FE1233967826EFCAE17F69FA1EE2
+:10AA5000842A014FBFD95EC51D6904D5D194593EE2
+:10AA60003BAF6B6382EF90A18B1A8E5EB6BAE41097
+:10AA70007A4F7F5760AC17BAB73610B73454060414
+:10AA8000B7B7814D55DC0E965DB12C976CD2EFFBBC
+:10AA900071A653EE41A37CC160C28E2568C02C7A9A
+:10AAA0004BE442427CCC711ECF9697961EBFD5E6F2
+:10AAB000DAEC31EDD118F9406A680A50817D0ADB81
+:10AAC0004C46CD584FFD9C2A480D17AC691DB1C0AE
+:10AAD000312B135C21FA3DBCAE163A97416C7B6377
+:10AAE00079DA8475F22817D6F520346F543FD92AC5
+:10AAF0008C8E0FF6F428B13D4AB60EDBF519EAA1AB
+:10AB00004F195319F770D9A5A6BB19FE167DC8A316
+:10AB10007459EA17D728831E48C0D0752A804F3E43
+:10AB2000334B3BD9152FEAF5FC786D0567ECE6CA87
+:10AB300034052AE1E5220A9978340D2165F94A891C
+:10AB400016D567AD991B0C3BB1CDE844C258985F50
+:10AB50005F7B62EE4C8CCE156CB421CC20E485AECC
+:10AB6000C17A3AC7E42307B3C0EDD5C58AD19D3B6E
+:10AB7000F752044DBBC599D3EB57F7B9D400E14F59
+:10AB8000E1CC56BF7BAD994B8FB18B04D4805D086F
+:10AB9000009DD6C979CD0E436C587707B823F2B81B
+:10ABA00011EE7BD9D84DE9A4E472617465AF4DDD37
+:10ABB0005CFE37B958B582F1E3EF24FE507510D929
+:10ABC000D2BE13C566ED6E40D717237390EB7F0896
+:10ABD000C0A23F246DF7041FF0A5205E996A416E64
+:10ABE000BC53F46D1AD2CD276B32B03EB9C4921467
+:10ABF0006D5FF086C6DF58125193127830FEFD2843
+:10AC0000A27356C9BDD18A19D31FAEC09A403D3A2E
+:10AC1000EC4BEC642B2B366470565D876415FF2A71
+:10AC2000385DDBEC1D3E09CFD7D69CF7E40CB7DDD1
+:10AC3000440D450E7DE8DAE6774FDDA81D1D30781E
+:10AC400088551FE563ADAF83FDC807DF512F79D36A
+:10AC5000D2AFC1F64EEC833ABFE3970F8A76E6ADEA
+:10AC600043A250C94F249B2FB1153F6BBE5A624976
+:10AC7000B895C42037D48CC0FDFA6F25001E4E5EF7
+:10AC8000576E93D6D245F9BF9D8F6F8FB7302EA3E5
+:10AC90003B0755D0365084C21820FF7967BCB1C934
+:10ACA0000B180DABCDFC19BB4B66F940182EA0AFAD
+:10ACB0007809ED5CF11538FADBF0A9D33020B50541
+:10ACC000D97BFF9805E49BB2C6AE4750D07BE0DD50
+:10ACD0004BB06D1884183D05C5DC2F1F7F54979A23
+:10ACE0001F1881469693C7E9DACF0975C1CFD2A85C
+:10ACF00069AF0972C7F9A57A49FB0FC89329EAB170
+:10AD000088D6C2D796D7CC198744F69FF5E6B18C82
+:10AD1000F8F7952DC0A045981D8D4D8E95562FB9ED
+:10AD20001B851E0C30F46C804B47DF58C3EF4EDBA5
+:10AD30000FB1B06A84C6F6051B70270D3502E931E4
+:10AD4000C209EB49277A23B1D180D8EAA7C9669214
+:10AD5000EA98A036E557CDCBFC3EB1A61E35DC33D4
+:10AD6000571E140E663BDC084437322DB7863C2153
+:10AD70004BB842C56A37974BF46BE4D454DB824836
+:10AD80003D49240C9D15D6492D3A5700704A04328E
+:10AD9000AD4FEB328BFF0AA3EA3F135AA5C40F391C
+:10ADA0001FDDB1B63852802200307774703B7DDDF4
+:10ADB000D9352545BED943DECAFE49E90997C444C1
+:10ADC000F4FF21FF278A2AD17DA21E5598D86162FF
+:10ADD00091FCF443F547D39B96EEC278EFC754F647
+:10ADE00028C21786FFF35D4FA3C05200BEF858DBA0
+:10ADF000480F9277E8842E3BCC161D6CAAF55F15A0
+:10AE00000365BCA26343DFCBC1E53BAB3EE04B84B3
+:10AE100084D40A0597E213A9855B34359DA8C2CF77
+:10AE20009871378B61ED8BC67B6A3FC6B90D1723CE
+:10AE3000602A13B9636F58BDEC76747B668187DF37
+:10AE4000803A5ADFEE4F2AFAD3D5C6DFD44C30B859
+:10AE500052B7C76150D17FD27E1AE2DE00CC85871F
+:10AE60006A1662CB2B56B89FEB685E6B779B8DA6FC
+:10AE70003E00B660BCA55FA4043603635C4EF08759
+:10AE80000105A8E443A703AC545FCE9E0DE7A735A8
+:10AE9000C3A49BB3796C4D7B99AACBE4AF86A9F18F
+:10AEA000A72515181308FCC28EE2E189BA0B3EFAF9
+:10AEB000D40C18BB51281119196B6798E9BD592C8E
+:10AEC0004952386A7B889E6D280DA3892D59E2FA74
+:10AED0000C7D276722E5C6BC9D32E84D7642E4D85A
+:10AEE000013CA9CFE0FD1833A1CF16614DCEFE4441
+:10AEF0002318AFE54E771566D72DFF6198420C51A8
+:10AF0000BA59BB0291BE900059176749888C1BD86B
+:10AF100034D431E2293EB52F6B675282C79A7A3E0C
+:10AF2000E1BDFE4A37DC52F7A19191A7A66CAD4175
+:10AF300087BA505337202BBAF1B569D592F29F7C6E
+:10AF400080ADE4D17ABA7B01C471A710E1715DCF05
+:10AF5000253045FD9533D2AB434CECA1F5A94DAD61
+:10AF60004AFE97DBEBBDB0BDA2992B343A2AC02E26
+:10AF700035D78D4EF21E9C2243D98A8812C08E3F4F
+:10AF80007CF15588472FD8FA17A5A544B66B46879C
+:10AF9000AF1D7EDC99C3721BDC438DF6D554615A1C
+:10AFA0008785256BAB8AA3CEE04F7609616A8D1247
+:10AFB000EC46807F5B0B0869ACAF7B8DFBB45DD04A
+:10AFC000562D19F22CA668E40C2349726D8D90A9B8
+:10AFD000773195B715740A30F807F26A4FA09E8250
+:10AFE0007AA5AFA5BD4F312A2CB836140F7E8F300D
+:10AFF0006F5EC7869DE3DF2493FD7264433E117A42
+:10B0000003AAB9A46E4CCE7E6E963BE310EA20B73D
+:10B010005685250E494B94411DB3CA84ED7B7B7C3C
+:10B02000D9A2BB9D66AB5D625FFB36AF6DCDF656B8
+:10B03000760EFB8FDE3EE79B26E50C80667DFFD912
+:10B04000D7F485B5A6D118D95999A718E408665D33
+:10B0500074916856CE929D3C4668D4EFC88617918D
+:10B06000882EAF2797195EFEFA5D12D97497941A4D
+:10B07000A062AE43EED6DFE37E59295FC4E6CAF193
+:10B08000CF2980FE9B409432A5A07F3502551E66D5
+:10B09000823E951076946B18E27086FA6051E383D5
+:10B0A0002B97028969C79CF03D1E207F482A03D94F
+:10B0B000DA95E0AC2E163BD706C73502CA9A358E14
+:10B0C000521FC182C7FB6A48086113472483C347E4
+:10B0D0000690F07A66F6784AC1471613A9A7F65685
+:10B0E000F8A4A2FE1F5D55D6A4A4B0158B60077905
+:10B0F000A33ECC9C7A9C40E0E608F1B6EBCA92CB2A
+:10B1000098252E426F7E944E87023BF525A3929E92
+:10B11000FB49CA3CB71C65C011AE71B8E6F9E0FA4C
+:10B1200017AF5A2E50707B8697FC7B2D7E5A608518
+:10B13000D8B4B1F648DC74015A0F82BD48BA515BED
+:10B1400091DB21F0092C9081597C717369DB1ED54C
+:10B15000CF3BC2794B9F565F4378A67536DDE3F54A
+:10B16000B26769E5D3CB4D00242653888EB60EDE38
+:10B17000267C37C8E83F37BE8B8249229BA31B2B16
+:10B18000850F77D7F44B5458BB852D3169D8817022
+:10B1900010D893D3F81DDE7B299A4DBE7741852BBD
+:10B1A000ACE67E6E5A5B724A085BD9C4383425FA25
+:10B1B000483042EF287E69F6DE0BC63862E9F93B7B
+:10B1C00044B11D652B88B334B313C0B7F63855E6C8
+:10B1D000EE5D578C332BD5F127B2C41DF78F44AEEB
+:10B1E000C453DC3210D362936FDFD8F4A98C71A5FD
+:10B1F000281B62C02B59384A9CDD5839FDBBB93C2D
+:10B200001C7ECF0E46A00816E6BB1EB141F457A225
+:10B21000204EEC66C80CBECE0405CFA9A4BB0E52CE
+:10B220007D6EE8367B8B3AF8E47BEE3CC0E3C94F99
+:10B23000EDABE0D6078C87784270C9169B5169F652
+:10B24000AD33F0396CE5BB88B7A21D39EDD49AE275
+:10B2500029E975F2F24F58A05E472F68DBA21F70F4
+:10B26000AB6E8010072F01580FA2E3183BBE6CB6DF
+:10B27000676AB3B36BC67B4D7FCECFE5BAF207B931
+:10B280000808EB8A383462BD99CD3A4A6517A32A7B
+:10B29000FAC490410E0C6F0FC3FA7E12D3A998EF37
+:10B2A000EED50F4D29022D251F670E2DBCA26BA8D0
+:10B2B000952033508E2712EA89DDB9A62046782CD6
+:10B2C00005DE3FBB382BC7AE0151BF6E5A53A79066
+:10B2D000BC9629133D4EE4E460E8F3A22DEEA73CB2
+:10B2E0005E7E936BFB5D6B9F7E716555ED8E11B23B
+:10B2F000F7B8CDA1E04C75190FFCABD8878C59C3BA
+:10B300003305E79500B8C1679A611AF672749330F5
+:10B310005C9805F4A3B40527C808F05A3E0B087ED4
+:10B320009BAE753348636A3974451348A230B52023
+:10B330005C5289482D96530E7CF956FD2D1182C41E
+:10B34000E8A14B7388A341DCBB597462F39FC942E7
+:10B3500082D8BC3431ABB37ED0C26D244317FFD248
+:10B36000D68EF616C93B334A1AFDF79E584681BA67
+:10B37000BACA7A148D73717F539E8293D885199AB5
+:10B3800070DC4A48A00E0DA617F5C71D960117459B
+:10B39000D1DE28FBF595526DBAB62CCDB37325DE00
+:10B3A0000ED722549D4F8CEED47EF5820D738DAD59
+:10B3B0000B613D8314D9453CC0D69A09A8315D6F15
+:10B3C000EF62FFCAEC74BABDA507C57DBF011A4282
+:10B3D000AC22235AFA6CEF74DE5FCB2E4EF4DF4FB3
+:10B3E000C68276EC98E735CCB8F8EC40B1D41EAE06
+:10B3F000D382C71B02266C00E5508D484E611CCAE3
+:10B4000062BF0A678BC0BDD7276D2CA17914A68DAA
+:10B41000AD165F733F1E2227B2064F602D79ED20D7
+:10B42000149A2D15C03C5C467C007404BA4D8ABD4C
+:10B430008693B0D3524EA09E20ADFD592F6D7E3A1B
+:10B44000C6ECE22880F656A62DBFA825F539D152C4
+:10B450007CABE2AB741A4FAF108071DDEF53C03D8F
+:10B4600005BB4BFDF602BE7EE175D61053CF96E7C5
+:10B47000032844EB39BF216751D2DBF4CFDE7928B2
+:10B48000DBE05B990EB47BA51D6C9F722112F9ACB9
+:10B490007D2C900A05232ADE552A5109597FA607DB
+:10B4A000C6FECD26157DF460FA01E980A020846AED
+:10B4B000FAB35312C8A0C93DE81902916A5230315B
+:10B4C000FA4C78F9A402960F348CDE93B122FB215A
+:10B4D00094048C2C17B9DFC0B923825B6E02E7405D
+:10B4E000DFED1A69915065B5219DBC66A338D03255
+:10B4F0000C2ADA58A842D490A8E7847DAEDD35B88E
+:10B50000CC4739C4729FB42A1C7DF1732A5BC13EBB
+:10B510006D3A35AD60C2596E96DDFE810BBD78BCCB
+:10B52000965EDEA10A6C8A2D7B7454A6BEFE78D688
+:10B530006A127D55A256DCC4C840FF58C52D820D45
+:10B540004E8A5C24A2E9CC496383E3CD6A23175079
+:10B55000DD3EA09CFDAFF7AAA9C22ADE9F56AA3302
+:10B56000F689CFBA51FC651080396914B97ECF7263
+:10B570009C32F0B1C2FB2B8074D37BFB9C1B4ACE68
+:10B580009AA2FC0696655EAEF824CF15926042C280
+:10B59000E8A0DF766400D9F3A3803738E99C18D39C
+:10B5A000D7420117C4CDD4EE92F9DE1606A9AF6BCF
+:10B5B00051CCB96E540549A46AE4E4116E47DF3FEB
+:10B5C000401AD05328E6D10155C8F045767E05E9EA
+:10B5D000CF9A23527CFCD7ABB9E70795F07BB476C2
+:10B5E0006E045D632A1AB60965F086423E42A07178
+:10B5F00065D69B3CD983DDC98976173B642FBFF0A4
+:10B60000DC6DFFFDEEF9C57C8F8FA5805CF53ADB24
+:10B61000C1406790A35AEE0B1B8EB20259DA7EC36B
+:10B62000053E4BB4A8F0228FEA92B9826BF190AB41
+:10B630001F6097DFAE716746E4EF9C20D3D2C07CD9
+:10B64000E594D55525E064E410A11F6902D3E6EB2B
+:10B650004AF08C43FF115FFCEAC25B9E549FECDE14
+:10B660007455797DDE8900A3D96727A14117BB1CDA
+:10B67000703251578421F4E034D5DF742DFB4E45F0
+:10B68000F0F2DD7934A68812EB7232CE18B1EB52AB
+:10B690002806A79564C659ABA3D5FA972C85EA145A
+:10B6A0007BFA0C765AFD967207E56D9C67C799EE9A
+:10B6B0007CB5C87D814E182259D5C1A3C4AF4FEBCC
+:10B6C000E80F5160CB956C2C762EE41BF74DDF69AB
+:10B6D0006DBAC06FB86A067EF4AF94A60D761FD619
+:10B6E0003640249FF4583489207AD668664CD2E0DC
+:10B6F0004AD1FBBA9BE4E14EA0685B6D3C6958B14E
+:10B70000AF977D87D3D6085FF23CCB09E1EFCF7DC1
+:10B710004F6765292EA5AD2B10CC915E8CE5B80D39
+:10B72000F7958F88D6F2496FD60A5F6A5327AFAC78
+:10B73000E8E7E7004B293C85AFF8F342798E3C718E
+:10B7400095964014D76C796A645795C3F6213C7C72
+:10B75000175AD720FD77507416667CD97ED7C8A2B9
+:10B7600085A7A30338409C645A274C2332965B7C00
+:10B770004B7EAEBD0EB6FDD826F40841A776D45F49
+:10B78000647D9D873B9FC4CCF887A325DAFDA6F78F
+:10B79000AA90EDD0CB00A804AF6F6AABD742A775D3
+:10B7A000B2AEA866075802B1F2C7B7CAD270F0AFFE
+:10B7B000F83F81E43486240137240F45E75322BE45
+:10B7C0004C61D1D801215BAF362916FB68880FF98F
+:10B7D000438B6A6D776E955DED2A06317857D5F407
+:10B7E0008585E5DB77A6DEA7C1D7E5FF68696FE24F
+:10B7F00058450884D4B2876132E9F8F5602C88781E
+:10B80000FED5AE1063485539C65088B4110A069F5C
+:10B8100045BD20F371674FB2AE38D2717F19AD6D5F
+:10B82000F2FC15CC1D029CAA65FE42CB6BA4CCDBBE
+:10B83000A71CCF0CF677EBF71933F643BE9021B275
+:10B840006760DD8BF3B308D09C3A2DF7F28365294E
+:10B850005B33F2877776A738CA492BC52A336567E9
+:10B860007BD6FAEB524340E28948DFC035E42F3102
+:10B8700021CB1CC10AE2C4440C1E7BF5EAAB73D693
+:10B8800081CB3DE7FACC3E1FFAD1140BB816A72F97
+:10B890008B7422F55315DEFC1B8AC287AEC5AE83BE
+:10B8A000077A698A698A394F32263481D01F7ED55A
+:10B8B0001983AB850D9567B4DCD7EC43691F138FF3
+:10B8C0000A062FA5DD790A3830B024E11F1DD5E026
+:10B8D000A2E9E8AECBDA1122550D2D3E7A9FB506CE
+:10B8E000303F94DDCAF96D3E65F0CFC2275CE8BEFB
+:10B8F0000A7B1B9D739266D1B6363C6F89C6580D84
+:10B90000B5CE9A1F7BADD42FE2DD8D413DBE2E4DCD
+:10B91000B83D72EC0546672C8439501661B67C261A
+:10B92000D3CC4E4D506A9227194F603F019C896DD0
+:10B93000D63ED1243C087F9A88611A34A2AA2D975A
+:10B94000532317774BBC1E4FFA4F4110421F23F76A
+:10B95000DFB9AEC8E187A64100C322B4077592B82B
+:10B96000EA39B4E9AE8FB4E68CEC40B9464D6C824E
+:10B970002F175BB07D1823F879AEFB4AF8731A4B8A
+:10B98000693AC4A01B09E90062BFE93230240CDE29
+:10B99000441A77D2C59FA839ADA299D27A3525F23B
+:10B9A000D9E91C67C3F5F3C0391F9A69A2E6672776
+:10B9B00034F8F8585FF28BC17D0F4CE57892544B08
+:10B9C000B43BB51E789536497B13BBA119DDD6066D
+:10B9D000B5A72F74979EC81E169E7425FF95C6C2E4
+:10B9E000D0F1E8B81A3C67A93D871D630B20D76AE0
+:10B9F000B7CC5CC227298C98803766077B6712B763
+:10BA000083636F33867B18423B21679E3BE458DC9F
+:10BA1000F6F759CAAF307F51D80169B0D95127EC38
+:10BA20001BEE60FE3DA842C498B35C1FBF7E856CD0
+:10BA30004B08DE1D615A62964CDDA2106CA4FC0E10
+:10BA40001710623613BC6947C7565FD84A9CF998ED
+:10BA500078519AE301CB3BC42F907BC43547003427
+:10BA6000F6BA3A4FC436A553D406D99F09B736481B
+:10BA7000A2148BF72CEC6AF43DD60D50EDA5DE0335
+:10BA800075C5DD32424579AC27907D2C5DFE793558
+:10BA9000B5836FF5D5C94984252B3AA429EBFC570A
+:10BAA000F7AE1987591747C1D38F15F352BA176BE1
+:10BAB0002A643C8EC43CE5AB70FC6D3E207511A63B
+:10BAC0001D4BBD18348D358BB78633D9B74F0C96C7
+:10BAD0000933371AB6E5804818741EE4E9612DC8A9
+:10BAE000291B999874A4BDDC6119B868EC8C56D0F8
+:10BAF000B63CA07C0E10F9D7DCBAF9D823C24FF3BC
+:10BB00001CBCD1812202C757C710BDA0925A9D8A82
+:10BB10006ED514B07553FD0798DC3C598BA0692B8A
+:10BB20001ABEF660F26CB5FC1961FBB8F9044174F9
+:10BB30008C7AABD2FB86DA1E699D2BCB718077881D
+:10BB4000CC4E5085CCBDE26E407B5DE928FDD6220F
+:10BB50002034AEBF00726D8C3F7CAE8BB5C45B1CD5
+:10BB6000B8D1A9BE306FBB76C179428BA4DE451136
+:10BB7000983C9CEBEEF18993B591E9D45606EE49D9
+:10BB8000356DD8618CBA35D8BED323F5D26159064C
+:10BB90003C7B8938A6BE2931C07513B44B67B5BA52
+:10BBA000B014824910CAFEF62CDCB8F2FE733CA039
+:10BBB000D2DE87E355DF86C5CEA839878AFD7AD6DF
+:10BBC0004FA25BB589EE5BFD29FDAA31C2A9615E7A
+:10BBD000A7B4DA78DDBF73B4A2FAF6BCFC1E560037
+:10BBE00063C1CABDEFD2D763E84C0BF3A2DA7AFA8D
+:10BBF000FA29DE6A1FE037840B34900F1068D622D2
+:10BC00000E640C5A3156219D392B98EE7885F592A9
+:10BC10003C36B8DE48F9DDC2FAD81D2804BDE1592A
+:10BC20000F678F544B31439015B0BF2849231EEE48
+:10BC3000CBC68D4C500FCD572BB8CB099ADFC18B9B
+:10BC400067A30BEF99010BE238CA3A9625BD6BB991
+:10BC5000BE5BB7E2A884CCDC97AF0207FB97719973
+:10BC6000889D0AD5100F446A61A6A022A3513AF814
+:10BC7000C370483B8BDED71516E9DAA158CC6306B2
+:10BC80002BEABE27B4BE227EA2A7AB0F5B7119B10F
+:10BC90005785C71367CACC56DEC63949C8A03519BF
+:10BCA00045F72859962B9610E0963935A55C0F3349
+:10BCB000EA857B91922169FAC523A61E4D5DD8E1E4
+:10BCC000D8C87D8A57BE13B588F603D7F1D3682A42
+:10BCD0007F87B7B65F0E915590B83C9E85B033F321
+:10BCE000D4FF9E4A92519F98E3D901DCBC26710D86
+:10BCF0009412FA00641891197F95BA8B25C706C66D
+:10BD0000B92DD746DD2664D8F4A2A68550E82E2F9B
+:10BD100056A89E4318A1BEFDD965394CF442949CA7
+:10BD20003DECF1055F132A28364A42ABD9F009B839
+:10BD3000685CCA3FB7C3F6CFF9AE60407C2F42DDE6
+:10BD4000F0C43667BEEBF2A9941226DACC2B401A67
+:10BD50003BADD2FD4818809B9632688B55FFCA6870
+:10BD6000AF63AB226510AD8884A6B9A7DBAD4AD41A
+:10BD7000BF5AE31F8F86969288382F06E92C3BAB7B
+:10BD8000B1A345A70FEBBE4453745B3AEE89071A83
+:10BD9000E4B31AA873F37FCE055E21D6E8F01B4EFC
+:10BDA00065FEFC4CBDC16B4C239CFC136C944CD9C0
+:10BDB000B83F27DE487D430BC14CCA3CBA9C12A653
+:10BDC0008EAEF409F3FDE4493FBCA42ADF2E78C40B
+:10BDD0008929EFA6A7159C149C61089CDF424A990B
+:10BDE000306B899A5E44CEA548DADA1B31708D52E9
+:10BDF0007113F7B30A8559E2B062567599EC412088
+:10BE00007FFCAF01A939A6EB20531E25198F1CE238
+:10BE100077B7A724424F1C650AD98CC99CE0A59925
+:10BE200012E2CF8C3B2090E0A728D623E5421ED11A
+:10BE30003A0408756C2C7C420311E5E5DA6AF59B3F
+:10BE40005D7BFAAF7E02F28E89AE677C1067EFFCF5
+:10BE5000A6474D4A735377F140875F8B5611A7B4BD
+:10BE600021230255D63BE1AB2A29B907C8C61CEDF0
+:10BE70001F2411F1B7266D39E7EBE00BF01E9B3E56
+:10BE8000C4E7357735CE9B71D62146FECC594D118E
+:10BE9000637B96C41D456B1982E123249DA81888F5
+:10BEA000243310C05F3FB43267931D847EFB3E0D88
+:10BEB00065B3AFDEE7832E81E41AF91F7EB04492AA
+:10BEC000C0C349013DCFB2EF5DF06668EFE549219F
+:10BED0007FC5071E1EB94D15A10D8890F131175B66
+:10BEE000A5A257FE7AE17FEA68BE21990EC989E3CF
+:10BEF000D3EC81A677D638A99E036ACC663D4D4621
+:10BF00008F79E9AE15309A985D657C1FF1C2078282
+:10BF100077C51BEBD784B960B2F050B0B82F0615C7
+:10BF200052EFD031ACC318927EA59B3EF3C4A50D51
+:10BF3000C0DE20382E6FE462B35FAF0D2F0238965B
+:10BF40007DAF0E3FD4704CE3008E5897A2EF9A8ECF
+:10BF50009118149DC27490DF871764FFFFAE9F3B5A
+:10BF600054550D49102E4D9A4140E8F88D27917C8B
+:10BF7000582C03390BDD9FC686E7F05C4F79F8B388
+:10BF8000314AF90EDB6304D66B6BB8373FD6C41168
+:10BF900074B4C22B8583C4E9675F284A2B73568E1D
+:10BFA0003CDEB8AC56C7682E5FAE3500F3DABFCAC8
+:10BFB000C33C84D43C54B22B05604E141B69CD4164
+:10BFC0004ED9175C9C3A2C20C0320C666F3A7C0E1E
+:10BFD0001E0C7FE71FE5EE7DE3B11FD6DDE788CAC3
+:10BFE000A69AC5A8AF098C351EE396EB5CA9002183
+:10BFF000A86E04713615C5CB25E802491A8C0FA32B
+:10C00000021A55CF2FA0615083CB9276543E012760
+:10C01000C15D1E448AFBEA8AD370F586E625A2C379
+:10C02000A638F66533705B5AE90A654CAA9EE2F5BC
+:10C03000C666EA58E5D440BD0E6437798C238C4E31
+:10C04000ADA30E64D591CFA4BB4A6C767985933DA0
+:10C050004292D140F24C10C5CD38D2453FA54D8D0E
+:10C060005CBEF4B98C4311191945E7D1426E2F3BE0
+:10C07000F8B35C40AEF69F3C0C363473A7C78F3BD9
+:10C08000C6E0A5ECF6500525B07E58EF2728F8E26B
+:10C090003EBB1EFE194CF4200084B2D8BACEA9478C
+:10C0A0003D8D6D6FF8846CD27B4FD27A1D0BBE74C0
+:10C0B0003EDBDCEF3A228723367D76E7CC88A2137D
+:10C0C0007A3FB8826B2E7F7BE51180CC86AF5E9A7B
+:10C0D00067CE12ECCC741889AE5D34D02BD6FD142B
+:10C0E0005E67DECA569F407DAB1230776912FD84D1
+:10C0F0005F95800E93D2352CE04C13847B7202FB4B
+:10C100003F2914C62800CD4127B045E1031B81DF3C
+:10C11000AFFA5933C2A4B998D7AAD5DBB20E27F02B
+:10C12000A6BA6313D5825A58578E784A21A52AEEAB
+:10C13000B328DA6693E8100637C288C6A0219A1E93
+:10C14000A63883E2B177E970AEE466B321F5AE318B
+:10C150003516984D28C6B2707ED4F119EA928A2815
+:10C16000471606984F873F2D4AB57DE31EE19D2671
+:10C17000416FF864388AEE7E9333FC33855CB7CB2D
+:10C180007261FF354225F209C3DF5B21E17E8E5AE1
+:10C190009C52C80FEE74FAF82AA3D890E7FAA3B815
+:10C1A000E5B8E2C17FA820639FA8A4F4D9ACC0DFA2
+:10C1B00040665D9CD3E6BE90FD103A20F8C817613A
+:10C1C000C6356448EB1366A7CF09C6C5B89B6EE6B3
+:10C1D000B22E6B4310C2634ABFFA0DA51A0DB1BD52
+:10C1E00008DB1978EA2876EDEA03003EC4B560C59D
+:10C1F000B8F27E4E06E856E0801042AC2F9814EC60
+:10C200004647472AD4D4C69AD922D086FBDAEA8F89
+:10C21000D2531063CA2130E0054BCC6AA0FE7A44A9
+:10C2200060CEFD6EE3DA61848CF2C04492A0489641
+:10C23000238E3569098613FA25E69F2367FB83DC85
+:10C240004F1C751F12A9D57231101EE664F607F057
+:10C2500033B0538DFA10D9762725D19D734E90E4D3
+:10C26000744BF571EF2928F0A3D1FE558E7BE3B313
+:10C27000D4C07E8C792237A4189E8769D087101984
+:10C2800038B929278B1BF4436FAA731B762432AD70
+:10C2900066569C12A4FC063D7C6759B7B9493647DF
+:10C2A000E91A4D82144237B5E79B1072154E6702AA
+:10C2B00000F7412B9651A9201672B86D25FDCFB617
+:10C2C0003EBEA2C013E135663BCAF12074DAB02449
+:10C2D000E3A437F67842D63AC0BA083030CDD2F36C
+:10C2E000F241B0C80495A4508BE03EC75F7A537307
+:10C2F00091D4D7827C647DE882671A30150163236C
+:10C30000C7ECFACB1DA3096E05212289BFB7729332
+:10C310004110BFBB63617E10CAA88121B3D6A8DCDF
+:10C320008E491C2D83A016FEE735F5689605251469
+:10C33000D4AB2D3F867B81F79EE628768C0CD87E89
+:10C340000FC302EE290E61FA4B9ECE9DDF643B992E
+:10C35000CCF8C58F08C74E53A31022ACF5A7240D07
+:10C36000D5A68AD823E3ECFFCBD82B42EB7D05572B
+:10C370006731541BCFCD4080DD624EF5493816E061
+:10C38000B4700A91DBD7982C62FDCE87D2D2070B0E
+:10C39000F4F49CA5DD1758AB5EECF15B351216E4A6
+:10C3A0006F59F5924D01C1DB90E89650DDA0E07B1E
+:10C3B000753AC8B0F76153D2549C38B429B760BD00
+:10C3C000022F05F08D46DFBB9E510C98CA656A832B
+:10C3D00035387F44270BC22F53284C16A572573F80
+:10C3E000ABAA9CE86C82A222E3D53ACEBDD8ED512F
+:10C3F0002C0AEBDE3FB729353D537ACF3B454C3510
+:10C400006D7F057135A58EC9227A80938BE9D9DBC2
+:10C41000362A4F94B437FFC621D01E334583DC83C0
+:10C42000A05E64713ABAF34F3105F19F2F80AB746F
+:10C43000FD009627358596D6CB81E4D1FD9A9725C8
+:10C4400056A1923F56EA5BA305D38DD04740401BCF
+:10C45000D92A197B4EFCCBEC4CC8FB45D7919FA247
+:10C4600093636DBA17FDA60CB2ACBC3A5CDD8ED5F9
+:10C47000D4E6A50D52073C518CE15D83B21C62AF3E
+:10C48000AD7054FE7EF5843C5FEBE306A363BB9A7C
+:10C490003342D96ED0B6A2C0FE7868F2087CE009BB
+:10C4A000C73512FADAC385D87E2E3684EB44C5E44C
+:10C4B000D0CAE00B3DCBA4746F490F1FD1D6F3CE89
+:10C4C0008565424AFEB5D90162B945677354B2FA2F
+:10C4D0005C7EEE85D812D6AE191EE84F6665F4CEA6
+:10C4E000F22537A07C0DD0FFA5967C4D121587CF85
+:10C4F0003396D993942921A67CA4CF471CE4B20794
+:10C50000A726F5DA930AC14FCD0A3CA024B2A69B18
+:10C51000E888D6912FC8D81D3A582EFE51C66AD148
+:10C52000AD8E0B767ABDCC05528CE05670E12BE1D6
+:10C530003994560AFC8D41A7B02EA984E38D5D5233
+:10C5400069E096942039BE78E0EDBB51013E7B84D2
+:10C5500014BE4FA5F96E21AD9084F16CF3358DD9E1
+:10C56000788D4BADFB5C95149D6EEA757B0416B619
+:10C57000E61F91F4A376E48DA64FA9DD3F38A338DA
+:10C580003BB50FD2B2FE25C990CC63FA25583BFCCF
+:10C59000FBEDC14F538290628C1C8769091DA0FB83
+:10C5A000915FFB8E1E2018BD2E828B11F59FF81017
+:10C5B000080512B7BF8823DF610068FC6D7B76C673
+:10C5C0009752AB3BC7B7A567335E42ACF408EA6746
+:10C5D00083D84C9AE9BF0940D08153C76F85275350
+:10C5E0006756139CFB855A442CF841711E0BA026FC
+:10C5F000A3630636F9EE614C15619FCBFF39C62067
+:10C6000064FA546AADF8A0B3BDC6F1CE4F3A153501
+:10C61000F2EEF875A6AA64DFA3BC110BF5A0E6F252
+:10C620005C9970B35CB4A1E6372C00B4D554AE3637
+:10C630009EE39E4C070DCD79AD5B98D672CD986A7E
+:10C6400007AE393D25BBAC3B3D79926766232F9CF5
+:10C6500041641BEE58945F129A5E074F8223CD59B6
+:10C66000E851793E899DAE4A0F327766E4DE8C99B7
+:10C67000423FAAC2ABDFC47FA9C869974CB324EE7E
+:10C680009425DF45EE0206DFC6C6D318AD7ABC7826
+:10C69000935D0A2B6A1232143C2C36B2264ECF2AF6
+:10C6A000EEE73500A906F61B123C7D2CDFE6BB4207
+:10C6B0003E54B23202ED996285933ADF326A6BA042
+:10C6C0008021F0E79C4CBF16257C04DB899AF21888
+:10C6D000721418B503C9C0E1CFBF7E78A05E31885F
+:10C6E00055E7CA30D294AA873FADFADF959C7EBF4A
+:10C6F000B2FCDEE000F8D74BF21594BFE47CF28C7C
+:10C7000080C17DD0D40D99D45578177822FEAEFC27
+:10C71000DADE7143DB76B14EE7C9CC5CD667549F55
+:10C7200098547093E7CEFDC7F6A58E68959326883A
+:10C73000B94F21DCD0E023CDB7892C73429677C066
+:10C74000B48CBF369C5B39AAE43AA1146AE8012094
+:10C750001C45C7CAC25B3E658BFAD495BB1426AB99
+:10C76000D9356F2742C66AE09FBD84F2C16699AC95
+:10C770009D0FA08166B875DB8628CBC0F75146E9CE
+:10C780005D107A8812983D0987A79BA974B222E7A9
+:10C79000E8E5B6B7975E6A4146091FBD74EA7EA810
+:10C7A000F4252115BDB553FB294CC202AD4BA01B8E
+:10C7B000F12F5E4C4909390D2FF7ADACC384A49914
+:10C7C0003FA9D25F572F408D4EC4C0B51C5DFF32CC
+:10C7D000296FDC954508073FB5EE2777D69FFDC248
+:10C7E0009695360DD09985D426B4677B3D112F716F
+:10C7F00069C4DF4C1FF218BFA7CA1AE0540A31B748
+:10C80000BCB6B61BE1D5C8ED4B44ABD4CD497B35A6
+:10C8100036C7C706D85D7AAB94F12AACED7EBC3042
+:10C82000BED82ACE2595E0161E861FAA853C4F4508
+:10C83000CB59B1F906BCC4D362FB3FCDC944F54A1C
+:10C840002AE4A088562972E70AFA9FE856999ED8EA
+:10C85000771DB95FA0062468A7FD4D48D33AD7BE1F
+:10C8600029151C9E80941DD8F2E7559375AF147C52
+:10C87000618025C366F33D9281EBD8F6CCF4F309D1
+:10C8800017FC1FD6279A0C4E063961325571B91222
+:10C890002424AAFDA84364B9D04614F4F28BA2392B
+:10C8A000BCEB0BE25174975A27805459A14DB95AE9
+:10C8B000757F2B970705A649F33B41F09CF73B4852
+:10C8C00084A1008713708B372D266C824F96EB491D
+:10C8D00088E6FAE9D9D5B17826FFBFA8D535F6584C
+:10C8E0004EBCE47767C049D7C007373366F8C5B098
+:10C8F000B4D91905909A56837991028CD7F756E8E6
+:10C90000AF7C704963AEE27BC594D5407E8BC8781E
+:10C910002F8D90AD05167F8EF936ACDDF6037B1FAB
+:10C9200073324C7F841D146606C3FE8AD5FAC48810
+:10C9300084559071E4FFDAB1C37C3E2F4C51F05C1A
+:10C94000AEB45ABE533DECEE83A0B8623F2A47B85E
+:10C95000B6264DE06607E6B3E1C20CE3819A4AA130
+:10C96000830943B7EF2D5FE7CFFDCEBEA4897D23BA
+:10C97000D6444841B7A2277D25158FBE4FD5CBE2BF
+:10C9800092ECF6C705F684C17DCFCF3251733426C1
+:10C9900064BE625DDEF6FC3FB29AD9278A46D16456
+:10C9A00002C726C26F9C79CADFD11C1725CAD82CB2
+:10C9B00052F346515D667DE4C3009538E11084C1B1
+:10C9C000AA0BE3B124D803C6E78164BE1CB6A391C9
+:10C9D000F582BD4B246C2763377E89893303C4DC21
+:10C9E000D5E44A7DFCA85E734547D23AF2577AC82F
+:10C9F0002A9431E3CAD5CEBEFC3BD5EB1F73177129
+:10CA0000BA334EAA0B3D8EAABB20AB39A8383340AF
+:10CA1000826A17EDA26E8F6FBD2A6611822E846E18
+:10CA20004F91D0C217EA8515C6A9DF4BA967C9B1D6
+:10CA300083E45C3030DAABC279F5A56953915E5E70
+:10CA4000A5BE42E30FA2FD56D7432E1F7106621A00
+:10CA50009441452F3176EE65AF864E4799D9B7A3FD
+:10CA600087B0CF188105AC1CB1D7328BDD5BFCE5FC
+:10CA700081CD017FC57565DF366C3D4445F84C0CB2
+:10CA8000175C36D7787CD886F0ACA9CA308AC195B5
+:10CA90002655202114AE17B84F9979981ADBADEBC3
+:10CAA00035C181B1DA647BC3F21C2D4E66B24CA253
+:10CAB000B393A987011C7D2BD93E5D7A5113490D93
+:10CAC000611613D36C39A50D42F7DDBA0B27A217F7
+:10CAD0005C11A47E8F419FB9F63F5655D8262F4052
+:10CAE00095BBEFE939E6676BD3412157F18E8F0B88
+:10CAF000F441B4750DA55EED9BB6095B605C9AF9D7
+:10CB00004773ADDC882A44CFA4A8624D2ECBC0FA6F
+:10CB100021D5A8E649BCE0AD0996D9B498B29EC724
+:10CB2000A2AD23F1D9C47C9D7D3CAB9CDEFDE747E3
+:10CB3000D1BEAB0FB540CF1D05285D21EB2BB3D97E
+:10CB4000B3B3E05CD8A450992C23DE89C9369EAAE1
+:10CB5000D87EF3DAF03A395084DA60DAA7011EFCA5
+:10CB60008BCA202C26C66E656E3BFCD9B963888DB6
+:10CB7000D45301F3E5DC4C8FD829FD96D445E0165B
+:10CB8000667E82C6868332EF7BB500233350B906BA
+:10CB900080D0D00197985496EA486C06557A4F7C1D
+:10CBA0006F87A453372CE200B1ECFD137972DF4F8D
+:10CBB0005D2CF1FBE837F7D436B04D63A23C144945
+:10CBC00094699DB9EB67B49D490F701B8ED5DD3D0F
+:10CBD000E753066BE382FF686B73FF39B5FBC24214
+:10CBE0000F3FC1197EB011837DEF6B9892293E6093
+:10CBF000407B43E103B4AFE61A71A2E2296DD2DEB5
+:10CC0000921D36E0EB48649236031344FDE0D410E5
+:10CC1000010CABCD2F08503AD9E07EF7DC18845ACE
+:10CC20006D25D8D09F8D6568D47BE94989D9CB3CE7
+:10CC3000914671760EB8BADD32A9FCF73654B9D8F0
+:10CC40007FF2D13422ACDAAFB5E2BE68F3156AF4F4
+:10CC500080C4C10D45467CDDDD7ED061764BEA990E
+:10CC6000702C6089C9A296798E489F30A482A7B79C
+:10CC7000ACB29E273A802724D88C20C1FFCF99AF31
+:10CC8000B6A32DE27CF1645C520962D8437B4F96D7
+:10CC9000BD0D07CB82DD812D246BCFEA9DE4956B22
+:10CCA00041B8C7C978A4C4DBFBE5184B5D17709188
+:10CCB0005641831D7CBB1FF21568643D869F6E0341
+:10CCC00040976AAADD493480439870D5E70424432D
+:10CCD0001E7B3DEC6EFFBEEA1CD0C62F5431881A75
+:10CCE000CFA1A5767B8B0CDFA32964704B5C86E318
+:10CCF000416A35B1A79E8D6BA1EAD1E30CF8AD7006
+:10CD0000A5E5CF4D3EF8004468DA445141F6498725
+:10CD1000543AE0BCBA14382DBF959B6EBC016067D5
+:10CD20009D7CB1CA722BDA85BAD47DF2305265E9A6
+:10CD3000617552B46B526438FAED796C7B65230CE3
+:10CD40003971137E6D593A5744FF9A655D89AA5E21
+:10CD500058D1160E9E6D98B95D7132EDEDDF663BD0
+:10CD6000D918BF61A369790108177CFE30F7644CBC
+:10CD7000B125427606061272139CA25C0037CA40A7
+:10CD800005E24B8CF2B9DC04B44E9CFF13499C497C
+:10CD90000C1A6EF742FC212D97E16C2C5B5492D952
+:10CDA0001E45FEB921416B7DDF4253C16E9534C5EE
+:10CDB0000875BFC9D66B6E44ADFC030FBCB6552CCD
+:10CDC00011F4061A62BBCA7A9C54082E5718CE5C1E
+:10CDD0003D43C22D3AE45C9F06122BFFFE480652EB
+:10CDE0005543FFE3E3D9E518D619FDA09C597E66AB
+:10CDF000E2D42680078DB569FD397C0D4593E0D5D9
+:10CE00002050E1E23B0F7F1E1323A43BAC12A8D7B6
+:10CE1000E088D41D714436F3CFF731C126F7D748E7
+:10CE2000AE404E6C0E63E0AE1A39990C27184A4298
+:10CE3000FD2CB603FB4445837C8F7EC316E43BF296
+:10CE4000F2909AD6E134743B657F8102808D53AEB7
+:10CE500030387DD9CD692729D11AD8639D6FA0CBF1
+:10CE6000949336413015EF5CEB4B5D24946FAFED3E
+:10CE7000E332A7A3EB2831153BD53F76F5D96CEE0D
+:10CE80005E33CE69E1B137041B447462C674919578
+:10CE900033C06F2542F3DDAD09DBF727A0F22DBAD1
+:10CEA000713CCEED7D8AE3AAADA0F3EAFBD60FA8D4
+:10CEB0000CAFC260E45D9E435B6FA3C33B506E3C0E
+:10CEC0002AD36D66DB33C70B38573ACCEA5823D8E0
+:10CED00097019C2B143E2DB41A1F86DAFF2DEF9478
+:10CEE000E479A4C99FF026AB4317907669B298E025
+:10CEF00014020830254285F72D9AB93CC9F1958373
+:10CF000067EABD79138D4E3155F502D6EC28AD5F39
+:10CF1000F4D91EC398BF81EF6D7D3AC410ACE2D541
+:10CF20009C0EDD0141F0FC49113EF825943DC126DF
+:10CF3000A8EC52EF8FE5E9C3CBAE635F607B71B2C3
+:10CF4000A5925EE67D41A092A9BFBFE29BC6333A9F
+:10CF500038DBDFE96B84FF8AB1E4C15269FEF51E5C
+:10CF600016C417D43A8B9BA3C494B71EF52047551B
+:10CF70007C605D273568F037A33D3FA10B5FFD2C3A
+:10CF800012EDEB26615B88DFF861E1B4ADA8978212
+:10CF90001F9FE3C7E6B9796A8FE2A341FAB93DA1C1
+:10CFA000483624E0FE50FDB5954CE14C01B09106A9
+:10CFB00098961F1AA1CBA52147358E55215A8BB2C1
+:10CFC0009D6B64B1667F2C90885E36B03CC122A117
+:10CFD000F76F8E7F26E1F4F408F65023AE8EE4DC82
+:10CFE000F10049D19EAD2107D55A1BCA27B822228C
+:10CFF0007CB59E73BFE173A6A04A5E787F1BA72213
+:10D0000016C8992C8EFC5251123919F030EA9E0242
+:10D0100079D94CD9FCA41499074C7142E3C9039007
+:10D02000AB22F78D267C1555CFC75B34CC9600CC50
+:10D030006A5ADF0ED2CF0554CC876E2689DE56E2BF
+:10D040008C141C24C194D263673E7ACE10B1FF0CBD
+:10D050007F2DE93BE101F265D63ADCF559FC7F848E
+:10D060006C56BA2CA3F1C58693F2EBE58F86CBCA3A
+:10D070000B40E14626AB31157F6DA9DFAB4799D355
+:10D08000408320D0150C8638087C6D689055A3F13C
+:10D0900094F8A3EF62E69BEB963F6D213E777B828F
+:10D0A0008DB8BC5B1600B43D69BC9DBB03216642D4
+:10D0B000C2A0512115FE6F3DD1E309AFA8289C7392
+:10D0C000EA1E47E1FD5172D243330329875AB94022
+:10D0D00012293544627CEEEFDBB1D8E14899EC4B84
+:10D0E0001A955E614B8E232065B12EFB475AC8D935
+:10D0F00098C7783A2839697749ADF9B170EBD48B84
+:10D100000A133052FCD8809FBAB198546DA94B6F66
+:10D1100097752824A73D70145663FB1D618ADA14A5
+:10D12000802DFE18E0EB1E983F41A5BC2C97218A6C
+:10D130002563372109DFF6A40D4204AA6B00D1292B
+:10D140008DBA79CE2CD2F18762A2E78FDCD6F2AB12
+:10D15000A81D11FD3647810545A3683F67D1D7B0AB
+:10D160006C721B69A6B1C21EDF08B7C17EA302653F
+:10D1700027693F69E2630A020F6A629A1E28D5DDB9
+:10D180008A991CC82EE19AB08DB486086522295D63
+:10D19000759B4828D2FB669D410254F7B4AF928E2E
+:10D1A000A0FC01A4A202827EBFC1E57150F6948268
+:10D1B0004F9864FAA74E7DEB91107AF0B43B499BEF
+:10D1C000E50D607082EC1D9B55E5CF865AD8CD33B6
+:10D1D000E614AE6AE3D5E66A1A9F801F491EC3A013
+:10D1E000180A192541798BF5D4517EB9E032F3D272
+:10D1F0000E91912D26F23B0D8C1586EA76C76D3186
+:10D20000AC3D11AC29059A637678FCA856B62FDBA5
+:10D21000E3FD8530DE90F1E4B60BD44C372765EBA7
+:10D22000754BD252CFCC17751AA6FFB397B1E2F85F
+:10D23000776B51ECE581DB6E3E7575C8F9D9F6FF69
+:10D240007B8AEA0E8152688F5A0E3365658B684679
+:10D250004A80CA2F7B254065E691C84DEDDB68C545
+:10D2600012EFA661ADE65EE0E0995069B196E2E0AA
+:10D2700062D266AD1BCC7F8B6EB57671404430397F
+:10D2800015E86AA57956B97591EF0B147D7C1B9A48
+:10D29000259B1420D61B5B710BD88C42573CC74E84
+:10D2A00066C96BB69FEDF1D01948F4902D87428086
+:10D2B000252224DFA0AF6DAE2AC4D4188A94E58B52
+:10D2C000589B28560ECFA04D13F83ED3C6AB49E766
+:10D2D00017DEE86448C293B2F70ADF59D04B3CAB83
+:10D2E0003720AF768542288518263C4432C71DA6D4
+:10D2F00066E97D6D172A1491E8A485A3C11CC8694D
+:10D300006BB941C09A38AD7A0B07577EF97E6885B4
+:10D310003B6A4944C5279740C289648754101C1E44
+:10D3200017F3B35D36C4DB91760C320D7996C9CE16
+:10D330002269180E59764C71E5F7D504EFBB7D9143
+:10D34000E1306C3EEF99254BF29815FB4FF6360510
+:10D35000A7CB0FA79A62945C2B47A85BC83B44B14C
+:10D36000B0E62A57DF288BD7CA0A99CA2C0FBCB55A
+:10D3700000E71E2CBBFD5D9F902A113E0F5DFDFD59
+:10D38000F51812815E6C7746E2E90458C0A18E95CB
+:10D39000EF44D82964EC70B28FA90F294DEA60746C
+:10D3A000B8B25FF4C0C0F6D34AD51D475C552024FF
+:10D3B000FC017BF3DFB901157EA08DAFC4ECFB311E
+:10D3C000E1E4B203B0BD29F19B712403879DAF4214
+:10D3D0007F0D0760C09F353C94875F40671DED3F20
+:10D3E000C4E02E96A785E7BF01FAD1EDE81A94664E
+:10D3F000B99E59F96F8A215DB065F6453E61BD124F
+:10D4000053A18E6C0DAE8215DA0ED6A686F8DD9687
+:10D41000A35FFC064E6EC765F334181BB7329C49F8
+:10D420009BE9710ADC19069FF863FEC348AEC38A04
+:10D430000608256E2DB6E223E9B707523BD5017BDE
+:10D440007B7C1E7E824E6530C355FEF5A40F52A331
+:10D4500010E036E3E168CA43EE36A724443D652375
+:10D46000C30BCB55F656844555A076EBD34B1B48E2
+:10D4700064B53234A4782207D2E69E5B30D331D231
+:10D48000710183611B6FDB171EEFDFBD6A62B4B9E8
+:10D490007FEA8154ED2269FF40F6F2BAA34DCEF344
+:10D4A00082D3268E02575E33AF6B665A8D7DF3872B
+:10D4B0001715CF69B5B4179ECFC98311AC2FF5628C
+:10D4C00024298606AC518D535FEFED48FD7B4BF46C
+:10D4D000401195C3FD6FC15D16582811511091AAD6
+:10D4E0007EAC01B168DCC7EF225BCE014E723B011E
+:10D4F000122578742D1C96B671CED95C16A7271B01
+:10D50000AA92BB221B64DD831BCF308D83C51C2EEA
+:10D510005DB7914A739F3675EE779A85617C5FD7C8
+:10D520007A64EE3A3FC78FA46DF89A4CA9B638C713
+:10D530000C0251FABC992F227DC7F5AC35633B94A0
+:10D54000FDE950D819040DC253B5AF17D82DAA3133
+:10D55000C5D9487049F119999A63027CB725E8103A
+:10D560008752EBCD8BC3C91BEF0345833371F8ABF7
+:10D57000B348C2608EE4E3E4E8E33C1F3B790D3836
+:10D580006EF45092A17B276404997A02BA299AD743
+:10D59000690FDA32DC85090583F1B9F21AE37D3DC2
+:10D5A000E4EC613A050D5EFFD094E4A3997720186E
+:10D5B0005F9B87CCEF80B1A7B17CB22194A7AD93DC
+:10D5C00082B5901F0D24012C3A94D0E898D006B370
+:10D5D0008460360851BDFE7C3E3767CF8CC20B6637
+:10D5E000FC5E2E7747F341E2B85A7733AC64EFA480
+:10D5F0009BAF2925FCC00DB67E26C8730D5DB8779C
+:10D600001E68533DD600409712D56A6C50A3172F61
+:10D61000C82A9DF6E3A04920F3DDE15E671CB2FB5A
+:10D6200087671C7F1E6DDBF7E62A3B93447DF93943
+:10D6300029308DC908CAF4E006DA5DF4134064109D
+:10D64000D0EDE0E026498BFCFDB951441ECCC80E5C
+:10D65000DDAF3F9CE5BA7C77E24089C7D8B6183782
+:10D6600089FA0DCE7F18FF42BB22EBC42C9A1F2FE4
+:10D67000BB58CE7F2EB44156249CFD86E8EC5191D8
+:10D68000F80A0589C49E6F6AF2E82507D2B92A70A4
+:10D6900026A6CA778D39F904BDEA1A6CD94AC3D8CF
+:10D6A000339D712B99FD9DA8E429014BD7D1A11E73
+:10D6B000FFD406060CA6E904DD2F7D6C7BF9771DEF
+:10D6C000D2715918006140FAB467F840A350F2BD16
+:10D6D0009C7CB1177B4D7FE1F5D758BD9190A77326
+:10D6E00071270FA9997819F6EE24DD84EDF9B0B011
+:10D6F000D8B4FD48FCA6386FA0E926654DB32A08CA
+:10D7000013B56124EA8ECA1FCCA68FE9EC128401FE
+:10D710006D13EC996E8FB0FF700A50457C0BBA55B3
+:10D720008AB18A2FAB051EEC0D6D4203443E9DA7C6
+:10D7300087F7FA40D8DE5BE8752FF32A7944BE2FCD
+:10D74000FA115A7F4ACF581125F26A082AE3117D4F
+:10D75000AB9107A5A02B16569606369D57C74BE6EC
+:10D76000A608BA913D736C9131DBCC98DA96FDE452
+:10D77000F4958044E764DE3F047C01FE6CE0AF7604
+:10D7800029055982E9B26D83F577EEED041A98C840
+:10D79000F49C0B38A9CF9E92C610E9E4EFE0E306B3
+:10D7A000D7E1FF7245CDC80FA3D5EF6E3E087F5578
+:10D7B00036D61FB05752DEAC8F01618F2593AF4B29
+:10D7C000D676C3A734093AE761435615ECE3216ED8
+:10D7D0004A1B083B584B132A2D9E9386D87093E31F
+:10D7E000ED2E1CBC3F25C69D969BA33D8756B59745
+:10D7F000936C6CFD191FAA2FECC6E0B1E9D052C2A0
+:10D80000DA30563A2102A3DB2F8156924E40193866
+:10D810005A18135E7FADDCA61366369A6B6C1D2713
+:10D820001FEBCBB2E0EF9AE1191F7308960833BCE7
+:10D83000A098A140A78FDEAF5F9012E4E3F712A596
+:10D84000E8A3E511243551E7CE6D587E6D61C1B96D
+:10D85000DE6194449A4DA04D0B857D84A69E82F690
+:10D8600002247B20BCAB468BF9E7E6D93E2B302562
+:10D8700031590F2356113E104493FF3B5531A1916E
+:10D88000BD572ADD66F75787CDEC1F55EE61C6B54B
+:10D890007A3662D75E5361DB002771262B3FB8A62C
+:10D8A0004026A9A5414BBA5B404C07EC4B5E2DD9F5
+:10D8B00001C49C53F908D683FA503E866289DBC0C6
+:10D8C000DF84D4DEBF25482CCE2F70A089EC8FF9E1
+:10D8D000930B149F933025268152A31C79D7165A97
+:10D8E0004CE20083DEE482E37EFBD53967027C886C
+:10D8F000A063069B42CDD7F8B3A8B99B4B2A0B96E1
+:10D9000071499003895B6B76BD941E1BAAE91A01CD
+:10D910008C0F205AAED295FEFA0BE98409EEA33B98
+:10D920003618E19B506BC0E19617F60FC8FE2BF737
+:10D93000396E93BF99ECB4DFEBC04419E287ECF485
+:10D9400039B7DD22C6EEC4AB50B5D2382A36C1DABB
+:10D95000CACE37D44CE1069FBB01F698E788DABD02
+:10D960008E57C7447F39B3EBD2B0B227F7A75C5AC2
+:10D97000923789DFDBA761A9D205FF01230F60176A
+:10D98000DD0FC03D92B5333410EAFDFEFFB383973F
+:10D99000589B5BDBC48254AC963860168F30BA87D4
+:10D9A000B30AEB543D34F7FDCFFE9DF141CFD8DBF8
+:10D9B000AFBAEDFA155061E81E549C7F67B2A62FEE
+:10D9C000872C94A44227AB3FADA0A2DE67F4BE87AC
+:10D9D000E46571191035872EB29386B725018FFD46
+:10D9E000795DF5D78D595C766D593B4F00D68144F2
+:10D9F000F4C3E6F499DC340480D84E8B1B01C1CF0C
+:10DA00000BF073505E0E39DE1C51266478707F581F
+:10DA1000F68EF83E850448614ACA601D479EB1A44F
+:10DA20006F48B1988B8559F7AF3B4801B257B5366F
+:10DA300013D7EE36F251B478C621D3831B27A2FA4E
+:10DA4000496CF008D654F4483E9A0863B65F48948F
+:10DA500058A40276915F743D6657620EB5D8DA46D7
+:10DA60005F3B91A454C09FC8A249F8F95E32E14CD3
+:10DA70000C8E466ACBDA0232BEDDAA94C93D2DFA7D
+:10DA8000A7E7F1B91E45B078C83D6AE4FE15183A1B
+:10DA9000E4483EB57670B90EDFADA25B7C0561B09F
+:10DAA00040409DCDB5A8A09485FF2932219DB0DBD3
+:10DAB00094618613A2D4C533A935265D5714858396
+:10DAC000A89480AD6A2B8D45E24A93A9B2766D7613
+:10DAD000DCCCE3DA0628067FB179CD04421704E2F4
+:10DAE000ED6A774DFEE3AA6F735FCF80AEDF0AA3C6
+:10DAF000B845D0C038E23E57DF002C931740BD0830
+:10DB00008AE7CAF6707BD61A2016C940F8866CF8E8
+:10DB10002A7BB33712497FDF1A989086354CE28210
+:10DB20004407FBF9B4830ADF256AA1EB51C40D2F2A
+:10DB30008B42C21E62651C5F56F5259EC6FA3D30BB
+:10DB4000C4606FFF2E00462C17CC08FAAAAC8618CA
+:10DB50009D366D34B17611CCC294966A44DA8BC28C
+:10DB60001624B1B4A46AFD5A76BBA9A2226D4366FD
+:10DB7000A150397442C817EBD0F7F2CC0934883879
+:10DB8000B938AF451C27BA7CFAE1DF8ED7B9B32F7D
+:10DB9000CF9422BAF36F25BC7728A6BC9848E14EF3
+:10DBA000DF6F04A3CEC6DF9923AE76D0DDE6840115
+:10DBB000B6F8D1D88184F23421239147B37BCDEBE1
+:10DBC00029D1986EC1EA26DB1D6A350A9A14854070
+:10DBD000C673B62AD4407EEF1B3317AF064BE6D48C
+:10DBE000FD831FF7F4BCC21279DA26CAE0EAF1DA43
+:10DBF000AD4D982183535E8FA57884004EC85E3169
+:10DC00001706DEA25292D128CDD83E0482F328B95D
+:10DC100086AB1AFC4FBA4F637A3949A77A99F28BCF
+:10DC2000C562DA02FBFC93192139E652A8E005E04F
+:10DC30004B689CA761D14CD55B4F4D2174BC7E864F
+:10DC400088866777644BB757894508F633D1DB0080
+:10DC50007A265E759A3585087DFBB37C85CDE7EB2A
+:10DC6000C533C8FFBC57084902AF8B0A0705190323
+:10DC7000D4E40FBB0E155EB0B9592D85CCBA61B195
+:10DC80003B042196704BDE6B750ACEC1024D1FA876
+:10DC9000D77CC0B4451897E71ECF2DF77B191A53D0
+:10DCA0005283C883998CEFC0B9CFD2FCC1BCFF8727
+:10DCB0006EB2EEA7FF8819B1C2696B069440891253
+:10DCC000E60D5C39B59FA0EBB471DD6A0B9E4EA1E9
+:10DCD0006148975D8E8507EF87AA9B45A67FA400C4
+:10DCE0009EB85A8FBC0826F47128151DD8E553F448
+:10DCF00076BAD5B6E3B816EF306694A52B56DACFD0
+:10DD00000E4CBD09A0EB04C9B3455E17D5F080C623
+:10DD10006780C1B29609D12FE58BE480D0FE152231
+:10DD2000BCDFE74C46D0775689E68472E63B413A41
+:10DD30001797C5DE2C6A3793FA8C7EE8041EBFC69F
+:10DD4000C71236C87E601976209BC3CEF668AE2710
+:10DD500008E1AD1A06B029370754AF4BDE1E254641
+:10DD6000B13C804D7B8DBCCFEFA3E2D1BA642F5480
+:10DD700089E6AADE44F07C370F7824EA466FA8874C
+:10DD8000B241AF81EC3FE9A46BDDAC3BCA34CE229B
+:10DD9000CB6EADDD2CC8C8CC7FDADE5A14047473A8
+:10DDA000D980512660E9C6BE007CF680013945D194
+:10DDB000D33F01E63497F58C4966A57C1F48E3FA0A
+:10DDC0000F7001656C5AFC6E990F67D2781C082E93
+:10DDD000640BC8BFB60494130AC33D9ABECA89BA7D
+:10DDE0000E8073664640D1BD97C6C30AB5705D7795
+:10DDF000A2A098BE72E12AEB808029978050135A26
+:10DE0000A0FCC09FF387894008C7AA32C09AEBFDE7
+:10DE1000898ACB13304FA51DBBA3599AF4B7A4210F
+:10DE20003807CABD31EF228BA3957C9C978A4BD6CD
+:10DE30004517DF707D90CDF3947CC8DAF9D4551A7C
+:10DE4000CD417DE71A4B0D0E20A4A8C623801E2FBE
+:10DE5000546E015A347AA9B58DBEBB5077101E722C
+:10DE6000C1F274504A0ED26758C2CFB3576C86E0E5
+:10DE70004BC3E9D5F03F7CF5E42CBC2EBB1272ED10
+:10DE8000B0B0CD5E925A545E378F8B2642F08F0031
+:10DE90002AF72E65D25DF07EB81CDD45B869727137
+:10DEA000B4DF69B914B26D2A7F78FF6DF1EBED1C18
+:10DEB00070C88A3A68D79892E1E8FA9E7EF52D6993
+:10DEC000AD97013F0AF66944078218CAC57ACAA10C
+:10DED0001C51CDA6A78A179B54EC9EA653AD51A109
+:10DEE0000CDE0B275B00CB98AEF12BCE1641CC3469
+:10DEF0001B79EBD5F3937E4025AC5735264E8F89A1
+:10DF00003267DF7657FD970477358D02424CCEAAF3
+:10DF1000003E161DF8EFDA0B367002769CC2AC316B
+:10DF2000B840BB59737EEED1320904CF01099CBCC5
+:10DF300006492A22BE59D17B6C2B5C570BC8ECE8F2
+:10DF400058DAD40CD5F38B150152579C2C9B97971C
+:10DF5000861847523B8B5B17E07864D0B05862203C
+:10DF6000FFFFCD4BEDEBC50CDDBB94421130502AC9
+:10DF70007C7CBA21B6EBD7369C25BCDD53644E2899
+:10DF800029226A7656AC5D474D0F621C4B9A6C781D
+:10DF90009A55E357DEB82371AE0F63E4F1ADA35891
+:10DFA00025A142357B530C0F1E1A3870E77537F6E2
+:10DFB000481632091EEAA31580BF09BE4F27A3CD1C
+:10DFC0000EFEEB3BBD9286CA20E9846AF994D273B7
+:10DFD000B05C6E030233A678C207BB25B19CF7374D
+:10DFE000918C03FC9A6328F25A7835B14627A8979A
+:10DFF000A934F4147F2B44EDA456E2525326535611
+:10E000000C18D2586D85468D6AD242E28A095E8D1F
+:10E010004C1A127EC5BE1A3132947BB07A0857B1C1
+:10E02000359297FF3CD6F86E81944D6462AEDE2641
+:10E03000C62FDB8471762CD4208C00A7A587D9DE6F
+:10E040002A6E9696457763146EB3F2308281B56579
+:10E0500040F376D163AE90DCC84DADC2D2C31CFC98
+:10E06000022499A2F8BEE7322D05AD9FF807CD8BAB
+:10E0700034ED992404F5E5B31C36D3FA2C40129AFA
+:10E080001444F4F18C7F65EC6AC0268A2F60CDA021
+:10E090006467BD1960D1F43005AED61FB482C6CD19
+:10E0A0006D8F21CD02A809993F655B8581B092F300
+:10E0B0000FD4AC96116A7B8156E59E52CC2FC98E47
+:10E0C0007BEB2CC78E04B93EBDCDE36A1EECCDDDE3
+:10E0D000C7273C6E58C1AC6EA74EB4533CB6AC9645
+:10E0E000F8EC6EA478DE6492DBACAF276424782869
+:10E0F0001A57BA4086D80FB22A072DD26FBD934B5C
+:10E100004FB84F4B5BCD801C009FCA63668D9B410F
+:10E11000B1D1F3E6DBF91AE489FC183581342AAA77
+:10E1200076C81D005E7B48525218E102D4A5C97A18
+:10E130008F316CC44A64B340472B0E4D08E2F06740
+:10E14000521664DEBFA10D1EE69F9BD9A96857A792
+:10E15000B3F0B63E4CB984CD40C4B036C0A23463EF
+:10E16000D579B43B3F1B7ED2184CAAC0B894CB9251
+:10E17000FB4E5DBD7C81F3A7C687C07CE1210B4FC0
+:10E180006B41F0006086C18B07433221A427CDD2BA
+:10E1900031623C1B54DD75C3681F78A24819A7BCC7
+:10E1A0009F7C817BB2291F7B3665A931A9A4673684
+:10E1B0004616F77700853168AA724C43AEA83997A6
+:10E1C0000D6323AA85D5A7F54EB49789C9B81AB1AE
+:10E1D00064F427A1BB2E1860A3F32FC5C13CECAAA1
+:10E1E0004C69625311B798992372007F700DAFA1EB
+:10E1F00074F6F02BEB25A9447E4CCEA5BA28CED0E0
+:10E200004F881F723FBCDE7E6B33C4D3C547B64117
+:10E210007C0A3D70317D85AB65A2ED572AFF59E13F
+:10E220002B77F5E95007AE1BE9440C8BD76C44E320
+:10E23000F5B218D6FF5EB3AB837C23FEC3CD068E4A
+:10E2400007C47A8197FE4CD4E9F00D0DEA243DCF46
+:10E25000FC48808B02B10B5398C4FF8EBF3C25E471
+:10E260004FE2D6478E454D38086A30723EA2594F6C
+:10E27000045118BAD77F4B96DA1F1AA465E6CEAFC1
+:10E2800023A7BB08D6EC483F8D84F26BCCFE660614
+:10E290003A0552F814942D79BB993F0B4D090C0D9A
+:10E2A000FFB187065F36791B882B039CA737320A9C
+:10E2B00095F0EBF64D6557130DB7950B94635FE042
+:10E2C000EA02169DB7C8EFEC371686EE9497F94E22
+:10E2D0009C02388A72B3C57C25D7FA88DD4332FCAC
+:10E2E000CD8D71DB17252C866C7122D32662776861
+:10E2F000D248EDD28ED80BB77A1B0323B28939E20C
+:10E3000013220A4C0CC3215F4B2707630BF550A364
+:10E31000DDD0DC68599C1A4922A144FE5C0839E82A
+:10E3200082A5937E67755D5ABE67ACC9468014D6D8
+:10E3300004593D4CA8CEA0A0260434ADFD6ADAF6FF
+:10E34000D81D53DAD11E4397C2D97A722D826E1925
+:10E35000C5D9C47F748C4804B7A5FF305CD3D2B351
+:10E36000ED10C70AD78C0647BB015B64FA338827D8
+:10E3700023CDE99483437E1AB57348F17893AB803B
+:10E380007596946FFF138C0EC1BC6E44B60C46B9E3
+:10E39000003DECEFEA1AE75127EE57A43299FBBD96
+:10E3A0006577C9B4EBEE82A25CB5BB0D6989598271
+:10E3B000EBCD129BDF083E0292C487FA4C5F5EC031
+:10E3C000CD342077D2DA204DCD5DAA43C04BB13A8F
+:10E3D000D8AC6508630CE683D9AC203F9431FDDEF0
+:10E3E000FA9B86F537C98A246FC76E791C07EBE163
+:10E3F0002BC034CEFB088D142BF114A5F8CB7E8BEB
+:10E400009C1606610F91FDC0EFFEF4D1EB1EC11505
+:10E4100056DF29A4B2C5ACDCC49087D1BC78BF9FBD
+:10E42000F4529F6ED55F7464950A2DE3C7FB855146
+:10E430005076AAFECCC6E1C14E1584F1F627DD5018
+:10E4400088DAB52C6F48E5E9CD66AEF20A6492F63B
+:10E4500091D88A6F680F246CFC36817051A0E5B7A3
+:10E4600097D36AA156A99850BB646BBEA327E698C0
+:10E470003FCF75BE9139B763E00AFD1D51E998FAA7
+:10E48000C777D4D98B3494E2307543D53EC3DD1BB6
+:10E490006E6380B3F55B2B5B2C235AF077D3E65584
+:10E4A00014779BBE0ABF997296581A2C0C5EAB4922
+:10E4B0003951467900CA0391176DA5EFF88A79188A
+:10E4C0006848A7609DDED4DCA8F87D0D7412465321
+:10E4D0005E13183C1E926290F4F39508A19C7F296C
+:10E4E000D13989893E366D3A83462C0E72622F9956
+:10E4F0002CA1B93C786B733ECD672E14BAE9C809DC
+:10E5000052C764194FF987DFC09A34FD9F3B6B4DAA
+:10E510006EF80859A87FD52AD24D5ADD24E55FB59B
+:10E52000B8D4138F4174A4C39779C4DD7CB48F270A
+:10E53000F60C8EE6DB5C1658279EE6A6B7EB2A7A29
+:10E54000AF84B666B4A6C6B7DD67578C401D42C619
+:10E5500045786522A71016640EA9D2F10DA0EC5ED5
+:10E5600076BF41131836030A34A28B9CF0565E9492
+:10E5700083831D7E1722C21AE83CC7E3468186E1E9
+:10E58000D643ADC063DD9727EDC4511B0A8368A550
+:10E59000AEABAF96C0A00645404941F53C28645754
+:10E5A0000EFAC90BB8FC5E8055BA48349487E79ED2
+:10E5B000B4C1C1562B7F56DE7DF1B002A717A47BF4
+:10E5C000979B46A7B01FBC52C5CC17D65158F0E850
+:10E5D0000F9FF15153D919F6EF695C007E8C3F43D0
+:10E5E0003CFB3888D205BF71EB75C001C802820AB6
+:10E5F00037EFD8BAF1F6E2939F46684AD36635D42E
+:10E6000046511606D52C4DD87F29DD9355405CBD6B
+:10E610000D7188EBE5C88FA13481CD58407D63072B
+:10E620007D96976996F4951FA173D9C34157621AD5
+:10E63000F7867045DC47A9FAD4F302BA4B56706CE2
+:10E640008E75ECF019B61D823C04A5E7BFCE2F5D98
+:10E65000BA5DF80AF7365B542AA4D092E7D1B1F438
+:10E66000197712F35625CA49D00D8CD3F3DD6C010E
+:10E67000598280EAA2FF042D2070A17599052223FA
+:10E68000AB6D43ACEE470B5E23663704E1D6F37601
+:10E69000088013B2328D2D8AC07700CEDCAB4313D5
+:10E6A000FEF3507419BB0BD9C412940CC15060B264
+:10E6B0000CD414E5F670DCC7DCD0F1B70AFD395E86
+:10E6C00009BA20EE6B3308A6DC5F9C0F0EABC98540
+:10E6D00032E454CD0A73EEFF2D0AAF0EAEDE479240
+:10E6E000AFFB60455E3075734026D2D2041316A08E
+:10E6F0000487499252CBDB75F138E4DAD428990DBE
+:10E70000E46ED964D4A6CD4CD5A0C6F7754A493A73
+:10E710002680A0F1E0D8681A6308C5A82EE309098D
+:10E72000E63604304060340E4433022F8EC43E0976
+:10E7300003F3D62903E6935C28D9A8E6619397B73B
+:10E7400052A7DB7256D07B2D555F9962B940DC41F0
+:10E75000AF3906937B931D816389E0802683CAEFDE
+:10E76000B89FD7262140AFB8F52220347E34952EAD
+:10E7700010A6937DABA6274B6478D774A4D6FC284B
+:10E78000E2927E96B65160BEFFD8666D7F7BFA41FD
+:10E790007EE8E6350F9E39DEA704FA751C1D17AF1B
+:10E7A000514CC23DD1DAD8D58619A5EBFFB99B9063
+:10E7B00068508DAB63324C7B681BCC4E3C79A34BCD
+:10E7C00047F64D26CB1BBD292F88636690AEBCB59E
+:10E7D000CF9B4CD0250596CCAFFC76282AD311319F
+:10E7E000490F75D199F86D5A1145BFD6D777C7B97A
+:10E7F000171152445C5470ACC1D3D0AC1314B8722E
+:10E800003A96120E465E921D2279C2A28E2ECB0639
+:10E81000857569C9CF19DFB2DCEF1910B0B558158D
+:10E8200047639677C8623E831B11FFF72ADE258770
+:10E83000286A46926DF14A21AF30E8D0F5F482168D
+:10E840001D14B066E1048B06417BF0743AB79F2734
+:10E85000630D6B47DD7FB49D5DB9E64F600CE09AB8
+:10E86000AB3EAA028EDB0A39AB75B822E0D365F065
+:10E8700062BAC0BE098BEA6988B0B0F1BA8CE6E42E
+:10E88000CB35EC05C073723F8585F18767801FCF5C
+:10E8900023BADC89219CA91D5718861E985AB843B3
+:10E8A00056377A05B834C04B399F542F5C621EB07E
+:10E8B0001A8B78B6888F2EC6B335C0938F50831DC0
+:10E8C000CACD9E937C803B9FD24539172CB71279D5
+:10E8D000DA5AEF1DE3119731A04843CDF47103E8F4
+:10E8E000A3B7F281919141E6D3C3B7795DBA1823FA
+:10E8F000C6835C71D98880CAF472D7021224BA3FE9
+:10E900001CF916447496EA0BA6D701CE532E6A1A48
+:10E91000D9D65B8E5ACDC32A6A335B1717DC9D1D8F
+:10E92000981DA364D851E06654A94CE2D0082E0C7F
+:10E9300072630953610B56EFF1CE350AA364056784
+:10E94000343F59F06CAC2394BF34EDF7CB93F1E92D
+:10E95000C007273BF232E0B128113CAE1A6F52A13A
+:10E96000DBD8C9721BA5D2C08E188C334217BA02ED
+:10E9700034AEDDA8E6BFDA070304878BAE04675820
+:10E980007CF9DACA926296DFAF8A79B04800F9A1C1
+:10E990004EFBC9AAB9707D6CC3CFC8C5140E80F3F5
+:10E9A000115661B54AC77B5AB3A03F3342644B3519
+:10E9B000B4D77029A4B826D26AB79BD9917E3C1AE5
+:10E9C0001BBF476399D735A5E42D69765A9ACACCFF
+:10E9D00008D3847EE639715698C471ECB1DB8B2D77
+:10E9E000DC4AEC5B025B310F0BF016F5BEA2639DB7
+:10E9F00028E889F2C2A4C1C46CBC3FF8FFF7FD70DF
+:10EA0000B1D98AB15396415C923ED64C24762EE31E
+:10EA100039FDD77443A777D4C5B816A1F00497275A
+:10EA2000883D8435DA8B65B1B753E729B63346990B
+:10EA300079788025DA2713B8F209B4B111F6A5A6C2
+:10EA4000F43467974A4A0BE55FC9FCE6F48E9BCB2A
+:10EA50001EAFE441A8D97DC30D8132301E55728EA0
+:10EA60008835FE5AEC40AD3006B468BC08B9013DAB
+:10EA700030B0C2A39A4DFD053DC3C8A6270FD8F9F3
+:10EA8000F192FAF2DAC61F621D61B3E45DA52BA014
+:10EA90002B7E18B070EB00D90BBA6C283E0DBCC0B1
+:10EAA000EC6C3E93FD3B7CFC39B6C15371D85ED70C
+:10EAB000922EA4BFE2D2328967BA0DB5054C0B5E27
+:10EAC000B5922458ECF899B31142B3832859030046
+:10EAD00058B1A03CB8D20851D53FC5E12A315640C3
+:10EAE0001547C0791B9EDCAFE92B56AC7B0A5F351E
+:10EAF0005ECF9D899D52222CF7CC809FAD19F8E501
+:10EB0000A1B7729C51F96C7E37C349F542DE2ACD1C
+:10EB1000B8E5206C0CDF22247CD5090FEEB06F50D5
+:10EB2000FB7B8A636318501C6E33F2D5F8935ABF8F
+:10EB3000EE95AAB9DBAA8E00227BA42665B5ABC6EA
+:10EB400046A948908EDB6A19D698DE50B20492FB33
+:10EB5000584450ECDC08C55837E83E88EDCEA3AFEA
+:10EB600047C655AE9BB99778F6C028AC8DC884D9F6
+:10EB700002237AEC164883B154AAFD484682032F3B
+:10EB800045C552B9F6C46E413D238C098B48C22756
+:10EB900047CE0FFCAEA542BA71441A79F18AAFEFA5
+:10EBA000A607D8EE45C246C58499E39790130BBFDC
+:10EBB00025122ECC5081839C9A38C35A8F28D52297
+:10EBC000F565D27CC1890299019BFE554675EF58C7
+:10EBD0006915FB663266B2E6E427DF4D4ABBF3688F
+:10EBE00088DAAE00C98F25C7C5F40CB2A1443F3DF9
+:10EBF00048484C7A2198901F24DE861468D164CB53
+:10EC0000F6757D6321955A50E0EBF8CE1FDCC310FA
+:10EC10009D6D299CDEB12338DE6B7D518CC3884508
+:10EC20001E492EFD6BCEE9488C5DA501DF4019E23F
+:10EC3000A34CC051A7ED531A466D84B0EC9170E916
+:10EC40004984E8C84F97A4087728E64EF50C670377
+:10EC5000FFD219F2EEA40D83BD0113B28F24F53754
+:10EC6000ECE6F3B01C5625CADCF76C51AAEF475D01
+:10EC70009424A499FBC5C3DE5C88824AF46D9EF59A
+:10EC8000B448EA9B24D792C48CD485A0C25B5D0BA8
+:10EC900014426904A50079F21F08BDC6D29991AB50
+:10ECA000A8B62A9F916CF4F8B0436E44B94975A098
+:10ECB00048E6DC14AC75D3D6B84B2CF10D8384F345
+:10ECC000E1534CB518F007836B76FDDF331E383DFA
+:10ECD00010BC118F91720410B1FEA7C768885E63E3
+:10ECE0008BE471FD73256B79A83C552623CE4DD658
+:10ECF000C5B4EA0081BD39FE84A578D05DB39F4CD0
+:10ED0000FF79CE1EC28E49BDBA2B4F0A701095FFF7
+:10ED10008FB58D409507578EBD706FF6CE68B6944F
+:10ED20005C70E63F8D5234342583D2C42D6A9DAC8D
+:10ED3000C3F0A38AA8BD67453272481F684AB3F77B
+:10ED4000AAEAAD458E407E76185575FF73E8F56DDD
+:10ED5000E30E6F66BFBEC89247545176A21144219C
+:10ED60004877BE70B15A03F33EF8FAEECFD09E3624
+:10ED7000ED9B8E1CB6AD296537504DAE60B652FC8A
+:10ED80007A00D12F24E98ACDFAB67E77FF132F9B24
+:10ED90009E6A2D1CBD4CAAD8AC6194E38DD2D4B927
+:10EDA0009A0F8EA372A18195D7BC603D5C9A862193
+:10EDB000DE2F56AAFA20886BC8984550151D02C34D
+:10EDC000BE2C3CF3116005CF841D26B6E7C13C8103
+:10EDD000EBD82E6BCF0478DDA2FF90590FFC468B49
+:10EDE0007315F42755D49070B004699E4A65464C5B
+:10EDF000C948A29E273D4AEDE8C13D3C97471E3BCE
+:10EE000034EE09F47FA6935AEFDE086770205FFBAB
+:10EE1000DCAAD0080291A6C51C823FEDCD6175A584
+:10EE2000DACE8E1BC32A0DAF4731263C84FF070D77
+:10EE30009B700285B47AAECCADC91CE43D5EF09205
+:10EE4000EBFC36D7C180080367034898F2F15EA84F
+:10EE5000C8547ABCCC0C79BDB6CB0EB217E955DFDD
+:10EE60007615CD068D26DB1801B108195EFD77B544
+:10EE700034D22D2EFC11C205B2C433592B2898A5CB
+:10EE800037310C1B694D1D50433AA459D37D8096F0
+:10EE90005383F1CB8A29FFD8473BB982E26D2938E9
+:10EEA00037F3988FCAAB284AD32C7EFB5FF5986462
+:10EEB00059C4F532C1440B97F873CCCB932F682516
+:10EEC000AA2CE4E5BE27E7617051AC4F15334C5CCA
+:10EED000230457179F33A58D759A46891EBDBDD152
+:10EEE000D22A5AF0BE5155A437B911CB53AB633F68
+:10EEF000B9D2808394B3582BC55F2D08B833D04C5A
+:10EF00004D8191B70EA450F175E5A2454D6655F5BA
+:10EF100033551DD0F7A253D8F1B0FD685835EF69CD
+:10EF2000E802DCB1E1F377B2BAB389A4B6C5C4385C
+:10EF3000F7F63754860503E8FCB0593E398B4FD4B9
+:10EF4000AA8CA5B159F9178806C6C0AB62496D866F
+:10EF500016EEE280F91A713D654AC7AADC744A626E
+:10EF60001E28BC3520C499EE41C8014A7DCDACFBBA
+:10EF7000988FEF2AC92A9B45190D04A25EB52F92DE
+:10EF80001AC0737AF61DD4EDEAAAE659D90A0678B2
+:10EF9000FEFDEE1BDE1B8980DEF5E80AE648E30D88
+:10EFA00069492052F7AC203BF3AD4351F97E87DC31
+:10EFB0001CD8A9F1FB352A4C7A40B2552F2645962C
+:10EFC0000C6E82DDE93F8DA2F06506FBB38A08CCAA
+:10EFD0005E15699843391953455DD4E69F893E9C77
+:10EFE00015164022A754719D925A4780BF73C68C54
+:10EFF0007302388DEC6FF967D8D20714CBD63CEE8C
+:10F00000B1A09FB65107785647A76801D8D8CF530B
+:10F0100023E5C44838CFD2C6893F4B7A17DE25395D
+:10F02000B68D4E5822609DB35111DD95C490671185
+:10F03000B73111C153F0617AD0A7A6A30B07D8DB73
+:10F04000E6736BC6112AF3605BD7971E677D62FA81
+:10F0500051F07D01D3212037E2A59DEB432941A842
+:10F06000AA3A2BF8965547EDDED9EDD86EA7144194
+:10F07000CB5F83A52C0AD42947EF492E10A89DEE1B
+:10F08000AB75E3A633E520C98B2B387D2484F55975
+:10F090007E5C0B3740440E0C8C4E82A44762F01508
+:10F0A0003A0F9B42A3861DE7CBD1D36E0572E8F8D9
+:10F0B0002D823AECFFDAE8C211213BDB66A6E0CEF6
+:10F0C0005E259BA66F6427E75C227651C40DA5A33D
+:10F0D0003261F5EBD94DCCF2275E154E7326086AE6
+:10F0E0009219718E1077F999E659239093A953A339
+:10F0F000D0A273D18C3F3CA14F4C3AAE595715AAC0
+:10F10000484F29D8EAB3A022F5CC025FA31F319C57
+:10F11000B45FA34132CBF580DEC580DE0813ECA0DE
+:10F12000F3B799C8EE0215D98D3BD0C10C424068A7
+:10F130009CB460A319A21421842281E2AC444E3312
+:10F140008DE8D75C75F8643AE2BD48A93B253C09D7
+:10F15000B4AC6C7DF939643CE86EDB483D95765C77
+:10F160003276F0711EA3DF858230991FB24BD6B183
+:10F17000F191AF8F9032D9DF5178CF401853AD71F4
+:10F1800050D78CB71638F6451FFDBC96D78FD66D75
+:10F1900040427D4D688AC0C7C0ACDEE420EC290542
+:10F1A000FB1DC64910E00E43AEC8062DA6FB3BB3BF
+:10F1B000F7ECA0FFA0647D819E13438265F23C9131
+:10F1C0009B771E23CE6D1022085A1C807203F358C1
+:10F1D000359B3553EDCC3656D1DF8B228F1351231F
+:10F1E000A6454DE21DF25B63E2DDCFAEC2FDF1F05C
+:10F1F0004A71DED902578A0206B5A0D8816A733EE9
+:10F2000067C5393933DEBE271E0B9924FBD1F2ECDA
+:10F21000EB90002EBD197BA9FE608E1DCFB8D5B333
+:10F220007E7130A4C755B0C70030D7EE8DA1ABFBBF
+:10F23000E15C67714F27A09E5B24FB84ED137DEB9F
+:10F2400098AF539D9D5B44D4904E568F9C37344D60
+:10F25000769BA8930869A98965CFA1096DEB027710
+:10F26000230D8194423AA9F938DDE94AD99166140F
+:10F27000CBE70FF25AEFB4411EC46519441E24B205
+:10F2800049DF3FC24590464555BD270438589C3656
+:10F290002FFB046D08232B344ABE5BD884D311B3F3
+:10F2A0001F421B6381D27BCEBA45685F815455D91A
+:10F2B000CA8B1BA5D5CB68B32775FEF519F3D9000A
+:10F2C000BDB1E51A81AC7E7526EBA2A44BACA17A48
+:10F2D000341F52C9177848F54A91F9AA7633581D58
+:10F2E0005B7FEF5F3A2DBDD1881ADEC5C3F602679A
+:10F2F00007A5D7CB5FCBBE006859C8ECA9EF202883
+:10F300004A17BF74975E32576E90DB4A23921321DF
+:10F310006AB16D59212ECFF9D8B9924C0DFEA93A98
+:10F32000318CD520E5931685DD6C3C8868C6A884B1
+:10F3300007B1F6BD3AAC5D4AD7219BA8E2998CEBA8
+:10F34000AE5F4934FC9126C28B21BAA351AC8DF239
+:10F35000D4994492F487D8E37C9AA05524F3AC99CD
+:10F360003FC60788A9F0F71B6680F7216B3E76D66B
+:10F37000DA3AE26EA86A85500AA35FEEB87786F59E
+:10F38000E44CBDD850E6EB9CA1B5B763A47A7FEB03
+:10F39000E0672C906FC9A6025B1AACEF680D27C31B
+:10F3A000F6B128CE8CE33424306C3B72C0687AC44A
+:10F3B0005BE3261D4964FB2899A52E3F0607AE4B4B
+:10F3C00049B409EC119A661B8E7406E53C90BAC0EC
+:10F3D000DEF77523402700C2B20E459EF7DB584189
+:10F3E000E4EB9B4F2ECD4453427F51851C8CB4746B
+:10F3F0001CA4866ABD9094AE19EDDCF1E50B558036
+:10F400001130BA3BF22F333A80F3B6A3F0657A7C21
+:10F41000BE6DF76A6C529A37FF0A3C5E9B55AA9FF5
+:10F420008EBE5842C4A0671235472D7D734CB92457
+:10F430006086BB43F106E62C9E888A4FACDA7E9448
+:10F4400068AC39B58343EA171AB8F0F6BA801CC322
+:10F45000F1EEAA25E40CA64FDA8D50580F8EA8873E
+:10F4600024D5A55B9EA22FE0895045D581400D2B68
+:10F47000978CC624BDB293C41C8C9EFAB48ED9223C
+:10F480000A587605E33A2AD60A06091BA4B8ABCC7B
+:10F490009C8C2B6E83C9AC5D91549BB853657B18D3
+:10F4A0004564A29C3575085101EB384C70B67EBAA4
+:10F4B0008B59B4C766A87D85D222DA1FAC7F5BFB6F
+:10F4C0001D7209FC277F4983489DE13D312CEA5399
+:10F4D0007950E53AAE1CFCE3185C7CCF3E9B7F2460
+:10F4E00029D7C776A022347AE8EC3D314DA6F392B5
+:10F4F000E7AE188231E6F5D5A08F89E0E4FBACF1E8
+:10F50000CBB9E649491D5481967B11E0699DF94DBF
+:10F5100043D2EDE9D8E028FD1DF21ECEBCFB790CEC
+:10F52000C0585E8241E516E746573215D5F06D0D9D
+:10F5300027A5A406278BADBA205D85510DD560ABFC
+:10F5400002EBC02BEC3F35E0C46AFF0E885DF9E3A7
+:10F55000900519425393DB831A55625001A8B11AE2
+:10F560004778FB08DD3400EBAEA0279524ADAEB0A4
+:10F57000FA7F26EBB186AB9222411F1FC8837B0620
+:10F58000E9735274F5A4923EF28DCBDB3C90B39DAF
+:10F59000E3F57284A75F0EF1B502DFED518824BF59
+:10F5A0008C12E25AB503215D7CFE55792B08C77198
+:10F5B000B376128BC8BA12F4AA9FE766818C562CD8
+:10F5C000201A4D3CDA80DEFF5020F3D065700F2208
+:10F5D0005468B1994108F1B45007EA4686C6EBF584
+:10F5E0003176D01306B931009F66C2FEEED4AF7AF1
+:10F5F000D450B0BDF52B7FE692E30B1E49789E01F7
+:10F6000085EC9B11250CC6FC23775CEBFEDD54E8F2
+:10F61000EA308E39B69818D06992C9EFD5AEE61C9B
+:10F62000AEFA7E2915D763EEF314671124C18F80DB
+:10F630001394CF80A1F1B07470A32D7F5317C22E05
+:10F64000AD1D2F520E7562784B5BB8487CD74FE2E8
+:10F650007DC842E0CC8D76C4625451018B32129F3A
+:10F660003C8E3E60876D292FFB2E6399996B66D186
+:10F670008470CC1D79175DC253903AD2B1281EEA2E
+:10F68000CABCEFE5DEAC0832AE1A1D85284E4592A5
+:10F69000A7B1E749FD7A00F7B9B6F9625739C01941
+:10F6A000AD5C456342F7D8571A47D024AFE17321C8
+:10F6B00029D41D542862442AB20A21F9FDB6C8A9EA
+:10F6C0005A3723F1CFF74A5F306F4E0FF961167C3E
+:10F6D0000AE1E3B3A6698248D1980F53CD59019A44
+:10F6E0004866AB5C70D4BC27A137F6102EDD0D83C5
+:10F6F00050DAB760AA67273331E8764CC7B5700790
+:10F70000FB70F17C95512AF6C37CC16C0D53E76800
+:10F7100030E1009196522B6CFA3B7D67E6E1A5073C
+:10F72000EF6F6BC3D48729B4D2863FF73AAB8A9F79
+:10F730006B3274F422CF01CF57CC0ED3BD3CE7E639
+:10F74000058177C2F1399430327C855756C8ED1067
+:10F75000503717944B44ECCCACD2418FBA05A74339
+:10F76000B61F7EFAD7FF6D38F6BB73B0D0508B252D
+:10F7700051DADEE5CC57A786B8A5BA69F812646DF0
+:10F780008DCB049DF4599264BDFF9D07FC2F5DD481
+:10F79000DD132D17FB44A2A693B9E71FF65E9379FC
+:10F7A0003B8F6DF6ECC73841332374828C7F023473
+:10F7B000AFD052C2B81EDDF7E30066DDB270CE5F97
+:10F7C0006C5EB93EB73196E6E9E3BDAB157E2878AD
+:10F7D0006C9519773372E5D55ADADE347A39D4422A
+:10F7E00029F7FB526D2D87D4A90E66138417D5CC4B
+:10F7F0008E7669F0BEAFB95B0A6DB185C9ADD452E2
+:10F800004FCF4F23E8AC74E9769EB7C63E11B15195
+:10F81000D5A7C0EA8C3984437C34DBFFF0FA03C6F9
+:10F82000183BFF54CC01ED5507B5B2483D2D984A21
+:10F83000EE4579FD4ECCEDCBA2E285A454AB0D7F15
+:10F84000589E0D71B5DD6BA825768535C9F4C710B6
+:10F8500000B3B773A43664D316F13E43443E0C495B
+:10F86000F70B9B2AE94F9D6E7CB27289279C273C3F
+:10F87000EA2866D78D30AC2106C342AF505BEF1B40
+:10F88000E404270343FF90091D7A5C601AC7A27243
+:10F89000F2851D882B9AECCE50BC60DA0841CD8EE3
+:10F8A000537AF718C5DB983922E760F8C525B1F817
+:10F8B0007E8088BA2BC6B14775E213E436E5096E3F
+:10F8C0008BA5D4533C6876258DD4A61A260845A06E
+:10F8D000D6FED33C9B7E3612A6185F69B10E625DE0
+:10F8E0007D1EE3075AAC5EC73D8F2F21C2263D7EA9
+:10F8F000A54DE47C7F09A589BA3A906CE0A8FD8605
+:10F90000F18FC4E7C7C54A9AD71EA5D69B9E0B693F
+:10F91000FC282054AF2D02782E1048B8A22F20B515
+:10F92000E98C3B80AD0C8B22218E0185B9FAB88B16
+:10F93000FB86624953E46B9BA7C35E90889AEFC92C
+:10F940009D735E84F869543E431024D32BD44AAD92
+:10F950001FF3E9418DF0B5026285582FD60BE6C33F
+:10F9600056DA877D993C87DF2738D4EE6D0AD8C6F2
+:10F970001EC651F7BC7DAACDFB8DBF7BEEDB522AA4
+:10F980000D23E663EA71C78811C1E84986CCE075AA
+:10F99000DA1BE3033B2CAEF1AB5639ED97B992007D
+:10F9A000B4868EEBD2D17B30404B37A303E689730C
+:10F9B000FA5B6772EA1B271CFEF8CD90F8571D48CA
+:10F9C000C9EACA9CDFC87A79A2B94ED4F91EFFA74A
+:10F9D000AD145C4DE4960D72FB3426F0D65EC7651F
+:10F9E00068AB92B43200198FB3760846A7CD06A152
+:10F9F000D0EB3D4993F28CDBF769D34BD21B1FD17F
+:10FA000037D67E8F02E64293DA6258FA43782A921A
+:10FA1000E080238F77165BE323811A7E09D67E77F9
+:10FA2000F141D7F1E01513DC6805B51E9139D09F7F
+:10FA300042C17437681C177DAFD84A9B61D4AB0FA5
+:10FA40002E6302B95A47FF63AD1F12F887D8A98207
+:10FA5000D69D18043A30CEEE3E9501853A1FDC055E
+:10FA6000251D19FCD12F38816ACB0794BB65F5267B
+:10FA7000CA4424ECC4ADCE8B9738E13DB1369A62CE
+:10FA8000687583BCD152C8E62C281BE3D9AFCF3FA1
+:10FA9000E2C39AE19452F6EE253C261A9E09674B82
+:10FAA0004448C933822796C52D0F796D0CF6913ADB
+:10FAB00052CFD7324B7D40E17E90232BCDE2A9116E
+:10FAC000F5B724873ACB4488BB62ABC7258EE4B038
+:10FAD0002A2353F6DE3F544007EDC13B3236D88D22
+:10FAE000E0553D55C753CF38209F664B52622E7666
+:10FAF000DFB63BDF3144FC089F18E8E4940F06A80A
+:10FB000092E67B9B903879867B98A93C4EA2989888
+:10FB100086F9C2D5689A076489A2CD7653AB0A9458
+:10FB20006C629115EAFA0FDCD22C23F95B2C22953A
+:10FB300036A866419197A7A38803DCDD98A23E7A98
+:10FB4000DA06C0193CAB4AC16DFDB70A5AA7470E89
+:10FB50003F6BC495ABA2670D78F31751EE6CD16083
+:10FB60008C3E903ACF2B2B752A633E8F7E7F791681
+:10FB7000ED09BDE7BEDAC005AB53F536E6F8801EE9
+:10FB80009C9CB2ABBB66CB4B75F74B23B8033BEFEA
+:10FB9000E1B2F12C761BC93333215B3DC7F6B1D9F5
+:10FBA000FB4EE861DFC2A8C236286663DEB8E93CD6
+:10FBB0001B9B4A2BB5342EF6E2400919E213471B72
+:10FBC0008B6EF705BE2F69D9951868A26E80DFFD90
+:10FBD000177215469051F4F9BEBD6A668DB6888CD1
+:10FBE000205205504032AC8EBACD81D706551AEE60
+:10FBF000A68956026F21CFDEDB0183B5D59903B903
+:10FC00000E63F345592801D2560D84B8FC3BAA80F7
+:10FC1000F2BF3723290A9FB586CFB5DC02A6DC0CDC
+:10FC20000EE8CA8F3D25B5CC060685540FAF363495
+:10FC3000C122629567D8B474AF6714674C2B9A7170
+:10FC400008983850759EF6059E0AABD66C16BD50C6
+:10FC5000474C9F3274B07CF741E03B14F991018E20
+:10FC6000A9329B96CE7EE61B1111C5D37135CA4AC7
+:10FC70004DEA6D56403FFEC69C3D86556A1BE20725
+:10FC80005F54846118695AE1AE6ADB4DE7E575BAE5
+:10FC90002FE77D106DBB1164382EC990FB356C29A0
+:10FCA0009F96ACBD139B27E317F8BF2C7E75230AE4
+:10FCB0007D444C7143508C4BDC4CC4B2BD43C110ED
+:10FCC0001CBEA6A25E6CDD6EC5ECFF5B994E76EAAB
+:10FCD000DC619CC4FD01679A14AB9F4F30F838710A
+:10FCE000068974C6791F2EAFCBD51822C80E2C9466
+:10FCF00004B3AA78EEDF7508D234F7E2EFCD976A45
+:10FD0000D495BBC9998D7826E5E9DD3A2E046C2E91
+:10FD10004A29DD01E3E42187077DAAEE39FCE69F4D
+:10FD2000EFA3DA92CCCD3E322FF955E438B1E0356D
+:10FD3000C8A4E150192264A72D74CC9308CADF4FE0
+:10FD4000B3638BFE3809E55CAC0EEF40DD88B22A68
+:10FD5000BE26A6194C247681B468FAEA9855947B9D
+:10FD6000C97DC4EF0DD12406443655CFBDDB9FCCF1
+:10FD7000966ACEE26C3807E059979C347961CE6080
+:10FD800045808BA341619C5C1C8E49DB3D5B91A44B
+:10FD9000FDF0CF440404F0912BCB6E3661983028EF
+:10FDA000052F4105A8B1905C204415B5DBFE047910
+:10FDB000B0D185E7B173F476841626232E5D9219AF
+:10FDC000C306BF252C94D07514F257130CC55F8A57
+:10FDD000C748A07BD391A6C282157ED2581DA5E943
+:10FDE00019A7D0F2EED8313EC61E82428549FD24C5
+:10FDF000404BA3A134F9CA4C5AB63FD75A91ABDF56
+:10FE0000AF956254D42A223269EE6C4221E4A1BC3F
+:10FE1000BED53354477D85F285DF00FED4AEA031D8
+:10FE2000AA3606456BDDFCD3835FBB0E43D4BBFF14
+:10FE3000E02831AB80BBA24055672BB73D3449FD6C
+:10FE400014240B1F075B5656FC7D1E2A9B4207A4F9
+:10FE5000BE02CA3938CA33FA3765D9F64BA16026D3
+:10FE6000158E75010295465215E24052909729F180
+:10FE7000E2783AB45EC307B6477DFE083BF31B8FBA
+:10FE80005857AE6F990C24638073BC6C634F7845F0
+:10FE9000284A684525903C4CB48CBEA299F28B82CE
+:10FEA00052520D4ED3E97047AEFDBE35C6766F1681
+:10FEB0007F6DBD954243C7B673191C2D8958C0612B
+:10FEC000F39433AC5328A3493269FC1B061D1DABC8
+:10FED000015E18E92C15A8176BD3BAC4AAAA22830D
+:10FEE000A4283D7CCC3FB5873EEA779341AE10CB4A
+:10FEF000C8F22ECB674406AE155D36E799E2648BF7
+:10FF0000D1FCEB0F27D9927A73D2F50CF9BC618A38
+:10FF100039B6A81046A0C8AEEDD8E8D2561DF59067
+:10FF2000D1805C2F37116C366505F7CB82B7DC18B2
+:10FF30002011C52957FDCAB7630E624885FF8C465C
+:10FF400011C546AB7A1316A5472DDE5E55A846D1DE
+:10FF5000D3D80996D4371D454E02EA0209CA053A9C
+:10FF6000B395E75046AB4241E00F4247E4859DC35D
+:10FF7000AFF5EF7AE69CAA6046318822F99B4DECFA
+:10FF8000981ACB1CD995D03A10B0CD0C820DFCA894
+:10FF9000148B8C6A792169A3EC49A4D3E2FC5CBF81
+:10FFA000225173487D7491BBF30CD1E5CA8D129731
+:10FFB0005271828AC75C45D79A1A691F2A32E8486B
+:10FFC000624311BC7C941F631B031B71EBCE623830
+:10FFD0005014AE5966AB0C9D6CD7ABAFF3A76B8ECC
+:10FFE0005D44E15547BCF5E8B609480D6F0735811A
+:10FFF0008C755B28573E3893BC27F1F88B1C744FE7
+:020000021000EC
+:10000000E65666153B1FE5E3C97E8D68DF8ED96E27
+:10001000E55EBC87224DE8270562867A4CD7E50E5F
+:100020007CDC55CC55D08EE507F6CA8FADA7B598C8
+:10003000F9E41A136CFD9A704CE93A9AC27E19BA27
+:10004000A749F0113AF6D03EDB73981C96B0EC56F7
+:100050005CDF720745B42CCE7CB7DAFA918BBEAB6D
+:10006000200377D3420C556EAB2A4864BD9DAD2D5D
+:1000700023B6B0390C1E649CF38FBED52698F49A33
+:100080004EC425927BE30922F6E68A968A71491FBF
+:10009000B525C8C7322F00176840F3F8B0805BC69B
+:1000A000EC8C7BBCFB0A81B8B638EC04A574827B6F
+:1000B0002B8436BF553C5392A8A06A935D0588FDFA
+:1000C0002E67D12AC9B4064576C34F555E2496489B
+:1000D0005F422DB213F8292C78F6154018C64CFE55
+:1000E00034AD69B822B0C745F5381C35E3699C7D4D
+:1000F000D110BD934982E1866329F8C6FEB73D4C15
+:100100008ED8CED9E3B1BE2C0E932B87A32FB9A9DD
+:1001100076D8903F4A5E51E00A828CF97D53460BB7
+:10012000E9279E09FAC91350C3FD39220286A35557
+:100130001948F926DBD240D8C4AE95F3CDCA6E7FFC
+:10014000939B6901417181ABA866CAD73B8FC65D9D
+:100150001BA51634350E7D8993151DCC4EE4A2A740
+:1001600051BF58C50DD9460ED53CBF3ADEEED73348
+:100170008C1929D8B49CBA6F76D864C4BDEF5D00E1
+:1001800089F7752D33D8009EDE64F1BD1CD6A0B270
+:100190009419D3050841836ACECEC80F64AEE693A6
+:1001A000321E60FCB7D95A7FDC35717448AB2737F3
+:1001B0004EF8F7CCA849D0181D3A8EBB141783E629
+:1001C0005FD24D75ED7C99B51AA2F96021A1535902
+:1001D0004722BC06799C24CCACF9E0C7FB507F5C7D
+:1001E000F8C0C364EF7D5A334BD7521E77D91692AD
+:1001F0004CE5D38CED15A6917B73AC5FC8A30C01C5
+:100200000187E35AE530096BBA469B11D9CB4D20E3
+:10021000D480CF6F19D70295638DD5EF5D20235918
+:100220005093708114452FB617519EC9A45BBAE153
+:10023000D898153E6CC5061646DB51BA3B51B23410
+:10024000F71DADB8028E1D3D863081D66803D2BF42
+:1002500029ED903FA5D6446A4CC1A9CEDCA24C4101
+:100260007C8055B08C1E9C24C5274131A898A64897
+:1002700027E508D5EFE9A6632D73259EAFB8E5689D
+:100280000234D80F7FE3358886134089E0409CD341
+:10029000032C2290E4924399A9B6E2EEAC411706F2
+:1002A0000229549E944950C86527A69BA7A1465190
+:1002B000AB6B04CE2A6898F886E480D81C10654899
+:1002C0007D09FEAB049C5EDF1F9EA9B68F0107F976
+:1002D00092A510A8CE30453352CCB1B8FCCE7247AF
+:1002E000DE408B28A36E2B4E154328F23B2B58493A
+:1002F0003D05F2561AEEE6C62A523B75AC70FEA8D2
+:10030000A4864FFDAF56B87DAED3767BA9D187A921
+:10031000CBCD08051802FA5F93A4AC12F1C5B33433
+:100320005115100179C938C068C7D4105DB1A3EF69
+:10033000B48A8E6DF2B9D54CD806D5581C3542F525
+:100340008205454737E26113398F289B70CE207EA6
+:100350000073C4E262FFAD278329EA78577D93B327
+:10036000901D9EA28DEF2F9D310F1810A500EBFB65
+:10037000E212F1DDF3E31BB536F3F93F57CBCA8147
+:10038000DE8569E8EE6C389407B58EE07C599239C9
+:10039000EBC1AC4D79A297BB004E356C802EDFE1EE
+:1003A000EFE10D0D70DBD2B2645C641CF61D2B41D5
+:1003B0009DD8FD258A0BD42AC4DF626376747A1D2A
+:1003C000A43A41A7DDEDFABE09CA6956D1958794D2
+:1003D000F2D57C64FAF86196F553484C791815B556
+:1003E00091A58142DEBC127C4913EABCC1F764329C
+:1003F00097B6516D579F22908B54DDE9A56A7732ED
+:10040000AD729E96FE9B77133FE3C6AAB75B6BD592
+:100410006E275CF56C26C9097D2A643957249899A2
+:1004200061FFFA8253FBB4CE7C6A14284702D97369
+:10043000A7D3ED7B1B9477CC78DAB735443BB882F1
+:100440006CEBFC2C1EFD0991F5B5612713B36F0A07
+:10045000F247A6F003733B31C45BD2C84BBDF8969C
+:10046000F547D6872702B25F7D3D76836C8F589F14
+:10047000CBDA53E7FEE4CEA50C284EE0EF2D90F248
+:10048000D2B1ED4D1DBEF84B73590E381503F06017
+:10049000AADDC3BC52DC3B92EA3A59208AC6BB9221
+:1004A000DC2F01BE31122CA7C8FCE6C7801466FC05
+:1004B0003EBA80A7FE9E074059270341201576C803
+:1004C000B28757888C1E5E4FF1434226536C994782
+:1004D000F4D1C8EFCA13C83D500DEF7A164FA6A34A
+:1004E00003250EBF91DD8E616101EEC39012964F20
+:1004F0001DA59BF7461D5A0CD46F5BE57B063ABAE7
+:1005000065141802EA2CA3CE4312C7B04F23FF2F65
+:1005100089F8828A540999AD45B4DD8CF36189D09C
+:10052000F944CA73D4543F4F28821A0B673DA686FC
+:10053000FD2545EBED582432A66AD51C0246A8D30A
+:10054000E612CA847CC3638974B67D8819B0DB4621
+:10055000380B5D8291CF7C32B9C0876BE2E26BC40D
+:10056000556BB5EB13624353362624ECF7B6628D18
+:1005700070F99143A8DED7B1411C21CEA24E29F4D7
+:100580009E2FAC4187D540790825374B08BC1527ED
+:100590000B73853B760C8A5E0F0B1100287587DB89
+:1005A00021889CBADC951D81FAE665945CDDDEA1AC
+:1005B000643759519E5F7C5F89A471A3CAB18A8C4C
+:1005C0004F412468ECFED85BEDE0A2B553807199F1
+:1005D000CF10C63D8BD371AEA5339BD2BD15184449
+:1005E000BEA3661701AE5A30F7A82E029CE8E64F6C
+:1005F000379018EEAE65FA953FF6AAA503F44418B5
+:10060000018B23F42BA69F19B732A6878CD4B7A7EA
+:10061000A92DBB50A28162E1736E71CA7673D88A2C
+:1006200046A9BDA123BB74FF3B7C0B20E7D0D85E5D
+:1006300084602CEFEC3DEC5E455C71EDAE4ED4B4C5
+:10064000A826652078BADCFC536E805BA941B58D85
+:100650004A03A24D44CF3CFCA7FFA69773EB492A5F
+:100660006E83B55BBC82C610C227E06139C985EADA
+:10067000B479DA5F584F066A93861213ECAB039E87
+:10068000C89055CEE0197875EDC93FD52310F545D2
+:1006900042A63A65EFF3E581C4B4F99E3EFD71C60A
+:1006A000CC56E493C0DC70289E2E060AB1DDD4003F
+:1006B00072B25E2F0CD76A0DFF2AB91A780383D65F
+:1006C000868A77915BCE24DC26189D29C3EE6A24A6
+:1006D000C31F170E5F9FC6226BCDFE69982B5AC1B0
+:1006E000F57F8DA0B42C9E7567F5CBB5B8C19FD8AA
+:1006F0007A0C8D28526D4B4F69C37162120E1DA288
+:100700007AD7AA682DACCDD41FDD813F4C5C10098F
+:10071000E7B8D8704CDC8D11CDCBAD9D4419FE737C
+:10072000F3D6D78FABFF310EE9866CCC7C54EA7CD4
+:1007300025052ED4553FD26CF4A418286F5BD895AC
+:10074000F95449F6E753D2C8D476B2587ADD7D968B
+:100750000A4D73C05BDF7AB14D4298134201698E36
+:10076000A01236095A0277A7439F9DCDDC68D67642
+:10077000348F219B8CCF6B3FBE0C71C11DFD9C76CD
+:10078000252F6D726BA5D30C6E918A067F9F4F1C2F
+:10079000F79B3AA9F1D4B8965803BC3C8CAEAA0B8F
+:1007A000D47AFB01A056B5BA0F5A4FDB706D55FADB
+:1007B000BB3ED80117773698A9A4268C82658CA9F0
+:1007C00073E44F5C227335CBC20E6E570704BB191E
+:1007D000BF0B88A4E5825321EF34482F7179C20FF3
+:1007E000F5F0CA1382D1B8037044045F5A7B9414A5
+:1007F0003CCCEA2573DDB1F7EF7D87612EA107754B
+:100800003BCD529971006C8D12BC72A10D5FC9571E
+:10081000157ED0A05952E30365FE8713E4D079AC6E
+:100820002624D3537583788650A86B0F5030AC4A7A
+:10083000F52307754410374AE6947C692EB9DB9797
+:100840009F02E16323291397BC65077C461BCFCE2B
+:10085000A5E6A9F4E9A92C8152E754F9E583F22D24
+:100860007523158D97AD7FCC85F2037091C2EB890E
+:100870007E89ABF1574602CBEDAC791CD30BA3EBD1
+:10088000E1E65594DF415837CAAE74B78E583F98A9
+:1008900003D3A568622129B241059E465B0E4286BC
+:1008A000CEAAF583C22B86ED1E3AEC9BBF10FA83CD
+:1008B000748595279E78537F78DF83157C59247043
+:1008C00047BD66DBC5675AD9913DA04B2A23CED9D7
+:1008D000EAE84B06A68EA6132651E101DF55FD047A
+:1008E000533190C0C07810D1CFE0B238E20B62B57E
+:1008F0007D4CC5B66EE7B30714121E67B2691C8142
+:10090000BFCD8A92C043869AA2754FB9AB3A82CDC9
+:100910002D71BD0BD24835C534158FD8577433604F
+:100920005BF8AEEAC62BE19D670E759CCAFEFAFE27
+:100930000EEA458D028FE995938204AE75BE65F18E
+:100940006853CA3A7B579A3CCCDAC104A7DDD57EFE
+:10095000202ED19231EDD98D8B089FC4F9A14D8500
+:100960008F024AB98FB5BF8AA90B4891C59F7258AB
+:1009700082706446309E19AAACFAC6048585EF5091
+:1009800051CF379E7F95917A9F089B6C563EC9D573
+:100990008211307375B6C4A0ADB9F312E72C83D8B9
+:1009A000A48C9F203AF8CF892BCFABF4583FB113DA
+:1009B0003251C7CBF585C5B7D728B3F398F1E4F822
+:1009C000CA04A04E4ED58576953618DD8D9558BD56
+:1009D00058FD3FD77F2E2A0F62918BC05472D1B53C
+:1009E000D1374F2B0DFC7FB8FAD3BE1CF1EDB46D9F
+:1009F000063DBB7EA5E76F60769A3B05C95254471A
+:100A0000D24CE5C649841BE98A395BD026785EC0A2
+:100A10001D33812DFFCF1949D520FB5B25299EE28F
+:100A200006A8A5A7907DEF7D414A3CE497E93E5793
+:100A3000C07BACD23CA9A37AEB850BC108516B718A
+:100A4000A4B9C3DA72133E5DA0D5239B3EA7D1D9CA
+:100A5000A832E71058CAA16BDC90BD15DE1734BD73
+:100A6000D1476FFD98A0DFD7CFE95E061275E5107C
+:100A7000A415D7B0122A1CBB3780555A9492BB5E7E
+:100A8000BB135D04722AFDCDB09ACAD81E79C2ECA0
+:100A90003D811FB074AD4334A95861A217A0A5B021
+:100AA0005B5E557E65A76D0B54F2CBB4D361BC2160
+:100AB000D06003E714D140FEB17AB6E7A45127F91C
+:100AC0002D675681323FDDC8556D59E59F2993EB5F
+:100AD000504BF4943F689CF75452A93CCED453EC4D
+:100AE00061990DD0B4ED5F39DA167D820E4F680B37
+:100AF0009C07D0DFD6C6DCD7CE95DEDB99BC52286A
+:100B0000714D6902CC5610D779D68EF3B64B32852B
+:100B100006C73E5F329F64540D0D75DDD2912FEEF6
+:100B2000C71FD8E1FF98E4904C67BE94C7594C2C7E
+:100B300059CEF2390257032C32F45FE3B26C5E1ADD
+:100B400094FD072348975BD1BA69AB1CF2ACA017A0
+:100B50004E56CBD6987913FD0EDA5B31EE22BD6A84
+:100B600067C6D728EBE55A344606D642CC34115630
+:100B7000040CB698FCEA2F6F3FCFBE79DC51F562CA
+:100B8000CE4BA832B373952D828BAA6419BD21BEBA
+:100B90001C8B33127BEDF71677C70015198C70E8A4
+:100BA000E2726835D728AB21BD681A8907C507CD21
+:100BB000350274EA7295418D7BCDC9ED39FD134440
+:100BC00044C9186E4B2A7B2E984766293F4715E08B
+:100BD000E3417B0E8125BDD3FAD6BB670674B1C352
+:100BE000DD5EF63F167A99119542CE8147D0D17FCE
+:100BF0005270E92F2E6FCCC6E3AE673312185874CB
+:100C00006C22DE9BD73D9B191DE1410B212C94D614
+:100C1000A2F97CD772990A6B53DB6106FF757B875B
+:100C2000D20E07EE10C6994BACCEF9B941EA42128A
+:100C300062995F9DD72195FA2E522932D4E533F778
+:100C40006836F3D612C674857FFC9033E89CE3C8FF
+:100C50006A39AEB41832B69751F55B001D69D1CA36
+:100C60004633E0B0B5F909D2D638AE34D1DEA2EDC4
+:100C70008EA686923DC718839C60C7F5940C22DB34
+:100C8000C10B2BF6B62FFE354BDE6AF8BA8F8356B2
+:100C90004724CD57E87CE1B6CC19FCFEB370F0696F
+:100CA000AE44511EA3658475349054B9859577334D
+:100CB0003EE4D0804FA12C3B09C42E1F6ECBF2FF27
+:100CC00078DA4B0D4B11D46006094FE1DFDC13CF0E
+:100CD000C2F110E4D744D3EF11A21C7FACFC6E43E9
+:100CE00015FE0A10A43D60ECD697D03EC8F04EF534
+:100CF0007140EC170233BAF9816FABC24B4898EAE6
+:100D00001F39C13203B5FCF86B8B992ECB690201F8
+:100D1000852B5C5B558BE247B2D411C82E093F8B03
+:100D200010107F48C25BF15DB883DC0DBD9E5DEFA6
+:100D3000A3EC55E66A9233702667C12018F83C444C
+:100D4000A481F8A93B2DDDE53B60508813759B7F9E
+:100D5000605FEDC991F58A31E69DDFB35AFCF75C1F
+:100D6000474468CA6B86C8EAE26C110778DF9CB515
+:100D7000E124CBCBAC8E2D4E5341803E7398DC6585
+:100D8000D20B0B4AECE515E5D4A56EE2880A9A571A
+:100D9000414E344F2E84D0E50573FD597B05432920
+:100DA000A47AC126A367BA2698D6A7FC098BBAF6FF
+:100DB000F87828E9F1B2CE6079C1493E71C40D32AC
+:100DC00023343B47637ED70D0B6D311458234EF10E
+:100DD0005813C912E815E3D153B0DD4AD8ECAF3946
+:100DE000693BFC6CB26D0519E7AAA725349B041377
+:100DF000EA645A18E5045681FBB4A825CC5B4AC8BE
+:100E0000AA69A1BC52E76EECB4F266ECC73B38EEBF
+:100E1000DAFFBBB4FD3D027B31A2B25005F7E443DB
+:100E2000F3A84761B6A5BA73C4B5E3CA291312ED96
+:100E3000AB99EF7FA25028B3D830F80CB0CAAC2FD2
+:100E400011FFD4FFA5EA12711DDBF312037E54E7F4
+:100E5000F492F5D983A6395BAC4FCE784D4EABCC2E
+:100E6000754410965D00135AF2F2FF5BFA4725278E
+:100E70004376FC8B2F645F330EF4073D627EE09374
+:100E8000A2CD0C37B7EF630F3B154B7DF9DCC69154
+:100E9000CA7E76533C3BF666425D4C5305F4C782EE
+:100EA00063BA1320AD310DF4263BAC9AF9BF47CBA2
+:100EB0007D01F834FA799EFE6E6FA9EC4FD4AD6CCB
+:100EC000C419B7BB374F77519C609456ECBFDCF91F
+:100ED0000A3D605BC80C3542BA3DA845EE5B648EA6
+:100EE000E9BA04C48C2722E187349BBF76F144CE53
+:100EF000F36F268050E9DFF56530F39DCF6F295001
+:100F000063686F410B25076554C99E42351BF9F391
+:100F1000BDC352A8486084C31E430E0B3461256DC7
+:100F2000248D14A7A6AF4113A27A37411B12FDE20C
+:100F3000508AFD6618B72A456655C1517ACA376589
+:100F4000CE4AA419F840BB99D9E5BBDBBFB8AA9F2C
+:100F5000FBE6DBCAEA8D170B076C7B9C5993826812
+:100F6000F33218DC80D52A17679533907D9979354F
+:100F7000528C8C3012D3DD4E566581A8544057CD2B
+:100F80002E87A380D87C460A6247285BD69017BC80
+:100F900043299BEDDCB74F2664CC9D30DBA22001BA
+:100FA000722FE304101F6FF95C68FB6F8D55663C70
+:100FB000A739C5F36CFA0AD04001F8ABA8D481DB9D
+:100FC0001D86A7B5EA100E7F5D6A6CAE50CEE9654E
+:100FD000F68E3ED8FA73F512B52DE5BDD75006232F
+:100FE000F8134A608E1B6F553C53957C661A4F3D33
+:100FF0004C80531177EFE8DC501CA5C13467EF47F4
+:1010000070B132600BCBE92E1C6A381D8ECB8E334B
+:101010009D09BD432690D5AE2AA60559D8AA9C8124
+:10102000CD1BC2FD50E04AF172324F9392638CBBEC
+:10103000F3836C0439800D35D152F99E7BA76E6B1A
+:10104000D68BA199005DEBF537D86F3348F9A481B1
+:101050008B63A851200EEDE0122FAC2994F38C8005
+:1010600027EE935CB857C749DDB9EC6AC48D1CF70D
+:1010700036F62EE6B1B5430D448CFA03A7A251F023
+:10108000CCE70F306A7579F3AF2A39E24880921BBA
+:101090001965C3712CF02B7FE0FDA283579A6E5720
+:1010A0006BF7CAFD3D48E2423C506AF57EBA9EE8C5
+:1010B00090366F136AAE49A37DAD3A097FBF104BDE
+:1010C0007C85E3DFF05D9735FE0F5EACA25C1DFA18
+:1010D00015C5793EA8C2C173C0F5F8DC3DFD85FF9A
+:1010E00008C54B46B91AD81ACBEECD8A4D373B9876
+:1010F000782E50BCAC68721B8367AED949E0E7829A
+:10110000BA8F4A61A94B8987748FAEB2D5F447BABA
+:1011100046F0058725863975E42BF48DEE90F2D1E3
+:10112000C681121A3B4AD1DD9D5E9FF144D78222CF
+:1011300021541D5C3AF6F7037DD0D7F3741A9BD483
+:10114000B072D5F847F4BB97798F02FFFB9665C064
+:101150004D4D3C7DDC483B51FEC79178053D3D3F00
+:1011600011C0A5EE5123392F2489AA7790A01B54D2
+:101170001F266E3FE2F1D25721DE3E391BB5DD87D7
+:10118000A37A47A30E5EAB9423FBA646E28846DD16
+:10119000688D2D277C28682CA330768EE9CB28B269
+:1011A000E5B2C5BD2032B406B3A5A5EB06D32FF436
+:1011B00037AF67CF07FDEE4EC97AD2C8763144B853
+:1011C0004E4BBFEEE7BAA310221D28699F3DB6859E
+:1011D00062420DC6B00AB938AAE0B620C0D798421C
+:1011E00086CFE577E7F2AB40BC553B758E6F65D592
+:1011F000A76ED4AF6F381BF76DB941C5F4925C7D13
+:10120000937FC2D47E7A04C57EAF16AFFFAC21CDEA
+:10121000AA966FD02B0C796599323ED1EDE908A8DA
+:1012200012E3E8E3AF590E5E8EA19AD25B46C7D4B3
+:1012300056BAD6DB184843623ECC0C00B3FAA9720A
+:10124000DE1BD136F0C9D54E5D555330E72A5BC958
+:101250003AE8A7CA6EB212945131F5BA82C2F81CAC
+:1012600092D34E7A5D5EB8B28BC46BD1F0F3DD825F
+:101270005BFF1BCB2A8F3D49548EC0D720EA72FEFC
+:10128000631D6F93BA15027DB65CAD5B063BFC56E1
+:10129000A21B830DA192B8AF98EB99FD469D79D71B
+:1012A00018C05D479B300E7FBE196D05CC0AD480F7
+:1012B000078B1BCF7481E2DBB18C272CC9429D4088
+:1012C0009CFAB067486705DCD30B3B586FC5839425
+:1012D000A11A0925B3AFF5A64D25C199FB1E11D65C
+:1012E00015E005B7A0E02740008765F588E565A60D
+:1012F000DDB7E2ABEA0F0E63DCB3CE8C2EF5F3AABA
+:101300004E223D0F44C21E6845758E5ECA11990F6C
+:10131000BC989101E1284204D7F16DB300E3A1E745
+:10132000412216D80E27C8C76C0A2D5105EA6AF566
+:1013300073C7AE1142C292C188A9DD6EA91E2A8B65
+:10134000ECA578498353A09EBEC28C12E31BBD3925
+:10135000516D579FA1C135C2924F9E128278E7FE10
+:10136000696D71BD27BC9CEB40A193CC955229A21D
+:10137000CE625459F9C5B69BAED063BFFE8763EF0A
+:1013800063EDD4F1833124010ECB47C685880F8FDE
+:101390005B6ED5AA2FAE3A6A4FF8FAFEA3DA5B84E9
+:1013A0002D7797E866AA6B16E8EB1253DA3D4D8C61
+:1013B0009473F1B30017B2B28FC3985044CCC3EC0E
+:1013C000F41F2ACB1653649AE515AE4445E7E79C13
+:1013D000903DB27016DF53D21F5797F9162D5E91CC
+:1013E000C535C2ADBE133E21BBF8DAAF940A28E082
+:1013F000114E6ED7B35D405C1D7BEF315DDCC15398
+:10140000248675637C084A2B8E06B8494AEC772DF2
+:10141000DE3CADA8AED203967CEE2B726BE17BEA8C
+:101420007365899185A6BCD41D58F3694738BF01FF
+:101430007254C77D55843D526E4AC7C4FA50377006
+:10144000C796C54F95512F5D6C7A63C26B7BCBA459
+:10145000C6B5E98162A2978130E9B2DD03598FFEFA
+:10146000331C40966F5F0E6D27928814D63D521440
+:10147000B02CB9F222DF99A838D668E9B67C9F086B
+:1014800089A9F80065FE4CEF54A85DEAFED68B17DB
+:101490008F64C1390C35E5770AF1E56E2F1B427078
+:1014A00028A96FDDDDF9916F90BA6B962AAEFDD752
+:1014B0004AF999B1B61996C991FDE89D4A9F14352C
+:1014C000E042184CC0B343F5117A354633AE3D982F
+:1014D00085151644A5BA27EA4DBFD20A129DF58B91
+:1014E000ED398D9C31F5C1FFB647EDFD1261FBE290
+:1014F00086F705B963137115714BD57E87DBC45C24
+:10150000308C6369F77618BEF5B0933265CA04BAB9
+:10151000408A3615B74FAA19FB9F2C0BBED9A45091
+:101520006FB35DA7697C23B3642DA80B8D0F61B0E9
+:101530004E54A845A899C16898855218A949D01653
+:101540009994687E85E5F0386C698E16619DCC4B68
+:101550002713BC9FAA1484401645523A3FB2EDE3CC
+:1015600036312CE26B37B11339BD661C4480FF0560
+:101570006F8DB84E6D764F7F173E0E5182A0B656D6
+:1015800039DD1AA277E13AD2531C71812286553C8B
+:101590006791058FFF5DB094C31D282F3ADBFD3D99
+:1015A0003FF5236F2D507448B823E29F3BE9B69F67
+:1015B0005D518A6E666A66A0ABBA494021C1F9A046
+:1015C000CA25DE57AF5558665316FD719D17CD8F4E
+:1015D0006F89B3F185ACFE4CF33FE4003BFCE2ECD9
+:1015E00063EAB30DFC9865CE32A8724007DD68A9A6
+:1015F0008DA66F65EE51C4C2B8305AEA0209A054F4
+:1016000090FB12EFE4BFC84044B535E10FE9F59215
+:10161000C64532DF53DD7AF96FBCF8B905CBF5D496
+:10162000CB555118FABAE011E754E0947DD4AA25BD
+:101630001E08DB32B7D9C63F60A81B559B665715FD
+:10164000891C1A3A90FC3853D8D5217FAA7FD974C7
+:1016500046CE0801F577CD4EDC2E94A0FEB5E338DA
+:10166000B96A9C6FA484688B60E9DC6DD2470E8DEB
+:10167000C21A7C27A76AA9CC1A5A0497D8E5AFDD0D
+:10168000EAC32A10EAAE7E625B6B83B77AC36C4B07
+:10169000B9FEEC5F015D28806998A02A0BFD2176D8
+:1016A000C9CD3715C58A42200B164D9C11A02B9928
+:1016B000BE01C56F0D87352700AD4493CA129AA5A8
+:1016C0005BA68A9E6ED6F9F3D9BA5BF1406E461BD3
+:1016D00071B8C16DA06890F4E3E2C565BF676C5353
+:1016E000BAAA6A450987CBB88A24C17F3313F8594F
+:1016F0009232B3E146AD8609543082F91E0BE1C740
+:10170000B20E863CB7D8A4E60D8CA7B0E568CFF73B
+:101710000AA7FB752432935CCBFB07479CB0B770DC
+:10172000A1D79E0571AA70391CA9BCA7178D4A3F85
+:10173000E21F0D59B0C370E3838E209CF321A8549F
+:101740006883A15249B7055380A2A27C72FF4DDC89
+:101750009428A3A38A2F501A74E2B6657855F13104
+:1017600047A314A4D6DD1F53856E9BD265541B2559
+:1017700030FB435E73FEB4E3E8E5F906B85915247F
+:10178000D3DCB8F8411D52B3AEF8948853AC5B304B
+:10179000E85C01C78189888B6E25E9582145428D17
+:1017A000052D0385554BE1B0C883001A304D673DC8
+:1017B000530631B5905AE253BB8F985DAFCBE1D45D
+:1017C000776DDFC48CDFA3528C86BB971EF77A3B04
+:1017D000C33D196278590ACEAAC99DB2343FBF836E
+:1017E00012DEC6625716A3B5E74D6E4F081A81A5E3
+:1017F0007CEF101373C541120BEC1435C8CF7D0E6E
+:10180000F334C7C18AF5F5600A63CE48684BE50634
+:10181000DC22B0BF4439697D747B1738F1ABAB2E45
+:10182000AECBA36D312D531645F652579295447B9E
+:10183000D985A4B43E77F2246B117934414875D62A
+:101840007D8540E39FFC2EE2E402F74D9A19E8976C
+:10185000DF15380E0F629D453E435734491915A1D7
+:10186000543FF92B5B642F314453E47867A486849A
+:1018700004B5950D76256F8CABAA5005F22F3FD895
+:1018800087AD5231505BA9036552F47C80820C6FA6
+:101890002301EDEABF033701A95504A8B494FD6DF7
+:1018A0007E1C377344873D6A91C0C8FB8E361ECAC2
+:1018B000C7788307B2B2AAE2CC607829950EEB2DE7
+:1018C0001F876364217D62AB9E67841573FDBF4EE5
+:1018D0006004B2591FA9EBEBBC1677747B9B3731C0
+:1018E0002606FC2E3EEDABFEE6B9C4958743CDB689
+:1018F0001365F333754C922A49AFADD337E635F40F
+:101900004AB6D0325BA90DD99204F57E132C28F982
+:101910000FC706F61BA404F71F8CA06DEA0CD90CA8
+:10192000C3377B514F3C65E635CF284980510D17B1
+:10193000A0BC1ED3C2FB69BD4AC61FAA5EE6755F86
+:10194000B058946ADE746D5600540F8D48BB940FE6
+:101950000421FC15BF5BCFEA9088C2217F3A679BC8
+:10196000988B19C2CA7C45804592DE10101D2DCF80
+:101970000DC6846062A1B2FF06943D57DE07E0FD0C
+:101980008AC0B0E5D9417F93AF214DF823F2E348F7
+:10199000DD89ED309DBF04CDD3DD1DBA0BED439342
+:1019A000B98AAABDF1987FA2EB9290B5B11A2E7DAB
+:1019B00070223719E66D975BE317FA5190E1B47521
+:1019C0001E8A79A66A529823C05A14E23737658175
+:1019D000E12023BE89B97B4C1BC9077B4374792F57
+:1019E00034F327F5F37B2CE23C6A9193529F2AFF54
+:1019F000C3B5FCF3A6705C456B7CBF7CAB185B8DFC
+:101A00002FF9CED16B0A11C59EF98E25446DE0ECFD
+:101A10005A8F0026F429689545E48BE67164CF3F20
+:101A20002469D5B6FE27424284180BC5FCEE95BA50
+:101A300086DF79958D9986FBF4DEBFEC1EF2E922F4
+:101A400022A85CE4AD7EE71D6315DE6567297AF6A2
+:101A5000819950A9803AC811CC06C7F19E3752DD52
+:101A60009FDEA8C235C2B0139FA4F65804D806E57D
+:101A70000FFF6BD6C8CF4F2EBF57D34FAD48215164
+:101A80003EFD7249F2BA29A443537625FC7C1A65BF
+:101A9000E33EB360525A23629A5B52C83946A3A40C
+:101AA000E63E667C2C3605CA35CF169EB846E8E978
+:101AB00036FEF68D4FB84FF31770C468DCB466FF7E
+:101AC0004DA8C3A580712A84D0BB3472CEB9D14A47
+:101AD0005D11B0E036B49DD5FB49041F02B6820209
+:101AE00045F0EC132168C9DECB612CA0014208D778
+:101AF000C75791471C9C54B81B46105630F2707F54
+:101B00005E3CAA834BCFFF89D02EBE3D447F324638
+:101B100023D703ADFACDB07B808D7FA132BE5910A3
+:101B2000E16DE37072FF59BF83B644DBDB6818B91F
+:101B3000BBA1B056C1FA22C8EE32842F7B37C4B1A4
+:101B4000C1F3E83F74D5C13B7A9D46A1CBDC69E87F
+:101B5000226E05219F9F3E66221333B8A3D4CA8B01
+:101B6000FF0248BA4705365277C17A1993FCD4F67A
+:101B7000611CBB8C944F751E3D0ECE94D5649AB7F4
+:101B80000FB24FDF39FB503872056372E10065BE5A
+:101B9000A210439977483FEEA3DAE7ECE0107B8987
+:101BA000E286FDC0D5ED394233E7FFBD1F7C4437E7
+:101BB000818E6A6562B5A49FB742BC4DBDFDFE0D26
+:101BC0003F0080DDA86485F17B584572E8F45D2E06
+:101BD0003FCD0DC857EB7731C4C04555208431B691
+:101BE00039050833354FD38730FA6963D01BF9A61E
+:101BF0002BAF74738944405A00BBD19315A4581479
+:101C0000C0F46A13FDD7801B6E68AB9FDDBE872CC6
+:101C100088713096E6FFA2D088FAD449E4FAF10F31
+:101C20002593F87CD571D839A6998033DE31F60238
+:101C30002E6D40A634EFF5AE6532BC4E9E291C29B0
+:101C4000310A4824F47EE708092D65251AD2BDB073
+:101C50005443D21B22316CC7523A45FB3ED92694DD
+:101C6000952E7E17A36C9FF3133738AE3B5EDEF2E2
+:101C70002BCAFE3D933C9B1C4F73E53E3D00262541
+:101C8000536FCE5281203F5F86FAB041252E0E4120
+:101C9000D2A56C342991A88DF221F6B071D36E0DC6
+:101CA0005A6144EE694AD32DBB1808D2050EFAF8E2
+:101CB00074892CD2EA53A28268BB23858B66D20B2F
+:101CC00085D2E52EBE3194EAC08D4E2896178F201E
+:101CD0003DB1E697BD180911B1AAA70EA303EC10F8
+:101CE000621CC79A2480D42D2826CFD80B88BA9B93
+:101CF000D82EE96EFCFF1BEDAFB16DF7DDBB35A84B
+:101D0000CA4CB267A9A950A01002EAEB41EC1C8AA8
+:101D10009136525CD1D4F085415722D8C5925DEC02
+:101D20001EA9CDFAC4FB7E905395359A43B17E75BA
+:101D3000F0DFCC28C2CA0BEE9A21BB0153229805D2
+:101D4000AFA3CC53E25DE45A25DB621DCD62738103
+:101D5000E5B0E11BB9109E0722CE6900BAEEA52CB2
+:101D6000E7E68F2F1D3DD9D9C6202B0D938139046D
+:101D70001CBFB498E033F55B33B7F12C3E239839A0
+:101D80004F903ED2B87993193FB8680A9843798644
+:101D9000ABAF87094F2F859D4618647500D424FF8B
+:101DA00032DAB15623CB164D5AFC38DF08D11A96D9
+:101DB000F82E1B1C7E67EACC1F9B272B8476E185BF
+:101DC0000148F012AB62DB591A46E5230C49D3FFF8
+:101DD000A194A062588D1AAE5ACF8FB073BDD2DADB
+:101DE0002E85192CD391354921471C9B6BA731FABD
+:101DF0000F2A3D32D9712F3B9653EEE165FB3DC072
+:101E0000C83231B88C86F98D2601C3EC201103BF8E
+:101E1000F19D5E5BF83DC433383B44BCCC52451A5F
+:101E2000359B9DA2AA4502A2DA41057381E3B6E47F
+:101E30008C5B7F5CC67CD5D219DA13D4AC9EA8D05B
+:101E4000E355B7CF2137FAEA52A1E62317F44C370E
+:101E5000F2AC220ED30E9ED95CCDC650AF061494C0
+:101E60001CAB55004600702A7DF8C341FF567EA783
+:101E700033FFC0EB1B43058BBE91D972BE1A2CBB3E
+:101E80002F528766ABAAB2D29911AD66B3A283EF87
+:101E9000FC024A9DD9AD3FCD8B4B354AC6970CF31A
+:101EA000569D5DC832E59095A48799DA932E7BFD07
+:101EB0003C54F98D547DE893E7164C818895425542
+:101EC000FAEF6639B27500CAEC7F8CE4FF09BF43B4
+:101ED000CE8A5DB5172D9F17370115B27E11B5D685
+:101EE000FC53386D0FF10C5978FA069AD595C75AFC
+:101EF00096B39DD326B95DD4E6FB37599612A33627
+:101F0000C62309B8BD82C5CD85DDD787AAD8B2E87A
+:101F100093E8EF2DAFA31D5AE3CDCABA6886EBF65E
+:101F20007A4FF43F3EA4F6F727D5FE3F8428701B76
+:101F300092D954519173EC88EFC1D463BAB2C2B94B
+:101F4000ED4ACB574EBCDECABB7B741247590976AB
+:101F5000D3D4C06EF0FB282FE00B34FCF7F992A429
+:101F600025987A2D55D00CE4444A46A7967F3E2109
+:101F7000FD43A9B62388588340B3550A8E65CAEF3E
+:101F8000E97196533094CFCD91D62B163C2A8AC84E
+:101F9000CD409F06B1DAFE822100976291EF136077
+:101FA000CBB7BEE4BCCC318C24FE54542D050E8638
+:101FB0005D61D1C69AACD77869D5ADBD4D57AE2617
+:101FC000FFAD3FA08EC2AED5B679D9A95AB0CCD854
+:101FD000C5834903C1B207A2A26FEDADC8A350E407
+:101FE0007D4AB5A3113F865180C9867954E8093FDF
+:101FF000AA7D8C1B68580E0012DDF43CB830F44802
+:102000000F994E30A3D5066ACED6B8CF61102163A2
+:102010004B2B52CB737A74686BA5A8CAD4C6C02A5E
+:1020200093A7AD67FCA2C3C18B7749129967A0B291
+:10203000620DC443D14B9E1BA3D1E24C964D412669
+:102040005BE50644EA2EA14ABDBD326E89BC523919
+:10205000ACF032F4BCFC9FFE0D657C76B359FE5BA0
+:10206000052FC13996A81E3EDFD93EE3C803201DC7
+:10207000250AC8FA7B62707F4BA3846D04B324AB3E
+:1020800030DA48ADFFB336431D44E8D7EFB6D76822
+:10209000BABD9243EEDE2AF2D34EC499EB45BE1789
+:1020A00017671135C7063534C867F44A8DC12AD180
+:1020B00024985D87D00879C724D9B66A74BA9E7609
+:1020C000BC71D06B186FFB5C0502EED950570AD774
+:1020D000497C1BB6E28AC20CBFEC7B3D1D5AB4E9B9
+:1020E00042604B009DB7226F8D6DE57B97472CF9C1
+:1020F000E8DE60B185CD42087F6ACA17E12A7E8991
+:10210000E3519F2E7B0D418FB613E26EE2D903EEB1
+:10211000769CC7C823C4DDCB5EFF6BE022E6D417F4
+:10212000A6B25482CBCAC9064CE607A45386F889E6
+:10213000A773BB327BACBA9F21E0236234EE44EB41
+:10214000594DAB1991BAC8D8C4E11CFA3488E0B132
+:102150001A6492759894586E95A4AFB860071210DF
+:102160000CB33C04AC4F1C6984CD5406C5ABE0C431
+:10217000372C4C88BC43B44559ADC4F85234833C29
+:10218000AE5C3F88C4BBD6D19AB8684F33BD20E05F
+:1021900056909490150A77C1DF4E1288BAA90A2D7D
+:1021A000DCCCCCA3A6B4BDEF658F1A155044AAAF02
+:1021B00095C1AAF028552A10AC2049AA7C77E3A142
+:1021C000A810B40485EF24705D5BCC7C69C98A09D2
+:1021D0001B34314CC5D297465522961DF14213D17E
+:1021E000031BB0545E0C0890172278A58862987D76
+:1021F000ECE3CF7BA78C554B6B016C8D445F9D8FBF
+:1022000082AEFC06AE37E760B6D298BCDABB2935A1
+:10221000D54C2D7F5C9E4A0CAB2AB74C01CD215486
+:10222000D1D1D3740177C0B54B50223EDC5CAAF209
+:10223000031E915BE750DA7923E46084F507C88ECA
+:10224000B51868E7955F2C821AC48EE98553003C67
+:1022500046039734A3D6ADBD361F8A73BE366CC80D
+:102260008063931FE605B6F466D4E15A18A23BC416
+:10227000A34A17DA00E9FF20FD16DC788953F380C2
+:1022800031022BD9DDA50E34F484DD28B9FDCF5001
+:10229000CA7564638D18DF95FFEAF7E0ADBB48F0BF
+:1022A000A564589745D5AF84B3E02367CD65518FBA
+:1022B000BDB8BD2FF75946C77E784F3B21ACDD2610
+:1022C0008D3E4AE554CFF948D94996F626A7CC3831
+:1022D0005EFD2A4814941D7A5141156CE472468EB5
+:1022E0007806A9BD6B6CAAADF056DF6D2A7E251A63
+:1022F0005A007FF0E71E8D322E2180BF9B91A87D72
+:10230000ABB10D5331CFDAAD3B52C18B74C9E85735
+:10231000870DC19FFD2398C17F55672A4AB7508B0F
+:102320002FE82785C961F2647594BDF6A1A60ABBA2
+:102330005FBA2A8B7C93991A0AD5D20E9598EB38FE
+:10234000932E77B9A3B22AE1AB5D30CC0204362AD2
+:102350009FEB4DE21D42ED15A70B2596D0EF94663D
+:102360008E3BE72F8D07F4EA4E5C2F9818B2345F4E
+:10237000EC4537E96357F1D76EEEB1BCF06DCB6930
+:102380007B057A1B3D086EB7A23B3B9F24310E9222
+:102390007CB82F2DB9FA9C6A092932CEBD6CF6E8BB
+:1023A000668354A37854A2ACED6A7E5219CD0F8691
+:1023B000B0939E137338BF9B82509202AF4849EE90
+:1023C000FFA68BD732271C0B86B65B321CE93EE595
+:1023D000DA0AF9630ED6759C18ED9E884FB504C0D5
+:1023E00068B13D69573FFD735016FADFBBE2F993C0
+:1023F000D1A937314A875C89366A2E1F2913545375
+:10240000ED5E6CF37CCF35E98DA9C86490EC9DFB43
+:102410002F22456F0D7F1720425834C086B0B65D1D
+:10242000A26390BF794472DAD271BD67CD7BABC035
+:10243000E4A67A6278576997880130EBFD3A330455
+:10244000ED5C82241B0C1C3A8382AD8B46C953BDC4
+:10245000A101AE6C36C03CBDDCCF9CEF871B92DE89
+:102460005F60C2E8C9790B715EA26B6315C458E264
+:10247000E7C2E462F8F19F3608BD1758B8BC583B74
+:1024800076D191A28FE4A77B89034C533583102822
+:102490001ADA9B07368BDF2CF4F4C9D6338C40064E
+:1024A000698AC9DBE36CF920CC2AE87D11B30332D9
+:1024B000D887D1B725594D42CDA0210C7BA065C04E
+:1024C000AA10EA22B745154558384D120E78CDBEF0
+:1024D000B856A7716539B8F1F59C2B4CF7FC24333D
+:1024E000EDF94AFF26CADE10F0C984972592DC2C4C
+:1024F000C65318B68B8541D37A53B28D783EFDAC66
+:10250000693512AA39B9EF65D479FB2E45136BCD25
+:10251000837AD37300644A4E3DBD8119C9041DBD41
+:10252000680117629C8374ED3B8503D9999D39CA74
+:10253000E3515D856BEB26B9AEF8289CF7F9998DD0
+:102540009CDB89D9EBD71CBDF384620AF77D2BF0A5
+:102550002857D545DE1D0791A4E853C06B40ED0513
+:1025600090FDBFF3CCA38728098E4AC9DDAE7768FA
+:10257000ADB53D0079337700A5F7809A28FFCE2AC4
+:10258000EA5C2B075DB9DC3431C261AB6C70930E31
+:102590004C6B5FF0262C2C3BC671AE2404ECA27D64
+:1025A000A0A91A75BAC2F4BF9374631D42FD849F3B
+:1025B000447987BA3708D3638D8814B485C25572BD
+:1025C0009AC3DECC68BAD43DE1E23732AA8A558399
+:1025D0008AD49798281BA46167DD22332A52EBA185
+:1025E000389C86CAF3A61DFECF720D9225EAA9FF7C
+:1025F0003E4248C6560131A95BC27E8CB68F9F050C
+:102600009EE49CDF4937BA879BA67EF94212D977B0
+:10261000813DCF57456061528F32BBE7A20F221731
+:102620007C4C2646969481DFE7867D4A50569A4533
+:102630008A2B321AF2EA0EC806E05F26122FE9C38F
+:102640009CCF3EA366454598F845272B4836E34383
+:102650003943284998A4E5F63D61BDC08425B359A6
+:10266000054F7ADAD40BF11AB565F97ED9DB078804
+:10267000A1CBA465C4DDF441264334AA61FFBF8722
+:10268000D52F0DCA985677C26B35F8ED4C2EF496BF
+:10269000ED6297CB59CFE1D2656E56337A0D3D137B
+:1026A0006FF1CDFF6BC819EE11F38F61CDC969B819
+:1026B000B6FC8456268A3D28ECA13AC83469AF6539
+:1026C00090AE6DC9AE11FEAA88A91DF914867B359E
+:1026D000BA4C2EB4C4495DDB32FA01FCE4D8646024
+:1026E000C3926AEE4F3B9EA4F8D63E16212ED174BB
+:1026F0002AFE2716A6BEF4550C952BAF95B6B8CA80
+:102700001F3D2CA98A8A73D2437B1C92E8F45A2974
+:102710006B9E5A8F6C3BCEE391DEB674AC35792656
+:10272000390202A34AE00F5FC085D2C9174E5AF999
+:10273000B4E4AD658445F3F559F234208940F8A33B
+:10274000383ACF5F149F85E2321454589DB9708394
+:102750009B7A33028A2FBC8321EACFE7023AEF6DDE
+:10276000B6A4CADDC170B6FD33F83B5D3B48055BDE
+:10277000E0768F4F410A5950272931933F79A05F66
+:102780001402D2E574112FA1BF0F684796B062DF23
+:1027900097AE00D833145053C80D3E9446A6F73B6D
+:1027A0007BCF00A8E1ADCEE541200FAD42A4DE9F76
+:1027B000FEBA09DC47F3569276431ED69A1819F1F1
+:1027C000B4D424139F12AFAAFD17DD1F886F258F85
+:1027D0008CD4044FC430FA08018B93BA125E69336B
+:1027E0006465C7C6ACC6FA07224FADB642A9540706
+:1027F000CFA19849A68D62AAF3B5A45B29A50D7552
+:102800001A8032FD60B477CBDB3DC46F78361BA0F5
+:102810006E1482B4C7F9DE48111173A534BB0EF5EE
+:102820001FAF13A77C0BAB13249672A531A10B65C8
+:102830008A954388006CDF5FA2AC8858DEAFCFD3A7
+:102840009C47079878C3EAFBC154A4DBFCFD1B6AD4
+:1028500098D76D2D661B30420642A555594DB86E6E
+:102860007BE5D9BFA38D19AC3A570D869E66A1D7DB
+:10287000385D15B2455EE1BF34CBCD904D767FE03B
+:10288000A8A0ED5AEF81A85F7FA2168D43AA5747F3
+:1028900004AE40721384CCCE826A4E7667A1A4EF58
+:1028A00099DD41657FC5406ABE6D1A2D288D9A5C01
+:1028B000E91D4662BF70003AA2BA15B79718DD52FB
+:1028C0005755E2A388593000609AA25C3A656B7054
+:1028D00088FF2A52BF3DAD6222F3C93705C464A701
+:1028E000E26EC4D788E1DC6F15054BE2B3B3CD844B
+:1028F000F7423CDAB1ECB8D8217518A91EFE63CBBB
+:10290000340E3014CCAA149AF9F2871F95A01B3C00
+:1029100075D3E6E99035E1DD1A407355098E032E33
+:10292000DE59EED046B9F4228C3FADA625D2D8DED2
+:10293000DE6D9225D0D68CEEB4E387E209F4E8CFC1
+:10294000BD086ABED3F2610E7F0A6A0BF57C24983B
+:10295000E6AEB51D4D12AAE9C715141219974C130E
+:1029600022C7135BFE9C5D8ECB20513D8DC3252D70
+:10297000D931DA0025D487EFB988D9E16A57E5EF74
+:10298000C86A4979E8E982BCC7801037CC79266BE0
+:102990009B2BC046406362B229AF11CB2433C2885F
+:1029A0003D2167A664FE2A6E709E135347B9730ECD
+:1029B000092CBF3F2285B31FD539EFA4FEC7F6719E
+:1029C0003FF1D6DABE2136CD05B8E23A8AB1C08DE4
+:1029D000B7F1C58C63E4E64AEFA47A9BC3844FD772
+:1029E000D982777EA5E24CB32A7EFF6E69A6EF02FC
+:1029F000B8FBF65040A0B7C5E9CFEC6E2A2887F5A2
+:102A000034BE68CDDC6BDFF2A5E0B5FDE1F4BA467B
+:102A10006E6DF818E33724F0CDBEA19CC9309C99A7
+:102A2000A77A1E5F03EB507E3E30548BB6A715414C
+:102A3000B7A52D250EF6601FA9F5393D81ACA43050
+:102A400053BDE3E5F3BB2C61C141D8B2E6BDFB5BEE
+:102A50008190CBD1FFE7551D677D41594D629AD0DA
+:102A60004A123877FB629DE94C106A3989249191AA
+:102A700047FBE405A56DD427B26D701150291D9F49
+:102A8000B1A748888FF98B522B756325EAEA3E621D
+:102A90005128AAF9438211B4276FB72F44911070BF
+:102AA000D57BA4D5604F1B10587039F300C244D1B8
+:102AB000D9297F700A73C81F5A601590DBB8181B9C
+:102AC0002D70291C1E88401D6552D6C825B3A181D2
+:102AD000DB2344DC5F83EA1D4D2AFE7EEE56384937
+:102AE00071A78DE3BC0FF78501AA697CE575BF6905
+:102AF000BEA62370DADD6881CECD3B192D22086E8B
+:102B00000A5EC1C198DADF5548E80DF304AE9D5C5A
+:102B1000B14923AA564BECB39BF965C5CE969F08E5
+:102B200081F6ABAA2D95B0DD01DF5BCCB2802C53D2
+:102B30002A772D6648A025A1F9A817DCDBB678888E
+:102B4000E9F2CD8F3E900C9D452FF14CDFABDBC8F9
+:102B5000F050BAAD03C1214AF31D5199B8C785A8F9
+:102B600063732ADA3638B54A351E39719C8679D6B0
+:102B700057E0399F1F54A0050FB161F6F9B82DCC6D
+:102B80006646863F54821102C54308D11FA43CA764
+:102B9000B35A54167C7A351C0288AD55687CE371B3
+:102BA0007BF93F1232535D1617169C38705461E062
+:102BB0005F983C6DA7B19337149C69438FE563E937
+:102BC000C44EEC527AFE9E6ABD48CB001D281AF115
+:102BD00045763D06F51D78F41307DADAB01B06A733
+:102BE0001D54FD28D6CD63EB73BDA3E7C9AE2BD52D
+:102BF0008760CA538FAB8360619B29ECBE039657F5
+:102C00005273013332A10D646D6C69807F5529E1E7
+:102C100039DAA0050C3AFC8A1CA193254EBC13E0BE
+:102C200024FCFC25DB20930906C71E80B4A328588A
+:102C30009D533A3054FB157A755087A2CD0C0DEC9C
+:102C4000F710820F5EF6282F2F71DCAFA0C57D89AB
+:102C5000E58258308C9387C1B7708F11FB8367C4AE
+:102C6000A37AE22790DE8FE4FC14A38CF39A2382EC
+:102C7000472F43B29CC61642F18A7A9A3AEC68DD35
+:102C8000B2532F164E693FFE95D9008B01DD775761
+:102C90006B24DF1CBA3A8E671ADEB9E1D84D21C029
+:102CA000EFFFBE2A02EA1E79D0F1C75D4C879E066F
+:102CB00099E1C8B6513B2F158E660C71491E59A477
+:102CC000800C55B222C3EC34962B3A84800FD62068
+:102CD0004C3122D0F5CA641A85AC2B31B78D9207DE
+:102CE000AFD8242DC2CFDDD8E7DCB1C18E5400A50A
+:102CF00047B01E9A1BF8738A74A9429AA8FE95D60B
+:102D0000D5D8B963F6A53A988A64D8B6271385A8AA
+:102D100082CF831BF61D2F37DB5288B598D2F4ABD8
+:102D2000646553D46958BF0D1F61840D19BB5AE700
+:102D3000D9E1CB30F0CD8C8B1C9022825F6D64E9A1
+:102D400089EC390F38F5B194507833DAE3622B15FA
+:102D5000B47534C2D7DEB905C69173A1EA68EBDB5E
+:102D60002FB606617F2166EEE8FB84B3C76A2A9D11
+:102D7000C998815499C11B92C38F6B086A5CB8CB08
+:102D8000EB58A6BFDCC786DD8833674D791D004C44
+:102D90001D71805BC4A8EF7F3D7A3AFDC861F519CB
+:102DA0007A2D60CFEB9A9D7E5B5E866B106BAA33AB
+:102DB00059C40C55111FE38D7A7A55082972ACADB0
+:102DC0008FBB9241062143E2A011C4F85570C06B3D
+:102DD00042036FEB37D5DB1F348813A5C66BB47382
+:102DE000602A899C2899D56B9B11443A5EBAD1B56B
+:102DF00099F9FA30DFB8ACA0E828F64737A2B67BDD
+:102E00005690199845FF6CC0393C6AFA9CA6C0BC24
+:102E10004BAADF5712240240F7456235D3DD89E81B
+:102E200090413DBCE428621422A9DEB82509FDE4E6
+:102E3000F9DF9B90F4F9C0C7B8C4FE3611A8458EDF
+:102E40009C51B7B9C28914204A5D9AC76C100BC354
+:102E500094DC35C324E54CFD6A97ADAD4087E6A907
+:102E6000AD8DD1539AF5CC59CDD12A6E5362A0C104
+:102E70009EF17F174E73DC5879E2FADCB1254F8161
+:102E80007C61F1CCD54DF3EEEED86C5666A02C16D5
+:102E90003510EFEA4AA6CE0115D7B59105BD4B9D79
+:102EA000DA856FA049BB287C97EC3E5E0FAA40E60E
+:102EB0009C45E5BEBB4D5EF9B125D7AF8BE51B54F4
+:102EC000DDF538D5B41CC3B241AC23C45C00F5B306
+:102ED0006C944323595C72B2F4A00CD0DA0DC6EEA8
+:102EE00021158AE60BC0E76A8D4B0A581F08616EF0
+:102EF0003F2A30E26067B3455FC40960215EF41386
+:102F0000FB13371075589FF3D6352FBB76C10816C3
+:102F10003A4BB8C66069A1817835B0B0F3D91E725A
+:102F2000A4F54A6FF01B909E957F5B38680BAF4706
+:102F300012CC138C73FAE3F926BC95BB66FFDDCA8D
+:102F40001A83E3DDD116DEEBB55EA90177DA4433EF
+:102F50000803A36BF024CBB4E7180B861A0CA7293F
+:102F60004110138EF549868ED677E6BDAC4F6D3590
+:102F7000E79A43C63E3B3E129FAF81E77049FB4E46
+:102F800095106568E724786C945F56471AB686EB0F
+:102F9000697240CDB80C103265768495E6FB7309F2
+:102FA000B5746CE4B20E2067EEE357E6FC7A296F45
+:102FB0001E2E2DFDBD761E25C62E0821C7B2D65B5E
+:102FC000813563C44337B12DB39E88939535CEE4E4
+:102FD000DD3EC2BBB51C6C3D1C18267DEA5A84B48C
+:102FE0005A7027B576427C45107DADC391AF7726E8
+:102FF000BE741BAA1559DDE61F8179ABC25EE89944
+:10300000A3B1008850E205514E3E5B7129782889B2
+:103010007ECE1222224ADF63140881927ED7130EDD
+:10302000FAB957122760C3CC0E4EA7A6252749E34D
+:103030009E3385C175F0E3C723E7FABD587992F254
+:103040008ABECE9878A8E32CF2DB6A265F98CB4F35
+:1030500009914659D5C32F23604D37D7AD28B5DF29
+:1030600067F11F59248C033CA81B8D3CA416F3B8B0
+:1030700097EED7421D496303B57A052EAA394C68ED
+:10308000343C7E6B4027B875C600DE4AA020D91DAF
+:10309000A4DF4F5AA439E575A28951EA8D2A2C0B79
+:1030A00016E2088B20213A917765BED43BE5938CDC
+:1030B000E66250C24C05B47DA6644550A5CDADDE98
+:1030C000D5FD6FECE1A5C9ECDF42523DFFDA31AE30
+:1030D000774E55B06C4E2D4CCC586A1E1C01B885ED
+:1030E0005BC8A018F0CCF624E0BB8812170B037F56
+:1030F000993791903E344F989E46F2F96B0F2D65AB
+:103100009A9328875FBEE0FF2AF2162D88A091C906
+:1031100071AC717851805CB515D7B069A47968B786
+:10312000F4CBB04A19EEBFE080F8EE13DF5967E048
+:10313000A2B650FC3B63427BCC76ACE51BFA8BC459
+:1031400097E572D0596C439A2D5E783EB48EA547B0
+:103150000901539F6678C3B2D04F1545A199D67027
+:103160005F2036D0DF35E2A6E61419A2C8EE76A1BC
+:1031700085199A4875A3C43374DAF39EC09156B585
+:10318000F33209C7941F45AD50527BE1D5A8F62113
+:10319000055ACD898760004408F3078A346EADE98B
+:1031A000F843C6DEF76CEA6B7ADDD9018B05CF9A5E
+:1031B0009DEE8111C46B8E4B547C3F1A6F3A49FBD4
+:1031C000FD2D9DD06388DDC1197055534632BC1E5C
+:1031D0008BF28AAEB397BEDCA625412DD446F7DE2E
+:1031E000FC1BC41E7448B5C98177E986F0D993DC0D
+:1031F000347479FD683B8C85780A2A0C4046748BC0
+:10320000F9B289C1F5CFC412A2FD407F1C39033247
+:10321000B0CE56491C84E490F3408E5CD4C3514038
+:10322000F757F1E51D56F8B9F08B73312F8201D7AE
+:10323000122F6D3D5E194700564C977F8F0C9CBB3B
+:10324000DC5CC86F1A314D9DE55E0C5E4E06DE44B7
+:10325000EF09945B8A521AF5BE9D8A7944665076CE
+:10326000747A94C6B9079F89702743585960A3831D
+:103270009A4537D4924A13D9A3FC498819002CC126
+:10328000330D6738A6611697AE7F73FAAFBAB55B98
+:10329000F3A6776D149B9CDF84F5C11CE3DD9C9E37
+:1032A000CEE260B522264A7AB4086FC056725D9AA3
+:1032B00083FA84C110278413038C37DF3CFDB06C84
+:1032C000E97AA53913A2D806660F6BB0E39CB4F374
+:1032D0005AB698C058690C650E2162D855B69FD36E
+:1032E000B7142A6319E2BC0722175F47024D94A363
+:1032F0004B865B2898313AD0C10603B7723E44CD65
+:10330000BC0641A32C7BFE10871B65838B13F9D26F
+:10331000A8A01A6F87C660D9A1EDC54893644783FA
+:103320004537AA5E4E865693B6A8EC6A7B16CE1633
+:1033300004A4C1A46D153A4E59A5F50D6AD8FA58E2
+:10334000F10B506469EB75806F4692B15EDC4BB057
+:10335000A8F2594C3E5BFFFF627FBCE084A225B21D
+:1033600089E48729FF28FC9C511936701E43586157
+:1033700093AB47A022A75E29A887231F0A162AB36A
+:103380001E18B9670BF85A659C7F02F94962D15043
+:10339000FD6D5393130C2D0070D49D9277F54A82E6
+:1033A0009E1603557D6D6A03088A667942149CB2A5
+:1033B00028604A4966F085140CD159EC29647CA434
+:1033C0001C66F67ED4674430B02DB33FEE0BEBCFD6
+:1033D000959F965FF54A25C7B22BDD0CF89A4538C4
+:1033E000592355D12B861365C9926F460B08817DF1
+:1033F00006E0E41EE3A66FD35BDEED82BE6761FBF1
+:10340000EE0CD732BFAA42C814C5E68049F867035C
+:10341000DA7395537291439912535B43D79890EAAC
+:103420006C0D5F1DCF83ADA58384901CF0DCCB2693
+:1034300079F9D94969AC60A56E5CDF8E452A6BFECF
+:10344000034A26A10EDD23E25875C7E51E57EB6C33
+:103450008F55C9665F7E4FA8CF3C8D9D537ED8B2F5
+:10346000B7B5CDE3ADE6EE9DDA8EEB754D028A4A37
+:103470008E2C32B8E3D995EDDC50919B3491143702
+:103480009285F77EB13541CA777AB986C4039B88A5
+:103490002D7AF8EC84493580C62B241220C53F04D0
+:1034A0009E6AD7F3278537EBF82F47E7195E5BBC99
+:1034B00012EE0F7328D0B1976412D6F1D4FDCB5120
+:1034C000421FEC0CB31D6273A2123AD4ED6261424A
+:1034D000B7067BC5E223BFCEBD64242BD7601D4E4B
+:1034E000A3905EE218984B8E0513643829EF2DE304
+:1034F0002F4B152A4CA6002529391AF6FE88E2140E
+:103500003E4F128768C1F5EEB306A5A05ECC65FEFE
+:103510008EAF9733CD17A444DBC6AFFB9AA2C55537
+:10352000216C0641203DDCB437CB95D3E0A0737D00
+:103530006011E3ACDA361F6D0A599369FD85E21E0E
+:10354000A4CBF803F35A0E74EF66B4145CCE8E6904
+:10355000D678A5F5CA652781CE10F6383AAB125455
+:1035600003969EF7D8BE2ADB786ABE3A70D990DD02
+:103570006DE90CA763352DCEEB09502CC0A3352780
+:10358000839536C4927737CA5309E21CAF8D33D482
+:103590006219C39F78B413C2C7EB5CA9582B71E2C0
+:1035A000F7C228E7290CFADE0CBECC2BB416BB7A86
+:1035B0006BA3FA91C77FE72840551D027B886A8A72
+:1035C000481BEF5D125E37C28E527B7029B5BA027E
+:1035D000AB5F5EC3A29C5831E689A0CC8237C01095
+:1035E000E86B1062D6676741F0C51FDFABC9747026
+:1035F000D12607ED48346690D9B2465B556B4B6DCA
+:10360000DEFC3C4CAE195D9C3852FB62C07C72768D
+:10361000B6DDFB31B276FE9ED747C2F2B47A51A630
+:103620004F618D9AB55B3B54E92045919CEF02DFD9
+:10363000FC21F272968071F63569E772EF36427EB0
+:10364000B888E9FDAE8836E8792F53C5057A6361FD
+:10365000868F6DF37CA1378CEDA482F21F359672B4
+:103660005F63CAD91F29D4CD66532E5CB26C5173E7
+:10367000E3A9756CBB03595C0C2FC6534AEE3FFAA5
+:10368000B670E5A4C0526166505D193658C8AE9553
+:10369000B5A310E4495FAFD2155D0E81CB766641CC
+:1036A000409886DC519C61599113DE2DC8C0936B04
+:1036B0003FC6C7E3A71D3CC46362E3D67695C9EF56
+:1036C00099D5508FB44363DAADCF97FD793C2796F7
+:1036D0005CFFEF77B9781D82A2DC1CC4C661B9FC1F
+:1036E0001970ABD917391645FD182D5048A5F12F83
+:1036F000B549CC6AF875AAF07779CA3A80EE2B887A
+:10370000AAB2E4CE9A02AFCA19038BD916D934658E
+:1037100011C6E1EADD2C9C195EF195F563CF89199C
+:103720004EA6E46CA2DB4ED7593859863859AE6F95
+:10373000461C87A719A7726FD1B6A0C12B1180ECC8
+:10374000B364562D763404F2C0AD1D007316F7EF46
+:10375000A381C9D8C39B12AF4ACEA1D2984E091DEE
+:10376000826A3A425ACA1270A10BFFB5AAA7AE8468
+:103770004C42E23546F02EDD77F45291795B21E63A
+:103780001A90D1E8C74D474691652323CE1CE85CCB
+:10379000045A37EC966F71A50D9C9E3E83A5375851
+:1037A00027F643304091FF677DB25E595B5B22D3C1
+:1037B000F1C59D93D07EEB5B0CA371937934940992
+:1037C00031B329908D3F203DFC982936F4124FF3F8
+:1037D000022BD00690733CBC7397E9C4867CDAE672
+:1037E0007109BC64E6F9F0F30ECC5CBA74387C6AFB
+:1037F0007162FBD387198E36A8F1C1DB4F1DE54EF0
+:10380000075396E454C450EAA2B8F1D7FDD82880F3
+:10381000DBE39F34586232349095D7D92B3A3CC4BD
+:1038200072E9F76DDAE0F522360EDCD051D50034BE
+:103830007441CDCC8A4552FD6D61E191145E6E26D6
+:10384000ADE92718453D1BB943A80024FD44666A2D
+:10385000BC6F25725D9EA8C18686CDEB391BDBC986
+:103860008C800CDF9130D2C954232402707AC3D4E7
+:103870006A50B56A3F73F35E6D83B3C138E6AAFE42
+:10388000577F4635D52955FC3885BE911547ACDBA9
+:10389000879563C2D940E7CDCCCE0D850F41AFDC13
+:1038A000DD63C7E2E98A1D8B6C54821B0D554714FA
+:1038B000F5DCF06BA4CF4BF6E1DCCF4418F07D4C87
+:1038C000F7CA72AE296131E8162FE6C8FB35B93F59
+:1038D000890B358B1EA614541E15404FE48471824B
+:1038E000433E1DEFBF3410180837F8ED1573B5E3EC
+:1038F00082F38B440A9A926CB3BED7A3BC6B771940
+:1039000016E5E968D7F93516A4742276AF882794AE
+:10391000688FFF9F12B43AAD3A88C496D7281550E5
+:10392000AC7080E79E98DD8FA174F3B81B990C747E
+:10393000CEF9DF695BA82ACC59C2004C077F977A81
+:103940005C72A421D2D935B7A4747AB93857B65F5E
+:103950003D97FC0580DCA97E9237CB16EF1E0AB29C
+:10396000F468C8B051146338A4445464748A41EEB6
+:10397000D24C63D122AE22DA1618681CB1E82A6D47
+:1039800052DADB8733A9A49BB96BFCE3FDCA9536F9
+:10399000748DFCF37ED1C4F5F5B31692B846BFC85A
+:1039A000195F6448C6B19B0A1091251AB6EEC6226B
+:1039B00000F49DC6CC3D7D616DE37C6E79A57E20D3
+:1039C000CCF5D3FD4F791B08D29D265AC39BDACE86
+:1039D000E842A4835A4EFF681EBE789B1E02BCFCC0
+:1039E0009597964794D21879345492FFB958BCB63B
+:1039F000F08F5A8843889EAEE6453074815C84FE21
+:103A0000E6BB2676005B7AAC6CCE587AFE8E0F272A
+:103A1000D75059C2553D2A01B5C1FFF1151567D5DB
+:103A20000041A4FA1C3E4AA1A37C4AD541E0D675C8
+:103A30005CB786B1868AFA91B68E7B433216B6950C
+:103A40004A52EE9A147CC9556F858128D99D9521DB
+:103A50007C864628D7416776C053E2923E4EFDA948
+:103A600013F0635B5BEC48FCDE9CEC96A83CBE600C
+:103A70001434A5CF82FF4B5A417DF58CFA3083EA8E
+:103A80001267251EEAEE7E73A863A286E4469AB208
+:103A9000F3BD213061C5B41B93C0D2CAECB0EA2D8E
+:103AA000DC8E16E6DCFCC5470434E4ACE8CCCF4839
+:103AB000920F48C74E5386E1EDF1DF24DFFC0DD0B5
+:103AC0005155A39C1AA82B761EDCB7845DD35300F6
+:103AD00077F7E1219DEDBAAEEF73331C2C4093379D
+:103AE00049EA440523F2001A32FC31C36F383940E9
+:103AF000ED282C6DB3326D82FB3A961E20EA17B387
+:103B00001644D3B71281F749173DB725DEE9E59290
+:103B1000286DBEE0EE3B4E3AB5E98C56DA2D77744F
+:103B2000BCC894104E743FA587DA87BA5BD91910C8
+:103B3000018BAE7E5F49429A127753F33C69DCE910
+:103B400005BC99E901D10F66C71525062FAEA3C1A3
+:103B50005146A564D172F500026DF118C15CF01CEC
+:103B6000AEDF5BCB9011A1759E2DEFA7ACE206DD19
+:103B70006386AFBBB6844A5A81810B0C28038FD66B
+:103B80002222A4A40D93A0BE09E8EF468371899573
+:103B900017DCE7E48566BF421748B47E10CEE8B66E
+:103BA000687B8E4DD9A945B19A5100929BED9CC678
+:103BB000CA9668AD8E0884F9D16D3636DDBE177EA3
+:103BC000AB7BDED37B70A7B8B59052F647B25329D2
+:103BD000EE676D09ACB19274AA23AA9E1A3DCDE49A
+:103BE000AF1BD5DD6C25226663F18A295FA588119C
+:103BF0009CF3B39BA78018F3211BFCB21CD00CD6FE
+:103C0000349E98A56EA8A9EF7BB7019F8D80B7035E
+:103C1000CA6C863E2850BB14B5DB2BD865D3C92FA0
+:103C2000FD073E1BE4A4F79E00C07B81EE93540089
+:103C3000BA08390D12733B94954574B09EB02BB7FA
+:103C40008DC8D20A434271EE4B06FD9DBA2B4A4401
+:103C5000BEEC230C52FFD14CAFF6C4EB532ED8EF81
+:103C60008E30748E393F12D9DC60FE9EA44ECA2578
+:103C7000C2BE054A4B93613BDDEDC9E3D37FD1B6AC
+:103C8000BD384752FBAE940A7B9284AB52BA7C8C0F
+:103C9000169C3C440EA7BC55A1C1E1DA14E13EB923
+:103CA000C9F1EA5340E53386450BABFF6800BBC260
+:103CB000DD2E282EACD62CCB7043CEA8F901BE0445
+:103CC0005132D76DCBE4C9CCDEA37CDB729072BAE3
+:103CD000F18E26121D282AD56E7917D2693BA901CB
+:103CE000F33B1AD11E3A85D3F7865FE115F80A181F
+:103CF000071D45A6C8F2822D8977CE6DB89F7F1B20
+:103D0000F8D58801BCFFC5DA7D31CD7DAB609D65FE
+:103D10000FE762D0AF8A29E6AD73D6911FEEDB289C
+:103D20003B60BD9F05B0CAAF7CD1A321CD650556D0
+:103D3000008BAC07D638427DB86737F5E39D5BABA7
+:103D40001EFBEAECA6183FD774092ACC9E2CF4B5CA
+:103D5000CA131A47281855A7621CF0DD15BC6B2939
+:103D6000933FC0EB059258569829D2027148DF154F
+:103D70009C52A925D86824D15A12B077832CA4FA72
+:103D80009A478C2DE38F59B88910386687D2EC0298
+:103D9000128596D38F76FD8494D4738BF04958C7DF
+:103DA0002AD82848CAC55D8E9432E5540E0E02C842
+:103DB000300386C4827D3B7CA514F9566E61991749
+:103DC0006B951138D7066E66B16B1E4C14438C543C
+:103DD000E7D5F4F1BDE82D96F890F8328298977EF9
+:103DE000460009AC32324B8279B1A1B74037465A0E
+:103DF0009242E2014636E561E7ADB59F060B7D2AAA
+:103E00001C4D15DD65661BA6F9530FD4778161A2A1
+:103E1000AE9AF9043C2C4D1883EABE4DD4A3F9F1B7
+:103E200056D80ECB6F909B527C5F1E52DC5F0F16F4
+:103E3000FBAB220D5729FAC776CA49B7A8A1287E3D
+:103E4000DEF9E78B2B03851502A2A272614F2BD9F5
+:103E500065819BF7FC594299ACF9B7B0448B68185F
+:103E60008DC3684FD797FFA348070CC63F6DBFB1FE
+:103E70007060B563857AEFE2411156E30EE5CA1230
+:103E8000A7643EB2575EB7C91C0CA71419C8467484
+:103E9000686E2AE081245131C19BF746F604F22D69
+:103EA000EA790E0BE81ED906979C0C68F1C47FF0E6
+:103EB000D283727739A49BB6A61C24F750FAFA363F
+:103EC00073AD8F6699B207022648776DC6ABD4D61C
+:103ED000BF4F7BFE4645E21E6336CC5C4818E0AE21
+:103EE000B4AE6F0F2EAE5BEFDEF01411ED7830D272
+:103EF0007BBE172B10D22D08B2BC84614276A4522F
+:103F0000692845ED21B18CF95672DF126849B5B6C2
+:103F1000B7CD9CB6794C2B253039B43F3BA805D0A2
+:103F2000638730350DE13FB45FE1B9A3630752DF2A
+:103F30001BFB3D769E156AEC0373A8AE920392EDCF
+:103F4000E9271869899EE5545CCD4EE046888CDAF5
+:103F5000FB5ED705FA5F1DDFC26B948A379FD4B42E
+:103F60008DB0681E0F443506157403BAF10D802F0D
+:103F70007A4C1B0994899FF587514D30F6630236C0
+:103F8000AF1E7E63DDE1976B160C46625641170942
+:103F9000FC4EE395C1AD863131729EB24C8FB25A60
+:103FA000E98C4822D2A6BEFBB7C01E35E1BD324D1A
+:103FB000FCA4B9A354B2BA0C90E639146C979BC513
+:103FC000B06A589B6D68FC4A1D6F288D199D40BFD3
+:103FD0002E5F8ECCD945E5D2740DF1EEA9CEC29FED
+:103FE0005933DCA6F425BEAD8E1595BE4A2B9A2E0C
+:103FF000B5EE64C69B5DF9D1DFB81255EC8AE74394
+:10400000708110F659875D2AFF52C590295E04130E
+:10401000EB8E1FC1A9FE0CEDA020C08C177748F7CE
+:104020000AC22C4A248FFE82CF9377A29872CDBC0D
+:104030003AEFDB7F07149418A898B568B44C62C8AF
+:10404000EE542365D83A5C22B2AA3CAD674CF39497
+:10405000AFEB2DACE01D628D1A6DC46AEBA2B2D439
+:104060009EA6AAC7549ED438D0F994BFA75FD4E7C0
+:10407000A825C8BD0C5115A052F447555AAA328341
+:104080002EC6CA112AB6E7DC3EE0623E93A05A264D
+:10409000E755DB547A587C511A5F6538C6DFCF92FA
+:1040A000EA8CA4158FBB0FA5AB24D8DC580321875D
+:1040B000B6EE8B79353EFF62649440AD4B1E947B27
+:1040C0003C78053E80EE3ABE82FD94B03335A93E81
+:1040D0008A00DD5D4243028AD0DA8ACB8BC7E1EAEF
+:1040E000AEA0EDD2456094450AFD872ED36F40EB1C
+:1040F00061951196EFAB64D3489B913EDE3A0992ED
+:10410000DD76683E63279E04F0B2C1211036A2CF4F
+:10411000FD1DD2AEF38DD107119EC6FD6F35914BBB
+:10412000D72F91A4941F28915F00A5940436459839
+:10413000B48D7F0ECE050FF89B12BD0F365698CE6C
+:10414000B8FD0C18F90A5C7170C1A24AC139044E5D
+:10415000EECED7CB9DFE08EBBCE8BC9135BFE49119
+:10416000A12EE8487DF470EE295D553E2EE495635E
+:10417000F94B0FA431868946EDDD543C9CEEB844E2
+:104180006370CA8FA33144CD0641186C0E78A829FC
+:104190003D76A42A042190F0F0858DBA55482F0869
+:1041A000D9797F44FA7C750132AA9C8B3FD995E37B
+:1041B000C27709E1A43B503660C6DDE4E7C7FAB236
+:1041C00030A24BF3418C614D0EFDBC78EA54C8F827
+:1041D000926876C0E1F22A51FA88E33FBA3BFE8941
+:1041E0000CF95E0B9E60DFC3705C4B694EA9AF712A
+:1041F0005C301D8AE0415BDFB24ABB83FEEC66089F
+:104200002056C95712052A0BBC868BD5A9D99429EB
+:1042100038F4A30FA0F1C8E69408B9F06C38CEAB1F
+:104220004BF837D137790D5362D3FB0132BF483099
+:104230009515E3BD25B489F7A138A312BA1ED25B48
+:1042400002A29F5877BAEFC5D45ADF8D76FEFBD213
+:10425000EB866A96C07AF7A74FD6028A4CF11460B3
+:104260001D7458A282D0B7F13558E34AF43B393E69
+:104270001F9A51441D29C4A092C36E58B340053201
+:104280002FBEE4ABEA97F8D783550FF8D2CFAC51E5
+:1042900018767AE7435B256F5FF146A5452DEFABB6
+:1042A000EAA18987F86D3361D7EF552B0F9250AA99
+:1042B0008599F00F11BB347002E013A1830B2C49D8
+:1042C0004492E0AE7DC279B7DD6F6B200DE508FA50
+:1042D0003D84B5D4F67ED3DAD567C83E7E9BACBBB1
+:1042E00072C8D394BEBCAB9E5C39217E39B553C72E
+:1042F000ADF48C1FD462119DC694870E9BC53360AC
+:104300006B8A70BFDA9AC2723FBF0F8E431ECD78A0
+:10431000E56FDAA4353D8147AF8C2C3B79320F3AFB
+:104320001CD683F842C55146F3C9E4DAD5D50184D9
+:10433000CEA06A8D09AA4871BA9497E3F727897CC1
+:10434000629F5259D58D92113AA4D7B00461835B14
+:10435000C2DDBE7CA1861DFBAD82216C86669A7291
+:10436000CA7CA7C4171C7BA9F3106D69BE4B100251
+:104370001C82CA2A0B131C442A7F39F55D2759BCBD
+:104380001D9D284447E51539F8FCD8F47030653890
+:1043900023DF751F9301F68D2214AD63AF23C8711F
+:1043A000B1E1CB9408ED39922B7AF81925BAE8B32C
+:1043B000EEDB5A5FA9C2D471B44422D9CDE5D7ABA4
+:1043C00054CCCA3DBA63B95C6B88B8E02A72690DF7
+:1043D00030C9B77E9E28B03DDD5898A825D00AEF99
+:1043E000782064BA6F0201452E4913AE898566258F
+:1043F0001C3F1048A91F1134236E329B356B4D832F
+:1044000034C8462F99DD34F2FBFB7FA3A2859E3B87
+:10441000E83B62E183F55DB1199347339D7CA90BBD
+:104420004B80E78A67245C07153D2A5AB6BD1C6C91
+:104430008F30C6683C781E727F8E46209D82ABD43A
+:1044400070344DE4C0045C0B8066303483CB23555C
+:104450005A0C8792E79E59C3B1496071A9DC5B662B
+:10446000A7EBC5A87A3648FDCE07D5D0D9C6B43E4D
+:10447000FA1BBFED8E712BBB67CB5079F4C37C1850
+:10448000A9E913C0C0009CFCDB31641668F031C39D
+:104490003430FF466A0780D824B3417D046EBF5A8A
+:1044A0006E19D0CE9E9200247812E397281F4F06F3
+:1044B00029B630BD92B42B9D8E38FF4BDA9AB933B2
+:1044C000EDDAEA76B996DF062BE95F231478EF710F
+:1044D0002D8CA64AF9809D429D86B107C04F80C6AB
+:1044E000190A70669780B442BF3757D98723913F26
+:1044F0000F15BA9507F22AFDCB696381C2E54EEB31
+:10450000473F5A3955275487FA227150AF7790DBCD
+:104510007085309152EAD26FEB1FC7170553CF3722
+:104520003A410CE0509BEBB72A55176F491548BE2E
+:10453000E4A12EF59BBC600CA703796D6DA5E34C3F
+:10454000BEFB2D7821C45FB3E588C1317D8E26E99D
+:10455000F85BDA7E0D7CFDFE3AB332704F52D6C95D
+:1045600059CF0BB84F266E5C7D3B735FC4848D388A
+:1045700017EF3338C4BDF164F9A1B7A65CC7EB905F
+:104580006E77B944A3439210B134453ABF1B31E66C
+:10459000639F7C1A4AA0F9F7D40EAAD993EE1709A3
+:1045A000CAC2D6CF414BC9D09CF7803A86058167F5
+:1045B000CAAE349AFFCAADCD64B0C4E0C55660B28D
+:1045C000C9B766163C7CB0B04FBA9BCA8E270EF4B2
+:1045D00069893BA3A939261ADDD02E125C2E9206DA
+:1045E000373BC56B469ECE20E4371A06A1D008DFC4
+:1045F0007368F945906809DF8DA5DE9D0A87DE891D
+:10460000657A9032E4CB22CBA791ADD5869386B163
+:10461000C5A4051641BD790B0797858A5C45DD4821
+:10462000EF10AB4374EBD7D0518698C2AE1DA1ED0D
+:1046300014B495B1F6DB906C33F087FB824CF9F83B
+:10464000F983F91A308CACED190E4A89333881E9B7
+:1046500091CC73D9A4FC8FEDA4148EC59974AE557A
+:10466000B322D1690D209C4A5BDC0859882501439F
+:1046700041E07B45FF6083C8B8B1D33140EEC4331D
+:10468000E6460686C1FA5D97237F841F3A36D8EC4A
+:104690003E5A697DFE43D4CCC1643B35375EEE8B18
+:1046A0001AA327CD8F17734CD0674B89F9BDA1A2F0
+:1046B000FCDF1D6DFF6121F15EDF6BF881801CBDA9
+:1046C000D5AA795A518731A2C69B6F3F8357AD1B3C
+:1046D00031C5418C3CB61193891937FA6B5C00CB1C
+:1046E000F16C098DCA0045430B169C3A8829007667
+:1046F000CFD56B1E1EC62FE21880D90A0B0FA0CB98
+:1047000027E0F6F472BB32A1BBF34FC6FE90D8D5BA
+:104710005903B1830200396EEDDC0D36B322FD8EF4
+:10472000E9DA18B1290246550EB2C9E677370164B5
+:10473000B1E4076E048A3B857BD4F4854009CA3C0A
+:104740008D7E8439D330E4BD94C8460790BF2F4393
+:104750002E73CEC6189A15DDC6BFBFF5AC454FEB1C
+:104760009791E0CCDD9069F3872AA0B9BC8DBABAE5
+:104770003547B153B5AE27BBAC6A4E44B34A1A3481
+:10478000DB557FE7C41F72DB778DC5ED3D12DE0779
+:10479000BA9C1CD3166DBBF1BA24E46FA8EC72333B
+:1047A0009BCFC623E28955895AC3785BC5AC7F800D
+:1047B000AC0F79122A7CBD4647687E693765446430
+:1047C000418EEDE5D90D7DF92C6D8B2EF3BCC385A3
+:1047D0002F5CFFF725A2BA0F1AB77E2244B08F7262
+:1047E0000F0F028612ECC841D9C43F1CAE0A64D632
+:1047F00062BFFC7357D15CE866733A15684F036873
+:10480000EAA75E459FC7380F027D331E67ED3D77EF
+:1048100060DD3B124698817CC6917D343F2678004E
+:10482000CFEA91D51734727240330BB2470DAC61A9
+:10483000A645FFCEB24FD1F181D870C35ED7A9692A
+:1048400004C98A62D79A08AB019E6E17A0DE4BA8F6
+:10485000666C1F3290D16ECDBF3F816D71D2B3E8CF
+:104860007AF1462B769DFCDB3B053D1870AA67C0AC
+:104870000B01A0C55FB91E8DAF71D963A27AC5C700
+:1048800053F452E11E27AFA7B6EFC81CE80AB94F90
+:104890004AADDC5C2416CDA9EA6FCF48EB40D2CDFF
+:1048A000432F6735D2DCC464AB7E0DF2B01F6E4C73
+:1048B0002B06DDE239689C706A6F53972BDEEA1C89
+:1048C0008C90F29FC9DE45A302C768B3D10A982D28
+:1048D00016A70F5B849FF733DC4092B9656DD8D182
+:1048E0001C21CF772AF3AA554D06C60B49C38399DD
+:1048F000D5D36C9C4B276FEF436AD98DFFE2336FA2
+:10490000C6CEF595852E91FBCFA21E901E28F729C5
+:10491000869E724246EA7D22B1FCFC1550D64F2697
+:104920006E815400A1BC622D68A712121EBFF11641
+:1049300098A02B5737B65B1711D898F5E7F20D1AE8
+:10494000D64288C25802D53C0CFA845C5FA6180F88
+:10495000AC42504BF652F47C5F9ED47F76D9B5E9D9
+:1049600030CB8B2554276B7B7A7AA44AEA2D66B923
+:10497000208012E716E23A2355CB435034F0BE981C
+:104980007D1A78612A43F51FEABF2C739668DAF125
+:104990003865D949BD79D0E90DF4B139FE8253416A
+:1049A000ADADCAEEE7750BD287FF31A2DA1AB2C6F7
+:1049B000F01BF8872D91A0D86128DFAFF8B6B5714C
+:1049C0008C66EDAD7AC03946CBD6E0F12C1670D0AE
+:1049D000FF1CD1746527FCC60FEF992AF41B84EDE8
+:1049E000E32A060B2FA476FD93EC513D7D36C16C76
+:1049F0003ECFF66801F43456000B1F48100B915E51
+:104A0000945F09040694BC27076676606A173F7CAA
+:104A1000BD3CA393AFD24FC3D97D00471671897DAA
+:104A20003EF11C09EA9A8607AB233564E1EA06FFEA
+:104A3000D98FB173993DD2DAF7B02ADEC198518B84
+:104A40007D6AF0275C394478055C24C8D0D04CBC22
+:104A50003E4CA597A215A30952587AEC31AB3649C2
+:104A60004A2EEE11642A8C03904ADBBD7E0D861D12
+:104A70005A3CA24E711B4144F23FEE5104125127A1
+:104A8000D7643DCEA4DEEABF09312001445E06783A
+:104A9000B73D03E898C4338DB48F56419D8FBBF961
+:104AA000F2C81D99DA64CF91AA629C4BE11F61693B
+:104AB00041A3DEAE0227BB32417D7DCC562AFD5993
+:104AC0000CB330FA00159D8487899CF658D1461F97
+:104AD000FB222A16472577B18E9D9A104B39EF7C21
+:104AE000EC82F308AA4200BDB84D9EE609A5B26A61
+:104AF000C544EC054369CC8CCB812669335A18A791
+:104B00008ADEAB66B5041167E5218CFE03E005FD86
+:104B1000C54949703D516F5F91B054A234FFFA27E7
+:104B2000B626F6FC83F0D74166DC4EADA16199C292
+:104B30007F60561C9757500209C33611E0A0C9D2B6
+:104B40006C07109463926389CEAE7506ADEC0B4D85
+:104B50009B8A0840AD9C828D99D65E163A92578901
+:104B6000EFFC304680B5C2277213494CFC7806BE74
+:104B70009461F7ACDAB31F19096A8382464F755FF7
+:104B800050A69D002646E275E6DD55EAF439BC3DA7
+:104B900018083CC14BAD84A20C5C8C6A6F2362D5B3
+:104BA000D5927269A719687C209D5B35D404AA430D
+:104BB0002E2B6F5C690B8A6FF41B3FACCE1C974C9D
+:104BC000A28C6780FE2A9ABB599148B58A0A813E19
+:104BD000E3088D77DA3934907A71C1673C92F0EC52
+:104BE000BA0F61D859F71F37CF2B1714BF676F73F0
+:104BF000389AE43ECAFB523132E788B87D65F76BDC
+:104C00006716FDE445A27056FE94261A0B0F6C2021
+:104C1000A4EEFDBC62E7EAB486E60788D1F5C7B921
+:104C20001DCE219D564CC8E32CC3D3AE912D2D6AC9
+:104C3000F363739B3817F1D95F659C882E0425B404
+:104C4000D9B3E1A16BBC51D2F951FA5587E4B294C2
+:104C500084E73F9EF1CC748B4E2CEEB47736E6DCC5
+:104C6000757C4F38F310DE157305DE544A83203D02
+:104C700047F3686EA56B3BF57AF4BE16B872F2ADD9
+:104C800095E2A1121CEAEE8A0B500176318BAC83BF
+:104C9000260205CE88353ED290BB381BA6F96F8719
+:104CA000222FD84D19B850B6E9990FBF4454B8B85F
+:104CB000CC26C6978CC87FEFBF4384AE740B12120C
+:104CC000C2628AD2759B466D298B16095C35B43A4F
+:104CD0007F500F76A18C97D9D442B255B3B3501000
+:104CE000EB6922B5DEC6417440A10ED195DED71C1A
+:104CF000B0AC5E4AB53B5C4D4BD54BB750073D8CD5
+:104D000065CB074651FD6126DF847DC07EBB6726EB
+:104D1000FFEE3E8BD219BA9D38E4B975F921F841FE
+:104D2000B147A95C926E9BEF9E825A53005B30CFD5
+:104D30006DF4E12FC9605902E3A6B659DC784B4106
+:104D40005257FB34FB1AD09405CD1B261A17FFBC13
+:104D50007A493A99E19B758EAAF89B08593CE96417
+:104D6000E2EC9C634E6430854FBC86832FC5183EB1
+:104D7000AFB14DCFF3954D21CF19F39102618D5B0A
+:104D80003C9F4D6E52030DDE13F33761938102DEBB
+:104D900090ACCD23E058AC6CF5C186284C10278C24
+:104DA0005B95A8DB8CD2E6CF1B88D53BC636D343B8
+:104DB0000F9C99AF2C2101AAA92C57037A63F19576
+:104DC0008DFD127B8AF71D3F931ED15506ACE2D4B0
+:104DD00084908C2F234B13358A5146E0F21544F70B
+:104DE0005FA52E5770A443F720FA025D5C8E2B104E
+:104DF000AAD48D7346384F95ECEA2ED19D1F02CF71
+:104E00003D6C698A47B9CCEA1842094924356701E3
+:104E10005CFCD182DB6D769F54B7350796367919E5
+:104E2000281849BE01F2DD392D1854F62898F2E110
+:104E30002FAB45D42FB6CDDFC1B1A2998272A48C1D
+:104E400023C218F6ACD0B03E3D5FF2BAFCD0DBEA2C
+:104E50003B50AE562317A88DCF2C97E1E9F584FB84
+:104E6000DF98D207B1F6DF031EFA4588056C771A82
+:104E7000CE37D47352251498FBC811C624E7871A7D
+:104E8000D646F46A4D52D4852056B59001AEA83C62
+:104E90007B1CC77EC9AB79B6481A636E670CE88D78
+:104EA000B5FAC16FBDC34447B41B3844354A13EA51
+:104EB00029A4999955A2B99BDBB8A8C0F0EECB7292
+:104EC000CC0C9F4B74125022547A02248CFE7CD15D
+:104ED0000FF2DF3501D329941FF5A970D5AD5BF131
+:104EE0009BB9389875DCC20C18DC34A2AA1581472E
+:104EF000315582E811C89F914F028DA9D2AA8D84A5
+:104F0000D498F5F3FA0B3D57312A29358D6ACDFA3D
+:104F1000A8C26A8409EC7F0F73761BB5F2E1C66103
+:104F20001ECAEF235D1430C0E200EC876FDD00681D
+:104F3000237AFA64C44BDF4C9C9A6B234B9C0E186B
+:104F40002B55A8A135123A2F820F0B60A951291EAB
+:104F5000236063C84C6F3E66B948C118F0FD741CED
+:104F600051EAB9BCB5C5456DA8802B296BE7BC5784
+:104F70009C11F7C574B72A5A90E1A6394A797F3B4C
+:104F8000D34FECB32BB97BBDF110CD67DDA5E5DBCD
+:104F90005C0E5F82720F1B10416805B630BB23F6B2
+:104FA000AFA1B345498FFF53FD7C93C014A5323D9B
+:104FB000366DC39002E309559583A3D6085A435230
+:104FC000B346C0BD2DB4229AA864E77FF239880D9C
+:104FD0002E9600D3C6EA3E543FE5CD87B72DE37B3E
+:104FE000B8C33E66168296FB372D14DA3FE054EACA
+:104FF000BC51B1A6F9DC5FEE08F1C65C9F721E0AD7
+:10500000912C309CCA0F2E821651404A801949417A
+:10501000BED18A482BAE760D96B4E2578BA8DEE758
+:1050200081EE06921AFB5B91FD2D7AAD46FCF2E90A
+:105030000751D37EA40EF4CB82BCCA32D7DBBB4F60
+:105040009A0E590290851AD46DD893C55876A02728
+:10505000E3CD787BFEAAA13F1403B25B6D772A866D
+:10506000BD17C051AE38B62577D5004B5034193333
+:1050700096B02A2471996DF7965996AB7A3668E303
+:105080006C4FFDF075B4A2192E346FDA6720478695
+:1050900084C88A7A0666819F5347C556275C328446
+:1050A0005061ED9DA98CDAEE351EA0001E2FDD6249
+:1050B0000E9DE4BB07BC76DE0C07259BCB894924FB
+:1050C000836405B87DB577BBC9D7FDC568E6B17106
+:1050D000987570581733BFCAF0BD659AE6B18E0F48
+:1050E000EC5E6ED0E7BED1D8FDB2E09C39CDABBE50
+:1050F000EC2663B8DD39CA2B1184FDF53E2A05E99B
+:105100004197A42F7C861C33652DA925075E23714A
+:1051100060DBE0E69CDA6D91D410FC6C1784F03D06
+:10512000FF508C086490263D912F66DCC29B266858
+:10513000A45A24433BFA6E73F1CE3B5C2C3D5126BE
+:1051400016D3902577A60376A0A3CFCD1B9772FE2A
+:10515000FE81B6E6A939B4BAEB5A04ABFD913247E9
+:1051600034820666682481BE81C157964FB153745C
+:10517000A9B9560482B8D6D7430C90D0A2CBBD9A19
+:10518000E273C6F893E4823683680CDF66FE4AC495
+:105190000DE0DF959E911504CC93ECD8D9460136ED
+:1051A0009A7C9B716C0C4B96DA9F442460AEF04B5A
+:1051B00032808DFAC1D09A41E634886F9129679880
+:1051C000BB7BB26BB5E09491A6A04ED72A9A0C0A8D
+:1051D00014F001F77337CA979171F8F7BC01E53DF8
+:1051E000F63E59070663369600DF9B072F085AC91B
+:1051F000CC171EAFA1C9BB923DD07450A4A1A50D80
+:10520000BACC480F622A986896B5D6837F2FE134CE
+:105210003C4E6A4B103387B1D51FA08F8CD3115DE4
+:105220000255992F7E2232A6D6BE3D15B8F8C8C7C2
+:10523000B672842ED265BDD1FA2F667598517492DC
+:1052400092228F6D64996E1CBD684CB7F9F22041B3
+:10525000DF77D312F73E8D9F003D5A3AE21A0D09CF
+:10526000A85CEB1931174D05DB29444FF238AADE53
+:1052700038C859F530D899BB53D9CE557EE77995C2
+:1052800005AB550623A7C5810BEF8EE6154634BD49
+:10529000D4C551D6C8E351FF379F92720633E5F06B
+:1052A0005F71A17432022582AC05C3C4BDAD153E49
+:1052B00045FE76E192F5426B851DD5B8AEDB025B0B
+:1052C000BB435D87FC24501BCB3E6B565B062C42D8
+:1052D000CB9CDF7250F51243160C2B9B3BCDC5B611
+:1052E0009DB632F715DAF454AB24429EC5C355403F
+:1052F000389BDABC9826616F291177EE08AD05D985
+:10530000D1CBA639C384B3602AE7253F31926C64C0
+:10531000B51AD560DFCC6C56C06CCBC06E90D7A3ED
+:10532000A62A59D15CD05B08973DCAE0D880236A91
+:105330000EE09BA2981EEB53408E0BBEFC077C0335
+:1053400036C0B23B3587D3D9572D8E25ED1D45D7B5
+:10535000FC280FFF728F82C5BAF664B7F2A45273AD
+:1053600004880041E3D3FC1AA8F7FFC3E65A575557
+:10537000037E44A07675E2DBD351A30B4C8131B49C
+:1053800063A7E2F0CE6E6DB6BB066E708B09F704B4
+:1053900089D28BE042F2EBDB4333E36A42A7407BE6
+:1053A000B68271F80C4291532D8CDAB600E498C2A3
+:1053B0006335B0FE4AB3F4A9608E0315F2BDEF4128
+:1053C000417D58B9CA4D667993F3DADB4ADB18B0F0
+:1053D000511E5FE0DEB784277445D5CA35D27F837E
+:1053E000F8FF843F042DF848A1B7E68312DBD948C3
+:1053F0005DF72A6AB8CFC483A130D433B272727613
+:10540000961663866DBF940F6511A1903BB42EB0C4
+:10541000C413787CC1C372CE8E4589D74EF1582211
+:1054200032D74426FBD875C0A8D10509ED8F468D2B
+:105430000D8013F0D27E50FB3896D64F4D9CD95E2E
+:10544000CEE06F8335F373AB63FD760F8A17FF826F
+:1054500043D77421501535C18A8DDF6877B9742A16
+:105460006FDC0AA6193E825B0F940B790EBF8F6E1C
+:105470006649BE36FD935DDC737FF5F18A4E97D8A1
+:10548000727D23035373960D74D9F9A7E6C43C7358
+:10549000B79B5B5400F1C2B6A3D1280E0632C60CEE
+:1054A00017F0A73AE3B5FB0CED8E6F04E046D36B23
+:1054B000147B9D373220F7948FE911E59CCF60F87B
+:1054C0004E1C630504C9D856CFB03C49B58600FCD4
+:1054D000990932FAE8727B07E0E6BBE63C0FE44D3F
+:1054E000B1741B8D6ADC1F99C1D0DC78EC368A2838
+:1054F000F51CB2599F60A1483A3A8C21490A86D8D6
+:1055000085B8DC2D143664D0AA6C49ABA2D4BFC0D8
+:10551000F0C111FA0398C3264785D0167D2743DAD8
+:10552000776C34AE5CA57C456BCCFD74725DB8883D
+:1055300006D7305D090A0B4CD82F1C6776B5C36EB1
+:10554000073016012EAE1E07960AD4D55FB8F79A1B
+:10555000073C1B859C837EC3AEE40AF44CE11298A1
+:1055600060BAD7450CC1C0BF13128EBF36AD669767
+:10557000140D2BC8473E67E14F47C364B55836F258
+:1055800076D93A15EFB29E08451622F20106EAEDE9
+:10559000008460E9FBF78C3841D28C46292EEEBBA3
+:1055A00071235EE45B4865D3627D051786F00C4E7F
+:1055B0006B8220A05C9DA7FF05FBF09DB4A707763A
+:1055C00047B2CBEA538C9D027540E359A4B2638085
+:1055D0008A48DB7C5A51083DA59BF2A71BDA30981C
+:1055E0004DD4A8AE2EE9B171F0061E6E9EB14156A3
+:1055F000CE0B3B1369AF1C0963FD1BC2B350D61021
+:105600009CA47AF9F5DBC620E8676FA4561590D7FD
+:105610000E39ECCCD12648A69E7D7220DD9225273E
+:10562000504A25344472F455662BD66640D635620E
+:10563000C09F3F63ABE44A94FCB6A82E10653CBA09
+:1056400066A4DB493E4F31E8887EA4D73C7A1C290A
+:10565000EA05A5E091A059013ACC85648276819B48
+:10566000A94FAE7894F9923C5E5AF73FEE874E25EB
+:10567000BEAAFF147E0CB8F90E98C7E366539D08C6
+:105680004195B84B408B2E912D55BF766392235B8D
+:10569000AFA7C102C8E9790CE654496D35FBA11EDC
+:1056A0001FBD02D8931D84CADD4F8034ED0D15480F
+:1056B000FF1A5F9D39C0BA314121293BAF7CB35FEE
+:1056C0007DC0BC0E1CB31C2A4EFC9BC3DC4C2116B7
+:1056D000A6E4098E3B87D001A808021B8D2315B1D3
+:1056E00083F81AB178C2590B450CD993BA9A730B47
+:1056F000EB74400C9159F895ACC312D043E7799EF6
+:105700009FAC77DB58EABF3A3BBE9394C872A5FDC5
+:10571000870A17A64A830836B588825D98831047A2
+:105720009FC00FB31FBA1E13E135504088CDAD7E28
+:10573000664A5BF4AEC7DFB9284680B3EC1E8369C6
+:105740007A7DA19FEB31EB0D2CB0A9848F5F2B18D4
+:1057500063C143121603FA9DDCE0409BA94819ABD4
+:10576000590E9171DFF8B04B9F61A6FB65E9654961
+:1057700025C40D1F5997768A5D332ABCFFD4E4AB4C
+:10578000D410045D8736F862747A56B3F9F0435743
+:10579000CBF6CEB3138E94490ECA7D18D7270C587A
+:1057A000ADC54062B92DF10CBFF511691EE4B253CD
+:1057B000C9A3814C028D02C219D67A40BF3B341571
+:1057C000FA7DE7DFCE8BBC2BEEA30C98B699AA1717
+:1057D000D21354C2C837AE58C36F84A6584910B20A
+:1057E0002CB0FBC89F4B2B08B58662D6A6382B354C
+:1057F000170091BF4417C0609B6C60D6CF3DA8A135
+:10580000D773E60E67DFFD67033EECEFE7430FFD5E
+:10581000B837089700B2E6B006B5B96E073EE4D9CE
+:10582000FAE893F767CAA8160E104906AD1ED0A471
+:105830002AAD9C912B43EC072D5E6BA7C18D907B0D
+:1058400096B45845D218742591C7446344DA50DFA2
+:10585000F2232691C221A6435396A5D9B8CE28D4C7
+:10586000C0D91453671F5813D96B6796719C60D5C4
+:10587000E77568508BEC3F3EDF3374D800AE5EC1F5
+:105880005F7076FEFDC9577B0CF6B8BAA923EADD36
+:1058900048507474E0C38F601B308173CEB054C91C
+:1058A0005B85260C8916D857983C4CAC775899B62E
+:1058B0008A172D71A7F988282553891370F30B0FC8
+:1058C000F6E5A3CF36FFC0562238A5C38CE8955124
+:1058D0001DCCF40BC77764D5975841FCC16305E72D
+:1058E0006FD018160F03F4236FEB8FF1148CF9E7C8
+:1058F0006916FCC4885A3C8D389D903BEB58046572
+:105900004A2FB5F36744987E1D12E592CE99701C1C
+:10591000D7BCC0D3145595BED1E75E29CAF7602421
+:10592000CE4A1500DC78F75A313A2C5B835D77312B
+:1059300029AAE76F79531C6AE80EE17F8ADEDD0D44
+:10594000B387C679487505744359EA7B69A88FCF38
+:10595000EE4D19BE9B046E92CB885C5E46738F3D04
+:105960006E893D94B9B78161F9DDF440B091DEF301
+:10597000F05221FF58CAF4EBCED210D16BD7714848
+:10598000358550DA3D9532BC2F54A6749BA81480FF
+:10599000D15257AFC66C8E8210859FE8FF62735F4D
+:1059A00027171FAA8850B9AB5374550CD1529D7656
+:1059B00082CAFAB087A74111C9EEFBD3D657CC7380
+:1059C000913AF26416E5057C4150505F434F4E46D4
+:1059D00049472020202020200000000000D800009F
+:1059E0005E0D0000E20922B953594E41204346475B
+:1059F000589EFA92AF06E0E62B001B4112130000FE
+:105A00000000000000000000000000000000000096
+:105A1000050001000400020003000900090006005F
+:105A200030002A0024001E00180012000C0006009E
+:105A3000000030002A0024001E00180012000C0094
+:105A40000600000000000000000000000000000050
+:105A5000010001000100010001000100020002003C
+:105A60000200020002000200030003000300030022
+:105A70000300030004000400040004000400040008
+:105A800005000500050005000500050000000100F7
+:105A90000200030004000500060007000800091EBC
+:105AA0000A1E0B1E0C1E0D1E0E1E0F1E101E111E9A
+:105AB00000010101020103010401050106010701C2
+:105AC0000801091F0A1F0B1F0C1F0D1F0E1F0F1FA0
+:105AD000101F111F0002010202020302040205024C
+:105AE00006020702080209200A200B200C200D20C4
+:105AF0000E200F20102011200003010302030303D6
+:105B00000403050306030703080309210A210B21E7
+:105B10000C210D210E210F2110211121000401045F
+:105B2000020403040404050406040704080409220B
+:105B30000A220B220C220D220E220F2210221122E9
+:105B40000005010502050305040505050605070511
+:105B5000080509230A230B230C230D230E230F23EF
+:105B6000102311230006010602060306040605069B
+:105B700006060706080609180A180B180C180D184F
+:105B80000E180F1810181118000701070207030755
+:105B90000407050706070707080709190A190B195B
+:105BA0000C190D190E190F191019111900080108F7
+:105BB0000208030804080508060807080808091A67
+:105BC0000A1A0B1A0C1A0D1A0E1A0F1A101A111A99
+:105BD0000009010902090309040905090609070961
+:105BE0000809091B0A1B0B1B0C1B0D1B0E1B0F1B93
+:105BF000101B111B000A010A020A030A040A050A03
+:105C0000060A070A080A091C0A1C0B1C0C1C0D1C9E
+:105C10000E1C0F1C101C111C000B010B020B030BA4
+:105C2000040B050B060B070B080B091D0A1D0B1DAA
+:105C30000C1D0D1D0E1D0F1D101D111D000C010C46
+:105C4000020C030C040C050C060C070C080C0912C2
+:105C50000A120B120C120D120E120F121012111248
+:105C6000000D010D020D030D040D050D060D070DB0
+:105C7000080D09130A130B130C130D130E130F1336
+:105C800010131113000E010E020E030E040E050E6A
+:105C9000060E070E080E09140A140B140C140D142A
+:105CA0000E140F1410141114000F010F020F030F24
+:105CB000040F050F060F070F080F09150A150B151E
+:105CC0000C150D150E150F151015111500100110DE
+:105CD0000210031004100510061007100810091612
+:105CE0000A160B160C160D160E160F161016111698
+:105CF0000011011102110311041105110611071100
+:105D0000081109170A170B170C170D170E170F1785
+:105D100010171117001201120212031204120512B9
+:105D2000061207120812090C0A0C0B0C0C0C0D0CB5
+:105D30000E0C0F0C100C110C0013011302130313A3
+:105D400004130513061307130813090D0A0D0B0D91
+:105D50000C0D0D0D0E0D0F0D100D110D0014011475
+:105D60000214031404140514061407140814090E6D
+:105D70000A0E0B0E0C0E0D0E0E0E0F0E100E110E47
+:105D8000001501150215031504150515061507154F
+:105D90000815090F0A0F0B0F0C0F0D0F0E0F0F0F29
+:105DA000100F110F00160116021603160416051621
+:105DB00006160716081609100A100B100C100D1005
+:105DC0000E100F10101011100017011702170317F3
+:105DD0000417051706170717081709110A110B11E1
+:105DE0000C110D110E110F111011111100180118C5
+:105DF00002180318041805180618071808180906C9
+:105E00000A060B060C060D060E060F0610061106F6
+:105E1000001901190219031904190519061907199E
+:105E2000081909070A070B070C070D070E070F07CC
+:105E300010071107001A011A021A031A041A051A88
+:105E4000061A071A081A09080A080B080C080D0890
+:105E50000E080F0810081108001B011B021B031B72
+:105E6000041B051B061B071B081B09090A090B0954
+:105E70000C090D090E090F0910091109001C011C5C
+:105E8000021C031C041C051C061C071C081C090A18
+:105E90000A0A0B0A0C0A0D0A0E0A0F0A100A110A46
+:105EA000001D011D021D031D041D051D061D071DEE
+:105EB000081D090B0A0B0B0B0C0B0D0B0E0B0F0B1C
+:105EC000100B110B001E011E021E031E041E051ED8
+:105ED000061E071E081E09000A000B000C000D001C
+:105EE0000E000F0010001100001F011F021F031FF2
+:105EF000041F051F061F071F081F09010A010B01C8
+:105F00000C010D010E010F011001110100200120F3
+:105F10000220032004200520062007200820090273
+:105F20000A020B020C020D020E020F0210021102F5
+:105F3000002101210221032104210521062107213D
+:105F4000082109030A030B030C030D030E030F03BF
+:105F5000100311030022012202220322042205223F
+:105F600006220722082209040A040B040C040D046B
+:105F70000E040F041004110401230223032304233D
+:105F80000523062300230723082309050A05110515
+:105F90000B050C050D050E050F051005FFFFFFFF96
+:105FA000FFFF3F00FFFFFFFFFFFF3F000303300540
+:105FB0002A05000500052A05300503000300070037
+:105FC000040009000700070007001C001C001C005B
+:105FD0001C001C001C000E000E000E000E000E0027
+:105FE0000E0000000000000001000100010001009F
+:105FF000000001000100010001000500050005008E
+:1060000005000500050009000D000F00090009004A
+:106010000900080001000700010000000300000063
+:1060200008001100190022002A0033003B00440040
+:106030004C0055005D0066006E0077007F007F0019
+:106040007F007F007F007F007F007F007F007F0058
+:106050007F007F007F007F007F007F007F007F0048
+:106060007F007F007F007F007F007F007F007F0038
+:106070007F007F007F007F007F007F007F007F0028
+:106080007F007F007F007F007F007F007F007F0018
+:106090007F007F007F007F007F007F007F007F0008
+:1060A0007F007F007F007F007F007F007F007F00F8
+:1060B0007F007F007F007F007F007F007F007F00E8
+:1060C0007F007F007F007F007F007F007F007F00D8
+:1060D0007F007F007F007F007F007F007F007F00C8
+:1060E0007F007F007F007F007F007F007F007F00B8
+:1060F0007F007F007F007F007F007F007F007F00A8
+:106100007F0077006E0066005D0055004C00440083
+:106110003B0033002A002200190011000800320061
+:10612000000000000000000000000000000000006F
+:106130000000070000000000300030003000300098
+:10614000300030000F000F000F000F000F000F0095
+:10615000000007000A000E0015001C0025002F009B
+:106160003C00490057006800780088009A00AB00A6
+:10617000BA00C800D400DF00E600E900EA00E7004A
+:10618000DE00D300C300AF0098007E006100420033
+:10619000210000010E010B01ED00A4017C010000B3
+:1061A000E8037800DC0596000000FF0010006400A2
+:1061B000401F4B00010002003C006500010006008A
+:1061C0000000120024000000000000000000180D74
+:1061D00000E401000000FF0D00FC000020020000B0
+:1061E000010001000800000000000E001300130071
+:1061F0001300130013001300130013001300130007
+:1062000013001300130013001300130013001300F6
+:1062100013001300130013001300130013001300E6
+:1062200013001300130013001300130013001300D6
+:1062300013001300130013001300130013001300C6
+:1062400013001300130013001300130013001300B6
+:1062500013001300130013001300130013001300A6
+:106260001300130013001300130013001300130096
+:106270001300130013001300130013001300130086
+:106280001300130013001300130013001300130076
+:106290001300130013001300130013001300130066
+:1062A0001300130013001300130013001300130056
+:1062B0001300130013001300130013001300130046
+:1062C0001300130013001300130013001300130036
+:1062D0001300130013001300130013001300130026
+:1062E0001300130013000E00000000000000000067
+:1062F000000000000000000000000000000000009E
+:10630000000000000000000000000000000000008D
+:10631000000000000000000000000000000000007D
+:10632000000000000000000000000000000000006D
+:10633000000000000000000000000000000000005D
+:10634000000000000000000000000000000000004D
+:10635000000000000100070032000F0007000300EA
+:1063600001000100000001000000010007001C0006
+:106370000E00050009003000300030000100070069
+:1063800000003200030001000800010000000100CD
+:1063900000000000010007001C000E0005000900BD
+:1063A0000A000A000A00320032000800080001005A
+:1063B0000100E80346009600640064003C001400FD
+:1063C000140094417B3C90010F0024001200010056
+:1063D00012002400CD011E00780005000A000A000A
+:1063E0006400140001008700140001000000000197
+:1063F0000001000100010001000100010001000195
+:106400000001000100010001000100010001000184
+:106410000001000100010001000100010001000174
+:106420000001000100010001000100010001000164
+:106430000001000100010001000100010001000154
+:106440000001000100010001000100010001000144
+:106450000001000100010001000100100010001007
+:10646000001000100010001000100F00800040000D
+:10647000500014004000204EC0001400280000020C
+:10648000C00000016666666666466646B200CD0CD0
+:10649000500066269A190100CD8C02000200060009
+:1064A00006008000800080008000800040008000A6
+:1064B000800066A633B333B333B3CD010A001900AD
+:1064C0006400B3019A00000266069A0000026606A4
+:1064D00060EA60EAF0D8F0D80100600060002800AF
+:1064E00014001400140028002800280028002800A8
+:1064F0002800280028000001800000010001290078
+:106500003D0029002900C8002800280028000003B9
+:10651000C0008001800100010001000100010001B4
+:1065200040002000200020001000040004000000B3
+:1065300000000A000A008001C00080018001800084
+:106540002000200020003800010080011E002600ED
+:10655000C8003704E7080000000000000000010048
+:106560007300002300058101000081010000040088
+:1065700001010A027E001C0007002C013A1E1422B1
+:1065800028040100000000006400640037043704A0
+:10659000D303D30305004100000000000000000009
+:1065A0006400640037043704D303D3030000000001
+:1065B000000000000000000064006400E708E70835
+:1065C0008308830832003200000000000000000051
+:1065D00064006400E708E70883088308320032009B
+:1065E0000000000032004B004600000000004600A2
+:1065F0002D0000000000000032003200000000000A
+:106600000F000F00000000000100020003008600E0
+:1066100028000A460F008202FA0060008000400055
+:106620004000FFFF9A5950001E00000124000600A0
+:106630000600000001000000000001000100010050
+:1066400001000100010050000A000A0014001400BB
+:106650000100040000004B00C800C8006F031F08C1
+:10666000320032000000000037046F0805001E00F1
+:1066700005000A000A0000000F00010001001400DC
+:1066800004000F0005000B00FF000F0001001E00BA
+:1066900001000000010001000A000100820000006A
+:1066A0000000FF00BB00FD00000000000000000033
+:1066B00000000000000000000000000001000000D9
+:1066C0000000000000000F01040106040704080C8C
+:1066D000090C0A080B080C080D100E10030000002E
+:1066E00000000000000000000000000000000000AA
+:1066F000000000000000000000000000000000009A
+:106700000000000000000000000000000000000089
+:106710000000000000000000000000000000000079
+:106720000000000000000000000000000000000069
+:106730000000000000000000000000000000000059
+:1067400000000000000016E5057C444953504C4110
+:10675000592020202020202020200100000000E0DF
+:1067600000000020000007830170DD1D0489002067
+:106770000000010101100000FE16000000007E096B
+:1067800002047E0902040000000000000000000076
+:1067900000000000000000000000000000000000F9
+:1067A00000000000000000000000000000000000E9
+:1067B00000000000000000000000000000007E0952
+:1067C00002040000000000000000000000000000C3
+:1067D00000000000000000000000000000000000B9
+:1067E00000000000000000000000000000000000A9
+:1067F0000000000000000000000000000000000099
+:106800000000000000000000000000000000000088
+:106810000000000000000000000000000000000078
+:106820000000000000000000000000000000000068
+:106830000000000000000000000000000000000058
+:106840000000000000000000000000000000000048
+:106850000000000000000000000000000000000038
+:106860000000000000000000000000000000000028
+:106870000000000000000000000000000000000018
+:106880000000000000000000000000000000000008
+:1068900000000000000000000000000000000000F8
+:1068A00000000000000000000000000000000000E8
+:1068B00000000000000000000000000000000000D8
+:1068C00000000000000000000000000000000000C8
+:1068D00000000000000000000000000000000000B8
+:1068E00000000000000000000000000000000000A8
+:1068F0000000000000000000000000000000000098
+:106900000000000000000000000000000000000087
+:106910000000000000000000000000000000000077
+:106920000000000000000000000000000000000067
+:106930000000000000000000000000000000000057
+:106940000000000000000000000000000000000047
+:106950000000000000000000000000000000000037
+:106960000000000000000000000000000000000027
+:106970000000000000000000000000000000000017
+:106980000000000000000000000000000000000007
+:1069900000000000000000000000000000000000F7
+:1069A00000000000000000000000000000000000E7
+:1069B00000000000000000000000000000000000D7
+:1069C00000000000000000000000000000000000C7
+:1069D00000000000000000000000000000000000B7
+:1069E00000000000000000000000000000000000A7
+:1069F0000000000000000000000000000000000097
+:106A00000000000000000000000000000000000086
+:106A10000000000000000000000000000000000076
+:106A20000000000000000000000000000000000066
+:106A30000000000000000000000000000000000056
+:106A40000000000000000000000000000000000046
+:106A50000000000000000000000000000000000036
+:106A60000000000000000000000000000000000026
+:106A70000000000000000000000000000000000016
+:106A80000000000000000000000000000000000006
+:106A900000000000000000000000000000000000F6
+:106AA00000000000000000000000000000000000E6
+:106AB00000000000000000000000000000000000D6
+:106AC00000000000000000000000000000000000C6
+:106AD00000000000000000000000000000000000B6
+:106AE00000000000000000000000000000000000A6
+:106AF0000000000000000000000000000000000096
+:106B00000000000000000000000000000000000085
+:106B10000000000000000000000000000000000075
+:106B20000000000000000000000000000000000065
+:106B30000000000000000000000000000000000055
+:106B40000000000000000000000000000000000045
+:106B50000000000000000000000000000000000035
+:106B60000000000000000000000000000000000025
+:106B70000000000000000000000001025FE00000D3
+:106B8000CEE03000CFE06B00D0E00000D1E00200AA
+:106B9000D2E00300D3E05100D4E00000D5E00000D3
+:106BA000D6E00000D7E05700D8E03D00D9E019005A
+:106BB000DAE0BE00DBE01E00DCE00A00DDE00A00F7
+:106BC000DEE06F00DFE03D00E0E02800E1E0BE0035
+:106BD000E2E03C00E3E01400E4E00A00E5E0B50098
+:106BE000E6E03300E7E04100E8E0BE00E9E06400F1
+:106BF000EAE02300EBE00A00ECE04400EDE02600D0
+:106C0000EEE0C300EFE01F00F0E01900F1E0060045
+:106C1000F2E00300F3E0C000F4E00000F5E0000063
+:106C2000F6E01000F7E03200F8E04C00F9E0C300B5
+:106C3000FAE05200FBE03200FCE01F00FDE0030040
+:106C4000FEE0F200FFE0000000E1000001E11300BF
+:106C500002E1240003E1680004E1C30005E1AA00A9
+:106C600006E13F0007E1320008E1030009E1FF000F
+:106C70000AE100000BE100000CE125000DE100003D
+:106C80000EE10D000FE1000010E1000011E1000035
+:106C900012E1000013E1000014E1000015E1000022
+:106CA00016E1000017E1000018E1000019E1000002
+:106CB0001AE1D3001BE101001CE12C001DE10A00D8
+:106CC0001EE108001FE1E80020E1000021E10A00C8
+:106CD00022E1000023E1000024E1080025E100009A
+:106CE00026E1000027E1300028E1000029E1000052
+:106CF0002AE111002BE100002CE100002DE1000051
+:106D00002EE100002FE1220030E1000031E105001A
+:106D100032E1200033E1000034E1800035E1FA0087
+:106D200036E1400037E1000038E1800039E10F0032
+:106D30003AE100003BE100003CE100003DE10000E1
+:106D40003EE100003FE1000040E1000041E10000C1
+:106D500042E1000043E1000044E1000045E10000A1
+:106D600046E1000047E1000048E1000049E1000081
+:106D70004AE100004BE100004CE100004DE1000061
+:106D80004EE100004FE1000050E1000051E1000041
+:106D900052E1D20053E1020054E1020055E100004B
+:106DA00056E1070057E1050058E1440059E10000B1
+:106DB0005AE100005BE100005CE100005DE10000E1
+:106DC0005EE100005FE1000060E1000061E10000C1
+:106DD00062E1000063E1000064E1000065E10000A1
+:106DE00066E1000067E1000068E1000069E1000081
+:106DF0006AE100006BE100006CE160006DE1C7003A
+:106E00006EE104006FE1040070E1010071E1010036
+:106E100072E1010073E1000074E1080075E1FB001C
+:106E200076E1000077E1000078E1010079E10800F7
+:106E30007AE100007BE100007CE100007DE144009C
+:106E40007EE111007FE1000080E1080081E1FB00AC
+:106E500082E1040083E1000084E1000085E100009C
+:106E600086E1000087E1000088E1000089E1000080
+:106E70008AE100008BE100008CE100008DE1000060
+:106E80008EE100008FE1000090E1000091E1000040
+:106E900092E1000093E1000094E1000095E1000020
+:106EA00096E1110097E1000098E1000099E10000EF
+:106EB0009AE100009BE100009CE100009DE10000E0
+:106EC0009EE100009FE10000A0E10000A1E10000C0
+:106ED000A2E10000A3E10000A4E10000A5E10000A0
+:106EE000A6E10000A7E10000A8E10000A9E1000080
+:106EF000AAE10000ABE10000ACE11100ADE100004F
+:106F0000AEE10000AFE10000B0E10000B1E100003F
+:106F1000B2E10000B3E10000B4E10000B5E100001F
+:106F2000B6E10000B7E10000B8E10000B9E10000FF
+:106F3000BAE10000BBE10000BCE10000BDE10000DF
+:106F4000BEE10000BFE10000C0E10000C1E10000BF
+:106F5000C2E11100C3E10000C4E10000C5E100008E
+:106F6000C6E10000C7E10000C8E10000C9E100007F
+:106F7000CAE10000CBE10000CCE10000CDE100005F
+:106F8000CEE10000CFE10000D0E10000D1E100003F
+:106F9000D2E10000D3E1C900D4E10100D5E19000C5
+:106FA000D6E18900D7E15A00D8E10000D9E100001C
+:106FB000DAE10000DBE10000DCE10000DDE1D2000D
+:106FC000DEE10100DFE19500E0E1A900E1E1390047
+:106FD000E2E10400E3E10200E4E10000E5E1000099
+:106FE000E6E10000E7E1D200E8E10400E9E10000A9
+:106FF000EAE17800EBE1F200ECE10200EDE10100F2
+:10700000EEE10100EFE10000F0E10000F1E1D2006B
+:10701000F2E10400F3E10000F4E18800F5E1F3009F
+:10702000F6E10200F7E10100F8E10100F9E10000FA
+:10703000FAE10000FBE10000FCE10000FDE10000DE
+:10704000FEE10000FFE1000000E2000001E20000BC
+:1070500002E2000003E2000004E2000005E200009A
+:1070600006E2000007E2000008E2000009E200007A
+:107070000AE200000BE200000CE200000DE200005A
+:107080000EE200000FE2000010E2000011E2AA0090
+:1070900012E2000013E2000014E2000015E200001A
+:1070A00016E2000017E2000018E2010019E20000F9
+:1070B0001AE201001BE200001CE200001DE20000D9
+:1070C0001EE200001FE2000020E2C00021E20000FA
+:1070D00022E2010023E2000024E2010025E2000098
+:1070E00026E2000027E2000028E2000029E200007A
+:1070F0002AE2C0002BE200002CE200002DE200009A
+:107100002EE200002FE2000030E2000031E2000039
+:1071100032E2000033E2000034E2000035E2000019
+:1071200036E2000037E2000038E2000039E20000F9
+:107130003AE200003BE200003CE200003DE20000D9
+:107140003EE200003FE2000040E2000041E20000B9
+:1071500042E2000043E2000044E2000045E2000099
+:1071600046E24C0047E2510048E24D0049E24D0042
+:107170004AE261004BE25F004CE25D004DE20F002D
+:107180004EE211004FE2440050E24F0051E24F0046
+:1071900052E2BE0053E2BF0054E2030055E2000099
+:1071A00056E2000057E2000058E2000059E20000F9
+:1071B0005AE200005BE200005CE200005DE20000D9
+:1071C0005EE24C005FE2510060E24D0061E24D0082
+:1071D00062E2610063E25F0064E25D0065E20E006E
+:1071E00066E2100067E2440068E24F0069E24F0087
+:1071F0006AE2BE006BE2BF006CE202006DE2FF00DB
+:107200006EE2FF006FE2FF0070E2FF0071E2FF003C
+:1072100072E2FF0073E2000074E2FE0075E2E70034
+:1072200076E2000077E2FE0078E2E70079E2000013
+:107230007AE202007BE218007CE200007DE20200BC
+:107240007EE218007FE2000080E2E00081E20000C0
+:1072500082E2000083E2E00084E2000085E20000B8
+:1072600086E2000087E2000088E2000089E2000078
+:107270008AE200008BE204008CE204008DE2000050
+:107280008EE200008FE2040090E2040091E2000030
+:1072900092E2000093E2000094E2000095E2000018
+:1072A00096E2500097E2000098E2000099E20000A8
+:1072B0009AE200009BE200009CE200009DE20000D8
+:1072C0009EE208009FE20000A0E20000A1E20000B0
+:1072D000A2E20000A3E20200A4E21A00A5E2080074
+:1072E000A6E2FC00A7E2FF00A8E2FF00A9E2FF007F
+:1072F000AAE20000ABE20000ACE21300ADE2010044
+:10730000AEE2FF00AFE20000B0E20100B1E2030034
+:10731000B2E24200B3E24500B4E24200B5E200004E
+:10732000B6E20000B7E20000B8E20100B9E20500F1
+:10733000BAE20900BBE22800BCE22800BDE201007D
+:10734000BEE20300BFE24200C0E24500C1E24200EB
+:10735000C2E20000C3E20000C4E20000C5E2010096
+:10736000C6E20B00C7E20000C8E20000C9E200006C
+:10737000CAE21E00CBE20100CCE20000CDE2000038
+:10738000CEE20000CFE20000D0E20000D1E2000037
+:10739000D2E22000D3E22000D4E20000D5E20000D7
+:1073A000D6E20000D7E20000D8E22200D9E22200B3
+:1073B000DAE22200DBE20000DCE20000DDE20000B5
+:1073C000DEE20000DFE21000E0E20000E1E2A00007
+:1073D000E2E28000E3E27000E4E20000E5E2200087
+:1073E000E6E20000E7E20000E8E22D00E9E2410009
+:1073F000EAE20000EBE20000ECE20000EDE2000057
+:10740000EEE2FF00EFE25D00F0E24000F1E2490051
+:10741000F2E25300F3E25900F4E25E00F5E26300A9
+:10742000F6E26800F7E26E00F8E27400F9E27E002E
+:10743000FAE28A00FBE29800FCE2A800FDE2BB0051
+:10744000FEE2D000FFE2E70000E3FF0001E30400FA
+:1074500002E3000003E3040004E3040005E3420048
+:1074600006E3000007E3690008E35A0009E340006F
+:107470000AE340000BE300000CE300000DE304000E
+:107480000EE3FA000FE3000010E3000011E3000038
+:1074900012E3800013E3A10014E36A0015E3000087
+:1074A0002DE3050046E3000047E3000048E3000049
+:1074B00049E302004AE37F004BE300004CE3000095
+:1074C0004DE300004EE300004FE3000050E30000F6
+:1074D00051E3000052E3000053E3000054E30000D6
+:1074E00055E3000056E3000057E3000058E30000B6
+:1074F00059E300005AE300005BE300005CE3000096
+:107500005DE300005EE300005FE3000060E3FF0076
+:1075100061E3F70062E3FF0063E3FF0064E3F70069
+:1075200065E3FF0066E3FF0067E3F70068E3FF0041
+:1075300069E3FF006AE3F7006BE3FF006CE3FF0021
+:107540006DE3F7006EE3FF006FE3FF0070E3F70009
+:1075500071E3FF0072E3FF0073E3F70074E3FF00E1
+:1075600075E3FF0076E3F70077E3FF0078E3FF00C1
+:1075700079E3F7007AE3FF007BE3FF007CE3F700A9
+:107580007DE3FF007EE3FF007FE3F70080E3FF0081
+:1075900081E3FF0082E3F70083E3FF0084E3FF0061
+:1075A00085E3F70086E3FF0087E3FF0088E3F70049
+:1075B00089E3FF008AE3FF008BE3F7008CE3FF0021
+:1075C0008DE3FF008EE3F7008FE3FF0090E3FF0001
+:1075D00091E3F70092E3FF0093E3FF0094E3F700E9
+:1075E00095E3FF0096E3FF0097E3F70098E3FF00C1
+:1075F00099E3FF009AE3F7009BE3FF009CE3FF00A1
+:107600009DE3F7009EE3FF009FE3FF00A0E3F70088
+:10761000A1E3FF00A2E3FF00A3E3F700A4E3FF0060
+:10762000A5E3FF00A6E3F700A7E3FF00A8E3FF0040
+:10763000A9E3F700AAE3FF00ABE3FF00ACE3F70028
+:10764000ADE3FF00AEE3FF00AFE3F700B0E3FF0000
+:10765000B1E3FF00B2E3F700B3E3FF00B4E3FF00E0
+:10766000B5E3F700B6E3FF00B7E3FF00B8E3F700C8
+:10767000B9E3FF00BAE3FF00BBE3F700BCE3FF00A0
+:10768000BDE3FF00BEE3F700BFE3FF00C0E3FF0080
+:10769000C1E3F700C2E3FF00C3E3FF00C4E3F70068
+:1076A000C5E3FF00C6E3FF00C7E3F700C8E3FF0040
+:1076B000C9E3FF00CAE3F700CBE3FF00CCE3FF0020
+:1076C000CDE3F700CEE3FF00CFE3FF00D0E3F70008
+:1076D000D1E3FF00D2E3FF00D3E3F700D4E3FF00E0
+:1076E000D5E3FF00D6E3F700D7E3FF00D8E3FF00C0
+:1076F000D9E3F700DAE3FF00DBE3FF00DCE3F700A8
+:10770000DDE3FF00DEE3FF00DFE3F700E0E3FF007F
+:10771000E1E3FF00E2E3F700E3E3FF00E4E3FF005F
+:10772000E5E3F700E6E3FF00E7E3FF00E8E3F70047
+:10773000E9E3FF00EAE3FF00EBE3F700ECE3FF001F
+:10774000EDE3FF00EEE3F700EFE3FF00F0E30000FE
+:10775000F1E30000F2E30000F3E30000F4E30000D3
+:10776000F5E30000F6E30000F7E30000F8E30000B3
+:10777000F9E30000FAE30000FBE30000FCE3000093
+:10778000FDE30000FEE30000FFE3000000E4000072
+:1077900001E4000002E4000003E4000004E400004F
+:1077A00005E4000006E4000007E4210008E41000FE
+:1077B00009E452000AE452000BE400000CE4D30098
+:1077C0000DE400000EE40A000FE4000010E4B6002F
+:1077D00011E4040012E4FD0013E4010014E40000CD
+:1077E00015E4030016E4000017E4050018E40500A2
+:1077F00019E405001AE407001BE404001CE405007A
+:107800001DE406001EE407001FE4000020E402005F
+:1078100021E4020022E4080023E4030024E403003E
+:1078200025E4080026E4040027E4080028E4080012
+:1078300029E40C002AE40B002BE40A002CE40A00E3
+:107840002DE40A002EE407002FE4080030E40A00CB
+:1078500031E4060032E4000033E4080034E40000C0
+:1078600035E4000036E4000037E4000038E40000AE
+:1078700039E404003AE404003BE404003CE404007E
+:107880003DE404003EE404003FE4040040E4000062
+:1078900041E4040042E4040043E4040044E404003E
+:1078A00045E4040046E4040047E4040048E404001E
+:1078B00049E404004AE404004BE406004CE40600FA
+:1078C0004DE400004EE400004FE4000050E40000EE
+:1078D00051E4000052E4120053E4410054E400007B
+:1078E00055E4410056E4000057E4820058E40000EB
+:1078F00059E4A8005AE4AA005BE400005CE45000EC
+:107900005DE455005EE408005FE4A20060E42A0044
+:1079100061E40A0062E4450063E4150064E40D00DC
+:1079200065E48A0066E48A0067E40A0068E41500FA
+:1079300069E445006AE40D006BE42A006CE4A000F1
+:107940006DE40A006EE455006FE4500070E40D0031
+:1079500071E4AA0072E4A80073E40A0074E455001C
+:1079600075E4500076E40D0077E42A0078E4A20084
+:1079700079E40A007AE415007BE445007CE40D001C
+:107980007DE48A007EE48A007FE40A0080E445000A
+:1079900081E4150082E40D0083E4A20084E42A005F
+:1079A00085E40A0086E4510087E4550088E40C0071
+:1079B00089E4A8008AE4AA008BE408008CE454005F
+:1079C0008DE455008EE401008FE4300090E4060061
+:1079D00091E4230092E465007BE0000093E4000062
+:1079E00094E4000095E40F0096E4FF0097E40000A3
+:1079F00098E4000099E400009AE400009BE4100081
+:107A00009CE400009DE430009EE463009FE40000DD
+:107A1000A0E40100A1E40E00A2E40100A3E4200020
+:107A2000A4E40A00A5E4E000A6E4AE00A7E4000098
+:107A3000A8E40900A9E40000AAE40200ABE4A6005F
+:107A4000ACE40000ADE40000AEE40000AFE40000F0
+:107A5000B0E40000B1E40000B2E40000B3E40000D0
+:107A6000B4E40400B5E4C200B6E40000B7E41100D9
+:107A7000B8E40000B9E4D300BAE40D00BBE4300080
+:107A8000BCE48600BDE41500BEE40000BFE40C00C9
+:107A9000C0E40000C1E40100C2E40000C3E401004E
+:107AA000C4E40400C5E41000C6E43800C7E41000D4
+:107AB000C8E42E00C9E40A00CAE4E000CBE4AE004A
+:107AC000CCE40200CDE43A00CEE40100CFE40100B2
+:107AD000D0E40200D1E40200D2E40800D3E40800BC
+:107AE000D4E40900D5E40900D6E40000D7E400009E
+:107AF000D8E40000D9E40000DAE40200DBE400008E
+:107B0000DCE49200DDE44A00DEE49100DFE41200F0
+:107B1000E0E40200E1E48C00E2E40000E3E40000C1
+:107B2000E4E40100E5E45000E6E40200E7E40200DA
+:107B3000E8E48C00E9E40000EAE40000EBE4A000E3
+:107B4000ECE41000EDE40200EEE4C300EFE41F00FB
+:107B5000F0E40000F1E40000F2E40000F3E4FD00D2
+:107B6000F4E40100F5E40000F6E40000F7E40000AE
+:107B7000F8E40000F9E4CF00FAE45F00FBE47F00E2
+:107B8000FCE4F000FDE40000FEE40F00FFE4F00080
+:107B900000E5000001E5000002E5000003E500004B
+:107BA00004E5000005E5C00006E50F0007E57F00DD
+:107BB00008E5000009E500000AE590000BE5090072
+:107BC0000CE509000DE509000EE549000FE5000090
+:107BD00010E5000011E5000012E5000013E50000CB
+:107BE00014E5000015E5000016E5010017E50000AA
+:107BF00018E5000019E500001AE500001BE540004B
+:107C00001CE500001DE500001EE500001FE500006A
+:107C100020E5000021E5000022E5010023E5000049
+:107C200024E5C00025E51F0026E5000027E500004B
+:107C300028E5000029E500002AE500002BE500000A
+:107C40002CE500002DE500002EE500002FE50000EA
+:107C500030E5000031E5000032E5000033E50000CA
+:107C600034E5000035E5000036E5000037E50000AA
+:107C700038E5000039E500003AE500003BE500008A
+:107C80003CE500003DE500003EE500003FE500006A
+:107C900040E5000041E5000042E5000043E500004A
+:107CA00044E5000045E5000046E5000047E500002A
+:107CB00048E5000049E500004AE500004BE500000A
+:107CC0004CE500004DE500004EE500004FE560008A
+:107CD00050E54B0051E5090052E5000053E5000076
+:107CE00054E5000055E5000056E5000057E5370073
+:107CF00058E5370059E537005AE500005BE500001C
+:107D00005CE500005DE500005EE500005FE5000069
+:107D100060E5000061E5000062E5000063E5000049
+:107D200064E5000065E5000066E5000067E5000029
+:107D300068E5000069E500006AE500006BE5000009
+:107D40006CE500006DE500006EE500006FE50000E9
+:107D500070E5000071E5000072E5000073E50000C9
+:107D600074E5000075E5000076E5000077E50000A9
+:107D700078E5000079E500007AE500007BE5000089
+:107D80007CE500007DE500007EE500007FE5000069
+:107D900080E5000081E5000082E5000083E5000049
+:107DA00084E5100085E5000086E5100087E5000009
+:107DB00088E5000089E510008AE500008BE51000E9
+:107DC0008CE500008DE50A008EE50A008FE50000D5
+:107DD00090E5000091E5000092E5000093E50000C9
+:107DE00094E5430095E5000096E5030097E5510012
+:107DF00098E5000099E500009AE505009BE5000084
+:107E00009CE500009DE500009EE500009FE5000068
+:107E1000A0E50000A1E50000A2E50000A3E5000048
+:107E2000A4E50000A5E50000A6E50000A7E5000028
+:107E3000A8E50000A9E50000AAE50000ABE5000008
+:107E4000ACE50000ADE50000AEE50000AFE50000E8
+:107E5000B0E50000B1E50000B2E50000B3E50000C8
+:107E6000C3E54400C4E53F00C5E50000C6E58D005C
+:107E7000C7E5BF005FE00300000000000000000055
+:107E800000000000000000000000000000000000F2
+:107E900000000000000000000000000000000000E2
+:107EA00000000000000000000000000000000000D2
+:107EB00000000000000000000000000000000000C2
+:107EC00000000000000000000000000000000000B2
+:107ED00000000000000000000000000000000000A2
+:107EE0000000000000000000000000000000000092
+:107EF0000000000000000000000000000000000082
+:107F00000000000000000000000000000000000071
+:107F10000000000000000000000000000000000061
+:107F20000000000000000000000000000000000051
+:107F30000000000000000000000000000000000041
+:107F40000000000000000000000000000000000031
+:107F50000000000000000000000000000000000021
+:107F60000000000000000000000000000000000011
+:107F70000000000000000000000000000000000001
+:107F800000000000000000000000000000000000F1
+:107F900000000000000000000000000000000000E1
+:107FA00000000000000000000000000000000000D1
+:107FB00000000000000000000000000000000000C1
+:107FC00000000000000000000000000000000000B1
+:107FD00000000000000000000000000000000000A1
+:107FE0000000000000000000000000000000000091
+:107FF0000000000000000000000000000000000081
+:108000000000000000000000000000000000000070
+:108010000000000000000000000000000000000060
+:108020000000000000000000000000000000000050
+:108030000000000000000000000000000000000040
+:108040000000000000000000000000000000000030
+:108050000000000000000000000000000000000020
+:108060000000000000000000000000000000000010
+:108070000000000000000000000000000000000000
+:1080800000000000000000000000000000000000F0
+:1080900000000000000000000000000000000000E0
+:1080A00000000000000000000000000000000000D0
+:1080B00000000000000000000000000000000000C0
+:1080C00000000000000000000000000000000000B0
+:1080D00000000000000000000000000000000000A0
+:1080E0000000000000000000000000000000000090
+:1080F0000000000000000000000000000000000080
+:10810000000000000000000000000000000000006F
+:10811000000000000000000000000000000000005F
+:10812000000000000000000000000000000000004F
+:10813000000000000000000000000000000000003F
+:10814000000000000000000000000000000000002F
+:10815000000000000000000000000000000000001F
+:10816000000000000000000000000000000000000F
+:1081700000000000000000000000000000000000FF
+:1081800000000000000000000000000000000000EF
+:1081900000000000000000000000000000000000DF
+:1081A00000000000000000000000000000000000CF
+:1081B00000000000000000000000000000000000BF
+:1081C00000000000000000000000000000000000AF
+:1081D000000000000000000000000000000000009F
+:1081E000000000000000000000000000000000008F
+:1081F000000000000000000000000000000000007F
+:10820000000000000000000000000000000000006E
+:10821000000000000000000000000000000000005E
+:10822000000000000000000000000000000000004E
+:10823000000000000000000000000000000000003E
+:10824000000000000000000000000000000000002E
+:10825000000000000000000000000000000000001E
+:10826000000000000000000000000000000000000E
+:1082700000000000000000000000000000000000FE
+:1082800000000000000000000000000000000000EE
+:1082900000000000000000000000000000000000DE
+:1082A00000000000000000000000000000000000CE
+:1082B00000000000000000000000000000000000BE
+:1082C00000000000000000000000000000000000AE
+:1082D000000000000000000000000000000000009E
+:1082E000000000000000000000000000000000008E
+:1082F000000000000000000000000000000000007E
+:10830000000000000000000000000000000000006D
+:10831000000000000000000000000000000000005D
+:10832000000000000000000000000000000000004D
+:10833000000000000000000000000000000000003D
+:10834000000000000000000000000000000000002D
+:10835000000000000000000000000000000000001D
+:10836000000000000000000000000000000000000D
+:1083700000000000000000000000000000000000FD
+:1083800000000000000000000000000000000000ED
+:1083900000000000000000000000000000000000DD
+:1083A00000000000000000000000000000000000CD
+:1083B00000000000000000000000000000000000BD
+:1083C00000000000000000000000000000000000AD
+:1083D000000000000000000000000000000000009D
+:1083E000000000000000000000000000000000008D
+:1083F000000000000000000000000000000000007D
+:10840000000000000000000000000000000000006C
+:10841000000000000000000000000000000000005C
+:10842000000000000000000000000000000000004C
+:10843000000000000000000000000000000000003C
+:10844000000000000000000000000000000000002C
+:10845000000000000000000000000000000000001C
+:10846000000000000000000000000000000000000C
+:1084700000000000000000000000000000000000FC
+:1084800000000000000000000000000000000000EC
+:1084900000000000000000000000000000000000DC
+:1084A00000000000000000000000000000000000CC
+:1084B00000000000000000000000000000000000BC
+:1084C00000000000000000000000000000000000AC
+:1084D000000000000000000000000000000000009C
+:1084E000000000000000000000000000000000008C
+:1084F000000000000000000000000000000000007C
+:10850000000000000000000000000000000000006B
+:10851000000000000000000000000000000000005B
+:10852000000000000000000000000000000000004B
+:10853000000000000000000000000000000000003B
+:10854000000000000000000000000000000000002B
+:10855000000000000000000000000000000000001B
+:10856000000000000000000000000000000000000B
+:1085700000000000000000000000000000000000FB
+:1085800000000000000000000000000000000000EB
+:1085900000000000000000000000000000000000DB
+:1085A00000000000000000000000000000000000CB
+:1085B00000000000000000000000000000000000BB
+:1085C00000000000000000000000000000000000AB
+:1085D000000000000000000000000000000000009B
+:1085E000000000000000000000000000000000008B
+:1085F000000000000000000000000000000000007B
+:10860000000000000000000000000000000000006A
+:10861000000000000000000000000000000000005A
+:10862000000000000000000000000000000000004A
+:10863000000000000000000000000000000000003A
+:10864000000000000000000000000000000000002A
+:10865000000000000000000000000000000000001A
+:10866000000000000000000000000000000000000A
+:1086700000000000000000000000000000000000FA
+:1086800000000000000000000000000000000000EA
+:1086900000000000000000000000000000000000DA
+:1086A00000000000000000000000000000000000CA
+:1086B00000000000000000000000000000000000BA
+:1086C00000000000000000000000000000000000AA
+:1086D000000000000000000000000000000000009A
+:1086E000000000000000000000000000000000008A
+:1086F000000000000000000000000000000000007A
+:108700000000000000000000000000000000000069
+:108710000000000000000000000000000000000059
+:108720000000000000000000000000000000000049
+:108730000000000000000000000000000000000039
+:108740000000000000000000000000000000000029
+:108750000000000000000000000000000000000019
+:1087600000000000000000000000D841FBC1D84913
+:10877000000078DAED7D6D73DA4CB2E8F7FD157321
+:1087800073BF24779F64F52E91A7CEADC2801DF6EE
+:1087900018DB052471B27B8A9285B0B5111247129D
+:1087A0007EC9A9737FFBED1949A0167A05C9C639A0
+:1087B000A9DACDE306349AE99EE9E9F7FEAFBF10E6
+:1087C000F2E6666DD9F361FFCD472268AACACBC233
+:1087D0001F847E1CB86BE36EE82CDC2BDDF8610691
+:1087E000F0F57FC1C7F0C5DC5CE86B3B98988E6FF5
+:1087F00039B723776E6EBE63DFFA8667AD02CB753D
+:10880000E0E337D33BCB272BDDD39766607AC49A5E
+:108810009B4E602D2CD327D682047726F19FFCC077
+:108820005C12F855B076CC3959B81E39BFBC389BAC
+:108830007D9A9D9C772FFE9DBCE5DE91F8B32FF1CC
+:1088400067FCBB376C96EC9537BA6F4E9F56741A1F
+:108850006FD630A95B3A8EE504899F2CF547F85610
+:108860009165514E7C68D12972DB0FC247E1B38517
+:108870006EFBE6F673DB746E833BF89C57B61FAE57
+:108880003CEB5E0FD84B132F72170B9F218B17B445
+:10889000EDA70B4F3728464EACC0C7AF0CE279C3EB
+:1088A0007C79E50DFBF8BFA3AFDF584BFDD614FA7A
+:1088B0001343B7CD5318C1F50A30DD739D7BD3F355
+:1088C00001223E7D0016419F6008650391B91EE8B4
+:1088D000247089A1AF74C30A74C73073B0B8B05D97
+:1088E0007D177DE2078913344134FF2A6A692CBE63
+:1088F000CFFE7283D1C05B67215414325097811E22
+:1089000036215148E1C7B05DE3C7A967FEE7DA74D5
+:108910008CA7EABBD0BF731F7CC29E268BCDE32DF4
+:108920006CA8EC3D92B99DF2F6DE764349D2F6D3BF
+:10893000B513EEA4373C47FEFDD3CF37CD6C35AE33
+:1089400081AD76B30E02F8FCB5ECB5E487C59BEDBE
+:10895000EEE9C6B3E6D78763E89AAC3C7761C18796
+:10896000AF003F8A540F3FDF0EC7CFB7D7849F8E2B
+:1089700052869FBFC4387A337F72F4A565C0DA1778
+:10898000D6EDDAD3236444D72AE3437017CE3319E4
+:108990009A016CE4D6F5E8676F2E26A3C47A539843
+:1089A0003D753D036ED5F072267AC02ED9CDD85BC9
+:1089B00076F781904BC77E220FAEF7835DC673CBEF
+:1089C000D76F6CF3C2B57C736405D62D9B1FBD7A3F
+:1089D0002DE7CEBAB182CDBC2677D622A03736A0FD
+:1089E000E0C39B02F617490AF8C3903EBCA02630AC
+:1089F0006F1AF1F4FB218E082029F05CDBAFC795DC
+:108A00006B5DE01B1A4A5A0663BDF85B771FAEBA6E
+:108A1000FD02D6C1BE186F70BF252C3E39A643118A
+:108A20007F66BBF7661EC9C32F73893E31037A5830
+:108A3000C281C8ADE9981EE0F0963E44E670E58537
+:108A4000E8DD8F52A93BEE8569C5778446A83208D8
+:108A50005115E21593C30FACE5DA5EFBA770808079
+:108A6000471570B18BF5F206C4097741E267C82259
+:108A70007AA8162AAA63FF3091355B9638008B934B
+:108A800078D921AE6027AC6161189DB780B0C97AF2
+:108A9000B5F24C9FF2FB10F1F3DC8D0EBF26899FDF
+:108AA00057DEF3F4393FF3B982CDCE1FF96657B8DC
+:108AB00046377B1AB7996C089E49EB748840F03DA5
+:108AC00059D21F54A54CC603AF97FF089CD628491E
+:108AD000287218BA312D1CF70456605B8E39366D3A
+:108AE000FD118B0A298AC4BF2C254874C3137D1D30
+:108AF000B84B18D22037D1A320206CDEF24BDC1209
+:108B00007C33B7443FC2588C6292A0062698AD3B96
+:108B100073906457263D6485E7A732833B8F870CAB
+:108B2000991B3D42E4C1B26DB2F64D2238732A7EE4
+:108B3000D1BB877DCB945BFFD7386282D4E411DB55
+:108B4000A291A13EE3B0654BBE7B49DFE99306D419
+:108B500072E8B064B995A82DC7B0D7732A9D6F8409
+:108B600071E253911A3EFAF09C14349DF592FE8402
+:108B7000FB48225C3114902D0EFE20FC47121F8210
+:108B8000F497CF7303B6299AE7AE2CCD8CFBEECFCA
+:108B9000DC03CDBEABBA21E6F0E33FC80FD35C5196
+:108BA000FA33FB27686A4CC7227419F7E155F9E1DB
+:108BB0009738C85CA34462784ED9FFEE740FC44E58
+:108BC0005893032BCD172AAB1C59CB995BF4192072
+:108BD0000A28CD3A89C6A66AAE118FFF6B90256927
+:108BE000B238802EBD08415BEC6772D54FFE9363AF
+:108BF00034C14BEFE840D4506131DB43285D528CE7
+:108C000084C72860028D91B4ADFC1AE452A4468F4B
+:108C100051488F94F137CBC0D304CD322E38127126
+:108C20005B4A30386C9E0EB8A24FFB44F7E8A7545D
+:108C3000C0816BD37D78E6E3B67B19527410860A47
+:108C4000740D6E3F7E0EEA278D8EED5D801BCA8708
+:108C50000B033AA5768867FE343DF7D2193C5A419A
+:108C60001F6EAF890DFF1C74232E989D5227E1C8FB
+:108C7000E4E1CE748809A3D37B710E83139FBEE217
+:108C8000D738C21AD7902591A1EA2B45D520421595
+:108C9000250609A9913ED35FF51FE67A7566FAC1EC
+:108CA000DA2B54E9CFAFBE9E95D20B06710848AFC0
+:108CB0000F6C54721B0EFBEB28F6FBF96B73B58E31
+:108CC00010F924C27E96D6115E60D33BCBF8516872
+:108CD000FA65BF20B50CC0017BE49734FFAA4A9324
+:108CE000544AE236EDAD09458913EA24DE3A69B605
+:108CF000B112F9AE6693B05F9161FF0319DC9BDEA0
+:108D0000135958DEF2815E6FE117773A5C7604B84A
+:108D100039F05CF62BFA8C71671A3FFCF59218BAA1
+:108D20006DACED5055844BD20BFCD08B0332CFBDD4
+:108D30006EAFCD0FA40CD1B60BFC3BD3DCA9A8AA17
+:108D40002AF0729AC692D0913A8A2A740EB2346787
+:108D5000FAC7F6B0C4ECBAF923D41460FDD43603D4
+:108D6000F899F75E14B69874C308931B4AC23F4241
+:108D70005C329FD882C600D06FC2A903794C1B0910
+:108D80001BF5B0CA3D233AEB0B833BD8FCDF6CB933
+:108D9000A294C4A6699B4BD361C348B93CE693A98E
+:108DA000CF93213C1EB9790ACC8A36A77F441F1184
+:108DB00022089AB2F5FD11BA29792D0903282561F7
+:108DC0004D909408FA8F12EEB4415E124F59FA6832
+:108DD000B4E00875BC92525D928EDA249E36E30BA5
+:108DE00052929481B736E80BB23DBC59262E05CE7F
+:108DF000057E270BB71A9B2BD703016B613956DA17
+:108E00000695A011BAABD2FC878E0352151D0898A7
+:108E10007F3C52E9F6A6FAEE9B62CA25180749B8CC
+:108E20004E0891723E57727EA3E67C8EB68190000A
+:108E30003A795FF05CDEE37C9571D11722DA9449D0
+:108E400040CAFB26F908F7FBEFDF7FFFFEFBF7DFE9
+:108E5000BFEADF7977B020EF23E7CCADA58F6F179E
+:108E600041DB7DC3561BE00429F32215E54A0226A7
+:108E7000BEF0B56C59494B3BF5E2B7E7899DE7A1D8
+:108E800000098226323C52A3E483EBCDFD3F12CE93
+:108E90001E26C1DF3119EAC3918787EC65214EC9CF
+:108EA000EC6B3F7097CC360F7819CEF32419255F01
+:108EB0009001017DED839489510BFA520EF62A48F8
+:108EC0003052F2C27FAD40DE3944217551A4239265
+:108ED0001473021C774FA25274109323D60D282AC4
+:108EE0003D858C86E9702C6AD92F92C5652D5B1A59
+:108EF0004F3E59248CAB425AF7CF7A7263038814E1
+:108F0000A84E073386AA67B4C4F92DAB491347743A
+:108F1000A053C6D8C79E6DADCEDD873C93D124F457
+:108F2000295EC501EF7E9631F191D051081D663F53
+:108F3000CB909C54ED1376A1CB9B7F0140FAB1E11D
+:108F400089E8CE9C849A8D8554E8E4E1CD310EE524
+:108F500084E266A34EE4C57CC6C567047AC34BA50C
+:108F6000159F5690C7268CD75F7BB906B96E8F4C7C
+:108F7000D78E95320720E60578B496EB2599C76C15
+:108F80008B06367B74607A15843EDF6A681764A5A9
+:108F9000BA49AE7B3A78162B9C2C3514A3C1704D80
+:108FA000FAF1194BA9C4D43964E8ABFEDCEFEBC687
+:108FB00089A5FB13D3CEA3CA95E7CED7E17E9B9AB2
+:108FC0007E40AA50A9DF9FCCFADDDEEC64D89DCCB0
+:108FD0002683F38A4183F20B102446D8CE32298EA1
+:108FE0007AFAEA23012C114013A178221451D543B7
+:108FF0006A39F5B070A920C433B5C30DAF478314E7
+:1090000019F57BF3CAD47F8C2989672B23D7B1F854
+:10901000892510EC58BAE3954FEF40AA625F92EEB3
+:10902000BDE9D184263A2C61E356A39CA870520D69
+:10903000E2EDC5C89A0D85E215BE80A529D9B4E137
+:10904000563BE298F7786505C6DD6CB93CF0CE601A
+:10905000C3543D279226D6382A8E6EBBB7CF134312
+:10906000DE11B85A17C53AFBA68819D464BEA4A766
+:10907000AE6F2D16DDF9BF9AE45093FE28E44EFD45
+:10908000E1E9E9ACDBFF7B35D4AB47C9A1004D2159
+:1090900077A288221453355894A6B5C8A2E6A096A4
+:1090A0007D771D7362FD34AF73E9E786910A992CD1
+:1090B00060E3518791081D8AD0B1C8F59E71E848D8
+:1090C000A77E2996A4650A59E25EB903F9F8FED68F
+:1090D00024BEBFFD82F89685C3F16D8CFD3B98736D
+:1090E00077617EB95DEBDEBC61410A98C8ECCBD9F3
+:1090F000E7EEB85F438C3A221ED5EF8D3F12400E4B
+:1091000009B153537C120FCCA629E64D8ECB5C3AA5
+:10911000E7AB87DB89BB0E7A816773FB4572508BA7
+:109120008A9D1C26742833DDE4227C0B59999EE528
+:10913000568DBC12E55A177CD354CCC44C751DA671
+:10914000A368CF4B36BE19B2F187924D9190EA7E5B
+:109150000C74E3EBD04D6BF3B8B144F89E7163F837
+:10916000B5F4FF844D33DFA4D93BE925139A893E3A
+:10917000FFD7DA0FE873759DE82D9A119F6123ECF4
+:10918000581C8B0C8E9DEC044695DBC3E298A731EE
+:10919000650738636AA5F6C9E9646A2D4DD8BEB97A
+:1091A000EAECC5A8F84CC73622679345FA96FF1B30
+:1091B000AFBC238072D7016D9E45A22F618710D36B
+:1091C000D657BE496ECCE0C1341D6A1187DFAC5959
+:1091D000BA4022C4D60041BB220BE06B189570C088
+:1091E0006F03E7FF144D9904111EAB7300456CD358
+:1091F0005E110B4B3D63E08CCDDB26E5A45E6F3644
+:10920000B8988D0767AF4F8D632252CF20032A8F06
+:10921000DFD6918E0E4C622D26D6829A2BC6618D9A
+:1092200095ECBBD57D2057EE031C301C92597C3643
+:1092300013B93884BDC263D1EA2ECBBDA3172F0E5C
+:1092400083AD1804A5D588AE3C8D63064F4D3DFD1A
+:109250008A46CE20CD3CA5AB7A53DD35C1C94A9BA9
+:10926000E7CEFD19E6E0B1B9F9E5E78EEECB7C3249
+:109270006E93F319017D564D84860612403D4BC412
+:109280000A53F3AA914EAE13181B2F2435C106C8FA
+:10929000D6DF4C9B04F454B2A54537488D33A974EE
+:1092A000DA24E4C62CB62D05D37375CF371BB58CE5
+:1092B000F5BAE783D969B737BD1CCF7A97DDF1647A
+:1092C000509DB11EA7059FE18B84082311C66AD467
+:1092D000C550DA148BC38042731E1A44280AFC83DB
+:1092E000EC36E3683C125958C211ABC92E82F2AA7F
+:1092F0006CF8A2A81E1E4F61D364BBEF39C59592CE
+:10930000D8FFFEB7AF19E83EA78F93EF688B55C51E
+:10931000769D5BEB18D02D48F97A7D5EE0CF4ACB85
+:10932000C8E73F778D1F7DCB0FA5FF3CF1822EF064
+:109330009CD643FABB15D0B8F253CB0E102FCE8E6D
+:10934000ADDEDCC361E19428908891A7AE2EA82AF7
+:1093500049C50E43220AA506A8BED6D79E3B7F4725
+:109360000D940AD4C0CC886E4190AB4997E56A60F1
+:10937000D6A15B58416FEDDD9B2191A6772085DD5D
+:10938000B9F69C791CAFF21D99DDF3B351C619A44F
+:109390001FC3F608081B332E9913C4A3D67164AA01
+:1093A000BBF5B438EE480DD892221D5E09338AB958
+:1093B0009185EC981BFEC0981B145C981973134F91
+:1093C000406C6902C908A6C20970AD4C40EA24EBA2
+:1093D0006A154C40E0B59C09A8DAAE5345A9EEE801
+:1093E00096851D0CF0D91350CB3357AA25A228021D
+:1093F0008AEC4FC3BCC609421A6E241105DE9344A1
+:109400004D71324ABC6C251BEFE5F1416598974AD6
+:10941000F75E2CD07FD5EFCDCBF8C1C624F9AFDDF8
+:109420002F83D9E5E9E964306D5E177B46F19D62D3
+:109430008744E8A9E1D86E55A78E378F94BD79CAC5
+:10944000FD00A59B87D32AF28D1CCE297185BED83D
+:10945000B2F78B95F956CED5211CF8FED268CDF81F
+:10946000FD7C0EDFEC1C4A0264602B3DBF0BD75B1A
+:109470001E747AABE6A145EF0C6D689B37D7E4D13B
+:109480005C6E1A56E737F01BF80DFC067E03BF81B1
+:109490002601E9051DE33942E6C7ACFBB366029D30
+:1094A000C04999893B4AC50A0D7B38D28B45D3A860
+:1094B0007C48D446A4C88557E8498F9374A883E7AD
+:1094C000CE2451063E4D67776E69AE45EC33E70515
+:1094D000EED34F66FD50E08F8A6E72E105BDE471F8
+:1094E0007995B8947B2D5F1D2FAB7C9B3EF2D3C941
+:1094F00070A4701B8BD8C1311051A90E3A2CB9370A
+:10950000990384053EDCD0A007DB7D08B327B7B6FE
+:10951000325AEBE6D10A8BDBE308088A6597C08BE9
+:109520003F904BF8D67BB02872E9EF8042208CDE6A
+:10953000D3D633F427A717A3A814889E1AE243555D
+:109540006F2EC7BD641405C595C26D91522780A2C8
+:10955000555F11F5AD7617E6B9B908CE3C779D5B3E
+:10956000274CE893E8F4979ACBB342E26078E25B49
+:10957000A05CC4A500810DFBCC39CFBCA4276BCF68
+:10958000AF1D5785E95701168FE0B660CBA5D8A669
+:1095900021AC6F9AB4AFF358BF7FC6DB619B5AF121
+:1095A000C9FA3931ED86037126FDD9A7E1771AACE6
+:1095B0005CDD69CC1D695205010CD188E59A7139D1
+:1095C0007CAB619431FD7E075165936D9F482AE421
+:1095D00024688762E3C72A813715AD43558D43DE82
+:1095E00063FD2A52FF232A6BBCA4C631BE264B7DE5
+:1095F00055A86F14AA1B5AA6B6A1A9A2F2B2F7C920
+:109600003682E294F64C682B22E9747851231EA925
+:1096100073FCF148A7B8C344693492C63D4388EE51
+:10962000D1255E1E5D52D32139978726F917D3D0F5
+:109630007FB056E6B791E59485D8C43554C34AA6A1
+:10964000AE574DA364C3D342D461AA0520E51BD114
+:109650001F2DBFF100C196037547D5D7531664205F
+:1096600076DA340938EBE5F871B47ECC2363F84C34
+:1096700021EDB69910CB35C8044C970BDBD7199662
+:10968000798F73D28FF4105ED4584269F327497BE7
+:109690000609FDD237FAD67D93BCF372D203B6F930
+:1096A000E5B58BE88018423153E3D2E35B8D8F0F31
+:1096B0008BB5D3EC997C56A97B644A7F553735ED41
+:1096C000EB9D49AD65A19D6D6B0E4B345A808DECC1
+:1096D000B855FB3DD613D4F9BCBF9F41304EE3FCD7
+:1096E00059B2D7F88AB9A70764AF45A5FDE71BFBB8
+:1096F000714C540B6EA8D44DFCC3726881F2B82B28
+:10970000558518EF093C121635CF680A180DB34776
+:1097100068B7A0BDB2C8EECEE1B9F90FA541555565
+:10972000782EEB706DF9712F94B0D2F5EA0E964E4B
+:10973000EFA2875AE1172F1A5F157BBA52ABA8CE5A
+:109740008525A9D5E416369B617E4B9BFD593023B8
+:10975000A1BE580072433A86E483A3E4DAEB4D11CC
+:1097600031E0C120FCD94FEC17BA7763C13DEE3D23
+:109770006D28FC076DC04D00B52E316E0C7626D8D5
+:1097800045BF64D1E91FC8290C613EEACB950DB8ED
+:10979000B7C30E3E2C9DDC8717C14588DE073B67AB
+:1097A000F70D401873E5B391D96B2CC7F04C98A80E
+:1097B000BFFDC5F6FEB88179EA3FA25E573483D576
+:1097C000BAA56F0C8708EE3C777D7BC79E839F010F
+:1097D000CA3E90C99DBBB6E7CCEF13FE34B8D38127
+:1097E000D30C2F66579FBA93C16C78D1AB7B03F132
+:1097F000756F9DFF093790C0296DE74F5FB1ED3B55
+:109800008CB60779BB21E0BBD4913A612DE38B4C38
+:109810008FE12FFC1C3B63B19B083426BA91A3BE99
+:10982000F420879B16C8E1643A1E5C9395E5F81F07
+:10983000C23ED8CC936879F0E37F5255267AE33F55
+:10984000DF80FC13787067B2F6446BBF7257A27F5B
+:109850001C9579EF04AFDE2FB4EB1555FF4C6C006F
+:10986000DDF3F4A7CD376F68DF0A56D761E82CDC4B
+:109870000F5B14BED9B7335CE336C0D86A7455C2E7
+:10988000C2F7D179369BBBBAD67374B6A2CD81AD7F
+:10989000A1F2C8629B972DE0658C120F0F4B3A1C0A
+:1098A000E98FCC96924A3EDC154EF94C7AED26DDD6
+:1098B0001C6FD1A8BD92EE31F281320648F897C0F4
+:1098C000FD9CA0B0256A3D0B9DBB1D9032E6E8359E
+:1098D000712A7DF335385B36D05DE2E57CCE5D4E96
+:1098E00099794EE1DA3499032B5D5FB9ABCFABBE0A
+:1098F000FBE07CB5E6B8AE79BD94C6CD798231C9BE
+:10990000CA5D91F58ACC6158F2C0C6AD563B2AE9D2
+:109910007E7EB91CC4320DAFC8E7AA656611EEE6BB
+:1099200092D27898B109F7A37513D6B91D3A804F32
+:1099300090BA2B36D04BC83A42E1C9A29554C85BC5
+:10994000D0CC79EEFDD227AC5FE03B1A2BE5994BEA
+:10995000DD6265E959DD8338262E12CDA979C08EE6
+:109960006B5EBCDFD6BC88AC97ACC0D4A653F87A8B
+:10997000358799FAB5A5205E46B237B78754D4F239
+:10998000414624A2CF86342A909484024929BB1BE5
+:1099900056477BA1781A2A8FC16057A6D73BE95555
+:1099A00035D1E76B263B247F41433B28A83E2D80E1
+:1099B0004668C126A6CBD6B1B11F584A28DD872CF0
+:1099C000CFD1454B545EF3CD5CA0D7EF0DD7F5E674
+:1099D00096436BD2B0DE139E03CBE7E328CAD05583
+:1099E000E499B795BBFEF19CDA399A733861D3FFDD
+:1099F000496B7A5EF375DC5B82D6B6BB9251916B94
+:109A0000958ADCFE54E48E92845C0D120AAD9AEEC7
+:109A10009E46FAE321E5AFBF113A403543B6B07B2D
+:109A2000A044414D34BE3B3653362F704D65E97727
+:109A3000848A9D315218291590959D14EFF774086A
+:109A40002D7B165553F5EBCE42E3EACC22275F5F20
+:109A50003CB44D08AA81575431A0C3B7840749AB21
+:109A60008307A59DC209AAA05544839A33818329FF
+:109A7000A14A158B4774A49628D151EA5042CE9939
+:109A8000C5C178E0ABEE48ADA5CE39A589D08F53DE
+:109A9000D736BDE6828D8278381A8F73CDE2719801
+:109AA000CEC4EEEEC6AD802D5FDA8FC9E52C76D63A
+:109AB00050867DA9D52622C11DC8FBA13D829507F0
+:109AC0006CAB1ED394BE67F32C7B53DDB2221C52C9
+:109AD000740554759743407E473DE5C5E484268A66
+:109AE0003255F4C056567277CD292CB98769B3F632
+:109AF000DAA7F46DD892B28D44BB616F62FAA511FA
+:109B0000BE8B1A5474E33FD7169CC4D8A2428D264C
+:109B10001F0E714CF247670E39D95978C3A61055FC
+:109B2000925EC41412F67E1F01352C76C087A3BD49
+:109B3000D217BBB6ED3E848E7A565F7638A21BE311
+:109B4000C6247AD89D684EDCFBA8CFF84AF70312EA
+:109B50003CB89159ED43E33743E3C985218EC89260
+:109B600022E97D58647438AA9360D86E0C4688EF59
+:109B7000D38BD127EBF6AE340BF5B42C0B7543BF6A
+:109B80004D7EA97E43FB4C3DDC59C6DD4E7A28A1B3
+:109B9000FF073A1BBA4DE3AB169EBB0C93572F46FB
+:109BA000346825A8CA0878F945F347C3A2C8B06A43
+:109BB0003AEF3BC0235BFE9D5F2F93546EB5890245
+:109BC000CD7105C5F478F38C59567959A6B1C232D6
+:109BD000CF0F4935E65F3ED31856BA5FAAF1B304FA
+:109BE00031FF6E6C5316CDBC77771B4E6837577CB0
+:109BF0000D17CD545F8DF447F897F65468280F245D
+:109C0000F2F5873E313840098FD8D6FFB50AF535D1
+:109C10009D84F3A09F341F23D9B2A0D6DF4C7DBB17
+:109C200068F89B2EBC8EE9B5D5920086FD43BB66D5
+:109C3000F12505795AFB3756092357BAAC9D0A23FB
+:109C4000282B0E40B5230F2EB680F4CEFF5DBB7ED1
+:109C5000D614D357DE5D45965AEFAE424942928400
+:109C6000637D70525598EF6E42F5969687A1D7E8BE
+:109C70009EC945E79F4E6CDDF941C22AE6AC940AC5
+:109C8000BB958F3FF1BFC2CCCB6E60ED192A4C8AD9
+:109C90008258D5A62766D911326BD2CA9D32C3EA43
+:109CA000DCB403FDF97A46D0B7B5D02E62B388167E
+:109CB000FA45D0B19B6818D16A3A6FBC87B8862A3A
+:109CC000FB56C9336AA892AF24271D10C5957CE3C3
+:109CD0009AF2DF4BF59943AD98204C9190F4DFE96F
+:109CE000669EB0E0FAA8E2786D7B66827D9442CFF2
+:109CF000545EFE056C9A8A20B568D37CFAEC84D158
+:109D000039A36533E2EFCA7A34ED50DE6526BCA58F
+:109D100065DB16F36CD74D85E68F47D24D2E0AB61C
+:109D200075B88AD4F2EA782C5AD56C02DD0074F446
+:109D30005C73B1AFBC2B16D8A8E1D105E309C48090
+:109D4000372C2CC3DAA38BA08A22F2F24AED0A88C0
+:109D50006DA2EE12C901A424A0244753C504A0E1BA
+:109D600097A29ABE029A8398E42DBC8C7EA922DB2E
+:109D7000B986B810F2BF087CB284BB2024A7228821
+:109D8000E89722FE0EA14044384065E1051ECDA5AE
+:109D900023A379224846E5E485E4AC3B087BC96F00
+:109DA00044F1987409B1C8D08FCA8927B4894E6B21
+:109DB00025263726AAE138BA23492F711E8ADA7977
+:109DC000743D533FA736D0736B6905A55772ADA696
+:109DD0001E746CC206276C7432CDB09CD5A93B7939
+:109DE000BCFDA9A5FD44C3CC5483C983151877CD08
+:109DF0005C8071DAFAE77DD20B10BA5FF8D28B5C27
+:109E00003107A516C8ADD67A036D62DA52E58F44E4
+:109E1000EEEA2B2EFE91B38AD2D8E4564D72C1637E
+:109E2000CFB656C0A40E09899C3E123A0AE5757B4E
+:109E3000DA52D09D7114291F7C814B2B39D944CE25
+:109E400087B4E2859D7C1BEFD61C8E4AEF958979FD
+:109E50004B2FBDCCFC9A8D8B2EA8797D70B54AD343
+:109E60001E41F8292F4A52033DF242FD7A0C8284AA
+:109E70005E66123A54C50E9F87B791E875247A5FE3
+:109E8000A55CC2A44095940993825F5200957E5DC3
+:109E9000C55A95851615EBD0B4C46B79C1C03B0586
+:109EA00047929F9459C55027FA829E55BC9613112C
+:109EB0002DEEF46E12951AAF57B48AAFCF0B019600
+:109EC0000F8A3C8519C842C90C6207ED191CBDB345
+:109ED000C841DB703DD8B3EE7430DBF8685F67FED5
+:109EE000F5D64F4B1145CE623F6DDD9ABE62FBA6A3
+:109EF0007E5ECB89A496941D8CE2A603257700C7CD
+:109F000049D562B941DF6FFE38C1EB45A1E27192DC
+:109F10009B6726F07A5EA9F8FAAA61E47C8D9773B4
+:109F20005CC59777725E9ED147AB1EF135AE22F1CC
+:109F3000B5AA19153527A0947A9BDC9FE62710C295
+:109F40002E178BE7C9DCA5A1429667B230A43B5A15
+:109F500024C77123ED97461786B50BC80DADB963BD
+:109F6000C689BDB7B4A249ED40540ED9CCD4E3CBD9
+:109F7000CDA56807BD6AD17408AAFA82D588A70D55
+:109F8000D6DA16958AB5B683FFE9B5B67FD5BF8F09
+:109F9000B186F8B4B486B858149B22AB99528EC6D9
+:109FA0002B2F533F68B97EA43611F3D29BE7671C71
+:109FB000943535C93FA86C5816A19A3017311B92B9
+:109FC000A91B77D4A474C8C19573FCE0C8CD917463
+:109FD0003B1CC1864208276FCF07A7D3776F9A0C27
+:109FE00074125FA6F595E37A4BDD3E4FB598BF74CA
+:109FF00006F3DBD6129B2ED83B6307453446B2ED01
+:10A000003CB974089B407DE10117F6A89FEFD4701E
+:10A0100066F4B3359F17A4169BCFD3CD6FFD34F7ED
+:10A02000E533428520A7C6184DB2815EE748188700
+:10A03000F5D36C565A14B417AD5AF7C55836DCE34D
+:10A04000E04B6F54BDB381766CD5EA001F75FB19E8
+:10A05000B4DA3FC7FF61AD0A6B2657AFAB3581A1BC
+:10A06000EA944D2E6D01BF0F47359D358D457AC35E
+:10A070007D24AEF327E13F52FDEBCF062A4D70DC85
+:10A08000611921B91B2AFBDCD082C203A7F186F536
+:10A09000838BD7D7358C9D1BD6A67EE0D43837A2CC
+:10A0A000DA6A59FBB9DFD70DDAA3A42077A70A59DA
+:10A0B000FAFD09B9A565CEF46D3879B552742F4013
+:10A0C000A2129C0BD28175A93601C080943E208FCC
+:10A0D000F580C98DB3FF7441BB795A4BD35D077BC3
+:10A0E000E7D86D7DF8860B42BBB1A6E5E4E240EA15
+:10A0F000070BE4CCE1C8DFA4D99996474B4DAF4C90
+:10A1000056756EEBE1DC18B496EE3D2D4E07338AA2
+:10A11000B3F6581E9D573DC152955F30690ED0C5AC
+:10A12000BA734648AD9130D76AA8F5ADEDDE9BF322
+:10A13000500BA01712FC315B143A4A3F3DDD78D634
+:10A140009C9CD107333618FB7C1EEB15D190B57C57
+:10A15000A1FC51063BE5F8A9F72BD28969C062FD45
+:10A16000C3F4FA5AD27DE1990B63FCA36A05C004DB
+:10A170009928CF28FB81B0CAF22CCF95568F371F74
+:10A180000D13F031EA5ECF2E2E8793C1ECE4F37805
+:10A19000329D7C7805F1356C8D11E66AB442569E8D
+:10A1A000EB446DA23D662B2368E440D50C1C046291
+:10A1B00048AF2BF0A328342D4F7BE2563B67CAF9FA
+:10A1C000DE834BC7F2039A5A3DB272E53D56A11C9D
+:10A1D000B6D06291297927BF26DF49624C4207AD8C
+:10A1E0004403A9629968560516DE63D27244CDE233
+:10A1F0003AD35C214A0D446A3E5113518FD5C4773E
+:10A20000E73D77B9022E55581B3ADAC75F5395815F
+:10A210003769807428178EC3A6807772D03057C1F3
+:10A22000AC6C95EA28AFE82E11F8068A74F72D7FFA
+:10A23000254C8DBB2FFEFAE68BEF4C16417FED1DB2
+:10A2400022459F5DF467E3EB59FFF398FC5FF265ED
+:10A25000F2F964D617A60C7CCB73EFC85FC3CFE8C6
+:10A26000AFD29F7D995CCC26A7E16FFF4A848AA17B
+:10A270006AA27A7CD2F7C1B5ACE2DD3D7458837234
+:10A280002ABC0259C22D7D4AEB8550B2D9FA1399E6
+:10A29000BA84B19C8F3B284CD1D95AEAB76691C792
+:10A2A000B0CC1E58E42184E96DDA61B01E17440F6A
+:10A2B0000BDBB0B7623321EB28435BCFDCF85102F4
+:10A2C000CEAEE010569F7B1EA722DFD0DF42437F39
+:10A2D0008B0DFD2D35F4B77CC8DFF50DF6F947B4CD
+:10A2E00092557E737076375EB9FB670F67A2D454C0
+:10A2F000179C7D22A9042E2FE15554DA4CD2FC0D77
+:10A30000BD6EA86EE672F6D617385466B038753949
+:10A31000DEB07CCE86E5B5DF1BB659A26537501797
+:10A32000382D6918AC4634A1A1B47A89EBA0F8F4B1
+:10A3300052B099147B1EC516565BB2F8DA979CD4BE
+:10A340008AAB2D59AA1AE35DAFAA2E2F48D5A2CC0D
+:10A35000052E2F2C76B7AB27E23CA513280DCC5C3D
+:10A36000F8A7CEB24FA5DFE069EF22802BD3336888
+:10A37000239F5B33B637AF3CF3DE72D73E4C6C5352
+:10A380000FE44E0F50C9C7D09866863231AB4B6888
+:10A390002D6132B42E619453BA8DE2B4409F659121
+:10A3A0002C811B76B7DC2D2D982C26F8A1855CC559
+:10A3B000E66BC3E1F9D35A82F38810354CDE7CFB9F
+:10A3C00061EB029713B6AEED7AE86A840DF3C26EC4
+:10A3D000F16D2EFBFD3971CBBB81D3C0476A9C4F19
+:10A3E000B162D96D81CB09DD56A4838EA7585A81FD
+:10A3F0001D3EECDEF8DF9A30C98DA23A8E5DAA7D53
+:10A40000564D86AB6A136AD12097DDA54DDAAB3283
+:10A41000531672AF9B466EC56A69E2112377AFC2CD
+:10A4200093992787CFBBD93AC281972B2A41929D16
+:10A4300074108531F48C1B836F328AA1D73BE9F10C
+:10A44000CD9780799E2086F4E44BEB57B55A85343E
+:10A450004923AE691A71AF99465C1D1A89C233D17E
+:10A4600048689A46C26BA691508746AD96248805E7
+:10A4700015A515414528CD30632D2FE0168C23B24C
+:10A480001BAA441B5DAB6143AF793CF69EF7EB8B97
+:10A49000A5608D3297B16D7C52A7535BAB0165AE61
+:10A4A00067DDE63B802B350A4EFD885C8643EEE790
+:10A4B000FE6D301693FF4853008D3BDDB965268154
+:10A4C0003F88F011F44BDAD1DB24D77F10690B7D84
+:10A4D000FB83685BE8C60DEE289D60FC6F0D847001
+:10A4E0001EDA6AAF620827ACBAE7DAEBA5D3609C44
+:10A4F0004CE8D232C26169CFD3B56EDB4F753ABB3F
+:10A50000F3DA519498410BA9530E966B531472FCD5
+:10A51000E5D0B1820B971A062686EE0C9D3BEB86A2
+:10A520001D265AC377AFE0425A4E1F980F8D5EDA50
+:10A530002DC21F8F1E96C67DBBB5E2BCAB7A27BF6E
+:10A54000649F8D0B7F4986D1D228C6682A8E43B678
+:10A5500038230C6935429DA4560B3D65E62DBD5848
+:10A56000C652ED728738C919D50C44C0AF96A7C43E
+:10A570003795E69CA52347CD582A7562F97458276C
+:10A5800016DC5B231119FCA96EEB15EE385AAF6C83
+:10A59000DAAED4EDAA21B75AE80330179E3A16B5C1
+:10A5A00075BD6768572C30B2EF330C4AF95122EF72
+:10A5B000F9AC02562F71FACA42B8B87A7D8E720C85
+:10A5C0007809647FDB17D951E7875F19D93C2F1CC5
+:10A5D0008C6C90A4AFDC55DF7D702EDCC0B88B0591
+:10A5E000FDC373B646303259B92B3287B1091B7C93
+:10A5F00013D358B96A5BCBA1BB8D94C7E334ED503C
+:10A600002ACCA358B8D2FBA28EF57A1360573364D4
+:10A610005A3CDA70DD064AE2798F63F7611C2A81C1
+:10A62000CD67128FAF67E3CBAFB3F1E0CB603C19DE
+:10A6300090B7E771D79531757FBEAB2B9F89475691
+:10A640007EE0C4A3A92C9F57A04627D1D8685231D9
+:10A650005FD132DD785A716CEB9AAC4C73DE86A117
+:10A66000CB670357CB5F3D5223577A09A576AD568A
+:10A67000134D620B362BA5E7B45648EFE2F596D1A1
+:10A680008BABE739FBD4CE93B436ED2291E0F19950
+:10A69000891E876BCE3B52C73A123CDA332FBFA0DC
+:10A6A000C451E026D732250E6DA565D8A5CA8BF119
+:10A6B00052E572381C47AD15F22AF2D62FC89BC25C
+:10A6C0006A19AA4F0083B6E5980CC5612874CFF5C6
+:10A6D000BCE807CF919B22A9CAE1DEF3C83270EE35
+:10A6E0003EB4D1A2354C24C686016A3CA3C681A4DF
+:10A6F0006DA0765B56E1284C036196F41E9601B975
+:10A700004D2F2ABB17BFBB8EF98D6B4666F8F6DE60
+:10A71000705D6F6E399471B3D471CF01047031F5EF
+:10A72000C28BD8336F2BAB51C7E3319BB0B9FF0459
+:10A730006C916F5C1D31827F1E12F2AD9290DF9F93
+:10A7400084022F778E928A7C1D2AB66A8A376E8C95
+:10A7500061DD569AE9C085931E31D670AD38C1F6D9
+:10A76000BFAE736F3EB91EB9B174FF780B9C9430C5
+:10A770004149395096DB64A7028A7A116A728B6765
+:10A78000840D3A7A77BA776B7AF092BDEEB8A89BCF
+:10A79000FCDADF441F1BE180408980060C2F5CCF70
+:10A7A0003037171DEB2BBDCFEDF692775BD4C92464
+:10A7B000B1B03A31C25C9BBAD5C20A0CDAC087EAA2
+:10A7C0007F57A6FEA3912E40B132C906ACD812FE27
+:10A7D0005525EF4B4A0301AC36E839D49DD87E535A
+:10A7E00044CBD93445643D82612856AB64AFB6880A
+:10A7F0003CEA848621D4D341CCED3489A2975E61B2
+:10A80000E7868ED4664B4416DF30D203CF7A1CE93C
+:10A81000ABBDCBAD4A5ABEF912446C8ADA9E6B933B
+:10A82000A133371F29EBED83EC4345198AF72BDA67
+:10A830006FF090A2AB7C8524E1BC64DD646651B20C
+:10A84000395C72A38196D6416087C3208F41018312
+:10A850002206250CCA185430A81624BBE1EF340494
+:10A8600025E72BA036818282D0A5A00C6B0535E7A9
+:10A8700053D0543B928C4105832A06350C22047632
+:10A88000640E833C06050C262725A34E83328FBF1A
+:10A890004354E65192356AFA22F32A82340425E7BA
+:10A8A0002AA3A0054DE0780C0A181431286150C67F
+:10A8B000A0824115831A06F10EC4DB137D87E32FB6
+:10A8C000500B47554598451D235515511BB5544C04
+:10A8D000167087C94868EB01A861B08340B4FB34A7
+:10A8E000096D3F00050C8A18943088CA2B73828446
+:10A8F000C1D4B70A0671474C7CAF70420781222E43
+:10A90000B68BFA52F21CBA783495C78D37D126042B
+:10A9100050C6A0824115831A06112655BC1555D480
+:10A920003114C5DD3230F52D6E8AA98918C40D4267
+:10A930003519830A06550CA23977D066D43A6837A0
+:10A9400002C86350C0A0884109833206150CA25981
+:10A95000C9A9B6A662EA5B0D831DDC0395C3208FEF
+:10A96000410183220693735678C4BB14DC5E154004
+:10A9700019830A06550C6A18EC20109D3200D19CF0
+:10A9800055742501286210377D4DF55645571280C4
+:10A990002A06350C224C6AA84CB5222126A6483C32
+:10A9A000FE1675780550C0A0884109833206150C43
+:10A9B000A2AB9243771380E8B2E4641CA586EE262E
+:10A9C00000050C8A189430286310CD4A41DC0CC075
+:10A9D000D4B7B8552DE2F800224C2AE89401C86398
+:10A9E00050C060AA3B2F6EC18B2E2900150CAA18EF
+:10A9F000D430D8C1DD7C71E35F445F41C4F4ED2005
+:10AA00006E0660EA5B11831206650C2A185431A8A1
+:10AA100061B083452C0E833C06050C8A18943028BF
+:10AA2000633055AA2025DAA11B9D47DC0CC0D4B7A2
+:10AA3000E8C2E711E70790C7A0804111831206D151
+:10AA40009C35748E005431A861106152C3D19E5A56
+:10AA5000AABF356EEEACE18ED11AA2AF2AA19ED16B
+:10AA600000A6BE9531A86050C5A0864184490971F1
+:10AA70007E00937386BD2F6050C4A0844119830A61
+:10AA800006550C6A18EC2010D117042815831A06F5
+:10AA90003B0814F0B3880A000A181431286110AD7D
+:10AAA00048C4BAB888CE912822090A401E830206FB
+:10AAB000450C4A18C4EF45F49534440500250CCAEA
+:10AAC000184C3DAB6250C320C2A486A9A0A1532656
+:10AAD000CAE81C01286350C1A08A410D8308933243
+:10AAE000523601C4EFED6075085101B4230E833C6A
+:10AAF0000653AA14D6A544AC4C89589B12B13A858A
+:10AB00004E99A8A17304208F4101832206250CCA07
+:10AB1000185430987A2F52E444440500150CAA18B2
+:10AB20004C3D8B3029222A00C86350C0A05858BE23
+:10AB300044C5A08641B4EB528D3E78A47E022860C5
+:10AB400050C420A2A082A800A080411183A96765FB
+:10AB50000C2A185431A86110AD4844121480220602
+:10AB6000250CCA185430A86250C3207E2FBAD9E1F0
+:10AB700090A918D43088A8DF41540090C7A0804124
+:10AB800011831206D18A140E736F0E736F3EC5F9CE
+:10AB900031F7E631F7E631F7E631F7E6F17B797C1C
+:10ABA0001F616EC669F8A6D3F04D87791D87791DA0
+:10ABB000A7A546C6371DE6759C8679AC82B9B782D3
+:10ABC000B9B782B9B782B9B782B9B782475631F7F8
+:10ABD00046123280A9FB48C520BEE9447CD3615EA1
+:10ABE00027625E27625E27625E27625E27E253C6A7
+:10ABF0000B987B0B987B0B29CE9FB29261EE2DA414
+:10AC000046C6DC5BC0D6307CB3CB889B01886FBA6C
+:10AC10000EBEE93AF8A6EBE09BAE931A19615241D9
+:10AC2000A70C40CC6355CCBD55CCBD55CCBD55CC47
+:10AC3000BD35CCBD353CB286B937DAED00A6EE2382
+:10AC400034674DC6379D8C6F3A19DF7432BEE964A4
+:10AC50003CB28C6F3A19DF7432E6B1F8EE56F0DD93
+:10AC6000ADE0BB5BC177B782EF6E454C8D8CB937D9
+:10AC7000DAEDC0CC53F7918C4105832A06350CE2FE
+:10AC80009B0EF33A1EF33A1EF33A1EDB7D357C77BA
+:10AC90006BF8EED63A29CECF6350C0201E19ED7660
+:10ACA00000650CE2FB08698B00E29B4EC1371DE694
+:10ACB0007522E675A2921A19DF7498D789D81AC03E
+:10ACC000A76C5012B63249D8CA24612B9384AD4C7C
+:10ACD000121E59C65626B4DB014C59C6640C628B51
+:10ACE0009C842D7212B6C849D82227638B9C8C2D68
+:10ACF00072A9F7629B9B94B641612B1387AD4C5CA4
+:10AD0000EA596C65E2B09589C35626B4DB01D4B02C
+:10AD1000298CC7A0804111831206650C2A18543172
+:10AD2000987A2FB614A56C50D8C6A8601BA3826D64
+:10AD30008C0AB6312A0AB63229D8CA8476BBA22830
+:10AD400029CB18B6C861EF1587DD571CB6C970D876
+:10AD500026C3619B0C876D325CEABDD8E6D649D923
+:10AD6000A0B08DB1836D8C1D3EF52CB632F1D8CAE2
+:10AD7000C4632B13D2CA958E90B28C618B1C8F2D1D
+:10AD8000723CB6C8619B8C886D3222B6C988D826C1
+:10AD900023A6DE2B604B51CA0685DD4A3CF62BF11B
+:10ADA000D8B1C463CF128F5D4B3CF62DF1D8B9C436
+:10ADB000AB29CB18B6C8E1146259C51639155BE446
+:10ADC000B06D5356B1454EC516B9D47BB1CD4D4A81
+:10ADD000D9A0046C6512B09549483D8BAD4C02B6C4
+:10ADE0003289D8CA84B47255125396316C9113B01B
+:10ADF000454EC01639015BE4B06D5313B1454EC4E6
+:10AE000016B9D47BB1CD4DC1364605DB18156C6340
+:10AE100054B4D4B3D8E5AD6197B7865DDE485F50D2
+:10AE20001574B363275D12C0CEAE2480182B62ABBD
+:10AE300088A9622707F23F638362474C7D8B1DDD43
+:10AE4000D8A0D8C106C58E841DDD12767423E540D6
+:10AE5000EDA06B5CC0D6646C4CC6B664748C057C8B
+:10AE60009AF061C267091F25EC8BE391940460EAB4
+:10AE70005B09833206150CAA18D430D8C17E6F2422
+:10AE8000BB6115086B405801C2FA0F567FB0F683BC
+:10AE9000951F74826401BBB225ECE896F0B7327658
+:10AEA00074CBD8D12D6347B78C1DDD327674235512
+:10AEB0004093D0A5AD623E855D03D833800F2D3E13
+:10AEC000B3F8C8E2138B0FAC863DD838A841E552E1
+:10AED000DF62FF360E6A50715083CA61FF368FFD04
+:10AEE000DBE85003286027BC88411C0B20E2580097
+:10AEF000EC0DE6B03798C3DE600E7B8339EC0DE6CF
+:10AF000024ECC15652207668E370860E0E67E8285E
+:10AF1000D8A1AD6087368E9BE8A0330E602A2E0E36
+:10AF2000CD59E8E05800ECB3153A985B62E7B08081
+:10AF30009DC302760E0BD8392C542EC5DC667E5A82
+:10AF400018BE4646FA6A950AC5DE695D2D69050197
+:10AF500078749F6455B9447BE039B347A34A6D12B6
+:10AF60002A3A7D40926066A0E97CBDB22D23AC1ADE
+:10AF7000F42678ECE22263C9C2008286A7C71A478A
+:10AF800018FA6A323F5BEB5E0BA99293FEECEC730E
+:10AF900077FC7A5325C994A2A8A7AF3E92C99C30EA
+:10AFA0002CED9133C92B5ABB6548BE3759D7F67B78
+:10AFB000C5026E475CD376AFBE44A978EBD5C3ED2E
+:10AFC000D8A411C623775ED019F7DC7D08B3EEC88C
+:10AFD00057FD87B95E91282B28FF5044F1FD1E1BB9
+:10AFE0009C2CC26C1C5AF5FCFCEAEB1959C2DB5EC6
+:10AFF0005B069799B5A21A39402D9F0FFDB167796D
+:10B00000866D4E6831F9A93B70E634B3B8A164FE91
+:10B01000A8A0CCA6D0232B4D1F96AD0F5C623A732F
+:10B0200016446FB009349FDDD0769EFF9EAB2B2374
+:10B0300078BB7599A6C69D403B871DD8E2AD6FD2FF
+:10B04000D6637AC096E92EC2A6A1F88922F6281CFA
+:10B0500061C6972C3594F1C5AEC5B0F41EEED81676
+:10B06000DE2853376EDD96E6AAEE03639694A7E6D4
+:10B0700026803192E6CB1426DB7B1CDB7973F72725
+:10B08000AC9E0F1355E0EF0FC7DF6D9C5E182CE5EB
+:10B090003BCDEA4B2B524A6DA676458263DE797929
+:10B0A000FCDB384B40DFEC874792923B9B91EFF201
+:10B0B000DE1B577AE53E1278352DAEFB27E1E3BF64
+:10B0C000BFFDD940ED56E1C044BA8AB55B81260682
+:10B0D0006C0360B42F783B7D0E2751917AFC315D73
+:10B0E0004FF1DCF1A236EBAD7327B52A8484A5328B
+:10B0F00040C43ED519D95A4ADE0B9F778D1FD183A4
+:10B1000054A827D12B0F48D0E272EDB6DCB364ED22
+:10B110003D5B09508D6FB104A867B21181D45726E9
+:10B12000ED0BDC84D236DE8C49A241F72CB17F3C9A
+:10B13000E5DC0EEFF61B9A5D4451C82E909FD5FEBC
+:10B1400058A951F3852B6B4612BF5F6CA5D397A40A
+:10B150000A6515FA19CABB80BAFBB080A0B534DD08
+:10B1600075D09C0A4BEF96709654308EF43E2ACEE2
+:10B17000B0EB24705DB8799CA790F2E4810DEAD31E
+:10B1800026C8DCFBA54F804F06FEBBE65B41B47CC6
+:10B19000D99CB2C5E81BA49220C26AF52B866BB578
+:10B1A0007656BCEBE436DA4248AA2C54DCF56A4504
+:10B1B00063A720247D6FFB1A3CE3DE43EA9BEC6926
+:10B1C0006B52F62CB5CA6DCE6AB52A92348EAB8816
+:10B1D000A79C3E63E2C133E02BB65ACBE34F927893
+:10B1E0006833C4CEEE66C96E8698C7A2798E3BA836
+:10B1F000894967B73530BF6315BA582FC7EE830F3B
+:10B20000F7E60955ED0F699E4025D195EBFB16B584
+:10B21000836DBB2878B45809ADC04FD9CD0A3E83A1
+:10B22000B19819A1623DB417545333F05359556D79
+:10B23000ACBEE3052D271437864C97F6992F434B68
+:10B240006A1EDD7AFD51A915810F350666BEC4BFA1
+:10B250003F52EBC1206BAEA5C5CE84968BC2B07AAF
+:10B260002EA19A313DB0264C34C89ED2419E0BE2AD
+:10B2700059ABC068D945601A106C57BABDEC7AA6B4
+:10B280003E5B3DE6BAE9E027591519E163421FAD7F
+:10B290008659ED38319BC3EDF72BE69751EFEDC2A0
+:10B2A000A5BA7733B697B09E9BE593B9A73F38E42C
+:10B2B000C10AEE68B9455A4EE7B5F977C2A5E4ACC4
+:10B2C000A04CE895A467613EAC3A11DDE09F577051
+:10B2D000D19E5B4B2B282D9554AB4C151D9BB0C1BB
+:10B2E000091BBD6E017541E65E59D52AEDF0DAA65F
+:10B2F000FE52B7EDEFAC0D4DB1E1EBFBDFBE66509A
+:10B3000062421F27DFC33E36B5EC5828FCE635A065
+:10B310005B140AFA3A6AD9E8DEADDFFB1304D1DC2C
+:10B32000DE18135A2B37B3426E8CEFEF24F6F85524
+:10B33000EC1A2CF33BAD5D5159972343B2C03585D0
+:10B34000E4EB26907CFD4B2299EF68D2E1486677CA
+:10B350000E65C06130412357B2110FC7CC54EC0DBC
+:10B36000FB36C77EB1BB98D55FA4BA657AFAA5FE55
+:10B370000DAECD42ABFE96C5C37D59402FDD2353A4
+:10B38000A6B565D7A1CBA5DFE970FC31AC936B1AEC
+:10B390002EEC693F305761195D736119162D3D4AD6
+:10B3A000E7005304D4D119D47477747263CEE59C4A
+:10B3B0000076F4F7334451A609B047F542A5C023FF
+:10B3C000D2C9D41D0541565A0A9DDC5CF2EC725F6D
+:10B3D000B0BD43DE4E7ADDF3C1ECB4DB9B5E8E671D
+:10B3E000A7C38BC1BBD44E7B1CCC6FCD1EBC8B7A4C
+:10B3F0003B7AEE72653ABE5ED49CA8A425141BCAA3
+:10B40000B5E69B3644243968D8B8D5845756DB5006
+:10B4100059BE85A3953904BE81DE39808CC807DB0F
+:10B42000468F143A647D1FF551754AD9BAA8D9627E
+:10B43000EAB0EC568BD49F5E8C4A1C43A5ED06B651
+:10B44000964EE0C980D47560DDD3200358BCCFF49C
+:10B4500045321CF9510B02E0DD964700C12B8AFCF6
+:10B460007B735BB69FFE02486CD29E04B4D26CAA7A
+:10B470002B01101FFE33EB0DFBF51A14C82F59C416
+:10B48000994E3C721045F8A863AFD3DABCAA833B4F
+:10B49000A05ABA3BE9C872DA8A4998D2F7653526CC
+:10B4A000A5C10975AF69096795E703BF5A7352498A
+:10B4B000145A8C4C78ECD9D68AF626CD556BE042DE
+:10B4C000848378A5D3BD0C84F4336ED2F123A1C359
+:10B4D0001036CE7E262EA4EA1C45571DBE800727B7
+:10B4E000279B40AFB4E2854CDF2CDF91B2DD5D429B
+:10B4F000B1B9B5648E1C72B814B8DBF84E8E6F7893
+:10B5000027A48BCF7A79F6BBD56ADE46BEA3E4BC0E
+:10B51000FB506F2397CC6D2C5E7E866B9AAFA6EFA7
+:10B5200095D323C32B4DE99D396381D3B227C865D9
+:10B53000E3483E687BA0EEAB85F8E1F3BCB1876DD4
+:10B540004F5EA8B8458476DE8FE26D8ADE2FD6F096
+:10B5500046D7998024559C8056F17CD63C21825058
+:10B560007502394109DCA11390CAA222967DD30845
+:10B57000ED073D27C84FB7D9DF8000DA8961C12ABE
+:10B580007D26586E25D7D1AC3FE8450A2788B16B98
+:10B590002788C55126800EC744378CF5726D87FA0F
+:10B5A000A0E547FEE279ED5608526E267B55E0573E
+:10B5B000B532F09A2AB46C6580ED652D431246A62B
+:10B5C0008688CA40E1B7C93D30EB5D4C67838BB4D8
+:10B5D000D9E1DE581ED8480848414D0B4BD779CFEA
+:10B5E00042E5BEB876407BD6E9DB8E39D55C1BC719
+:10B5F00097572288076AAA3195BEF446F91D84E65A
+:10B6000096CF0EDE94F69BA0C1298744EC60F535F9
+:10B610001E1A7436189B26E379B4372FF1ADAA268B
+:10B6200007B1AADDA7F190907E3C7786179F006650
+:10B63000E80258736132B1B2734C32D3A4F976F395
+:10B64000B2D2F43B6F937E366DB2FC8AC9C79A447E
+:10B65000D7A45EABADD47098CF4913613E27FB668B
+:10B660001A1FB9E35C38DCAA7A6BDC1857E7875CF1
+:10B67000374387F5E1F6C9CAB575CF0A9EE839A107
+:10B68000EEF444433B7FDB21CD330DD3BAAFDAE098
+:10B69000E918BBD9258BF91D72079D5104C548DBFC
+:10B6A0003904D497402D62F0C7487F3C0D4D7BA5EF
+:10B6B00096B39A26B3C86511BD87FA8BC969DA8833
+:10B6C0005849E614723A2BA1D267F5A5CA57D27A27
+:10B6D0008B57C466C5CA228ED86D8223762BDAB604
+:10B6E00045E995B144EEF058A2B8B1FB64FEC9FA41
+:10B6F000D94AAD924FC3EFF52A95704754A9A4DFFC
+:10B700001BB32225809C3D4A94B41B221C45FB6B35
+:10B710009D8AE60D3163E24276BA185F6658585149
+:10B72000B1EA72B16872AF786B87C4C573423F17D4
+:10B730007B0BDCB08B57B7713E9228A69CB5F123EA
+:10B74000976809A581FE9D361506FF87B5A28BF582
+:10B750008B03FDCB1D549B50031890B011A34537AC
+:10B760009EB05E99D92632D8C3DC60E2AE4C0F564B
+:10B77000E53321CD0DC7A188F3FFA0A9EDD18FE658
+:10B780002EFCC07183EDAFD93B9E920F101F2E345B
+:10B7900023808DF19676C5FD37C2BFA31A0595F2B9
+:10B7A000005EEAFE0F62DBFF5AF45C6761DD7ED863
+:10B7B00020B98118464E909E23693E66276AD3DEE3
+:10B7C0000C3159F4379B9DD0223D13771DF402CFE5
+:10B7D000CEED0C4E7F54923DB97AB8DD0C43EE7538
+:10B7E0007B5DD5AF2D6BA8C8D9B3B30F34F31A4E18
+:10B7F000ED4EAB374C922C5C3364E16A91454426A4
+:10B80000B017A50A57872AED4605FEB01C5AEA254F
+:10B8100064C8D112B3FDCBF04B32C2013E09AE1D5C
+:10B820007E1717356003ED77CF0A8D716DC7754CA4
+:10B830005674244A7FA65C3BA0A9F9A6FF271136BF
+:10B840001F3BE643F4691DFE9A27EC08CFC15E9FBB
+:10B85000A6AE0D970BCDF86F24982B888763C5593A
+:10B8600088FE68F97503708FA7E6C8537239F5A38F
+:10B8700070A55653C06399F4EA0E163A748C266587
+:10B88000DEAB4FDDC96036BCE8BDF6428E0C3984B4
+:10B8900062A7BA7A746835A062B2D1B4BE4D36D10F
+:10B8A0006C6504FB24F7D54C4712854419E2D76038
+:10B8B0004328744EE4D96CB8556661C7A96E9C796B
+:10B8C000D67C323F03E48ED68FF4D6DC4F68F0CCC2
+:10B8D0005BCB677752B7373B1B0FFB335AF3B43B55
+:10B8E0001DCC469FAF67BDE9F8FC1FD247F90FEDAD
+:10B8F00063E73F4271628F428FC8AEFF22924526B6
+:10B90000BE6A6889BCD2BA7141E2726267902367ED
+:10B910009FE00559ED548B5F91B8BCF8194D3D700F
+:10B920000A5AA95EE23FE8AB30488F398D0EF0AC81
+:10B930004D6024502159BC5F7507DA4B5A340A66B2
+:10B940005C5A544F15DA2FC922F3AD84F5C85CE96F
+:10B95000AE7878BC8C7F5E23EDF2EB23891EDB8F03
+:10B96000F4A863E271847126BBAB57C849CB4C493C
+:10B9700043FEEB7AC10709778F58282B6347B6BF80
+:10B980004F244222E208F7780530D5449E3B82E2FC
+:10B99000EF69FF775EE8C28E3F482CF00749391EF9
+:10B9A000725978913AF0D652BF35C78FF99EC2B21C
+:10B9B0004D93E80A94B56BA6E3C13559598E4FD61D
+:10B9C0003E60520F63DCD85B378E5D9F1D36FAB93F
+:10B9D0007EE3936BA686EDDA36DED3F878AD2406E7
+:10B9E0001F352F431DF270EBC8A4F31137C4CAEB07
+:10B9F000F6A2E4141D7CAE57D6CF1AC83F0F95F8B7
+:10BA0000567C0A86985645FB9E2F6A812068993B92
+:10BA10005F6DB4AC61E5809FC86337DAC47636A940
+:10BA200090A2A0BDCA3AA9A01D9BCF6E04F7A1B1F8
+:10BA30005BDCA0D463D76ABD5266D7E85B5116BB06
+:10BA4000DF644994B9B59B1BFF3ACAA1A7E6EFD7BB
+:10BA5000B1FBC8CA33D87DA87A76E6B4D0C883696A
+:10BA6000B46717FDD7EB1EDFDA7F28920860699F65
+:10BA7000461EAD266486C5524AABD614974AA969BC
+:10BA800006E2EB1CAFA3289352604BA85C5C2268D3
+:10BA900024DF6DFA4BE6BB15E49E56CF7743AAD25E
+:10BAA000F9B3A94A35837EFF8174A1024D4914B4CC
+:10BAB000E3D494B2A2849B509414EE251B66899221
+:10BAC000DA4A1A92D4A9988825722852293B58B389
+:10BAD000BAC2841A0BCA7985D5AB2A1F25418F12A9
+:10BAE000B2B6A62994BD5AADC9D50A026A629806B3
+:10BAF000F91DB099758BA8E86CA5754B4A4BDBAC6A
+:10BB000062C2A1880DC687223EBF627F0A6A08E131
+:10BB1000A8A250B58DC6B56208159157B510E1625F
+:10BB2000A3E73A694690DB3DD6228A65AE866DA1D1
+:10BB3000C9C5F29C8AFB6A22B093869ADA63C96906
+:10BB4000555BB5FCFA57AD2A5CDD554BAF99932890
+:10BB50009DDA5796FA9AD7AB69B577B5D216E36AEC
+:10BB6000591C1135A1F22DE1FFE75AF7CCAFFABD10
+:10BB70007950DFB6FE843CC0180BD75B7EA0015A1B
+:10BB8000E1B0ECB30F84FB488CB51FB8CBCD6F5E32
+:10BB9000817F335C00434CF57C28996FD35811DBCF
+:10BBA000762F7DA36FDD37696BBA9CF466FDE19754
+:10BBB000EA6626F5D82CBA8013429152C398DBAAC4
+:10BBC0006129743F1937865FEB5C552AAB4093E5DA
+:10BBD0003CD38F1B6ED54D66FF47769DC5FD801704
+:10BBE000D4D11B2882805B87B4520401132B9D7231
+:10BBF0001ADAF28BA274F7EB14140D1CE626042E4D
+:10BC000031EE4CE347C5A37D3CC6FFD8D5910A3E33
+:10BC10002EED6DDB6E2DB7C8F0FFDBC3566AF6DF85
+:10BC2000D3CD2688C233D0AF67D0A2A330CF86FD54
+:10BC300036BDDEAC7739BA9AF5BA57AF3D6CB76707
+:10BC4000B0C2AC0480BA5E9B56334F769DDC85054E
+:10BC50008C0E3E8761799A1AD4948ED9E14D0059A1
+:10BC600064E0D411955A65A80F4F7B372BF8FAB4CE
+:10BC7000479F025193DB8D9E6BDAFDD669C0FD466E
+:10BC8000438ABFF8AB33675ED407BA38F09A7E3B7D
+:10BC9000FB32B9625EE9D1657FB00DAF4631D95F45
+:10BCA000269F4FD86FFA9FC7C7AFE9A5305323C46B
+:10BCB000BAD50485C791FE7888A7F49A96B0A8DA19
+:10BCC000D32961536BA7666BC34782E70E2FF73208
+:10BCD00077D737B639D557DF5DC7BCE69B09B7B90B
+:10BCE0007E6FB8AE37B71C1AF0C06A347B0E9C0A60
+:10BCF0003E2EAE1CBEF47D00172A3D32550372B4B1
+:10BD00005D02BD9850DE674B2074093F69AFB86B88
+:10BD1000BE8668DEAE688749CAB54A52EE40920ACE
+:10BD20001C77BC24E5EA90B45536E8746FFCEB9EB2
+:10BD3000EB5005DA748CA782A2D9757A3877593C12
+:10BD40006E625C5A189B96BFAF48BCA36DE5AC1CF5
+:10BD5000CE184FD641E03AD382D0E9F0177E4EDCC0
+:10BD60007471B637E09B9E9C1B364458D16319967C
+:10BD700090D844547F20978EFDC40ED7C2F2E0F7CE
+:10BD8000FF7CE3AC97D14BFFF986B04614B468034F
+:10BD90001C081A7CFDA1769FF523882C39D94140D7
+:10BDA000710472816D2B793075CFD39F36DF00D54A
+:10BDB0006C836DFCA1B3703F6CB1F82653A27991EE
+:10BDC000F813C765133CA7396F1690EF9666BAE56E
+:10BDD0002B73C5222A4C8BFB1877174D8C1CE7E977
+:10BDE00047122B4D85BE08BF8D7AB8FF49083CFB32
+:10BDF0000FF523FF1F1F419AF14DEFBEF2C67A499E
+:10BE0000E53D0F7B35CA11B45A80D22DF455EC5F55
+:10BE10005A18B06F39C00316B4552D63E0C054EE04
+:10BE20002D2F58EB36316CD7F811E665D05EB38F05
+:10BE30008615B032B47F903B6F197EFB07316E8C54
+:10BE4000303D637B02FF00E41BF69A1580D3BD1BD7
+:10BE50000BBEF29EC8ED5AF7E609F7166563BCC043
+:10BE60008D3EFD8C5E441B4E5AF7D61C5E7743D93F
+:10BE700016C061190BF256F87F822CBFABCB9FD452
+:10BE800064E6454EFB2335EFEF5FB660B1A2B56DBA
+:10BE9000ABBFF40DCBB6756A23E9338292B79167D5
+:10BEA0002C5D9AF84A77CCDCF4E5345232AE41F698
+:10BEB0003CDD383726DD6C6CAB4E87DD8B517776F9
+:10BEC000D5BD189C33A672723980957D780581DFC7
+:10BED0000C1B3532405BADC810966D02ED376EB469
+:10BEE00052D0BAF7D0462BE1F3940964345BA97BB6
+:10BEF000EC452D79D84BA067AA20F96CCD56B4A695
+:10BF00004E7796484BB5886FED6811DF7E492DE27C
+:10BF1000F0D29176D4EDA86AB9D643CFDF9EC55A48
+:10BF20006505A7E7260F19CA7914F20E1CEAD6F7A1
+:10BF3000FA0AB60A157B0EEF59B03578BCB202E3A7
+:10BF40006EB65C1E98F6C186A9288F2BAA56C7210B
+:10BF5000EAE8B6FB2C864BBE5354FB2B2BD5639DD6
+:10BF60009DEB31A1562026D29E9BF7F9824815D42D
+:10BF70006E8722E1583B7D6BB2EB83BFAA02E18062
+:10BF8000F8BDB41C8CF56453928BF5B2497723EA63
+:10BF9000771235F30B4BED1F6F838ADCE2A6951603
+:10BFA00053EA5DD1DA342B022A7B9667D8ED36D07E
+:10BFB00034D82B2A56DC3FA6FE998975508B777AA8
+:10BFC00019A54D34DBF5FEC7567E10F1E1DF58CAE6
+:10BFD0006F8888519FF0791C5DF7D6724007E3DFC8
+:10BFE0002F97046615F8EF40650B1E4CD3A1E6F2BF
+:10BFF000B0A89E1EF900E82715CB4B1DA5ED3FBD4F
+:10C00000F63A4E80564FAB1D16E50F4BF403D50B99
+:10C010000FEDDE1D0068C9FF49BCE7E33E00E13BD0
+:10C02000FD3D921B93892A52AE90C9EF93E6F85AD0
+:10C030007A01A09C8AC645CB380AA83FF7FBBA71A3
+:10C0400062E9FE245F14DAE752EEF727B37EB737D2
+:10C050003B197627340B7FCFB6362F1DFB03F82113
+:10C06000802042314413F06B04FE485CAB052FE6A0
+:10C070004B3AA7BEB5581CD8E76B62DD2EF5F77DAD
+:10C08000D30E744287A3BA7260E976B8E6BA01D2D9
+:10C09000FC1176FB920EF4B26EC4FDFE28440A45F4
+:10C0A000537EDFAFCC86C5CFDEADF8306DBE04FA6F
+:10C0B000D5BA158B8AD69E012DCEDE955B49269585
+:10C0C0003A15DB958A92D44EFAB0D6A9D6525710BB
+:10C0D0002AE76DF32515BD04B9832A6CC99A2A97FE
+:10C0E000C1154585B27BB9467E58BCEC9C36229280
+:10C0F0007220E9796D378F98CF267D4E45C7A462AF
+:10C100009F61912BA5BC54F5FDB9C54E9543379F52
+:10C110005875F7E734CB3D10031A57F1F5422BAFB2
+:10C1200057A41202C482DEEF88FD22316FFF60FD4A
+:10C13000760B65C59BA7D3D2D551B119BA28692D05
+:10C140004D40293B3EBB1943BFD3156A660FD5CF7F
+:10C150005910A43655976569F2D7FEA12D3B6D9312
+:10C160006B8BC149B9623FE0970D225155A5E5207F
+:10C1700092DDAED7A8D7753A92E4E171FFEC97C78C
+:10C18000FF09D92F0511AD95B35F7E8E2CE75BAE0D
+:10C1900097CC724CB83ABDDD129931A2BFC77E7DF3
+:10C1A000F2AD6A01CD1D96CAA3465DC78564816B59
+:10C1B000A2C21F45F2751348BEFE2591CC770A1422
+:10C1C000F4CA489EBB3FCDEEC264E5BACF3C77BD12
+:10C1D000DAB7D09F54E806D916408F8269E7041871
+:10C1E0007CE8EEE8C314C8C9DAF36BD71BC0B747C5
+:10C1F00005583C86128074B961797440FC9B268D89
+:10C20000363C2FA92F531D1DB0D88577DD9BFDC867
+:10C21000F9DF6CF98170D9ACFB357B0B99C731061E
+:10C22000BA6DC36873D6C1D35D0744DF942A782BF7
+:10C2300073DCFBA51F79D9AA26D11C8FD734729E37
+:10C24000A5165CA76C41AB7DE176283EB5962650DD
+:10C25000A02DC247BDD868CB1DC635CC47C3349985
+:10C260004B2D08DDAC3B5BE32DFF2B6E00124478B9
+:10C27000AEB1119E25793E21769EC2E5DC685FE76E
+:10C280005EF77C106BA3A7C38B41755DB4736C66BE
+:10C2900095A4844D18A2AAEBA04AAB4D9868E2720F
+:10C2A0006FE94D02D8CD7E73C77893CA6D2CBD99C6
+:10C2B000CF0627B0202A27F97B74D23A9EB81658A9
+:10C2C0000F49ADA7CEA1949FA328C9176359E00ACF
+:10C2D000DDE72C7EE98D66DDFEDF5F9FEF7A6B0880
+:10C2E00002A4504F659DF223AD5EA57DCB5F09533F
+:10C2F000E3EECC998F1FE13A3DA872DE7072254CB7
+:10C300007B9F68AD04F27F09AD9A30BEA6C0ECFCFD
+:10C31000B2DB276FB977E4AF894F2BDE8A8A7A7C4C
+:10C320002EEC83FB316CFAB6384C2FA162442CCB37
+:10C330009053CF5D124A175B7F225397B030FD8F29
+:10C3400049C4154514590E0B1DF8DE7C4851A4D183
+:10C35000869109DF9920D468645109F4EB86162987
+:10C36000D58AA254539C76D56C38DD02DD4E5FFC35
+:10C37000F50DEDEEB1080E3CE770C4057AD6A37357
+:10C38000CE4AA47C995C30F02D4F0FF9A66ACAE41E
+:10C3900074CA3E8E3E9A0AFDE8578C174855CD7CEC
+:10C3A000DC11B200F940BE5CCA02C2F41C6000118C
+:10C3B0002FF8B883D614A18D1B63E014F813ABD00B
+:10C3C00076C02C243EE99DF48EB77A6659E952A5D1
+:10C3D00021EE4CEB1D8608C98EF6EA2D1B8CF5EA82
+:10C3E000B9CBA5EBBC674AE65EA15E47480941D4DC
+:10C3F000A46643BD7AA3FC402FF8687DE5AE3EAF4E
+:10C40000FAEE8313FE6AFF30AFCDB507839295BB7A
+:10C4100022A06FCC615C12479091331D3408F8DF85
+:10C42000851BC03905595FAFCACE8E21CFB1CC571D
+:10C43000C11558F3AA76BCBCF3960733A44FBA07CC
+:10C44000C7C23260D50C1523EB11C8F5F6D378F4CA
+:10C450008E55343EEE12CCA5459605AD91F301E81C
+:10C46000C8E6548F9FA905EA0A04C3653349052B22
+:10C47000DA3C26B46B9115506269D9B6C532B20860
+:10C480006CCFB02F64D5525D47A34E2717E52EA27F
+:10C4900055A49657A75B5BABA1C69BC2E37B166313
+:10C4A0004E4AD6690AD73B51D915F091DCAEA2406D
+:10C4B000D56412AA94D79253E69340B24E84921C4C
+:10C4C0005A4DC6C06AC9A13B22AABA8F5A31F1A8F7
+:10C4D000223F8F9A3308EA6FE837F41BFA0DFD8686
+:10C4E000DA8530DFC53C19F16BC4CA119347EC1FE4
+:10C4F0005D0CE8CA409709EEFC2CE55D4DE8D23AA8
+:10C5000086CE7D19B7F26E5135A1B0AF3397DDA954
+:10C510004F9024ED459CF62BDD5E863A57977AD1F5
+:10C5200027C1939DEFF8B9821FBFC92AD5632F2376
+:10C53000C58DB0514834CC7E41CFFC611A18E889D2
+:10C5400054247BC37D04F4FE49F88FAEF3672D0DB0
+:10C5500021BB7C09D7394894CCDD7DBBA138D4A957
+:10C56000F679B56900CBF5F3C841A348B2454BA1B4
+:10C57000B87F33BC5DB7894D4B3390207E0FCB4ADB
+:10C58000EEF67BC470D70ECD49D66FDC7B933CDCD6
+:10C5900059A05553AB98FFE407E692988F543AE7B9
+:10C5A000FA84CE9551C1334115707C5A176DB1B6DE
+:10C5B000EDF72BE61BACEECE4B4499A2C6EF7B9475
+:10C5C000546C593FA1A4A106882DD2803A05CC40D5
+:10C5D000286005C9048D849B497BA1E81D8365BB48
+:10C5E0001E6847EBAD3D9A25F9DE709D7BF3C9F5DA
+:10C5F0007E9D5C495169C640D0EB8538C9359E5156
+:10C600000F3C35340F1A0C9F0AC3EDFE1675DAA5E0
+:10C61000B9F8CCA77513561AACED7EE78FE63CE26D
+:10C620009584CBACE37F179567690A726308CDE602
+:10C63000169DF4848A9112C7D9C425BD8232DFBB0E
+:10C640002868CF4428AE694271AF9E505C9D0C991A
+:10C65000CE739D28BE6942F1AF9E507C9D13F52C90
+:10C660005D0527F3335AE87662DA0DA7574EFAB321
+:10C67000B3CFDD719F96D0A81E08C81D5D20E09C39
+:10C680003004D1121A35132CE556C391165600B258
+:10C69000DCBD19069474972BDB0AD673504B56A653
+:10C6A000776E2DADE0CAC8F5E975CFCF4619920F68
+:10C6B000FD18B4C480B081A35015B2199AB0B10965
+:10C6C0001B9CD0D1AB892222B79B287C0415E3B4F4
+:10C6D000CCB44E45150E2E181753263C2191AFE9C8
+:10C6E000204A8423C56EAB17D6D949A4B49326B487
+:10C6F00076494ED8AD5AD4DAF5E5AA1B7C3F2C1FFB
+:10C700006CFB65E24CE8C12681290CF4FAF6BE9B6D
+:10C71000E5D77BCF67D7ACDC7571BF442592D24C8F
+:10C72000B102DB57B27C6DB298C88A97F38870DD8E
+:10C730003611AE7F4922141403AA4E840BD7F2CDD2
+:10C7400089A13B2C972BD790C87E46C3E09D8C8453
+:10C75000B20C8B5558E931ECF141C7652EE16D996A
+:10C76000FEC0A5D5CE697A04ABB24F1C363C488AD0
+:10C770000EADAC6FF96409BA367C1A44192364D43F
+:10C78000BD9E5D5C0E2783D9A4D7BD989D7C1E4FAE
+:10C79000A6938A45D1951714222E360B8B1051A3E0
+:10C7A000407AC52CE5E632407AAEEEF9EDE580F44C
+:10C7B0002EBBE3498D2C10F9A8B3402264D5C803E1
+:10C7C00069B745D27A39761FFC5A89A085E796F574
+:10C7D000AE261E8C499399D6BA6D3FD5E9B323BED8
+:10C7E000E8A9CB58459DCE0482D47E2914AD6A2990
+:10C7F00094D4DD53662243E946D13D4787D0B28FBA
+:10C80000FF196C929654BEB3EE74F04B287D14471A
+:10C810007BAB7D92DAA6DECE3C37C3D17038EEB961
+:10C82000E66291DB8CE4224BAD086DD2C31181C767
+:10C8300089419FB70CABB2D15F90C5AA55F02F26A6
+:10C84000A367C9AEDFF3E4669F0CEA3BBE8C876E3C
+:10C85000EC507CED7E19CC2E4F4F278369F3558227
+:10C860009FE73850C490083335EC579D36CFC1ADA3
+:10C87000BEF67D4B77BE5AF3E02E57A98B4C18ECD1
+:10C880004719E7E12C1A24FC41D5321FB405ECAB63
+:10C89000AA830FAAC35E859A0B307EDD0CC6AF7FDC
+:10C8A0005D8C37D09291467E7C72ED391CBD517EF5
+:10C8B000C487EB5B6C91590BCC8AFF1855F6228A22
+:10C8C000AF0CE9A2D4C06D60542837B897A39D0E71
+:10C8D0000B127998B604E3EB8655B97CD33106E4A4
+:10C8E0002B12D794BF7D53C130D7E71E353CECAF38
+:10C8F00097CB2766B898583FF7EC67CEC6082BD978
+:10C90000103A0AD117AC0231F5B087551CFE36C774
+:10C91000613B472ABA66E3A4460BC85673DB1F9EE9
+:10C920008A65A99CE2664FBB82461DF4375BD4AC96
+:10C9300091F4A0223F5ED5F420C7F596BA9DAECC07
+:10C94000FDD50AEE7A77BA07176E5B45BA2FD88BFA
+:10C9500063575046B16E422741E259D40C26D3505A
+:10C960003244129030F0CB55EDAEE61A3CA86A374F
+:10C970009F53F97457BFA8677090A44E2583433C1A
+:10C980008D1CB387281F380D79B77A78D13484AAE3
+:10C9900015BCC3418A37AE9CDC9E08407F57DCB68D
+:10C9A00025BB451238AD5EE16E9117ABD2BE66D99C
+:10C9B0005B41AD58B49AE79AC4771E86792E053547
+:10C9C0008471A42F55C338DFE47A05414D86E6A76C
+:10C9D000417E076C68DDBC24D55DB7D24E697E8987
+:10C9E000AF58E09957AB229E6BF54CD72BC62F4919
+:10C9F000C9E0E26A98961A5A286A30A0B6BD50413A
+:10CA0000ABCDBCE436282AC92D2F54942B5314C621
+:10CA10000F4511731ECA297ED70E0E52F0BB54AAC1
+:10CA200073A8D93A2E4817BF80446FA8D6E1B16ADF
+:10CA300073DA970FD511C506DAD5C6A13A4D04E9C8
+:10CA4000FC9AD139C27344E7C4A5B50EACB63374B1
+:10CA50002CD6FE696ED288F350AD0F3CEB96AA2E11
+:10CA60000F77A613A5D5F88445A95A01EB53E92EF3
+:10CA700037D1F6810BFF5B57ED372BA8C7586B47B3
+:10CA80006AC82A330D5144375D71B9ADAC0060F608
+:10CA90001C6BCDDCA3994A45C5F22777A09C16B83C
+:10CAA000A8B7D360E39170C08A56E3AA81878DB995
+:10CAB000AB32B0973DEDD2509064383DABB6C0EC90
+:10CAC0002CE96ED7CD4795D2F5B08AB161B5D8388B
+:10CAD0008BAAD97AB1DBA003F63EF2C09EF537658A
+:10CAE000826F680E27AD410D2798C60B25AACABED6
+:10CAF000BA8219A76C85FA06A5DBCCB41A69305C3A
+:10CB0000AB3EE58C94C6634C686C219B11EB8FCADD
+:10CB10002B48676C3A9731795D6CF80C90E4CD8BBB
+:10CB2000A438461A8098D3EF4D910EEA39A58A654C
+:10CB30003A2530A69375008241AEBB2DFEBA723005
+:10CB400024FBF95E1155DC510454DDEC2CB8F4EEF5
+:10CB50006AD5F11FB5A613F9BCBE6C876C11BE2354
+:10CB600070256DC98C1B8396333B340DF704985E9A
+:10CB7000E821244BCBF35C8FDCD22269E42D88F0D2
+:10CB8000EC2F403DC8E4FC1612DEBD625FE181F788
+:10CB900057B2CC202B2697EB288CB7474EDB3E9E16
+:10CBA0003B6C7B70A55DEBE236E5DF5DC7FCC6350F
+:10CBB0005349ECDB7BC375BDB9C5147CDA9ADDF54E
+:10CBC0001C389D1CFD9B5E93E14BDFD36EDEB48E63
+:10CBD000370A9C2F2CA37F940DC97F02E6C837AE7D
+:10CBE0004E1FF2562BAE6392F2CD90F43A9BA4FC0A
+:10CBF000C124553BC74B53BE0E4D5BEDE44665C9A2
+:10CC000021552FEE75BB695997B67E60922DBFED09
+:10CC10006B012A4DF0609A4E28C42E981EF7A1B6DB
+:10CC2000BBF4B0623B2D537B83CE662554957F9930
+:10CC30006A1B7ED53489FD5BFE9D0EC71FD9615FDF
+:10CC400058341805549D55C80ACC282E97E691D81B
+:10CC500030C78FF0592AF9A09A013CE9D1A8FBF717
+:10CC6000AFDA0C102E0BAEE56680616444DC073051
+:10CC7000232726DD0ED00FF41BCBB682A78D023EF4
+:10CC80005BE5A7EF7E7ABAF1AC3939B34159CE32C0
+:10CC9000DDDD01EF615F92493C2E99662890450DDC
+:10CCA0005934F175C5FEF172813B208F78DC6A370B
+:10CCB000FC0F0E5F773EF7F28BBB5411EF99A53452
+:10CCC0003463B0307BA2C390A6CF4C16406B2F606C
+:10CCD000C71ECE3F2886C67AB9B6D35DA35E977CC1
+:10CCE0002F487C4365C4B73909A41BA10C15EBFD83
+:10CCF0004B4C2AE6F2D86AE940B7E532DC713D17C1
+:10CD000088314387677AF9B9F769361E5C5D8EA76B
+:10CD100033AE3F3BF93C9D5E5E4C669369773A4883
+:10CD2000FC709790B086A5EEFFA06C99EB47BA30E7
+:10CD30006B2703C801D1CDBA3741A7A7B98AD190D3
+:10CD4000E4865AAA1EACA4290A46856B716D32E5A9
+:10CD500038FAECBFB76B47939B0E470398D5E8AA08
+:10CD60007056B48917F12D5A5A9BD9BEDEBBACBCA4
+:10CD7000F6D2323C17C8EF3A733F313D51784F67D6
+:10CD80009539A1B2F95C9EFC7DD09BCE2E66DF6604
+:10CD90005F87FDE9A7C2694521AFC40DD9C1378AB4
+:10CDA00087E08ECE4CF760069EEE3D85E2506272C3
+:10CDB0001AC99D1B2F944CEEF4723CE802089C7536
+:10CDC00048932CD85C8BC909A234CC86D8AE0B57BB
+:10CDD000ED3D08DC51DFAE70CA3E796BD8BAEF5B2F
+:10CDE000B0074363EDFFFA37C2BDCB9E5DC9E47A5D
+:10CDF0009F27D3CBD1603C3B03827E1E0F665F062C
+:10CE0000C55BEDD4D66F698B22CA23786201CF202F
+:10CE10005F4C73D328CFF223CDC29C27D0C753F4E5
+:10CE200065CFAFA3D49DE1F0E2F4B2EE14E796979C
+:10CE3000E0F9405D8356E5BFDDEA42BA65FB74F276
+:10CE4000FE7A153AA42B12BFA3D59DFEE78B61EFA6
+:10CE5000B25F1BC9E939D747B45C719FEEB7416D2A
+:10CE60003BDE9D99AF17EAA2A9777939EE0F2FCA59
+:10CE7000385F06A6121AABC7586D1E5DF98E1032C8
+:10CE8000C2B70A302860F63EF93F4422374F81E9A5
+:10CE9000E79CA64EA73A27BABA9C0CA7C3CB8B7ABD
+:10CEA000CC6815C7510082638F2FAB669E6447BC68
+:10CEB00092BF253B75313D1D0FBB1767E7B5F13CB0
+:10CEC000F52CDDB9B50FD9926ADDB94EBE0EAF6A49
+:10CED0004FD47FB05687CC52AC4AF3E9F586E87060
+:10CEE000455E0FCE2775683FBDDE12DF371D1F84FC
+:10CEF000F25A84E72BCF7378D11F5CD7999AE5CC8F
+:10CF0000CDC7C434A4FC59285527313E0859E34302
+:10CF1000912555DD7AA3C1B47B3EBB3AA759C3FD29
+:10CF2000C114263FE8D7DB814BB85EECF7709283E3
+:10CF3000FABB4FE06ADFE0BDE1B857FF341B9667EC
+:10CF40001C7496A5AA84FF5E87CEDF8BE5B24212E1
+:10CF5000732533BAEAF667D3CBD9C5E07A3A3BF901
+:10CF60005672D10C1DDF84AB840B6F0CC0DB4A9F63
+:10CF7000B3501CEA48331F03766D1037951592980D
+:10CF80004EE50D77D53D1FEDB9D3682ADE1E5BACAB
+:10CF90000C514872859BF9F345B178B075CB61B9F6
+:10CFA000B59A4C2554DE49D77BDDB1D787DFB15A1E
+:10CFB000F519D6D647AE0FD547CA1846CC27FA97EB
+:10CFC0009F4FCEE1FAEF5ED596A6B756FFDA7CA268
+:10CFD000EC7E38EDF6F6E5B30BDDD883C1964E68EE
+:10CFE000DC1D0D66E3324134A622339A130FABDE0B
+:10CFF00045E4522B8AE5838B62740C40B10925F21B
+:10D00000CCF754160E7AE7DDC964783AEC75EB1E5E
+:10D010002CAC94561317CA565F65D5ACA13795EE64
+:10D0200033DFB0616E29D7CA93A32F2DA3E73A0B44
+:10D03000EB76E004DED3708EC229FABDD33378FDDF
+:10D0400074FC6D16D603A6496AB468A87906EF6722
+:10D05000E9C968625B769AC11D76069BDE59C68F68
+:10D06000D0349A394A9655213108D0684AED421792
+:10D070007D5AC664D8CF19A4C3178E720B0B998042
+:10D0800062440D5880CFD08435CF19AB7828CBB906
+:10D09000B380C8A77129AD3060327324B164A03069
+:10D0A000442FF253E6E3B953384C54A29AD5B91A37
+:10D0B00001B3BFD5A31DF35F9574D3C4488E7BA283
+:10D0C000FBA66D39E6D8B4F5C782718AE9EE993FBF
+:10D0D0004DCFBD74068F56D037CDD5C4867FB207ED
+:10D0E000522A6CA0A2BD23962C88B90CB31F2D59CF
+:10D0F0000210D707CEBA2173F6285295F9039B2C5C
+:10D100003A446215F27EF29F1C237B04B9F0F9B514
+:10D11000F3C3711F72E8C8153EEA07D6726DAFFD02
+:10D12000B8456E361E8BC730C24454603E0EBBA954
+:10D13000B207510BC7E89E9FE7E04E9631CBA3D6CE
+:0AD14000E8BFFCF7FF0799C7565A35
+:00000001FF
diff --git a/include/linux/input/synaptics_tcm.h b/include/linux/input/synaptics_tcm.h
index 19ed77061545..7fd90abfc844 100644
--- a/include/linux/input/synaptics_tcm.h
+++ b/include/linux/input/synaptics_tcm.h
@@ -35,6 +35,9 @@
#define I2C_MODULE_NAME "synaptics_tcm_i2c"
#define SPI_MODULE_NAME "synaptics_tcm_spi"
+#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T
+#define WAKEUP_GESTURE
+#endif
struct syna_tcm_board_data {
bool x_flip;
@@ -45,6 +48,9 @@ struct syna_tcm_board_data {
int power_gpio;
int power_on_state;
int reset_gpio;
+#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T
+ int mdss_reset;
+#endif
int reset_on_state;
unsigned int spi_mode;
unsigned int power_delay_ms;
@@ -58,6 +64,11 @@ struct syna_tcm_board_data {
unsigned long irq_flags;
const char *pwr_reg_name;
const char *bus_reg_name;
+#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_D2T
+ const char *i2c_reg_name;
+ const char *lab_reg_name;
+ const char *ibb_reg_name;
+#endif
};
#endif