From c1e48283efef4faeee6b601fc679ea228bd8d6ef Mon Sep 17 00:00:00 2001 From: Mahantesh Salimath Date: Thu, 30 Jun 2022 16:46:50 -0400 Subject: [PATCH backport 5.10 21/63] UBUNTU: SAUCE: pka: Add pka driver. BugLink: https://bugs.launchpad.net/bugs/1980415 * This driver is picked from internal linux repo;bfdev-5.4.60 branch. For commit history, please refer to above repo and branch. Signed-off-by: Mahantesh Salimath Reviewed-by: Khalil Blaiech Signed-off-by: Mahantesh Salimath Signed-off-by: Ike Panhc --- drivers/platform/mellanox/Kconfig | 2 + drivers/platform/mellanox/Makefile | 1 + drivers/platform/mellanox/mlxbf_pka/Kconfig | 14 + drivers/platform/mellanox/mlxbf_pka/Makefile | 9 + .../mellanox/mlxbf_pka/mlxbf_pka_addrs.h | 284 + .../mellanox/mlxbf_pka/mlxbf_pka_config.h | 226 + .../mellanox/mlxbf_pka/mlxbf_pka_cpu.h | 72 + .../mellanox/mlxbf_pka/mlxbf_pka_debug.h | 66 + .../mellanox/mlxbf_pka/mlxbf_pka_dev.c | 2414 +++++++++ .../mellanox/mlxbf_pka/mlxbf_pka_dev.h | 310 ++ .../mellanox/mlxbf_pka/mlxbf_pka_drv.c | 1398 +++++ .../mellanox/mlxbf_pka/mlxbf_pka_firmware.h | 4823 +++++++++++++++++ .../mellanox/mlxbf_pka/mlxbf_pka_ioctl.h | 127 + .../mellanox/mlxbf_pka/mlxbf_pka_mmio.h | 49 + .../mellanox/mlxbf_pka/mlxbf_pka_ring.h | 276 + 15 files changed, 10071 insertions(+) create mode 100644 drivers/platform/mellanox/mlxbf_pka/Kconfig create mode 100644 drivers/platform/mellanox/mlxbf_pka/Makefile create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h diff --git a/drivers/platform/mellanox/Kconfig b/drivers/platform/mellanox/Kconfig index 5d329350a..946bc2375 100644 --- a/drivers/platform/mellanox/Kconfig +++ b/drivers/platform/mellanox/Kconfig @@ -97,6 +97,8 @@ config MLXBF_TRIO This driver supports the TRIO PCIe root complex interface on Mellanox BlueField SoCs. +source "drivers/platform/mellanox/mlxbf_pka/Kconfig" + config NVSW_SN2201 tristate "Nvidia SN2201 platform driver support" depends on REGMAP diff --git a/drivers/platform/mellanox/Makefile b/drivers/platform/mellanox/Makefile index 161fad566..046347d3a 100644 --- a/drivers/platform/mellanox/Makefile +++ b/drivers/platform/mellanox/Makefile @@ -12,3 +12,4 @@ obj-$(CONFIG_MLXREG_HOTPLUG) += mlxreg-hotplug.o obj-$(CONFIG_MLXREG_IO) += mlxreg-io.o obj-$(CONFIG_MLXREG_LC) += mlxreg-lc.o obj-$(CONFIG_NVSW_SN2201) += nvsw-sn2201.o +obj-$(CONFIG_MLXBF_PKA) += mlxbf_pka/ diff --git a/drivers/platform/mellanox/mlxbf_pka/Kconfig b/drivers/platform/mellanox/mlxbf_pka/Kconfig new file mode 100644 index 000000000..ebc038ec7 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/Kconfig @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-only OR Linux-OpenIB +# +# Platform support for Mellanox BlueField PKA +# + +config MLXBF_PKA + tristate "Mellanox BlueField Public Key Accelerator driver" + depends on ARM64 && IOMMU_API && VFIO_IOMMU_TYPE1 && VFIO_PLATFORM + help + If you say yes to this option, support will be included for the + Public Key Accelerator device on Mellanox BlueField SoCs. + + This driver can also be built as a module. If so, the module will + be called pka-mlxbf. diff --git a/drivers/platform/mellanox/mlxbf_pka/Makefile b/drivers/platform/mellanox/mlxbf_pka/Makefile new file mode 100644 index 000000000..d9f5be4d6 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/Makefile @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-only OR Linux-OpenIB +# +# Makefile for Mellanox BlueField PKA Driver +# + +obj-m += mlxbf-pka.o + +mlxbf-pka-y := mlxbf_pka_drv.o +mlxbf-pka-y += mlxbf_pka_dev.o diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h new file mode 100644 index 000000000..cd2a4d814 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h @@ -0,0 +1,284 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_ADDRS_H__ +#define __PKA_ADDRS_H__ + +// Define memory size in bytes +#define MEM_SIZE_4KB 0x1000 +#define MEM_SIZE_8KB 0x2000 +#define MEM_SIZE_16KB 0x4000 +#define MEM_SIZE_32KB 0x8000 +#define MEM_SIZE_64KB 0x10000 + +// +// COMMON SPACE +// +#define CRYPTO_COMMON_BASE 0x0 + +// Common IO CSR addresses/offsets: These are all addressed as 8-byte registers. +#define DEV_INFO_ADDR (0x00 | CRYPTO_COMMON_BASE) +#define DEV_CTL_ADDR (0x08 | CRYPTO_COMMON_BASE) +#define MMIO_INFO_ADDR (0x10 | CRYPTO_COMMON_BASE) +#define SCRATCHPAD_ADDR (0x20 | CRYPTO_COMMON_BASE) +#define SEMAPHORE0_ADDR (0x28 | CRYPTO_COMMON_BASE) +#define SEMAPHORE1_ADDR (0x30 | CRYPTO_COMMON_BASE) +#define CLOCK_COUNT_ADDR (0x38 | CRYPTO_COMMON_BASE) +#define INT_SETUP_ADDR (0x40 | CRYPTO_COMMON_BASE) +#define CRED_CTL_ADDR (0x50 | CRYPTO_COMMON_BASE) +#define SAM_CTL_ADDR (0x58 | CRYPTO_COMMON_BASE) + +// +// CRYPTO SPACE +// + +// All addresses/offsets herein are BYTE addresses. + +// EIP154 CSRS: + +// Global Control Space CSR addresses/offsets. These are accessed from the +// ARM as 8 byte reads/writes however only the bottom 32 bits are implemented. +#define PKA_CLOCK_SWITCH_ADDR 0x11C68 +#define PKA_CLK_FORCE_ADDR 0x11C80 +#define MODE_SELECTION_ADDR 0x11C88 +#define PKA_PROT_STATUS_ADDR 0x11C90 +#define PKA_OPTIONS_ADDR 0x11DF0 +#define PKA_VERSION_ADDR 0x11DF8 + +// Advanced Interrupt Controller CSR addresses/offsets. These are accessed +// from the ARM as 8 byte reads/writes however only the bottom 32 bits are +// implemented. +#define AIC_POL_CTRL_ADDR 0x11E00 +#define AIC_TYPE_CTRL_ADDR 0x11E08 +#define AIC_ENABLE_CTRL_ADDR 0x11E10 +#define AIC_RAW_STAT_ADDR 0x11E18 +#define AIC_ENABLE_SET_ADDR 0x11E18 +#define AIC_ENABLED_STAT_ADDR 0x11E20 +#define AIC_ACK_ADDR 0x11E20 +#define AIC_ENABLE_CLR_ADDR 0x11E28 +#define AIC_OPTIONS_ADDR 0x11E30 +#define AIC_VERSION_ADDR 0x11E38 + +// The True Random Number Generator CSR addresses/offsets. These are accessed +// from the ARM as 8 byte reads/writes however only the bottom 32 bits are +// implemented. +#define TRNG_OUTPUT_0_ADDR 0x12000 +#define TRNG_OUTPUT_1_ADDR 0x12008 +#define TRNG_OUTPUT_2_ADDR 0x12010 +#define TRNG_OUTPUT_3_ADDR 0x12018 +#define TRNG_STATUS_ADDR 0x12020 +#define TRNG_INTACK_ADDR 0x12020 +#define TRNG_CONTROL_ADDR 0x12028 +#define TRNG_CONFIG_ADDR 0x12030 +#define TRNG_ALARMCNT_ADDR 0x12038 +#define TRNG_FROENABLE_ADDR 0x12040 +#define TRNG_FRODETUNE_ADDR 0x12048 +#define TRNG_ALARMMASK_ADDR 0x12050 +#define TRNG_ALARMSTOP_ADDR 0x12058 +#define TRNG_BLOCKCNT_ADDR 0x120E8 +#define TRNG_OPTIONS_ADDR 0x120F0 +#define TRNG_TEST_ADDR 0x120E0 +#define TRNG_RAW_L_ADDR 0x12060 +#define TRNG_RAW_H_ADDR 0x12068 +#define TRNG_RUN_CNT_ADDR 0x12080 +#define TRNG_MONOBITCNT_ADDR 0x120B8 +#define TRNG_POKER_3_0_ADDR 0x120C0 +#define TRNG_POKER_7_4 0x120C8 +#define TRNG_POKER_B_8 0x120D0 +#define TRNG_POKER_F_C 0x120D8 + +#define TRNG_PS_AI_0_ADDR 0x12080 +#define TRNG_PS_AI_1_ADDR 0x12088 +#define TRNG_PS_AI_2_ADDR 0x12090 +#define TRNG_PS_AI_3_ADDR 0x12098 +#define TRNG_PS_AI_4_ADDR 0x120A0 +#define TRNG_PS_AI_5_ADDR 0x120A8 +#define TRNG_PS_AI_6_ADDR 0x120B0 +#define TRNG_PS_AI_7_ADDR 0x120B8 +#define TRNG_PS_AI_8_ADDR 0x120C0 +#define TRNG_PS_AI_9_ADDR 0x120C8 +#define TRNG_PS_AI_10_ADDR 0x120D0 +#define TRNG_PS_AI_11_ADDR 0x120D8 + +// Control register address/offset. This is accessed from the ARM using 8 +// byte reads/writes however only the bottom 32 bits are implemented. +#define PKA_MASTER_SEQ_CTRL_ADDR 0x27F90 + +// Ring CSRs: These are all accessed from the ARM using 8 byte reads/writes +// however only the bottom 32 bits are implemented. + +// Ring 0 CSRS +#define COMMAND_COUNT_0_ADDR 0x80080 +#define RESULT_COUNT_0_ADDR 0x80088 +#define IRQ_THRESH_0_ADDR 0x80090 + +// Ring 1 CSRS: +#define COMMAND_COUNT_1_ADDR 0x90080 +#define RESULT_COUNT_1_ADDR 0x90088 +#define IRQ_THRESH_1_ADDR 0x90090 + +// Ring 2 CSRS: +#define COMMAND_COUNT_2_ADDR 0xA0080 +#define RESULT_COUNT_2_ADDR 0xA0088 +#define IRQ_THRESH_2_ADDR 0xA0090 + +// Ring 3 CSRS: +#define COMMAND_COUNT_3_ADDR 0xB0080 +#define RESULT_COUNT_3_ADDR 0xB0088 +#define IRQ_THRESH_3_ADDR 0xB0090 + +// EIP154 RAM regions: Note that the FARM_PROG_RAM_X address range overlaps +// with the FARM_DATA_RAM_X and FARM_DATA_RAM_X_EXT address ranges. This +// conflict is resolved by using the FARM_PROG_RAM_X only when the +// Sequencer is in SW reset, and the DATA_RAMs are picked only when the +// engine is operation. +// +// Note: +// The FARM_DATA_RAM_X_EXT RAMs may also be +// called the LNME FIFO RAMs in some of the documentation. +// +// PKA_BUFFER_RAM : 1024 x 64 - 8K bytes +// PKA_SECURE_RAM : 1536 x 64 - 12K bytes +// PKA_MASTER_PROG_RAM : 8192 x 32 - 32K bytes +// FARM_DATA_RAM_X : 1024 x 64 - 8K bytes +// FARM_DATA_RAM_X_EXT : 256 x 32 - 1K bytes +// FARM_PROG_RAM_X : 2048 x 32 - 8K bytes +// +// Note: +// *TBD* Since hardware guys multiplied the address per 2, the size of +// each memory/registers group increased and become two times larger. +// Memory size should be adjusted accordingly: +// PKA Buffer RAM size : 8KB --> 16KB +// PKA Secure RAM size : 8KB --> 16KB +// PKA Master Program RAM size : 32KB --> 64KB +// PKA Farm Data RAM size : 4KB --> 8KB +// PKA Farm Data RAM extension size : 4KB --> 8KB +// PKA Farm Program RAM size : 8KB --> 16KB +// +#define PKA_BUFFER_RAM_BASE 0x00000 +#define PKA_BUFFER_RAM_SIZE MEM_SIZE_16KB // 0x00000...0x03FFF + +#define PKA_SECURE_RAM_BASE 0x20000 +#define PKA_SECURE_RAM_SIZE MEM_SIZE_16KB // 0x20000...0x23FFF + +#define PKA_MASTER_PROG_RAM_BASE 0x30000 +#define PKA_MASTER_PROG_RAM_SIZE MEM_SIZE_64KB // 0x30000...0x3FFFF + +#define FARM_DATA_RAM_0_BASE 0x40000 +#define FARM_DATA_RAM_0_SIZE MEM_SIZE_8KB // 0x40000...0x41FFF +#define FARM_DATA_RAM_0_EXT_BASE 0x42000 +#define FARM_DATA_RAM_0_EXT_SIZE MEM_SIZE_8KB // 0x42000...0x43FFF +#define FARM_PROG_RAM_0_BASE 0x40000 +#define FARM_PROG_RAM_0_SIZE MEM_SIZE_16KB // 0x40000...0x43FFF +#define FARM_DATA_RAM_1_BASE 0x44000 +#define FARM_DATA_RAM_1_SIZE MEM_SIZE_8KB // 0x44000...0x45FFF +#define FARM_DATA_RAM_1_EXT_BASE 0x46000 +#define FARM_DATA_RAM_1_EXT_SIZE MEM_SIZE_8KB // 0x46000...0x47FFF +#define FARM_PROG_RAM_1_BASE 0x44000 +#define FARM_PROG_RAM_1_SIZE MEM_SIZE_16KB // 0x44000...0x47FFF +#define FARM_DATA_RAM_2_BASE 0x48000 +#define FARM_DATA_RAM_2_SIZE MEM_SIZE_8KB // 0x48000...0x49FFF +#define FARM_DATA_RAM_2_EXT_BASE 0x4A000 +#define FARM_DATA_RAM_2_EXT_SIZE MEM_SIZE_8KB // 0x4A000...0x4BFFF +#define FARM_PROG_RAM_2_BASE 0x48000 +#define FARM_PROG_RAM_2_SIZE MEM_SIZE_16KB // 0x48000...0x4BFFF +#define FARM_DATA_RAM_3_BASE 0x4C000 +#define FARM_DATA_RAM_3_SIZE MEM_SIZE_8KB // 0x4C000...0x4DFFF +#define FARM_DATA_RAM_3_EXT_BASE 0x4E000 +#define FARM_DATA_RAM_3_EXT_SIZE MEM_SIZE_8KB // 0x4E000...0x4FFFF +#define FARM_PROG_RAM_3_BASE 0x4C000 +#define FARM_PROG_RAM_3_SIZE MEM_SIZE_16KB // 0x4C000...0x4FFFF +#define FARM_DATA_RAM_4_BASE 0x50000 +#define FARM_DATA_RAM_4_SIZE MEM_SIZE_8KB // 0x50000...0x51FFF +#define FARM_DATA_RAM_4_EXT_BASE 0x52000 +#define FARM_DATA_RAM_4_EXT_SIZE MEM_SIZE_8KB // 0x52000...0x53FFF +#define FARM_PROG_RAM_4_BASE 0x50000 +#define FARM_PROG_RAM_4_SIZE MEM_SIZE_16KB // 0x50000...0x53FFF +#define FARM_DATA_RAM_5_BASE 0x54000 +#define FARM_DATA_RAM_5_SIZE MEM_SIZE_8KB // 0x54000...0x55FFF +#define FARM_DATA_RAM_5_EXT_BASE 0x56000 +#define FARM_DATA_RAM_5_EXT_SIZE MEM_SIZE_8KB // 0x56000...0x57FFF +#define FARM_PROG_RAM_5_BASE 0x54000 +#define FARM_PROG_RAM_5_SIZE MEM_SIZE_16KB // 0x54000...0x57FFF + +// PKA Buffer RAM offsets. These are NOT real CSR's but instead are +// specific offset/addresses within the EIP154 PKA_BUFFER_RAM. + +// Ring 0: +#define RING_CMMD_BASE_0_ADDR 0x00000 +#define RING_RSLT_BASE_0_ADDR 0x00010 +#define RING_SIZE_TYPE_0_ADDR 0x00020 +#define RING_RW_PTRS_0_ADDR 0x00028 +#define RING_RW_STAT_0_ADDR 0x00030 + +// Ring 1 +#define RING_CMMD_BASE_1_ADDR 0x00040 +#define RING_RSLT_BASE_1_ADDR 0x00050 +#define RING_SIZE_TYPE_1_ADDR 0x00060 +#define RING_RW_PTRS_1_ADDR 0x00068 +#define RING_RW_STAT_1_ADDR 0x00070 + +// Ring 2 +#define RING_CMMD_BASE_2_ADDR 0x00080 +#define RING_RSLT_BASE_2_ADDR 0x00090 +#define RING_SIZE_TYPE_2_ADDR 0x000A0 +#define RING_RW_PTRS_2_ADDR 0x000A8 +#define RING_RW_STAT_2_ADDR 0x000B0 + +// Ring 3 +#define RING_CMMD_BASE_3_ADDR 0x000C0 +#define RING_RSLT_BASE_3_ADDR 0x000D0 +#define RING_SIZE_TYPE_3_ADDR 0x000E0 +#define RING_RW_PTRS_3_ADDR 0x000E8 +#define RING_RW_STAT_3_ADDR 0x000F0 + +// Ring Options +#define PKA_RING_OPTIONS_ADDR 0x07FF8 + +// Alternate Window RAM size +#define PKA_WINDOW_RAM_REGION_SIZE MEM_SIZE_16KB + +// Currently, we do not use these MiCA specific CSRs. + +// The PKI (not EIP154) CSR address/offsets: These are all addressed as +// 8-byte registers. +#define PKA_INT_MASK_ADDR 0x00 +#define PKA_INT_MASK_SET_ADDR 0x08 +#define PKA_INT_MASK_RESET_ADDR 0x10 +#define PKA_ZEROIZE_ADDR 0x40 +#define TST_FRO_ADDR 0x50 +#define FRO_COUNT_ADDR 0x58 +#define PKA_PARITY_CTL_ADDR 0x60 +#define PKA_PARITY_STAT_ADDR 0x68 + +#endif // __PKA_ADDRS_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h new file mode 100644 index 000000000..5b69d55be --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h @@ -0,0 +1,226 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_CONFIG_H__ +#define __PKA_CONFIG_H__ + +#include "mlxbf_pka_addrs.h" + +// The maximum number of PKA shims refered to as IO blocks. +#define PKA_MAX_NUM_IO_BLOCKS 8 +// The maximum number of Rings supported by IO block (shim). +#define PKA_MAX_NUM_IO_BLOCK_RINGS 4 + +#define PKA_MAX_NUM_RINGS \ + (PKA_MAX_NUM_IO_BLOCK_RINGS * PKA_MAX_NUM_IO_BLOCKS) + +// Resources are regions which include info control/status words, +// count registers and host window ram. +#define PKA_MAX_NUM_RING_RESOURCES 3 + +// PKA Ring resources. +// Define Ring resources parameters including base address, size (in bytes) +// and ring spacing. +#define PKA_RING_WORDS_ADDR PKA_BUFFER_RAM_BASE +#define PKA_RING_CNTRS_ADDR COMMAND_COUNT_0_ADDR + +#define PKA_RING_WORDS_SIZE 0x40 // 64 bytes +#define PKA_RING_CNTRS_SIZE 0x20 // 32 bytes (3 count registers) +#define PKA_RING_MEM_SIZE 0x4000 // 16K bytes + +#define PKA_RING_WORDS_SPACING 0x40 // 64 bytes +#define PKA_RING_CNTRS_SPACING 0x10000 // 64K bytes +#define PKA_RING_MEM_0_SPACING 0x4000 // 16K bytes +#define PKA_RING_MEM_1_SPACING 0x10000 // 64K bytes + +// PKA Window RAM parameters. +// Define whether to split or not Window RAM during PKA device creation phase. +#define SPLIT_WINDOW_RAM_MODE_ENABLED 1 +#define SPLIT_WINDOW_RAM_MODE_DISABLED 0 +#define PKA_SPLIT_WINDOW_RAM_MODE SPLIT_WINDOW_RAM_MODE_DISABLED +// Defines for Window RAM partition. It is valid for 16K memory. +#define PKA_WINDOW_RAM_RING_MEM_SIZE 0x0800 // 2KB +#define PKA_WINDOW_RAM_DATA_MEM_SIZE 0x3800 // 14KB + +// Offset mask, common to both Window and Alternate Window RAM. +#define PKA_WINDOW_RAM_OFFSET_MASK1 0x730000 + +// Macro for mapping PKA Ring address into Window RAM address. It converts the +// ring address, either physical address or virtual address, to valid address +// into the Window RAM. This is done assuming the Window RAM base, size and +// mask. Here, base is the actual physical address of the Window RAM, with the +// help of mask it is reduced to Window RAM offset within that PKA block. +// Further, with the help of addr and size, we arrive at the Window RAM +// offset address for a PKA Ring within the given Window RAM. +#define PKA_RING_MEM_ADDR(base, mask, addr, size) \ + ((base & mask) | (((addr) & 0xffff) | \ + ((((addr) & ~((size) - 1)) & 0xf0000) >> 2))) + +// PKA Master Sequencer Control/Status Register +// Write '1' to bit [31] puts the Master controller Sequencer in a reset +// reset state. Resetting the Sequencer (in order to load other firmware) +// should only be done when the EIP-154 is not performing any operations. +#define PKA_MASTER_SEQ_CTRL_RESET_VAL 0x80000000 +// Write '1' to bit [30] will reset all Command and Result counters. This +// bit is write-only and self clearing and can only be set if the ‘Reset’ +// bit [31] is ‘1’. +#define PKA_MASTER_SEQ_CTRL_CLEAR_COUNTERS_VAL 0x40000000 +// Bit [8] in the PKA Master Sequencer Control/Status Register is tied to +// the 'pka_master_irq interrupt' on the EIP-154 interrupt controller. +#define PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT 8 +// Sequencer status bits are used by the Master controller Sequencer to +// reflect status. Bit [0] is tied to the 'pka_master_irq' interrupt on +// the EIP-154 interrupt controller. +#define PKA_MASTER_SEQ_CTRL_STATUS_BYTE 0x01 +// 'pka_master_irq' mask for the Master controller Sequencer Status Register. +#define PKA_MASTER_SEQ_CTRL_MASTER_IRQ_MASK 0x100 + +// Advanced Interrupt Controller (AIC) configuration +// AIC Polarity Control Register is used to set each individual interrupt +// signal (High Level / Rising Edge) during the initialization phase. +// '0' = Low level or falling edge. +// '1' = High level or rising edge. +#define PKA_AIC_POL_CTRL_REG_VAL 0x000FFFFF +// AIC Type Control Register is used to set each interrupt to level or edge. +// '0' = Level. +// '1' = Edge. +#define PKA_AIC_TYPE_CTRL_REG_VAL 0x000FFFFF +// AIC Enable Control Register is used to enable interrupt inputs. +// '0' = Disabled. +// '1' = Enabled. +#define PKA_AIC_ENABLE_CTRL_REG_VAL 0x000F030F +// AIC Enabled Status Register bits reflect the status of the interrupts +// gated with the enable bits of the AIC_ENABLE_CTRL Register. +// '0' = Inactive. +// '1' = Pending. +#define PKA_AIC_ENABLE_STAT_REG_VAL 0x000F030F + +// 'pka_master_irq' mask for the AIC Enabled Status Register. +#define PKA_AIC_ENABLED_STAT_MASTER_IRQ_MASK 0x100 + +// PKA_RING_OPTIONS field to specify the priority in which rings are handled: +// '00' = full rotating priority, +// '01' = fixed priority (ring 0 lowest), +// '10' = ring 0 has the highest priority and the remaining rings have +// rotating priority, +// '11' = reserved, do not use. +#define PKA_FULL_ROTATING_PRIORITY 0x0 +#define PKA_FIXED_PRIORITY 0x1 +#define PKA_RING_0_HAS_THE_HIGHEST_PRIORITY 0x2 +#define PKA_RESERVED 0x3 +#define PKA_RING_OPTIONS_PRIORITY PKA_FULL_ROTATING_PRIORITY + +// 'Signature' byte used because the ring options are transferred through RAM +// which does not have a defined reset value. The EIP-154 master controller +// keeps reading the PKA_RING_OPTIONS word at start-up until the ‘Signature’ +// byte contains 0x46 and the ‘Reserved’ field contains zero. +#define PKA_RING_OPTIONS_SIGNATURE_BYTE 0x46 + +// Order of the result reporting: Two schemas are available: +// InOrder - This means that the results will be reported in the same order +// as the commands were provided. +// OutOfOrder - This means that the results are reported as soon as they are +// available +#define PKA_RING_TYPE_IN_ORDER_BIT 1 +#define PKA_RING_TYPE_OUT_OF_ORDER_BIT 0 +#define PKA_RING_TYPE_IN_ORDER PKA_RING_TYPE_OUT_OF_ORDER_BIT + +// Byte order of the data written/read to/from Rings. +// Little Endian (LE) - The least significant bytes have the lowest address. +// Big Endian (BE) - The most significant bytes come first. +#define PKA_RING_BYTE_ORDER_LE 0 +#define PKA_RING_BYTE_ORDER_BE 1 +#define PKA_RING_BYTE_ORDER PKA_RING_BYTE_ORDER_LE + +// 'trng_clk_on' mask for PKA Clock Switch Forcing Register. Turn on the +// TRNG clock. When the TRNG is controlled via the Host slave interface, +// this engine needs to be turned on by setting bit 11. +#define PKA_CLK_FORCE_TRNG_ON 0x800 + +// Number of TRNG Output registers +#define PKA_TRNG_OUTPUT_CNT 4 + +// TRNG Configuration +#define PKA_TRNG_CONFIG_REG_VAL 0x00020008 +// TRNG Alarm Counter Register Value +#define PKA_TRNG_ALARMCNT_REG_VAL 0x000200FF +// TRNG FRO Enable Register Value +#define PKA_TRNG_FROENABLE_REG_VAL 0x00FFFFFF +// TRNG Control Register Value; Set bit 10 to start the EIP-76 a.k.a TRNG +// engine, gathering entropy from the FROs. +#define PKA_TRNG_CONTROL_REG_VAL 0x00000400 + +// TRNG Control bit +#define PKA_TRNG_CONTROL_TEST_MODE 0x100 + +// TRNG Control Register Value; Set bit 10 and 12 to start the EIP-76 a.k.a TRNG +// engine with DRBG enabled, gathering entropy from the FROs. +#define PKA_TRNG_CONTROL_DRBG_REG_VAL 0x00001400 + +// DRBG enabled TRNG 'request_data' value. REQ_DATA_VAL (in accordance with +// DATA_BLOCK_MASK) requests 256 blocks of 128-bit random output. +// 4095 blocks is the max number that can be requested for the TRNG(with DRBG) +// configuration on Bluefield platforms. +#define PKA_TRNG_CONTROL_REQ_DATA_VAL 0x10010000 + +// Mask for 'Data Block' in TRNG Control Register. +#define PKA_TRNG_DRBG_DATA_BLOCK_MASK 0xfff00000 + +// Set bit 12 of TRNG Control Register to enable DRBG functionality. +#define PKA_TRNG_CONTROL_DRBG_ENABLE_VAL 0x00001000 + +// Set bit 8 a.ka 'test_sp_800_90 DRBG' bit in the TRNG Test Register. +#define PKA_TRNG_TEST_DRBG_VAL 0x00000080 + +// Number of Personalization String/Additional Input Registers +#define PKA_TRNG_PS_AI_REG_COUNT 12 + +// DRBG Reseed enable +#define PKA_TRNG_CONTROL_DRBG_RESEED 0x00008000 + +// TRNG Status bits +#define PKA_TRNG_STATUS_READY 0x1 +#define PKA_TRNG_STATUS_SHUTDOWN_OFLO 0x2 +#define PKA_TRNG_STATUS_TEST_READY 0x100 +#define PKA_TRNG_STATUS_MONOBIT_FAIL 0x80 +#define PKA_TRNG_STATUS_RUN_FAIL 0x10 +#define PKA_TRNG_STATUS_POKER_FAIL 0x40 + +// TRNG Alarm Counter bits +#define PKA_TRNG_ALARMCNT_STALL_RUN_POKER 0x8000 + +// TRNG Test bits +#define PKA_TRNG_TEST_KNOWN_NOISE 0x20 +#define PKA_TRNG_TEST_NOISE 0x2000 + +#endif // __PKA_CONFIG_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h new file mode 100644 index 000000000..12a368c13 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h @@ -0,0 +1,72 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_CPU_H__ +#define __PKA_CPU_H__ + +#include +#include + +#define PKA_AARCH_64 +#define MAX_CPU_NUMBER 16 // BlueField specific + +#define MEGA 1000000 +#define GIGA 1000000000 + +#define MS_PER_S 1000 +#define US_PER_S 1000000 +#define NS_PER_S 1000000000 + +// Initial guess at our CPU speed. We set this to be larger than any +// possible real speed, so that any calculated delays will be too long, +// rather than too short. +// +//*Warning: use dummy value for frequency +//#define CPU_HZ_MAX (2 * GIGA) // Cortex A72 : 2 GHz max -> 2.5 GHz max +#define CPU_HZ_MAX (1255 * MEGA) // CPU Freq for High/Bin Chip + +// YIELD hints the CPU to switch to another thread if possible +// and executes as a NOP otherwise. +#define pka_cpu_yield() ({ asm volatile("yield" : : : "memory"); }) +// ISB flushes the pipeline, then restarts. This is guaranteed to +// stall the CPU a number of cycles. +#define pka_cpu_relax() ({ asm volatile("isb" : : : "memory"); }) + +// Processor speed in hertz; used in routines which might be called very +// early in boot. +static inline uint64_t pka_early_cpu_speed(void) +{ + return CPU_HZ_MAX; +} + +#endif // __PKA_CPU_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h new file mode 100644 index 000000000..a44af6eb1 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h @@ -0,0 +1,66 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_DEBUG_H__ +#define __PKA_DEBUG_H__ + +// PKA library bitmask. Use those bits to enable debug messages +#define PKA_DRIVER 0x0001 +#define PKA_DEV 0x0002 +#define PKA_RING 0x0004 +#define PKA_QUEUE 0x0008 +#define PKA_MEM 0x0010 +#define PKA_USER 0x0020 +#define PKA_TESTS 0x0040 +// PKA debug mask. This indicates the debug/verbosity level. +#define PKA_DEBUG_LIB_MASK 0x0040 + +#define PKA_PRINT(lib, fmt, args...) \ + ({ pr_info(#lib": "fmt, ##args); }) + +#define PKA_ERROR(lib, fmt, args...) \ + ({ pr_err(#lib": %s: error: "fmt, __func__, ##args); }) + +#define PKA_DEBUG(lib, fmt, args...) \ + ({ \ + if (lib & PKA_DEBUG_LIB_MASK) \ + pr_debug(#lib": %s: "fmt, __func__, ##args); \ + }) + +#define PKA_PANIC(lib, msg, args...) \ + ({ \ + pr_info(#lib": %s: panic: "msg, __func__, ##args); \ + panic(msg, ##args); \ + }) + +#endif // __PKA_DEBUG_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c new file mode 100644 index 000000000..c90c70134 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c @@ -0,0 +1,2414 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include +#include +#include + +#include "mlxbf_pka_dev.h" + +#define BYTES_PER_WORD 4 +#define BYTES_PER_DOUBLE_WORD 8 + +// Personalization string "NVIDIA-MELLANOX-BLUEFIELD-TRUE_RANDOM_NUMBER_GEN" +uint32_t pka_trng_drbg_ps_str[] = +{ + 0x4e564944, 0x49412d4d, 0x454c4c41, 0x4e4f582d, + 0x424c5545, 0x4649454c, 0x442d5452, 0x55455f52, + 0x414e444f, 0x4d5f4e55, 0x4d424552, 0x5f47454e +}; + +// Personalization string for DRBG test +uint32_t pka_trng_drbg_test_ps_str[] = +{ + 0x64299d83, 0xc34d7098, 0x5bd1f51d, 0xddccfdc1, + 0xdd0455b7, 0x166279e5, 0x0974cb1b, 0x2f2cd100, + 0x59a5060a, 0xca79940d, 0xd4e29a40, 0x56b7b779 +}; + +// First Entropy string for DRBG test +uint32_t pka_trng_drbg_test_etpy_str1[] = +{ + 0xaa6bbcab, 0xef45e339, 0x136ca1e7, 0xbce1c881, + 0x9fa37b09, 0x63b53667, 0xb36e0053, 0xa202ed81, + 0x4650d90d, 0x8eed6127, 0x666f2402, 0x0dfd3af9 +}; + +// Second Entropy string for DRBG test +uint32_t pka_trng_drbg_test_etpy_str2[] = +{ + 0x35c1b7a1, 0x0154c52b, 0xd5777390, 0x226a4fdb, + 0x5f16080d, 0x06b68369, 0xd0c93d00, 0x3336e27f, + 0x1abf2c37, 0xe6ab006c, 0xa4adc6e1, 0x8e1907a2 +}; + +// Known answer for DRBG test +uint32_t pka_trng_drbg_test_output[] = +{ + 0xb663b9f1, 0x24943e13, 0x80f7dce5, 0xaba1a16f +}; + +pka_dev_gbl_config_t pka_gbl_config; + +// Global PKA shim resource info table +static pka_dev_gbl_shim_res_info_t pka_gbl_res_tbl[PKA_MAX_NUM_IO_BLOCKS]; + +// Start a PKA device timer. +static uint64_t pka_dev_timer_start(uint32_t usec) +{ + uint64_t cur_time = get_cycles(); + return (cur_time + (pka_early_cpu_speed() * usec) / 1000000ULL); +} + +// Test a PKA device timer for completion. +static int pka_dev_timer_done(uint64_t timer) +{ + return (get_cycles() >= timer); +} + +// Return register base address +static uint64_t pka_dev_get_register_base(uint64_t base, uint64_t reg_addr) +{ + return (base + reg_addr) & PAGE_MASK; +} + +// Return register offset +static uint64_t pka_dev_get_register_offset(uint64_t base, uint64_t reg_addr) +{ + return (base + reg_addr) & ~PAGE_MASK; +} + +// Return word offset within io memory +static uint64_t pka_dev_get_word_offset(uint64_t mem_base, uint64_t word_addr, + uint64_t mem_size) +{ + return (mem_base + word_addr) & (mem_size - 1); +} + +static uint64_t pka_dev_io_read(void *mem_ptr, uint64_t mem_off) +{ + uint64_t data; + + data = pka_mmio_read(mem_ptr + mem_off); + + return data; +} + +static void pka_dev_io_write(void *mem_ptr, uint64_t mem_off, uint64_t value) +{ + pka_mmio_write(mem_ptr + mem_off, value); +} + +// Add the resource to the global resource table +static int pka_dev_add_resource(pka_dev_res_t *res_ptr, uint32_t shim_idx) +{ + uint8_t res_cnt; + + res_cnt = pka_gbl_res_tbl[shim_idx].res_cnt; + + if (res_cnt >= PKA_DEV_SHIM_RES_CNT) + return -ENOMEM; + + pka_gbl_res_tbl[shim_idx].res_tbl[res_cnt] = res_ptr; + pka_gbl_res_tbl[shim_idx].res_cnt++; + + return 0; +} + +// Remove the resource from the global resource table +static int pka_dev_put_resource(pka_dev_res_t *res, uint32_t shim_idx) +{ + pka_dev_res_t *res_ptr; + uint8_t res_idx; + + for (res_idx = 0; res_idx < PKA_DEV_SHIM_RES_CNT; res_idx++) + { + res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx]; + if (res_ptr && strcmp(res_ptr->name, res->name) == 0) + { + pka_gbl_res_tbl[shim_idx].res_tbl[res_idx] = NULL; + pka_gbl_res_tbl[shim_idx].res_cnt--; + break; + } + } + + // Check whether the resource shares the same memory map; If so, + // the memory map shouldn't be released. + for (res_idx = 0; res_idx < PKA_DEV_SHIM_RES_CNT; res_idx++) + { + res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx]; + if (res_ptr && (res_ptr->base == res->base)) + return -EBUSY; + } + + return 0; +} + +static void* pka_dev_get_resource_ioaddr(uint64_t res_base, uint32_t shim_idx) +{ + pka_dev_res_t *res_ptr; + uint8_t res_cnt, res_idx; + + res_cnt = pka_gbl_res_tbl[shim_idx].res_cnt; + + if (res_cnt == 0) + return NULL; + + for (res_idx = 0; res_idx < res_cnt; res_idx++) + { + res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx]; + if (res_ptr->base == res_base) + return res_ptr->ioaddr; + } + + return NULL; +} + +// Set PKA device resource config - - map io memory if needed. +static int pka_dev_set_resource_config(pka_dev_shim_t *shim, + pka_dev_res_t *res_ptr, + uint64_t res_base, + uint64_t res_size, + uint64_t res_type, + char *res_name) +{ + int ret = 0; + + if (res_ptr->status == PKA_DEV_RES_STATUS_MAPPED) + return -EPERM; + + if (res_type == PKA_DEV_RES_TYPE_REG) + res_ptr->base = res_base; + + if (res_type == PKA_DEV_RES_TYPE_MEM) + res_ptr->base = shim->mem_res.eip154_base + res_base; + + res_ptr->size = res_size; + res_ptr->type = res_type; + res_ptr->name = res_name; + res_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED; + res_ptr->ioaddr = pka_dev_get_resource_ioaddr(res_ptr->base, + shim->shim_id); + if (!res_ptr->ioaddr) + { + if (!request_mem_region(res_ptr->base, res_ptr->size, res_ptr->name)) + { + PKA_ERROR(PKA_DEV, "failed to get io memory region\n"); + return -EPERM; + } + + res_ptr->ioaddr = ioremap(res_ptr->base, res_ptr->size); + } + + res_ptr->status = PKA_DEV_RES_STATUS_MAPPED; + + if (!res_ptr->ioaddr || pka_dev_add_resource(res_ptr, shim->shim_id)) + { + PKA_ERROR(PKA_DEV, "unable to map io memory\n"); + release_mem_region(res_ptr->base, res_ptr->size); + return -ENOMEM; + } + return ret; +} + +// Unset PKA device resource config - unmap io memory if needed. +static void pka_dev_unset_resource_config(pka_dev_shim_t *shim, + pka_dev_res_t *res_ptr) +{ + int ret = -EBUSY; + + if (res_ptr->status != PKA_DEV_RES_STATUS_MAPPED) + return; + + if (res_ptr->ioaddr && + ret != pka_dev_put_resource(res_ptr, shim->shim_id)) + { + iounmap(res_ptr->ioaddr); + release_mem_region(res_ptr->base, res_ptr->size); + } + + res_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED; +} + +int pka_dev_clear_ring_counters(pka_dev_ring_t *ring) +{ + pka_dev_shim_t *shim; + pka_dev_res_t *master_seq_ctrl_ptr; + void *master_reg_ptr; + uint64_t master_reg_base, master_reg_off; + + shim = ring->shim; + master_seq_ctrl_ptr = &shim->resources.master_seq_ctrl; + master_reg_base = master_seq_ctrl_ptr->base; + master_reg_ptr = master_seq_ctrl_ptr->ioaddr; + master_reg_off = pka_dev_get_register_offset(master_reg_base, + PKA_MASTER_SEQ_CTRL_ADDR); + + // push the EIP-154 master controller into reset. + pka_dev_io_write(master_reg_ptr, master_reg_off, + PKA_MASTER_SEQ_CTRL_RESET_VAL); + + // clear counters. + pka_dev_io_write(master_reg_ptr, master_reg_off, + PKA_MASTER_SEQ_CTRL_CLEAR_COUNTERS_VAL); + + // take the EIP-154 master controller out of reset. + pka_dev_io_write(master_reg_ptr, master_reg_off, 0); + + return 0; +} + +// Initialize ring. Set ring parameters and configure ring resources. +// It returns 0 on success, a negative error code on failure. +static int pka_dev_init_ring(pka_dev_ring_t *ring, uint32_t ring_id, + pka_dev_shim_t *shim) +{ + int ret = 0; + + pka_dev_res_t *ring_info_words_ptr; + pka_dev_res_t *ring_counters_ptr; + pka_dev_res_t *ring_window_ram_ptr; + + uint32_t ring_words_off; + uint32_t ring_cntrs_off; + uint32_t ring_mem_off; + uint32_t ring_mem_base; + + uint32_t shim_ring_id; + uint8_t window_ram_split; + + if (ring->status != PKA_DEV_RING_STATUS_UNDEFINED) + { + PKA_ERROR(PKA_DEV, "PKA ring must be undefined\n"); + return -EPERM; + } + + if (ring_id > PKA_MAX_NUM_RINGS - 1) + { + PKA_ERROR(PKA_DEV, "invalid ring identifier\n"); + return -EINVAL; + } + + ring->ring_id = ring_id; + ring->shim = shim; + ring->resources_num = PKA_MAX_NUM_RING_RESOURCES; + + shim_ring_id = ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS; + shim->rings[shim_ring_id] = ring; + + // Configure ring information control/status words resource + ring_info_words_ptr = &ring->resources.info_words; + ring_words_off = shim_ring_id * PKA_RING_WORDS_SPACING; + ring_info_words_ptr->base = ring_words_off + shim->mem_res.eip154_base + + PKA_RING_WORDS_ADDR; + ring_info_words_ptr->size = PKA_RING_WORDS_SIZE; + ring_info_words_ptr->type = PKA_DEV_RES_TYPE_MEM; + ring_info_words_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED; + ring_info_words_ptr->name = "PKA_RING_INFO"; + + // Configure ring counters registers resource + ring_counters_ptr = &ring->resources.counters; + ring_cntrs_off = shim_ring_id * PKA_RING_CNTRS_SPACING; + ring_counters_ptr->base = ring_cntrs_off + shim->mem_res.eip154_base + + PKA_RING_CNTRS_ADDR; + ring_counters_ptr->size = PKA_RING_CNTRS_SIZE; + ring_counters_ptr->type = PKA_DEV_RES_TYPE_REG; + ring_counters_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED; + ring_counters_ptr->name = "PKA_RING_CNTRS"; + + // Configure ring window RAM resource + window_ram_split = shim->window_ram_split; + if (window_ram_split == PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED) + { + ring_mem_off = shim_ring_id * PKA_RING_MEM_1_SPACING; + ring_mem_base = ring_mem_off + shim->mem_res.alt_wndw_ram_0_base; + } + else + { + ring_mem_off = shim_ring_id * PKA_RING_MEM_0_SPACING; + ring_mem_base = ring_mem_off + shim->mem_res.wndw_ram_base; + } + + ring_window_ram_ptr = &ring->resources.window_ram; + ring_window_ram_ptr->base = ring_mem_base; + ring_window_ram_ptr->size = PKA_RING_MEM_SIZE; + ring_window_ram_ptr->type = PKA_DEV_RES_TYPE_MEM; + ring_window_ram_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED; + ring_window_ram_ptr->name = "PKA_RING_WINDOW"; + + ring->ring_info = kzalloc(sizeof(pka_dev_hw_ring_info_t), GFP_KERNEL); + if (!ring->ring_info) + { + PKA_ERROR(PKA_DEV, "unable to kmalloc\n"); + kfree(ring->ring_info); + return -ENOMEM; + } + + mutex_init(&ring->mutex); + ring->status = PKA_DEV_RING_STATUS_INITIALIZED; + + return ret; +} + +// Release a given Ring. +static int pka_dev_release_ring(pka_dev_ring_t *ring) +{ + int ret = 0; + + pka_dev_shim_t *shim; + uint32_t shim_ring_id; + + if (ring->status == PKA_DEV_RING_STATUS_UNDEFINED) + return ret; + + if (ring->status == PKA_DEV_RING_STATUS_BUSY) + { + PKA_ERROR(PKA_DEV, "PKA ring is busy\n"); + return -EBUSY; + } + + shim = ring->shim; + + if (shim->status == PKA_SHIM_STATUS_RUNNING) + { + PKA_ERROR(PKA_DEV, "PKA shim is running\n"); + return -EPERM; + } + + pka_dev_unset_resource_config(shim, &ring->resources.info_words); + pka_dev_unset_resource_config(shim, &ring->resources.counters); + pka_dev_unset_resource_config(shim, &ring->resources.window_ram); + + kfree(ring->ring_info); + + ring->status = PKA_DEV_RING_STATUS_UNDEFINED; + shim_ring_id = ring->ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS; + shim->rings[shim_ring_id] = NULL; + shim->rings_num--; + + return ret; +} + +// Partition the window RAM for a given PKA ring. Here we statically divide +// the 16K memory region into three partitions: First partition is reserved +// for command descriptor ring (1K), second partition is reserved for result +// descriptor ring (1K), and the remaining 14K are reserved for vector data. +// Through this memroy partition scheme, command/result descriptor rings hold +// a total of 1KB/64B = 16 descriptors each. The adresses for the rings start +// at offset 0x3800. Also note that it is possible to have rings full while +// the vector data can support more data, the opposite can also happen, but +// it is not suitable. For instance ECC point multiplication requires 8 input +// vectors and 2 output vectors, a total of 10 vectors. If each vector has a +// length of 24 words (24x4B = 96B), we can process 14KB/960B = 14 operations +// which is close to 16 the total descriptors supported by rings. On the other +// hand, using 12K vector data region, allows to process only 12 operations, +// while rings can hold 32 descriptors (ring usage is significantly low). +// For ECDSA verify, we have 12 vectors which require 1152B, with 14KB we can +// handle 12 operations, against 10 operations with 12KB vector data memory. +// We believe that the aformentionned memory partition help us to leverage +// the trade-off between supported descriptors and required vectors. Note +// that these examples gives approximative values and does not include buffer +// word padding across vectors. +// +// The function also writes the result descriptor rings base addresses, size +// and type, and initialize the read and write pointers and statistics. It +// returns 0 on success, a negative error code on failure. +// +// This function must be called once per ring, at initialization before any +// other fonctions are called. +static int pka_dev_partition_mem(pka_dev_ring_t *ring) +{ + int ret = 0; + + pka_dev_shim_t *shim; + pka_dev_hw_ring_info_t *ring_info; + + uint32_t ring_mem_base; + uint32_t ring_mem_size; + uint32_t data_mem_base; + uint32_t data_mem_size; + + uint64_t cmd_desc_ring_base; + uint32_t cmd_desc_ring_size; + uint64_t rslt_desc_ring_base; + uint32_t rslt_desc_ring_size; + + uint16_t num_cmd_desc; + uint16_t host_desc_size; + uint8_t ring_in_order; + + uint64_t window_ram_base; + uint64_t window_ram_size; + + shim = ring->shim; + + if (!ring->shim || + ring->status != PKA_DEV_RING_STATUS_INITIALIZED) + return -EPERM; + + ring_in_order = shim->ring_type; + window_ram_base = ring->resources.window_ram.base; + window_ram_size = ring->resources.window_ram.size; + // Partition ring memory. Give ring pair (cmmd descriptor ring and rslt + // descriptor ring) an equal portion of the memory. The cmmd descriptor + // ring and result descriptor ring are used as "non-overlapping" ring. + // Currently set aside 1/8 of the window RAM for command/result descriptor + // rings - giving a total of 1K/64B = 16 descriptors per ring. + // The remaining memory is "Data Memory" - i.e. memory to hold the command + // operands and results - also called input/output vectors (in all cases + // these vectors are just single large integers - often in the range of + // hundreds to thousands of bits long). + ring_mem_size = PKA_WINDOW_RAM_RING_MEM_SIZE / 2; + data_mem_size = PKA_WINDOW_RAM_DATA_MEM_SIZE; + data_mem_base = window_ram_base; + ring_mem_base = data_mem_base + data_mem_size; + + num_cmd_desc = ring_mem_size / CMD_DESC_SIZE; + host_desc_size = CMD_DESC_SIZE / BYTES_PER_WORD; + + cmd_desc_ring_size = num_cmd_desc * CMD_DESC_SIZE; + rslt_desc_ring_size = cmd_desc_ring_size; + + ring->num_cmd_desc = num_cmd_desc; + + // The command and result descriptor rings may be placed at different + // (non-overlapping) locations in Window RAM memory space. PKI command + // interface: Most of the functionality is defined by the EIP-154 master + // firmware on the EIP-154 master controller Sequencer. + cmd_desc_ring_base = ring_mem_base; + rslt_desc_ring_base = ring_mem_base + cmd_desc_ring_size; + + cmd_desc_ring_base = + PKA_RING_MEM_ADDR(window_ram_base, shim->mem_res.wndw_ram_off_mask, + cmd_desc_ring_base, window_ram_size); + rslt_desc_ring_base = + PKA_RING_MEM_ADDR(window_ram_base, shim->mem_res.wndw_ram_off_mask, + rslt_desc_ring_base, window_ram_size); + + ring_info = ring->ring_info; + // Fill ring information. + ring_info->cmmd_base = cmd_desc_ring_base; + ring_info->rslt_base = rslt_desc_ring_base; + ring_info->size = num_cmd_desc - 1; + ring_info->host_desc_size = host_desc_size; + ring_info->in_order = ring_in_order; + ring_info->cmmd_rd_ptr = 0x0; + ring_info->rslt_wr_ptr = 0x0; + ring_info->cmmd_rd_stats = 0x0; + ring_info->rslt_wr_stats = 0x0; + + return ret; +} + +// Write the ring base address, ring size and type, and initialize (clear) +// the read and write pointers and statistics. +static int pka_dev_write_ring_info(pka_dev_res_t *buffer_ram_ptr, + uint8_t ring_id, + uint32_t ring_cmmd_base_val, + uint32_t ring_rslt_base_val, + uint32_t ring_size_type_val) +{ + uint32_t ring_spacing; + uint64_t word_off; + int ret = 0; + + if (buffer_ram_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + buffer_ram_ptr->type != PKA_DEV_RES_TYPE_MEM) + return -EPERM; + + PKA_DEBUG(PKA_DEV, "Writing ring information control/status words\n"); + + ring_spacing = ring_id * PKA_RING_WORDS_SPACING; + + // Write the command ring base address that the EIP-154 + // master firmware uses with the command ring read pointer + // to get command descriptors from the Host ring. After the + // initialization, although the word is writeable it should + // be regarded as read-only. + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + RING_CMMD_BASE_0_ADDR + ring_spacing, + PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_cmmd_base_val); + + // Write the result ring base address that the EIP-154 + // master firmware uses with the result ring write pointer + // to put the result descriptors in the Host ring. After + // the initialization, although the word is writeable it + // should be regarded as read-only. + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + RING_RSLT_BASE_0_ADDR + ring_spacing, + PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_rslt_base_val); + + // Write the ring size (number of descriptors), the size of + // the descriptor and the result reporting scheme. After the + // initialization, although the word is writeable it should + // be regarded as read-only. + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + RING_SIZE_TYPE_0_ADDR + ring_spacing, + PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_size_type_val); + + // Write the command and result ring indices that the EIP-154 + // master firmware uses. This word should be written with zero + // when the ring information is initialized. After the + // initialization, although the word is writeable it should be + // regarded as read-only. + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + RING_RW_PTRS_0_ADDR + ring_spacing, + PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, 0); + + // Write the ring statistics (two 16-bit counters, one for + // commands and one for results) from EIP-154 master firmware + // point of view. This word should be written with zero when + // the ring information is initialized. After the initializa- + // -tion, although the word is writeable it should be regarded + // as read-only. + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + RING_RW_STAT_0_ADDR + ring_spacing, + PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, 0); + + return ret; +} + +// Set up the control/status words. Upon a PKI command the EIP-154 master +// firmware will read and partially update the ring information. +static int pka_dev_set_ring_info(pka_dev_ring_t *ring) +{ + int ret = 0; + + pka_dev_shim_t *shim; + pka_dev_hw_ring_info_t *ring_info; + pka_dev_res_t *buffer_ram_ptr; + + uint32_t ring_cmmd_base_val; + uint32_t ring_rslt_base_val; + uint32_t ring_size_type_val; + + uint8_t ring_id; + + shim = ring->shim; + // Ring info configuration MUST be done when the PKA ring + // is initilaized. + if ((shim->status != PKA_SHIM_STATUS_INITIALIZED && + shim->status != PKA_SHIM_STATUS_RUNNING && + shim->status != PKA_SHIM_STATUS_STOPPED) || + ring->status != PKA_DEV_RING_STATUS_INITIALIZED) + return -EPERM; + + ring_id = ring->ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS; + + // Partition ring memory. + ret = pka_dev_partition_mem(ring); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to initialize ring memory\n"); + return ret; + } + + // Fill ring infomation. + ring_info = ring->ring_info; + + ring_cmmd_base_val = ring_info->cmmd_base; + ring_rslt_base_val = ring_info->rslt_base; + + ring_size_type_val = (ring_info->in_order & 0x0001) << 31; + ring_size_type_val |= (ring_info->host_desc_size & 0x03FF) << 18; + ring_size_type_val |= (ring->num_cmd_desc - 1) & 0xFFFF; + + buffer_ram_ptr = &shim->resources.buffer_ram; + // Write ring information status/control words in the PKA Buffer RAM + ret = pka_dev_write_ring_info(buffer_ram_ptr, ring_id, ring_cmmd_base_val, + ring_rslt_base_val, ring_size_type_val); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to wirte ring information\n"); + return ret; + } + + ring->status = PKA_DEV_RING_STATUS_READY; + + return ret; +} + +// Create shim. Set shim parameters and configure shim resources. +// It returns 0 on success, a negative error code on failure. +static int pka_dev_create_shim(pka_dev_shim_t *shim, uint32_t shim_id, + uint8_t split, struct pka_dev_mem_res *mem_res) +{ + int ret = 0; + + uint64_t reg_base; + uint64_t reg_size; + + if (shim->status == PKA_SHIM_STATUS_CREATED) + return ret; + + if (shim->status != PKA_SHIM_STATUS_UNDEFINED) + { + PKA_ERROR(PKA_DEV, "PKA device must be undefined\n"); + return -EPERM; + } + + if (shim_id > PKA_MAX_NUM_IO_BLOCKS - 1) + { + PKA_ERROR(PKA_DEV, "invalid shim identifier\n"); + return -EINVAL; + } + + shim->shim_id = shim_id; + shim->mem_res = *mem_res; + + if (split) + shim->window_ram_split = PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED; + else + shim->window_ram_split = PKA_SHIM_WINDOW_RAM_SPLIT_DISABLED; + + shim->ring_type = PKA_RING_TYPE_IN_ORDER; + shim->ring_priority = PKA_RING_OPTIONS_PRIORITY; + shim->rings_num = PKA_MAX_NUM_IO_BLOCK_RINGS; + shim->rings = kzalloc(sizeof(pka_dev_ring_t) * shim->rings_num, + GFP_KERNEL); + if (!shim->rings) + { + PKA_ERROR(PKA_DEV, "unable to kmalloc\n"); + return -ENOMEM; + } + + // Set PKA device Buffer RAM config + ret = pka_dev_set_resource_config(shim, &shim->resources.buffer_ram, + PKA_BUFFER_RAM_BASE, + PKA_BUFFER_RAM_SIZE, + PKA_DEV_RES_TYPE_MEM, + "PKA_BUFFER_RAM"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to set Buffer RAM config\n"); + return ret; + } + + // Set PKA device Master Program RAM config + ret = pka_dev_set_resource_config(shim, &shim->resources.master_prog_ram, + PKA_MASTER_PROG_RAM_BASE, + PKA_MASTER_PROG_RAM_SIZE, + PKA_DEV_RES_TYPE_MEM, + "PKA_MASTER_PROG_RAM"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to set Master Program RAM config\n"); + return ret; + } + + // Set PKA device Master Controller register + reg_size = PAGE_SIZE; + reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base, + PKA_MASTER_SEQ_CTRL_ADDR); + ret = pka_dev_set_resource_config(shim, &shim->resources.master_seq_ctrl, + reg_base, reg_size, + PKA_DEV_RES_TYPE_REG, + "PKA_MASTER_SEQ_CTRL"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to set Master Controller register " + "config\n"); + return ret; + } + + // Set PKA device AIC registers + reg_size = PAGE_SIZE; + reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base, + AIC_POL_CTRL_ADDR); + ret = pka_dev_set_resource_config(shim, &shim->resources.aic_csr, + reg_base, reg_size, + PKA_DEV_RES_TYPE_REG, + "PKA_AIC_CSR"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to set AIC registers config\n"); + return ret; + } + + // Set PKA device TRNG registers + reg_size = PAGE_SIZE; + reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base, + TRNG_OUTPUT_0_ADDR); + ret = pka_dev_set_resource_config(shim, &shim->resources.trng_csr, + reg_base, reg_size, + PKA_DEV_RES_TYPE_REG, + "PKA_TRNG_CSR"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to setup the TRNG\n"); + return ret; + } + + // Set PKA device 'glue' logic registers + reg_size = PAGE_SIZE; + reg_base = pka_dev_get_register_base(shim->mem_res.csr_base, + PKA_INT_MASK_ADDR); + ret = pka_dev_set_resource_config(shim, &shim->resources.ext_csr, + reg_base, reg_size, + PKA_DEV_RES_TYPE_REG, + "PKA_EXT_CSR"); + if (ret) + { + PKA_ERROR(PKA_DEV, "unable to setup the MiCA specific registers\n"); + return ret; + } + + shim->status = PKA_SHIM_STATUS_CREATED; + + return ret; +} + +// Delete shim and unset shim resources. +static int pka_dev_delete_shim(pka_dev_shim_t *shim) +{ + int ret = 0; + pka_dev_res_t *res_buffer_ram, *res_master_prog_ram; + pka_dev_res_t *res_master_seq_ctrl, *res_aic_csr, *res_trng_csr; + + PKA_DEBUG(PKA_DEV, "PKA device delete shim\n"); + + if (shim->status == PKA_SHIM_STATUS_UNDEFINED) + return ret; + + if (shim->status != PKA_SHIM_STATUS_FINALIZED && + shim->status != PKA_SHIM_STATUS_CREATED) + { + PKA_ERROR(PKA_DEV, "PKA device status must be finalized\n"); + return -EPERM; + } + + res_buffer_ram = &shim->resources.buffer_ram; + res_master_prog_ram = &shim->resources.master_prog_ram; + res_master_seq_ctrl = &shim->resources.master_seq_ctrl; + res_aic_csr = &shim->resources.aic_csr; + res_trng_csr = &shim->resources.trng_csr; + + pka_dev_unset_resource_config(shim, res_buffer_ram); + pka_dev_unset_resource_config(shim, res_master_prog_ram); + pka_dev_unset_resource_config(shim, res_master_seq_ctrl); + pka_dev_unset_resource_config(shim, res_aic_csr); + pka_dev_unset_resource_config(shim, res_trng_csr); + + kfree(shim->rings); + + shim->status = PKA_SHIM_STATUS_UNDEFINED; + + return ret; +} + +static int pka_dev_config_aic_interrupts(pka_dev_res_t *aic_csr_ptr) +{ + int ret = 0; + + uint64_t csr_reg_base, csr_reg_off; + void *csr_reg_ptr; + + if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + PKA_DEBUG(PKA_DEV, "configure the AIC so that all interrupts " + "are properly recognized\n"); + + csr_reg_base = aic_csr_ptr->base; + csr_reg_ptr = aic_csr_ptr->ioaddr; + + // Configure the signal polarity for each interrupt. + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, AIC_POL_CTRL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_POL_CTRL_REG_VAL); + + // Configure the signal type for each interrupt + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, AIC_TYPE_CTRL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_TYPE_CTRL_REG_VAL); + + // Set the enable control register + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, AIC_ENABLE_CTRL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_ENABLE_CTRL_REG_VAL); + + // Set the enabled status register + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, AIC_ENABLED_STAT_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_ENABLE_STAT_REG_VAL); + + // *TBD* Write PKA_INT_MASK_RESET with 1's for each interrupt bit + // to allow them to propagate out the interrupt controller. + // EIP-154 interrupts can still be programmed and observed via polling + // regardless of whether PKA_INT_MASK is masking out the interrupts or + // not. The mask is for system propagation, i.e. propagate to the GIC. + // Bit positions are as follows: + // Bit 10 - parity_error_irq (non EIP-154 interrupt) + // Bit 9 - trng_irq + // Bit 8 - pka_master_irq + // Bits 7:4 - pka_queue_*_result_irq + // Bits 3:0 - pka_queue_*_empty_irq + + return ret; +} + +static int pka_dev_load_image(pka_dev_res_t *res_ptr, const uint32_t *data_buf, + uint32_t size) +{ + uint64_t data_rd; + int mismatches; + int i, j, ret = 0; + + if (res_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + res_ptr->type != PKA_DEV_RES_TYPE_MEM) + return -EPERM; + + // Note that the image size is in word of 4 bytes and memory 'writes' + // are 8 bytes aligned, thus the memory start address and end address + // are shifted. + if (res_ptr->size < (size * BYTES_PER_WORD) << 1) + { + PKA_ERROR(PKA_DEV, "image size greater than memory size\n"); + return -EINVAL; + } + + for (i = 0, j = 0; i < size; i++, j += BYTES_PER_DOUBLE_WORD) + pka_dev_io_write(res_ptr->ioaddr, j, + (uint64_t) data_buf[i]); + + mismatches = 0; + PKA_DEBUG(PKA_DEV, "PKA DEV: verifying image (%u words)\n", size); + for (i = 0, j = 0; i < size; i++, j += BYTES_PER_DOUBLE_WORD) + { + data_rd = pka_dev_io_read(res_ptr->ioaddr, j); + if (data_rd != (uint64_t) data_buf[i]) + { + mismatches += 1; + PKA_DEBUG(PKA_DEV, "error while loading image: " + "addr:0x%llx expected data: 0x%x actual data: 0x%llx\n", + res_ptr->base + j, + data_buf[i], data_rd); + } + } + + if (mismatches > 0) + { + PKA_PANIC(PKA_DEV, "error while loading image: mismatches: %d\n", + mismatches); + return -EAGAIN; + } + + return ret; +} + +static int +pka_dev_config_master_seq_controller(pka_dev_shim_t *shim, + pka_dev_res_t *master_seq_ctrl_ptr) +{ + pka_dev_res_t *aic_csr_ptr, *master_prog_ram; + void *aic_reg_ptr, *master_reg_ptr; + + uint64_t aic_reg_base, aic_reg_off; + uint64_t master_reg_base, master_reg_off; + + const uint32_t *boot_img_ptr, *master_img_ptr; + uint32_t boot_img_size, master_img_size; + + uint32_t pka_master_irq; + + uint64_t timer; + uint8_t status_bits; + uint8_t shim_fw_id; + int ret = 0; + + if (master_seq_ctrl_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + master_seq_ctrl_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + master_reg_base = master_seq_ctrl_ptr->base; + master_reg_ptr = master_seq_ctrl_ptr->ioaddr; + master_reg_off = pka_dev_get_register_offset(master_reg_base, + PKA_MASTER_SEQ_CTRL_ADDR); + + PKA_DEBUG(PKA_DEV, "push the EIP-154 master controller into reset\n"); + pka_dev_io_write(master_reg_ptr, master_reg_off, + PKA_MASTER_SEQ_CTRL_RESET_VAL); + + shim_fw_id = pka_firmware_get_id(); + + // Load boot image into PKA_MASTER_PROG_RAM + boot_img_size = pka_firmware_array[shim_fw_id].boot_img_size; + PKA_DEBUG(PKA_DEV, "loading boot image (%d words)\n", boot_img_size); + + boot_img_ptr = pka_firmware_array[shim_fw_id].boot_img; + ret = pka_dev_load_image(&shim->resources.master_prog_ram, + boot_img_ptr, boot_img_size); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to load boot image\n"); + return ret; + } + + PKA_DEBUG(PKA_DEV, "take the EIP-154 master controller out of reset\n"); + pka_dev_io_write(master_reg_ptr, master_reg_off, 0); + + // Poll for 'pka_master_irq' bit in AIC_ENABLED_STAT register to indicate + // sequencer is initialized + aic_csr_ptr = &shim->resources.aic_csr; + if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + aic_reg_base = aic_csr_ptr->base; + aic_reg_ptr = aic_csr_ptr->ioaddr; + aic_reg_off = pka_dev_get_register_offset(aic_reg_base, + AIC_ENABLED_STAT_ADDR); + + pka_master_irq = 0; + PKA_DEBUG(PKA_DEV, "poll for 'pka_master_irq'\n"); + timer = pka_dev_timer_start(100000); // 100 msec + while (pka_master_irq == 0) + { + pka_master_irq |= pka_dev_io_read(aic_reg_ptr, aic_reg_off) + & PKA_AIC_ENABLED_STAT_MASTER_IRQ_MASK; + if (pka_dev_timer_done(timer)) + { + //PKA_PANIC(PKA_DEV, "failed to load firmware\n"); + return -EAGAIN; + } + } + PKA_DEBUG(PKA_DEV, "'pka_master_irq' is active\n"); + + // Verify that the EIP-154 boot firmware has finished without errors + status_bits = (uint8_t)((pka_dev_io_read(master_reg_ptr, + master_reg_off) >> PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT) + & 0xff); + if (status_bits != PKA_MASTER_SEQ_CTRL_STATUS_BYTE) + { + // If the error indication (bit [15]) is set, + // the EIP-154 boot firmware encountered an error and is stopped. + if ((status_bits >> (PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT - 1)) == 1) + { + PKA_ERROR(PKA_DEV, + "boot firmware encountered an error 0x%x and is stopped\n", + status_bits); + return -EAGAIN; + } + PKA_DEBUG(PKA_DEV, "boot firmware in progress %d", status_bits); + } + PKA_DEBUG(PKA_DEV, "boot firmware has finished successfully\n"); + + PKA_DEBUG(PKA_DEV, "push the EIP-154 master controller into reset\n"); + pka_dev_io_write(master_reg_ptr, master_reg_off, + PKA_MASTER_SEQ_CTRL_RESET_VAL); + + // Load Master image into PKA_MASTER_PROG_RAM + master_img_size = pka_firmware_array[shim_fw_id].master_img_size; + PKA_DEBUG(PKA_DEV, "loading master image (%d words)\n", + master_img_size); + master_prog_ram = &shim->resources.master_prog_ram; + master_img_ptr = pka_firmware_array[shim_fw_id].master_img; + ret = pka_dev_load_image(master_prog_ram, master_img_ptr, + master_img_size); + if (ret) + { + pr_err("PKA DEV: failed to load master image\n"); + return ret; + } + + PKA_DEBUG(PKA_DEV, "take the EIP-154 master controller out of reset\n"); + pka_dev_io_write(master_reg_ptr, master_reg_off, 0); + + return ret; +} + +// Configure ring options. +static int pka_dev_config_ring_options(pka_dev_res_t *buffer_ram_ptr, + uint32_t rings_num, uint8_t ring_priority) +{ + uint64_t control_word; + uint64_t word_off; + int ret = 0; + + if (buffer_ram_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + buffer_ram_ptr->type != PKA_DEV_RES_TYPE_MEM) + return -EPERM; + + if (rings_num > PKA_MAX_NUM_RINGS || + rings_num < 1) + { + PKA_ERROR(PKA_DEV, "invalid rings number\n"); + return -EINVAL; + } + + PKA_DEBUG(PKA_DEV, "Configure PKA ring options control word\n"); + + // Write PKA_RING_OPTIONS control word located in the PKA_BUFFER_RAM. The + // value of this word is determined by the PKA I/O block (Shim). Set the + // number of implemented command/result ring pairs that is available in + // this EIP-154, encoded as binary value, which is 4. + control_word = (uint64_t) 0x0; + control_word |= ring_priority & 0xff; + control_word |= ((rings_num - 1) << 8) & 0xff00; + control_word |= (PKA_RING_OPTIONS_SIGNATURE_BYTE << 24) & 0xff000000; + word_off = pka_dev_get_word_offset(buffer_ram_ptr->base, + PKA_RING_OPTIONS_ADDR, PKA_BUFFER_RAM_SIZE); + pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, control_word); + + return ret; +} + +static int pka_dev_config_trng_clk(pka_dev_res_t *aic_csr_ptr) +{ + int ret = 0; + + uint64_t csr_reg_base, csr_reg_off; + uint64_t timer; + uint32_t trng_clk_en = 0; + void *csr_reg_ptr; + + if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + PKA_DEBUG(PKA_DEV, "Turn on TRNG clock\n"); + + csr_reg_base = aic_csr_ptr->base; + csr_reg_ptr = aic_csr_ptr->ioaddr; + + // Enable the TRNG clock in PKA_CLK_FORCE. + // In general, this register should be left in its default state of all + // zeroes! Only when the TRNG is directly controlled via the Host slave + // interface, the engine needs to be turned on using the ’trng_clk_on’ + // bit in this register. In case the TRNG is controlled via internal + // firmware, this is not required. + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, PKA_CLK_FORCE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_CLK_FORCE_TRNG_ON); + // Check whether the system clock for TRNG engine is enabled. The clock + // MUST be running to provide access to the TRNG. + timer = pka_dev_timer_start(100000); // 100 msec + while (trng_clk_en == 0) + { + trng_clk_en |= pka_dev_io_read(csr_reg_ptr, csr_reg_off) + & PKA_CLK_FORCE_TRNG_ON; + if (pka_dev_timer_done(timer)) + { + PKA_DEBUG(PKA_DEV, "Failed to enable TRNG clock\n"); + return -EAGAIN; + } + } + PKA_DEBUG(PKA_DEV, "'trng_clk_on' is enabled\n"); + + return ret; +} + +static int pka_dev_trng_wait_test_ready(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + uint64_t csr_reg_off, timer, test_ready, csr_reg_val; + + test_ready = 0; + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + timer = pka_dev_timer_start(1000000); // 1000 ms + + while (!test_ready) + { + csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + test_ready = csr_reg_val & PKA_TRNG_STATUS_TEST_READY; + + if (pka_dev_timer_done(timer)) + { + PKA_DEBUG(PKA_DEV, "TRNG: TEST ready timer done, 0x%llx\n", csr_reg_val); + return 1; + } + } + + return 0; +} + +static int pka_dev_trng_enable_test(void *csr_reg_ptr, uint64_t csr_reg_base, + uint32_t test) +{ + uint64_t csr_reg_val, csr_reg_off; + + // Set the ‘test_mode’ bit in the TRNG_CONTROL register and the + // ‘test_known_noise’ bit in the TRNG_TEST register – this will + // immediately set the ‘test_ready’ bit (in the TRNG_STATUS register) + // to indicate that data can be written. It will also reset the + // ‘monobit test’, ‘run test’ and ‘poker test’ circuits to their + // initial states. Note that the TRNG need not be enabled for this + // test. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + csr_reg_val | PKA_TRNG_CONTROL_TEST_MODE); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, test); + + // Wait until the 'test_ready' bit is set + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + do + { + csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + } while((csr_reg_val & PKA_TRNG_STATUS_TEST_READY) == 0); + + // Check whether the 'monobit test', 'run test' and 'poker test' + // are reset. + if (csr_reg_val & (PKA_TRNG_STATUS_MONOBIT_FAIL + | PKA_TRNG_STATUS_RUN_FAIL + | PKA_TRNG_STATUS_POKER_FAIL)) + { + PKA_ERROR(PKA_DEV, "Test bits aren't reset, TRNG_STATUS:0x%llx\n", + csr_reg_val); + return -EAGAIN; + } + + // Set 'stall_run_poker' bit to allow inspecting the state of the + // result counters which would otherwise be reset immediately for + // the next 20,000 bits block to test. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR); + csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + csr_reg_val | PKA_TRNG_ALARMCNT_STALL_RUN_POKER); + + return 0; +} + +static int pka_dev_trng_test_circuits(void *csr_reg_ptr, uint64_t csr_reg_base, + uint64_t datal, uint64_t datah, + int count, uint8_t add_half, + uint64_t *monobit_fail_cnt, + uint64_t *run_fail_cnt, + uint64_t *poker_fail_cnt) +{ + uint64_t status, csr_reg_off; + int test_idx, error; + + if (monobit_fail_cnt == NULL || run_fail_cnt == NULL || poker_fail_cnt == NULL) + return -EINVAL; + + error = 0; + + for (test_idx = 0; test_idx < count; test_idx++) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_L_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, datal); + + if (add_half) + { + if (test_idx < count - 1) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_H_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, datah); + } + } + else + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_H_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, datah); + } + + // Wait until the ‘test_ready’ bit in the TRNG_STATUS register + // becomes ‘1’ again, signaling readiness for the next 64 bits + // of test data. At this point, the previous test data has + // been handled so the counter states can be inspected. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + do + { + status = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + } while((status & PKA_TRNG_STATUS_TEST_READY) == 0); + + // Check test status bits. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_INTACK_ADDR); + if (status & PKA_TRNG_STATUS_MONOBIT_FAIL) + { + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_MONOBIT_FAIL); + *monobit_fail_cnt += 1; + } + else if (status & PKA_TRNG_STATUS_RUN_FAIL) + { + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_RUN_FAIL); + *run_fail_cnt += 1; + } + else if (status & PKA_TRNG_STATUS_POKER_FAIL) + { + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_POKER_FAIL); + *poker_fail_cnt += 1; + } + + } + + error = (*monobit_fail_cnt || *poker_fail_cnt || *run_fail_cnt) ? -EIO : 0; + + return error; +} + +static void pka_dev_trng_disable_test(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + uint64_t status, val, csr_reg_off; + + // When done, clear the ‘test_known_noise’ bit in the TRNG_TEST + // register (will immediately clear the ‘test_ready’ bit in the + // TRNG_STATUS register and reset the ‘monobit test’, ‘run test’ + // and ‘poker test’ circuits) and clear the ‘test_mode’ bit in + // the TRNG_CONTROL register. + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + status = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if (status & PKA_TRNG_STATUS_TEST_READY) + PKA_PRINT(PKA_DEV, "Warning: Test ready bit is still set\n"); + + if (status & (PKA_TRNG_STATUS_MONOBIT_FAIL + | PKA_TRNG_STATUS_RUN_FAIL + | PKA_TRNG_STATUS_POKER_FAIL)) + PKA_PRINT(PKA_DEV, + "Warning: Test bits are still set, TRNG_STATUS:0x%llx\n", status); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + (val & ~PKA_TRNG_STATUS_TEST_READY)); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR); + val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + (val & ~PKA_TRNG_ALARMCNT_STALL_RUN_POKER)); + + return; +} + +static int pka_dev_trng_test_known_answer_basic(void *csr_reg_ptr, + uint64_t csr_reg_base) +{ + int ret, cnt_idx, cnt_off; + uint64_t monobit_fail_cnt, run_fail_cnt, poker_fail_cnt, monobit_cnt; + uint64_t poker_cnt[4], csr_reg_off; + uint64_t poker_test_exp_cnt[4] = { + 0x20f42bf4, 0xaf415f4, 0xf4f4fff4, 0xfff4f4f4 + }; + + PKA_DEBUG(PKA_DEV, "Run known-answer test circuits\n"); + + monobit_fail_cnt = 0; + run_fail_cnt = 0; + poker_fail_cnt = 0; + + ret = pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base, + PKA_TRNG_TEST_KNOWN_NOISE); + if (ret) + return ret; + + ret = pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0x11111333, + 0x3555779f, 11, 0, &monobit_fail_cnt, &run_fail_cnt, + &poker_fail_cnt); + + ret |= pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0x01234567, + 0x89abcdef, 302, 1, &monobit_fail_cnt, &run_fail_cnt, + &poker_fail_cnt); + + PKA_DEBUG(PKA_DEV, "monobit_fail_cnt : 0x%llx\n", monobit_fail_cnt); + PKA_DEBUG(PKA_DEV, "poker_fail_cnt : 0x%llx\n", poker_fail_cnt); + PKA_DEBUG(PKA_DEV, "run_fail_cnt : 0x%llx\n", run_fail_cnt); + + for (cnt_idx = 0, cnt_off = 0; cnt_idx < 4; cnt_idx++, cnt_off += 8) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + (TRNG_POKER_3_0_ADDR + cnt_off)); + poker_cnt[cnt_idx] = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + } + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_MONOBITCNT_ADDR); + monobit_cnt = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if (!ret) + { + if (memcmp(poker_cnt, poker_test_exp_cnt, sizeof(poker_test_exp_cnt))) + { + PKA_DEBUG(PKA_DEV, "invalid poker counters!\n"); + ret = -EIO; + } + + if (monobit_cnt != 9978) + { + PKA_DEBUG(PKA_DEV, "invalid sum of squares!\n"); + ret = -EIO; + } + } + + pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base); + + return ret; +} + +static int pka_dev_trng_test_known_answer_poker_fail(void *csr_reg_ptr, + uint64_t csr_reg_base) +{ + uint64_t monobit_fail_cnt, run_fail_cnt, poker_fail_cnt; + int ret; + + monobit_fail_cnt = 0; + run_fail_cnt = 0; + poker_fail_cnt = 0; + + PKA_DEBUG(PKA_DEV, "Run known-answer test circuits (poker fail)\n"); + + pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base, + PKA_TRNG_TEST_KNOWN_NOISE); + + // Ignore the return value here as it is expected that poker test should + // fail. Check failure counts thereafter to assert only poker test has failed. + pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0xffffffff, + 0xffffffff, 11, 0, &monobit_fail_cnt, &run_fail_cnt, &poker_fail_cnt); + + PKA_DEBUG(PKA_DEV, "monobit_fail_cnt : 0x%llx\n", monobit_fail_cnt); + PKA_DEBUG(PKA_DEV, "poker_fail_cnt : 0x%llx\n", poker_fail_cnt); + PKA_DEBUG(PKA_DEV, "run_fail_cnt : 0x%llx\n", run_fail_cnt); + + if (poker_fail_cnt && !run_fail_cnt && !monobit_fail_cnt) + ret = 0; + else + ret = -EIO; + + pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base); + + return ret; +} + +static int pka_dev_trng_test_unknown_answer(void *csr_reg_ptr, + uint64_t csr_reg_base) +{ + uint64_t datal, datah, csr_reg_off; + int ret, test_idx; + + datah = 0; + datal = 0; + ret = 0; + + PKA_DEBUG(PKA_DEV, "Run unknown-answer self test\n"); + + // First reset, the RAW registers. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_RAW_L_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_RAW_H_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + // There is a small probability for this test to fail, + // So run the test 10 times, if it succeeds once then + // assume that the test passed. + for (test_idx = 0; test_idx < 10; test_idx++) + { + pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base, PKA_TRNG_TEST_NOISE); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_RAW_L_ADDR); + datal = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_RAW_H_ADDR); + datah = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + PKA_DEBUG(PKA_DEV, "datal=0x%llx\n", datal); + PKA_DEBUG(PKA_DEV, "datah=0x%llx\n", datah); + + if (!datah && !datal) + { + ret = -EIO; + } + else + { + ret = 0; + break; + } + + pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base); + } + + return ret; +} + +// Test TRNG +static int pka_dev_test_trng(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + int ret; + + ret = 0; + + ret = pka_dev_trng_test_known_answer_basic(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + ret = pka_dev_trng_test_known_answer_poker_fail(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + ret = pka_dev_trng_test_unknown_answer(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + +exit: + return ret; +} + +static void pka_dev_trng_write_ps_ai_str(void *csr_reg_ptr, + uint64_t csr_reg_base, + uint32_t input_str[]) +{ + uint64_t csr_reg_off; + int i; + + for (i = 0; i < PKA_TRNG_PS_AI_REG_COUNT; i++) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_PS_AI_0_ADDR + (i * 0x8)); + + pka_dev_io_write(csr_reg_ptr, csr_reg_off, input_str[i]); + } +} + +static void pka_dev_trng_drbg_generate(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + uint64_t csr_reg_off; + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_REQ_DATA_VAL); +} + +static int pka_dev_test_trng_drbg(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + uint64_t csr_reg_off, csr_reg_val; + int i, ret; + + ret = 0; + + // Make sure the engine is idle. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + // Enable DRBG, TRNG need not be enabled for this test. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_ENABLE_VAL); + + // Set 'test_sp_800_90' bit in the TRNG_TEST register + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_TEST_DRBG_VAL); + + // Wait for 'test_ready' bit to be set. + ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + // Instantiate + pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_ps_str); + ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + // Generate + pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_etpy_str1); + ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + // A standard NIST SP 800-90A DRBG known-answer test discards + // the result of the first 'Generate' function and only checks + // the result of the second 'Generate' function. Hence 'Generate' + // is performed again. + + // Generate + pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_etpy_str2); + ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base); + if (ret) + goto exit; + + // Check output registers + for (i = 0; i < PKA_TRNG_OUTPUT_CNT; i++) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_OUTPUT_0_ADDR + (i * 0x8)); + + csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if ((uint32_t)csr_reg_val != pka_trng_drbg_test_output[i]) + { + PKA_DEBUG(PKA_DEV, + "DRBG known answer test failed for output register:%d, 0x%x\n", + i, (uint32_t)csr_reg_val); + ret = 1; + goto exit; + } + } + + // Clear 'test_sp_800_90' bit in the TRNG_TEST register. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + +exit: + return ret; +} + +// Configure the TRNG. +static int pka_dev_config_trng_drbg(pka_dev_res_t *aic_csr_ptr, + pka_dev_res_t *trng_csr_ptr) +{ + int ret = 0; + + uint64_t csr_reg_base, csr_reg_off; + void *csr_reg_ptr; + + if (trng_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + trng_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + PKA_DEBUG(PKA_DEV, "Starting up the TRNG\n"); + + ret = pka_dev_config_trng_clk(aic_csr_ptr); + if (ret) + return ret; + + csr_reg_base = trng_csr_ptr->base; + csr_reg_ptr = trng_csr_ptr->ioaddr; + + // Perform NIST known-answer tests on the complete SP 800-90A DRBG + // without BC_DF functionality. + ret = pka_dev_test_trng_drbg(csr_reg_ptr, csr_reg_base); + if (ret) + return ret; + + // Starting up the TRNG with a DRBG + + // Make sure the engine is idle. + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + // Disable all FROs initially + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_FROENABLE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_FRODETUNE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + // Write all configuration values in the TRNG_CONFIG and TRNG_ALARMCNT, + // write zeroes to the TRNG_ALARMMASK and TRNG_ALARMSTOP registers. + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_CONFIG_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONFIG_REG_VAL); + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_ALARMCNT_REG_VAL); + + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMMASK_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMSTOP_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + // Enable all FROs in the TRNG_FROENABLE register. Note that this can + // only be done after clearing the TRNG_ALARMSTOP register. + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_FROENABLE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_FROENABLE_REG_VAL); + + // Optionally, write 'Personalization string' of upto 384 bits in + // TRNG_PS_AI_... registers. The contents of these registers will be + // XOR-ed into the output of the SHA-256 'Conditioning Function' to be + // used as seed value for the actual DRBG. + pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_ps_str); + + + // Run TRNG tests after configuring TRNG. + // NOTE: TRNG need not be enabled to carry out these tests. + ret = pka_dev_test_trng(csr_reg_ptr, csr_reg_base); + if (ret) + return ret; + + // Start the actual engine by setting the 'enable_trng' and 'drbg_en' bit + // in the TRNG_CONTROL register (also a nice point to set the interrupt mask + // bits). + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_REG_VAL); + + // The engine is now ready to handle the first 'Generate' request using + // the 'request_data' bit of the TRNG_CONTROL register. The first output + // for these requests will take a while, as Noise Source and Conditioning + // Function must first generate seed entropy for the DRBG. + + + // Optionally, when buffer RAM is configured: Set a data available + // interrupt threshold using the 'load_thresh' and 'blocks_thresh' + // fields of the TRNG_INTACK register. This allows delaying the data + // available interrupt until the indicated number of 128-bit words are + // available in the buffer RAM. + + // Start the actual 'Generate' operation using the 'request_data' and 'data_blocks' + // fields of the TRNG_CONTROL register. + + pka_dev_trng_drbg_generate(csr_reg_ptr, csr_reg_base); + + mdelay(200); + + return ret; +} + +// Triggers hardaware zeorize to initialize PKA internal memories +static int pka_dev_ram_zeroize(pka_dev_res_t *ext_csr_ptr) +{ + uint64_t csr_reg_base, csr_reg_off, csr_reg_value; + uint64_t timer; + void *csr_reg_ptr; + + if (ext_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + ext_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + return -EPERM; + + PKA_DEBUG(PKA_DEV, "Starting memory zeroize\n"); + + csr_reg_base = ext_csr_ptr->base; + csr_reg_ptr = ext_csr_ptr->ioaddr; + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + PKA_ZEROIZE_ADDR); + // When PKA_ZEROIZE register is written (with any value) + // sensitive data in the PKA is zeroed out. + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 1); + + // Now wait until the zeroize completes + timer = pka_dev_timer_start(10000000); // 10000 ms + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + while (csr_reg_value != 0) + { + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if (pka_dev_timer_done(timer)) + { + PKA_DEBUG(PKA_DEV, "Timeout while PKA zeorize\n"); + return -EBUSY; + } + } + + return 0; +} + +// Initialize PKA IO block refered to as shim. It configures shim's +// parameters and prepare resources by mapping corresponding memory. +// The function also configures shim registers and load firmware to +// shim internal rams. The pka_dev_shim_t passed as input is also an +// output. It returns 0 on success, a negative error code on failure. +static int pka_dev_init_shim(pka_dev_shim_t *shim) +{ + const uint32_t *farm_img_ptr; + uint32_t farm_img_size, data[4], i; + uint8_t shim_fw_id; + + int ret = 0; + + if (shim->status != PKA_SHIM_STATUS_CREATED) + { + PKA_ERROR(PKA_DEV, "PKA device must be created\n"); + return -EPERM; + } + + // First of all, trigger a hardware zeroize to initialize internal + // RAM memories + ret = pka_dev_ram_zeroize(&shim->resources.ext_csr); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to zeroize PKA\n"); + return ret; + } + + // Configure AIC registers + ret = pka_dev_config_aic_interrupts(&shim->resources.aic_csr); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to configure AIC\n"); + return ret; + } + + shim_fw_id = pka_firmware_get_id(); + + // Load Farm image into PKA_BUFFER_RAM for non-High Assurance mode + // or into PKA_SECURE_RAM for High Assurance mode. + farm_img_size = pka_firmware_array[shim_fw_id].farm_img_size; + PKA_DEBUG(PKA_DEV, "loading farm image (%d words)\n", farm_img_size); + + farm_img_ptr = pka_firmware_array[shim_fw_id].farm_img; + // The IP provider suggests using the zeroize function to initialize + // the Buffer RAM. But a bug has been detected when writing ECC bits. + // Thus a workaround is used, and has already been shown to work; it + // consists of padding the farm image. Then all RAM locations will be + // written with correct ECC before the IP reads the image out. + ret = pka_dev_load_image(&shim->resources.buffer_ram, farm_img_ptr, + farm_img_size); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to load farm image\n"); + return ret; + } + + // Configure EIP-154 Master controller Sequencer + ret = pka_dev_config_master_seq_controller(shim, + &shim->resources.master_seq_ctrl); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to configure Master controller " + "Sequencer\n"); + return ret; + } + + // Configure PKA Ring options control word + ret = pka_dev_config_ring_options(&shim->resources.buffer_ram, + shim->rings_num, shim->ring_priority); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to configure ring options\n"); + return ret; + } + + shim->trng_enabled = PKA_SHIM_TRNG_ENABLED; + shim->trng_err_cycle = 0; + + // Configure the TRNG + ret = pka_dev_config_trng_drbg(&shim->resources.aic_csr, + &shim->resources.trng_csr); + + // Pull out data from the content of the TRNG buffer RAM and + // start the re-generation of new numbers; read and drop 512 + // words. The read must be done over the 4 TRNG_OUTPUT_X registers + // at a time. + i = 0; + while (i < 128) + { + pka_dev_trng_read(shim, data, sizeof(data)); + i++; + } + + if (ret) + { + // Keep running without TRNG since it does not hurt, but + // notify users. + PKA_ERROR(PKA_DEV, "failed to configure TRNG\n"); + shim->trng_enabled = PKA_SHIM_TRNG_DISABLED; + } + + mutex_init(&shim->mutex); + shim->busy_ring_num = 0; + shim->status = PKA_SHIM_STATUS_INITIALIZED; + + return ret; +} + +// Release a given shim. +static int pka_dev_release_shim(pka_dev_shim_t *shim) +{ + int ret = 0; + + uint32_t ring_idx; + + if (shim->status != PKA_SHIM_STATUS_INITIALIZED && + shim->status != PKA_SHIM_STATUS_STOPPED) + { + PKA_ERROR(PKA_DEV, "PKA device must be initialized or stopped\n"); + return -EPERM; + } + + // Release rings which belong to the shim. The operating system might + // release ring devices before shim devices. The global configuration + // must be checked before proceeding to the release of ring devices. + if (pka_gbl_config.dev_rings_cnt) + { + for (ring_idx = 0; ring_idx < shim->rings_num; ring_idx++) + { + ret = pka_dev_release_ring(shim->rings[ring_idx]); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to release ring %d\n", ring_idx); + return ret; + } + } + } + + shim->busy_ring_num = 0; + shim->status = PKA_SHIM_STATUS_FINALIZED; + + return ret; +} + +// Return the ring associated with the given identifier. +pka_dev_ring_t *pka_dev_get_ring(uint32_t ring_id) +{ + return pka_gbl_config.dev_rings[ring_id]; +} + +// Return the shim associated with the given identifier. +pka_dev_shim_t *pka_dev_get_shim(uint32_t shim_id) +{ + return pka_gbl_config.dev_shims[shim_id]; +} + + +static pka_dev_ring_t *__pka_dev_register_ring(uint32_t ring_id, + uint32_t shim_id) +{ + pka_dev_shim_t *shim; + pka_dev_ring_t *ring; + + int ret; + + shim = pka_dev_get_shim(shim_id); + if (!shim) + return NULL; + + ring = kzalloc(sizeof(pka_dev_ring_t), GFP_KERNEL); + if (!ring) + return ring; + + ring->status = PKA_DEV_RING_STATUS_UNDEFINED; + + // Initialize ring. + ret = pka_dev_init_ring(ring, ring_id, shim); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to initialize ring %d\n", ring_id); + pka_dev_release_ring(ring); + kfree(ring); + return NULL; + } + + return ring; +} + +pka_dev_ring_t *pka_dev_register_ring(uint32_t ring_id, uint32_t shim_id) +{ + pka_dev_ring_t *ring; + + ring = __pka_dev_register_ring(ring_id, shim_id); + if (ring) + { + pka_gbl_config.dev_rings[ring->ring_id] = ring; + pka_gbl_config.dev_rings_cnt += 1; + } + + return ring; +} + +static int __pka_dev_unregister_ring(pka_dev_ring_t *ring) +{ + int ret; + + if (!ring) + return -EINVAL; + + // Release ring + ret = pka_dev_release_ring(ring); + if (ret) + return ret; + + kfree(ring); + + return ret; +} + +int pka_dev_unregister_ring(pka_dev_ring_t *ring) +{ + pka_gbl_config.dev_rings[ring->ring_id] = NULL; + pka_gbl_config.dev_rings_cnt -= 1; + + return __pka_dev_unregister_ring(ring); +} + +static pka_dev_shim_t *__pka_dev_register_shim(uint32_t shim_id, + struct pka_dev_mem_res *mem_res) +{ + pka_dev_shim_t *shim; + + uint8_t split; + int ret = 0; + + PKA_DEBUG(PKA_DEV, "register shim id=%u\n", shim_id); + + shim = kzalloc(sizeof(pka_dev_shim_t), GFP_KERNEL); + if (!shim) + return shim; + + // Shim state MUST be set to undefined before calling 'pka_dev_create_shim' + // function + shim->status = PKA_SHIM_STATUS_UNDEFINED; + + // Set the Window RAM user mode + split = PKA_SPLIT_WINDOW_RAM_MODE; + + // Create PKA shim + ret = pka_dev_create_shim(shim, shim_id, split, mem_res); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to create shim %u\n", shim_id); + pka_dev_delete_shim(shim); + kfree(shim); + return NULL; + } + + // Initialize PKA shim + ret = pka_dev_init_shim(shim); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to init shim %u\n", shim_id); + pka_dev_release_shim(shim); + pka_dev_delete_shim(shim); + kfree(shim); + return NULL; + } + + return shim; +} + +pka_dev_shim_t *pka_dev_register_shim(uint32_t shim_id, uint8_t shim_fw_id, + struct pka_dev_mem_res *mem_res) +{ + pka_dev_shim_t *shim; + + pka_firmware_set_id(shim_fw_id); + + shim = __pka_dev_register_shim(shim_id, mem_res); + if (shim) + { + pka_gbl_config.dev_shims[shim->shim_id] = shim; + pka_gbl_config.dev_shims_cnt += 1; + } + + return shim; +} + +static int __pka_dev_unregister_shim(pka_dev_shim_t *shim) +{ + int ret = 0; + + if (!shim) + return -EINVAL; + + // Release shim + ret = pka_dev_release_shim(shim); + if (ret) + return ret; + + // Delete shim + ret = pka_dev_delete_shim(shim); + if (ret) + return ret; + + kfree(shim); + + return ret; +} + +int pka_dev_unregister_shim(pka_dev_shim_t *shim) +{ + pka_gbl_config.dev_shims[shim->shim_id] = NULL; + pka_gbl_config.dev_shims_cnt -= 1; + + return __pka_dev_unregister_shim(shim); +} + +static bool pka_dev_trng_shutdown_oflo(pka_dev_res_t *trng_csr_ptr, + uint64_t *err_cycle) +{ + uint64_t csr_reg_base, csr_reg_off, csr_reg_value; + uint64_t curr_cycle_cnt, fro_stopped_mask, fro_enabled_mask; + void *csr_reg_ptr; + + csr_reg_base = trng_csr_ptr->base; + csr_reg_ptr = trng_csr_ptr->ioaddr; + + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if (csr_reg_value & PKA_TRNG_STATUS_SHUTDOWN_OFLO) + { + curr_cycle_cnt = get_cycles(); + // See if any FROs were shut down. If they were, toggle bits in the + // FRO detune register and reenable the FROs. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_ALARMSTOP_ADDR); + fro_stopped_mask = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + if (fro_stopped_mask) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_FROENABLE_ADDR); + fro_enabled_mask = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_FRODETUNE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, fro_stopped_mask); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_FROENABLE_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + fro_stopped_mask | fro_enabled_mask); + } + + // Reset the error + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_ALARMMASK_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_ALARMSTOP_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0); + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_INTACK_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, + PKA_TRNG_STATUS_SHUTDOWN_OFLO); + + // If we're seeing this error again within about a second, + // the hardware is malfunctioning. Disable the trng and return + // an error. + if (*err_cycle && (curr_cycle_cnt - *err_cycle < 1000000000)) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_CONTROL_ADDR); + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + csr_reg_value &= ~PKA_TRNG_CONTROL_REG_VAL; + pka_dev_io_write(csr_reg_ptr, csr_reg_off, csr_reg_value); + return false; + } + + *err_cycle = curr_cycle_cnt; + } + + return true; +} + +static int pka_dev_trng_drbg_reseed(void *csr_reg_ptr, uint64_t csr_reg_base) +{ + uint64_t csr_reg_off; + int ret; + + ret = 0; + + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_RESEED); + + ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base); + if (ret) + return ret; + + // Write personalization string + pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_ps_str); + + return ret; +} + +// Read from DRBG enabled TRNG +int pka_dev_trng_read(pka_dev_shim_t *shim, uint32_t *data, uint32_t cnt) +{ + int ret = 0; + + pka_dev_res_t *trng_csr_ptr; + uint64_t csr_reg_base, csr_reg_off, csr_reg_value; + uint64_t timer; + uint32_t data_idx, word_cnt; + uint8_t output_idx, trng_ready = 0; + void *csr_reg_ptr; + + if (!shim || !data || (cnt % PKA_TRNG_OUTPUT_CNT != 0)) + return -EINVAL; + + if (!cnt) + return ret; + + mutex_lock(&shim->mutex); + + trng_csr_ptr = &shim->resources.trng_csr; + + if (trng_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED || + trng_csr_ptr->type != PKA_DEV_RES_TYPE_REG) + { + ret = -EPERM; + goto exit; + } + + csr_reg_base = trng_csr_ptr->base; + csr_reg_ptr = trng_csr_ptr->ioaddr; + + if (!pka_dev_trng_shutdown_oflo(trng_csr_ptr, + &shim->trng_err_cycle)) + { + ret = -EWOULDBLOCK; + goto exit; + } + + // Determine the number of 32-bit words. + word_cnt = cnt >> 2; + + for (data_idx = 0; data_idx < word_cnt; data_idx++) + { + output_idx = data_idx % PKA_TRNG_OUTPUT_CNT; + + // Tell the hardware to advance + if (output_idx == 0) + { + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_INTACK_ADDR); + pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_READY); + trng_ready = 0; + + // Check if 'data_blocks' field is zero in TRNG_CONTROL register, + // if it is then we have to issue a 'Reseed' and Generate' request + // for DRBG enabled TRNG. + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_CONTROL_ADDR); + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + + if (!((uint32_t)csr_reg_value & PKA_TRNG_DRBG_DATA_BLOCK_MASK)) + { + // Issue reseed + ret = pka_dev_trng_drbg_reseed(csr_reg_ptr, csr_reg_base); + if (ret) + { + ret = -EBUSY; + goto exit; + } + + // Issue generate request + pka_dev_trng_drbg_generate(csr_reg_ptr, csr_reg_base); + } + + } + + // Wait until a data word is available in the TRNG_OUTPUT_X + // registers (using the interrupt and/or 'ready' status bit in the + // TRNG_STATUS register. The only way this would hang if the TRNG + // never initialized, and we would not call this function if that + // happened. + timer = pka_dev_timer_start(1000000); // 1000 ms + csr_reg_off = + pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR); + while (trng_ready == 0) + { + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + trng_ready = csr_reg_value & PKA_TRNG_STATUS_READY; + + if (pka_dev_timer_done(timer)) + { + PKA_DEBUG(PKA_DEV, + "Shim %u got error obtaining random number\n", + shim->shim_id); + ret = -EBUSY; + goto exit; + } + } + + // Read the registers + csr_reg_off = pka_dev_get_register_offset(csr_reg_base, + TRNG_OUTPUT_0_ADDR + (output_idx * 0x8)); + csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off); + data[data_idx] = (uint32_t) csr_reg_value; + } + +exit: + mutex_unlock(&shim->mutex); + return ret; +} + +bool pka_dev_has_trng(pka_dev_shim_t *shim) +{ + if (!shim) + return false; + + return (shim->trng_enabled == PKA_SHIM_TRNG_ENABLED); +} + +// Syscall to open ring. +int __pka_dev_open_ring(uint32_t ring_id) +{ + pka_dev_shim_t *shim; + pka_dev_ring_t *ring; + + int ret = 0; + + if (pka_gbl_config.dev_rings_cnt == 0) + return -EPERM; + + ring = pka_dev_get_ring(ring_id); + if (!ring || !ring->shim) + return -ENXIO; + + shim = ring->shim; + + mutex_lock(&ring->mutex); + + if (shim->status == PKA_SHIM_STATUS_UNDEFINED || + shim->status == PKA_SHIM_STATUS_CREATED || + shim->status == PKA_SHIM_STATUS_FINALIZED) + { + ret = -EPERM; + goto unlock_return; + } + + if (ring->status == PKA_DEV_RING_STATUS_BUSY) + { + ret = -EBUSY; + goto unlock_return; + } + + if (ring->status != PKA_DEV_RING_STATUS_INITIALIZED) + { + ret = -EPERM; + goto unlock_return; + } + + // Set ring information words. + ret = pka_dev_set_ring_info(ring); + if (ret) + { + PKA_ERROR(PKA_DEV, "failed to set ring information\n"); + ret = -EWOULDBLOCK; + goto unlock_return; + } + + if (shim->busy_ring_num == 0) + shim->status = PKA_SHIM_STATUS_RUNNING; + + ring->status = PKA_DEV_RING_STATUS_BUSY; + shim->busy_ring_num += 1; + +unlock_return: + mutex_unlock(&ring->mutex); + return ret; +} + +// Open ring. +int pka_dev_open_ring(pka_ring_info_t *ring_info) +{ + return __pka_dev_open_ring(ring_info->ring_id); +} + +// Syscall to close ring. +int __pka_dev_close_ring(uint32_t ring_id) +{ + pka_dev_shim_t *shim; + pka_dev_ring_t *ring; + + int ret = 0; + + if (pka_gbl_config.dev_rings_cnt == 0) + return -EPERM; + + ring = pka_dev_get_ring(ring_id); + if (!ring || !ring->shim) + return -ENXIO; + + shim = ring->shim; + + mutex_lock(&ring->mutex); + + if (shim->status != PKA_SHIM_STATUS_RUNNING && + ring->status != PKA_DEV_RING_STATUS_BUSY) + { + ret = -EPERM; + goto unlock_return; + } + + ring->status = PKA_DEV_RING_STATUS_INITIALIZED; + shim->busy_ring_num -= 1; + + if (shim->busy_ring_num == 0) + shim->status = PKA_SHIM_STATUS_STOPPED; + +unlock_return: + mutex_unlock(&ring->mutex); + return ret; +} + +// Close ring. +int pka_dev_close_ring(pka_ring_info_t *ring_info) +{ + if (ring_info) + { + return __pka_dev_close_ring(ring_info->ring_id); + } + + return 0; +} + +// Syscall to map ring into memory (kernel-space). +static int __pka_dev_mmap_ring(uint32_t ring_id) +{ + //not implemented + return -1; +} + +// Map ring into memory (user-space). +int pka_dev_mmap_ring(pka_ring_info_t *ring_info) +{ + return __pka_dev_mmap_ring(ring_info->ring_id); +} + +// Syscall to unmap ring (kernel-space). +static int __pka_dev_munmap_ring(uint32_t ring_id) +{ + //not implemented + return -1; +} + +// Unmap ring (user-space). +int pka_dev_munmap_ring(pka_ring_info_t *ring_info) +{ + if (ring_info) + { + return __pka_dev_munmap_ring(ring_info->ring_id); + } + + return 0; +} + diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h new file mode 100644 index 000000000..06ac28623 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h @@ -0,0 +1,310 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_DEV_H__ +#define __PKA_DEV_H__ + +/// +/// @file +/// +/// API to handle the PKA EIP-154 I/O block (shim). It provides functions +/// and data structures to initialize and configure the PKA shim. It's the +/// "southband interface" for communication with PKA hardware resources. +/// + +#include +#include +#include "mlxbf_pka_firmware.h" + +#include + +#include "mlxbf_pka_config.h" +#include "mlxbf_pka_cpu.h" +#include "mlxbf_pka_debug.h" +#include "mlxbf_pka_ioctl.h" +#include "mlxbf_pka_mmio.h" +#include "mlxbf_pka_ring.h" + +#define PKA_SYSFS_RING_DEVICES "/sys/bus/platform/devices" +#define PKA_VFIO_DIR "/dev/vfio" +#define PKA_VFIO_CONTAINER_PATH "/dev/vfio/vfio" +#define PKA_VFIO_GROUP_FMT "/dev/vfio/%d" + +#define PKA_DEVFS_RING_DEVICES "/dev/pka/%d" + +// Defines specific to device-tree and Linux operating system. +// Careful, all constants MUST be conform with both devicetree +// (DTS) and ACPI tables (SSDT). +// *TBD* Better to be detected automatically (or passed as arg +// so far). +#define PKA_DEV_RING_DT_PREFIX_0 "45000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_1 "47000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_2 "4d000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_3 "4f000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_4 "44000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_5 "46000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_6 "4c000000.eip154:ring@%d" +#define PKA_DEV_RING_DT_PREFIX_7 "4e000000.eip154:ring@%d" + +#define PKA_DEV_RING_ACPI_PREFIX "MLNXBF11:%02x" + +/// Device resource structure +typedef struct +{ + void *ioaddr; ///< (iore)map-ped version of addr, for + /// driver internal use. + + uint64_t base; ///< base address of the device's + /// resource + + uint64_t size; ///< size of IO + + uint8_t type; ///< type of resource addr points to + int8_t status; ///< status of the resource + + char *name; ///< name of the resource +} pka_dev_res_t; + +/// defines for pka_dev_res->type +#define PKA_DEV_RES_TYPE_MEM 1 // resource type is memory +#define PKA_DEV_RES_TYPE_REG 2 // resource type is register + +/// defines for pka_dev_res->status +#define PKA_DEV_RES_STATUS_MAPPED 1 // the resource is (iore)-mapped +#define PKA_DEV_RES_STATUS_UNMAPPED -1 // the resource is unmapped + +/// PKA Ring resources structure +typedef struct +{ + pka_dev_res_t info_words; // ring information words + pka_dev_res_t counters; // ring counters + pka_dev_res_t window_ram; // window RAM +} pka_dev_ring_res_t; + +typedef struct pka_dev_shim_s pka_dev_shim_t; + +/// PKA Ring structure +typedef struct +{ + uint32_t ring_id; ///< ring identifier. + + pka_dev_shim_t *shim; ///< pointer to the shim associated + /// to the ring. + + uint32_t resources_num; ///< number of ring ressources. + pka_dev_ring_res_t resources; ///< ring resources. + + pka_dev_hw_ring_info_t *ring_info; ///< ring information. + uint32_t num_cmd_desc; ///< number of command descriptors. + + int8_t status; ///< status of the ring. + + struct mutex mutex; ///< mutex lock for sharing ring device +} pka_dev_ring_t; + +/// defines for pka_dev_ring->status +#define PKA_DEV_RING_STATUS_UNDEFINED -1 +#define PKA_DEV_RING_STATUS_INITIALIZED 1 +#define PKA_DEV_RING_STATUS_READY 2 +#define PKA_DEV_RING_STATUS_BUSY 3 +#define PKA_DEV_RING_STATUS_FINALIZED 4 + +/// PKA Shim resources structure +typedef struct +{ + pka_dev_res_t buffer_ram; // buffer RAM + pka_dev_res_t master_prog_ram; // master controller program RAM + pka_dev_res_t master_seq_ctrl; // master sequencer controller CSR + pka_dev_res_t aic_csr; // interrupt controller CSRs + pka_dev_res_t trng_csr; // TRNG module CSRs + pka_dev_res_t ext_csr; // MiCA specific CSRs (glue logic) +} pka_dev_shim_res_t; + +#define PKA_DEV_SHIM_RES_CNT 6 // Number of PKA device resources + +/// Platform global shim resource information +typedef struct +{ + pka_dev_res_t *res_tbl[PKA_DEV_SHIM_RES_CNT]; + uint8_t res_cnt; +} pka_dev_gbl_shim_res_info_t; + +struct pka_dev_mem_res +{ + uint64_t eip154_base; ///< base address for eip154 mmio registers + uint64_t eip154_size; ///< eip154 mmio register region size + + uint64_t wndw_ram_off_mask; ///< common offset mask for alt window ram and window ram + uint64_t wndw_ram_base; ///< base address for window ram + uint64_t wndw_ram_size; ///< window ram region size + + uint64_t alt_wndw_ram_0_base; ///< base address for alternate window ram 0 + uint64_t alt_wndw_ram_1_base; ///< base address for alternate window ram 1 + uint64_t alt_wndw_ram_2_base; ///< base address for alternate window ram 2 + uint64_t alt_wndw_ram_3_base; ///< base address for alternate window ram 3 + uint64_t alt_wndw_ram_size; ///< alternate window ram regions size + + uint64_t csr_base; ///< base address for csr registers + uint64_t csr_size; ///< csr area size +}; + + +/// PKA Shim structure +struct pka_dev_shim_s +{ + struct pka_dev_mem_res mem_res; + + uint64_t trng_err_cycle; ///< TRNG error cycle + + uint32_t shim_id; ///< shim identifier + + uint32_t rings_num; ///< Number of supported rings (hw + /// specific) + + pka_dev_ring_t **rings; ///< pointer to rings which belong to + /// the shim. + + uint8_t ring_priority; ///< specify the priority in which + /// rings are handled. + + uint8_t ring_type; ///< indicates whether the result + /// ring delivers results strictly + /// in-order. + + pka_dev_shim_res_t resources; ///< shim resources + + uint8_t window_ram_split; ///< Window RAM mode. if non-zero, + /// the splitted window RAM scheme + /// is used. + + uint32_t busy_ring_num; ///< Number of active rings (rings in + /// busy state) + + uint8_t trng_enabled; ///< Whether the TRNG engine is + /// enabled. + + int8_t status; ///< status of the shim + + struct mutex mutex; ///< mutex lock for sharing shim +}; + +/// defines for pka_dev_shim->status +#define PKA_SHIM_STATUS_UNDEFINED -1 +#define PKA_SHIM_STATUS_CREATED 1 +#define PKA_SHIM_STATUS_INITIALIZED 2 +#define PKA_SHIM_STATUS_RUNNING 3 +#define PKA_SHIM_STATUS_STOPPED 4 +#define PKA_SHIM_STATUS_FINALIZED 5 + +/// defines for pka_dev_shim->window_ram_split +#define PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED 1 // window RAM is splitted into + // 4 * 16KB blocks + +#define PKA_SHIM_WINDOW_RAM_SPLIT_DISABLED 2 // window RAM is not splitted + // and occupies 64KB + +/// defines for pka_dev_shim->trng_enabled +#define PKA_SHIM_TRNG_ENABLED 1 +#define PKA_SHIM_TRNG_DISABLED 0 + +/// Platform global configuration structure +typedef struct +{ + uint32_t dev_shims_cnt; ///< number of registered PKA shims. + uint32_t dev_rings_cnt; ///< number of registered Rings. + + pka_dev_shim_t *dev_shims[PKA_MAX_NUM_IO_BLOCKS]; ///< table of registered + /// PKA shims. + + pka_dev_ring_t *dev_rings[PKA_MAX_NUM_RINGS]; ///< table of registered + /// Rings. +} pka_dev_gbl_config_t; + +extern pka_dev_gbl_config_t pka_gbl_config; + +/// Ring getter for pka_dev_gbl_config_t structure which holds all system +/// global configuration. This configuration is shared and common to kernel +/// device driver associated with PKA hardware. +pka_dev_ring_t *pka_dev_get_ring(uint32_t ring_id); + +/// Shim getter for pka_dev_gbl_config_t structure which holds all system +/// global configuration. This configuration is shared and common to kernel +/// device driver associated with PKA hardware. +pka_dev_shim_t *pka_dev_get_shim(uint32_t shim_id); + +/// Register a Ring. This function initializes a Ring and configures its +/// related resources, and returns a pointer to that ring. +pka_dev_ring_t *pka_dev_register_ring(uint32_t ring_id, uint32_t shim_id); + +/// Unregister a Ring +int pka_dev_unregister_ring(pka_dev_ring_t *ring); + +/// Register PKA IO block. This function initializes a shim and configures its +/// related resources, and returns a pointer to that ring. +pka_dev_shim_t *pka_dev_register_shim(uint32_t shim_id, uint8_t shim_fw_id, + struct pka_dev_mem_res *mem_res); + +/// Unregister PKA IO block +int pka_dev_unregister_shim(pka_dev_shim_t *shim); + +/// Reset a Ring. +int pka_dev_reset_ring(pka_dev_ring_t *ring); + +/// Clear ring counters. This function resets the master sequencer controller +/// to clear the command and result counters. +int pka_dev_clear_ring_counters(pka_dev_ring_t *ring); + +/// Read data from the TRNG. Drivers can fill up to 'cnt' bytes of data into +/// the buffer 'data'. The buffer 'data' is aligned for any type and 'cnt' is +/// a multiple of 4. +int pka_dev_trng_read(pka_dev_shim_t *shim, uint32_t *data, uint32_t cnt); + +/// Return true if the TRNG engine is enabled, false if not. +bool pka_dev_has_trng(pka_dev_shim_t *shim); + +/// Open the file descriptor associated with ring. It returns an integer value, +/// which is used to refer to the file. If un-successful, it returns a negative +/// error. +int pka_dev_open_ring(pka_ring_info_t *ring_info); + +/// Close the file descriptor associated with ring. The function returns 0 if +/// successful, negative value to indicate an error. +int pka_dev_close_ring(pka_ring_info_t *ring_info); + +/// Map ring resources. +int pka_dev_mmap_ring(pka_ring_info_t *ring_info); + +/// Unmap ring resources. +int pka_dev_munmap_ring(pka_ring_info_t *ring_info); + +#endif /// __PKA_DEV_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c new file mode 100644 index 000000000..b8b5a465e --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c @@ -0,0 +1,1398 @@ +// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mlxbf_pka_dev.h" + + +#define PKA_DRIVER_VERSION "v3.0" +#define PKA_DRIVER_NAME "pka-mlxbf" + +#define PKA_DRIVER_DESCRIPTION "BlueField PKA driver" + +#define PKA_DEVICE_COMPAT "mlx,mlxbf-pka" +#define PKA_RING_DEVICE_COMPAT "mlx,mlxbf-pka-ring" + +#define PKA_DEVICE_ACPIHID_BF1 "MLNXBF10" +#define PKA_RING_DEVICE_ACPIHID_BF1 "MLNXBF11" + +#define PKA_DEVICE_ACPIHID_BF2 "MLNXBF20" +#define PKA_RING_DEVICE_ACPIHID_BF2 "MLNXBF21" + +#define PKA_DEVICE_ACCESS_MODE 0666 + +#define PKA_DEVICE_RES_CNT 7 +enum pka_mem_res_idx { + PKA_ACPI_EIP154_IDX = 0, + PKA_ACPI_WNDW_RAM_IDX, + PKA_ACPI_ALT_WNDW_RAM_0_IDX, + PKA_ACPI_ALT_WNDW_RAM_1_IDX, + PKA_ACPI_ALT_WNDW_RAM_2_IDX, + PKA_ACPI_ALT_WNDW_RAM_3_IDX, + PKA_ACPI_CSR_IDX +}; + +enum pka_plat_type { + PKA_PLAT_TYPE_BF1 = 0, /* Platform type Bluefield-1 */ + PKA_PLAT_TYPE_BF2 /* Platform type Bluefield-2 */ +}; + +static DEFINE_MUTEX(pka_drv_lock); + +static uint32_t pka_device_cnt; +static uint32_t pka_ring_device_cnt; + +const char pka_compat[] = PKA_DEVICE_COMPAT; +const char pka_ring_compat[] = PKA_RING_DEVICE_COMPAT; + +const char pka_acpihid_bf1[] = PKA_DEVICE_ACPIHID_BF1; +const char pka_ring_acpihid_bf1[] = PKA_RING_DEVICE_ACPIHID_BF1; + +const char pka_acpihid_bf2[] = PKA_DEVICE_ACPIHID_BF2; +const char pka_ring_acpihid_bf2[] = PKA_RING_DEVICE_ACPIHID_BF2; + +struct pka_drv_plat_info { + enum pka_plat_type type; + uint8_t fw_id; +}; + +static struct pka_drv_plat_info pka_drv_plat[] = { + [PKA_PLAT_TYPE_BF1] = { + .type = PKA_PLAT_TYPE_BF1, + .fw_id = PKA_FIRMWARE_IMAGE_0_ID + }, + [PKA_PLAT_TYPE_BF2] = { + .type = PKA_PLAT_TYPE_BF2, + .fw_id = PKA_FIRMWARE_IMAGE_2_ID + } +}; + +static const struct acpi_device_id pka_drv_acpi_ids[] = { + { PKA_DEVICE_ACPIHID_BF1, (kernel_ulong_t)&pka_drv_plat[PKA_PLAT_TYPE_BF1] }, + { PKA_RING_DEVICE_ACPIHID_BF1, 0 }, + { PKA_DEVICE_ACPIHID_BF2, (kernel_ulong_t)&pka_drv_plat[PKA_PLAT_TYPE_BF2] }, + { PKA_RING_DEVICE_ACPIHID_BF2, 0 }, + {}, +}; + +struct pka_info { + struct device *dev; /* the device this info belongs to */ + const char *name; /* device name */ + const char *version; /* device driver version */ + const char *compat; + const char *acpihid; + uint8_t flag; + struct module *module; + void *priv; /* optional private data */ +}; + +/* defines for pka_info->flags */ +#define PKA_DRIVER_FLAG_RING_DEVICE 1 +#define PKA_DRIVER_FLAG_DEVICE 2 + +struct pka_platdata { + struct platform_device *pdev; + struct pka_info *info; + spinlock_t lock; + unsigned long irq_flags; +}; + +/* Bits in pka_platdata.irq_flags */ +enum { + PKA_IRQ_DISABLED = 0, +}; + +struct pka_ring_region { + u64 off; + u64 addr; + resource_size_t size; + u32 flags; + u32 type; + void __iomem *ioaddr; +}; + +/* defines for pka_ring_region->flags */ +#define PKA_RING_REGION_FLAG_READ (1 << 0) /* Region supports read */ +#define PKA_RING_REGION_FLAG_WRITE (1 << 1) /* Region supports write */ +#define PKA_RING_REGION_FLAG_MMAP (1 << 2) /* Region supports mmap */ + +/* defines for pka_ring_region->type */ +#define PKA_RING_RES_TYPE_NONE 0 +#define PKA_RING_RES_TYPE_WORDS 1 /* info control/status words */ +#define PKA_RING_RES_TYPE_CNTRS 2 /* count registers */ +#define PKA_RING_RES_TYPE_MEM 4 /* window RAM region */ + +#define PKA_DRIVER_RING_DEV_MAX PKA_MAX_NUM_RINGS + +struct pka_ring_device { + struct pka_info *info; + struct device *device; + struct iommu_group *group; + int32_t group_id; + uint32_t device_id; + uint32_t parent_device_id; + struct mutex mutex; + uint32_t flags; + struct module *parent_module; + pka_dev_ring_t *ring; + int minor; + uint32_t num_regions; + struct pka_ring_region *regions; +}; + +#define PKA_DRIVER_DEV_MAX PKA_MAX_NUM_IO_BLOCKS +#define PKA_DRIVER_RING_NUM_REGIONS_MAX PKA_MAX_NUM_RING_RESOURCES + +/* defines for region index */ +#define PKA_RING_REGION_WORDS_IDX 0 +#define PKA_RING_REGION_CNTRS_IDX 1 +#define PKA_RING_REGION_MEM_IDX 2 + +#define PKA_RING_REGION_OFFSET_SHIFT 40 +#define PKA_RING_REGION_OFFSET_MASK \ + (((u64)(1) << PKA_RING_REGION_OFFSET_SHIFT) - 1) + +#define PKA_RING_OFFSET_TO_INDEX(off) \ + (off >> PKA_RING_REGION_OFFSET_SHIFT) + +#define PKA_RING_REGION_INDEX_TO_OFFSET(index) \ + ((u64)(index) << PKA_RING_REGION_OFFSET_SHIFT) + +struct pka_device { + struct pka_info *info; + struct device *device; + uint32_t device_id; + uint8_t fw_id; /* firmware identifier */ + struct mutex mutex; + struct resource *resource[PKA_DEVICE_RES_CNT]; + pka_dev_shim_t *shim; + long irq; /* interrupt number */ + struct hwrng rng; +}; + +/* defines for pka_device->irq */ +#define PKA_IRQ_CUSTOM -1 +#define PKA_IRQ_NONE 0 + +/* Hardware interrupt handler */ +static irqreturn_t pka_drv_irq_handler(int irq, void *device) +{ + struct pka_device *pka_dev = (struct pka_device *)device; + struct platform_device *pdev = to_platform_device(pka_dev->device); + struct pka_platdata *priv = platform_get_drvdata(pdev); + + PKA_DEBUG(PKA_DRIVER, + "handle irq in device %u\n", pka_dev->device_id); + + /* Just disable the interrupt in the interrupt controller */ + + spin_lock(&priv->lock); + if (!__test_and_set_bit(PKA_IRQ_DISABLED, &priv->irq_flags)) + disable_irq_nosync(irq); + spin_unlock(&priv->lock); + + return IRQ_HANDLED; +} + +static int pka_drv_register_irq(struct pka_device *pka_dev) +{ + if (pka_dev->irq && (pka_dev->irq != PKA_IRQ_CUSTOM)) { + /* + * Allow sharing the irq among several devices (child devices + * so far) + */ + return request_irq(pka_dev->irq, + (irq_handler_t) pka_drv_irq_handler, + IRQF_SHARED, pka_dev->info->name, + pka_dev); + } + + return -ENXIO; +} + +static int pka_drv_ring_regions_init(struct pka_ring_device *ring_dev) +{ + struct pka_ring_region *region; + pka_dev_ring_t *ring; + pka_dev_res_t *res; + uint32_t num_regions; + + ring = ring_dev->ring; + if (!ring || !ring->shim) + return -ENXIO; + + num_regions = ring->resources_num; + ring_dev->num_regions = num_regions; + ring_dev->regions = kcalloc(num_regions, + sizeof(struct pka_ring_region), + GFP_KERNEL); + if (!ring_dev->regions) + return -ENOMEM; + + /* Information words region */ + res = &ring->resources.info_words; + region = &ring_dev->regions[PKA_RING_REGION_WORDS_IDX]; + /* map offset to the physical address */ + region->off = + PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_WORDS_IDX); + region->addr = res->base; + region->size = res->size; + region->type = PKA_RING_RES_TYPE_WORDS; + region->flags |= (PKA_RING_REGION_FLAG_MMAP | + PKA_RING_REGION_FLAG_READ | + PKA_RING_REGION_FLAG_WRITE); + + /* Count regiters region */ + res = &ring->resources.counters; + region = &ring_dev->regions[PKA_RING_REGION_CNTRS_IDX]; + /* map offset to the physical address */ + region->off = + PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_CNTRS_IDX); + region->addr = res->base; + region->size = res->size; + region->type = PKA_RING_RES_TYPE_CNTRS; + region->flags |= (PKA_RING_REGION_FLAG_MMAP | + PKA_RING_REGION_FLAG_READ | + PKA_RING_REGION_FLAG_WRITE); + + /* Window ram region */ + res = &ring->resources.window_ram; + region = &ring_dev->regions[PKA_RING_REGION_MEM_IDX]; + /* map offset to the physical address */ + region->off = + PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_MEM_IDX); + region->addr = res->base; + region->size = res->size; + region->type = PKA_RING_RES_TYPE_MEM; + region->flags |= (PKA_RING_REGION_FLAG_MMAP | + PKA_RING_REGION_FLAG_READ | + PKA_RING_REGION_FLAG_WRITE); + + return 0; +} + +static void pka_drv_ring_regions_cleanup(struct pka_ring_device *ring_dev) +{ + /* clear vfio device regions */ + ring_dev->num_regions = 0; + kfree(ring_dev->regions); +} + +static int pka_drv_ring_open(void *device_data) +{ + struct pka_ring_device *ring_dev = device_data; + struct pka_info *info = ring_dev->info; + pka_ring_info_t ring_info; + + int error; + + PKA_DEBUG(PKA_DRIVER, + "open ring device %u (device_data:%p)\n", + ring_dev->device_id, ring_dev); + + if (!try_module_get(info->module)) + return -ENODEV; + + ring_info.ring_id = ring_dev->device_id; + error = pka_dev_open_ring(&ring_info); + if (error) { + PKA_DEBUG(PKA_DRIVER, + "failed to open ring %u\n", ring_dev->device_id); + module_put(info->module); + return error; + } + + /* Initialize regions */ + error = pka_drv_ring_regions_init(ring_dev); + if (error) { + PKA_DEBUG(PKA_DRIVER, "failed to initialize regions\n"); + pka_dev_close_ring(&ring_info); + module_put(info->module); + return error; + } + + return 0; +} + +static void pka_drv_ring_release(void *device_data) +{ + struct pka_ring_device *ring_dev = device_data; + struct pka_info *info = ring_dev->info; + pka_ring_info_t ring_info; + + int error; + + PKA_DEBUG(PKA_DRIVER, + "release ring device %u (device_data:%p)\n", + ring_dev->device_id, ring_dev); + + pka_drv_ring_regions_cleanup(ring_dev); + + ring_info.ring_id = ring_dev->device_id; + error = pka_dev_close_ring(&ring_info); + if (error) + PKA_DEBUG(PKA_DRIVER, + "failed to close ring %u\n", + ring_dev->device_id); + + module_put(info->module); +} + +static int pka_drv_ring_mmap_region(struct pka_ring_region region, + struct vm_area_struct *vma) +{ + u64 req_len, pgoff, req_start; + + req_len = vma->vm_end - vma->vm_start; + pgoff = vma->vm_pgoff & + ((1U << (PKA_RING_REGION_OFFSET_SHIFT - PAGE_SHIFT)) - 1); + req_start = pgoff << PAGE_SHIFT; + + region.size = roundup(region.size, PAGE_SIZE); + + if (req_start + req_len > region.size) + return -EINVAL; + + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + vma->vm_pgoff = (region.addr >> PAGE_SHIFT) + pgoff; + + return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, + req_len, vma->vm_page_prot); +} + +static int pka_drv_ring_mmap(void *device_data, struct vm_area_struct *vma) +{ + struct pka_ring_device *ring_dev = device_data; + struct pka_ring_region *region; + unsigned int index; + + PKA_DEBUG(PKA_DRIVER, "mmap device %u\n", ring_dev->device_id); + + index = vma->vm_pgoff >> (PKA_RING_REGION_OFFSET_SHIFT - PAGE_SHIFT); + + if (vma->vm_end < vma->vm_start) + return -EINVAL; + if (!(vma->vm_flags & VM_SHARED)) + return -EINVAL; + if (index >= ring_dev->num_regions) + return -EINVAL; + if (vma->vm_start & ~PAGE_MASK) + return -EINVAL; + if (vma->vm_end & ~PAGE_MASK) + return -EINVAL; + + region = &ring_dev->regions[index]; + + if (!(region->flags & PKA_RING_REGION_FLAG_MMAP)) + return -EINVAL; + + if (!(region->flags & PKA_RING_REGION_FLAG_READ) + && (vma->vm_flags & VM_READ)) + return -EINVAL; + + if (!(region->flags & PKA_RING_REGION_FLAG_WRITE) + && (vma->vm_flags & VM_WRITE)) + return -EINVAL; + + vma->vm_private_data = ring_dev; + + if (region->type & PKA_RING_RES_TYPE_CNTRS || + region->type & PKA_RING_RES_TYPE_MEM) + return pka_drv_ring_mmap_region(ring_dev->regions[index], vma); + + if (region->type & PKA_RING_RES_TYPE_WORDS) + /* + * Currently user space is not allowed to access this + * region. + */ + return -EINVAL; + + return -EINVAL; +} + +static long pka_drv_ring_ioctl(void *device_data, + unsigned int cmd, unsigned long arg) +{ + struct pka_ring_device *ring_dev = device_data; + + int error = -ENOTTY; + + if (cmd == PKA_RING_GET_REGION_INFO) { + pka_dev_region_info_t info; + + info.mem_index = PKA_RING_REGION_MEM_IDX; + info.mem_offset = ring_dev->regions[info.mem_index].off; + info.mem_size = ring_dev->regions[info.mem_index].size; + + info.reg_index = PKA_RING_REGION_CNTRS_IDX; + info.reg_offset = ring_dev->regions[info.reg_index].off; + info.reg_size = ring_dev->regions[info.reg_index].size; + + return copy_to_user((void __user *)arg, &info, sizeof(info)) ? + -EFAULT : 0; + + } else if (cmd == PKA_GET_RING_INFO) { + pka_dev_hw_ring_info_t *this_ring_info; + pka_dev_hw_ring_info_t hw_ring_info; + + this_ring_info = ring_dev->ring->ring_info; + + hw_ring_info.cmmd_base = this_ring_info->cmmd_base; + hw_ring_info.rslt_base = this_ring_info->rslt_base; + hw_ring_info.size = this_ring_info->size; + hw_ring_info.host_desc_size = this_ring_info->host_desc_size; + hw_ring_info.in_order = this_ring_info->in_order; + hw_ring_info.cmmd_rd_ptr = this_ring_info->cmmd_rd_ptr; + hw_ring_info.rslt_wr_ptr = this_ring_info->rslt_wr_ptr; + hw_ring_info.cmmd_rd_stats = this_ring_info->cmmd_rd_ptr; + hw_ring_info.rslt_wr_stats = this_ring_info->rslt_wr_stats; + + return copy_to_user((void __user *)arg, &hw_ring_info, + sizeof(hw_ring_info)) ? -EFAULT : 0; + } else if (cmd == PKA_CLEAR_RING_COUNTERS) { + return pka_dev_clear_ring_counters(ring_dev->ring); + } else if (cmd == PKA_GET_RANDOM_BYTES) { + pka_dev_trng_info_t *trng_data; + pka_dev_shim_t *shim; + bool trng_present; + uint32_t byte_cnt; + uint32_t *data; + int ret; + + ret = -ENOENT; + shim = ring_dev->ring->shim; + trng_data = (pka_dev_trng_info_t *)arg; + /* + * We need byte count which is multiple of 4 as + * required by pka_dev_trng_read() interface. + */ + byte_cnt = round_up(trng_data->count, 4); + + data = kzalloc(byte_cnt, GFP_KERNEL); + if (data == NULL) { + PKA_DEBUG(PKA_DRIVER, "failed to allocate memory.\n"); + return -ENOMEM; + } + + trng_present = pka_dev_has_trng(shim); + if (!trng_present) { + kfree(data); + return ret; + } + + ret = pka_dev_trng_read(shim, data, byte_cnt); + if (ret) { + PKA_DEBUG(PKA_DRIVER, "TRNG failed %d\n", ret); + kfree(data); + return ret; + } + + ret = copy_to_user((void __user *)(trng_data->data), data, trng_data->count); + kfree(data); + return ret ? -EFAULT : 0; + } + + return error; +} + +#ifdef CONFIG_PKA_VFIO_IOMMU +static const struct vfio_device_ops pka_ring_vfio_ops = { + .name = PKA_DRIVER_NAME, + .open = pka_drv_ring_open, + .release = pka_drv_ring_release, + .ioctl = pka_drv_ring_ioctl, + .mmap = pka_drv_ring_mmap, +}; + +static int pka_drv_add_ring_device(struct pka_ring_device *ring_dev) +{ + struct device *dev = ring_dev->device; + int ret; + + ring_dev->parent_module = THIS_MODULE; + ring_dev->flags = VFIO_DEVICE_FLAGS_PLATFORM; + + ring_dev->group = vfio_iommu_group_get(dev); + if (!ring_dev->group) { + PKA_DEBUG(PKA_DRIVER, + "failed to get IOMMU group for device %d\n", + ring_dev->device_id); + return -EINVAL; + } + + /* + * Note that this call aims to add the given child device to a vfio + * group. This function creates a new driver data for the device + * different from the structure passed as a 3rd argument - i.e. + * pka_ring_dev. The struct newly created corresponds to 'vfio_device' + * structure which includes a field called 'device_data' that holds + * the initialized 'pka_ring_dev'. So to retrieve our private data, + * we must call 'dev_get_drvdata()' which returns the 'vfio_device' + * struct and access its 'device_data' field. Here one can use + * 'pka_platdata' structure instead to be consistent with the parent + * devices, and have a common driver data structure which will be used + * to manage devices - 'pka_drv_remove()' for instance. Since the VFIO + * framework alters the driver data and introduce an indirection, it + * is no more relevant to have a common driver data structure. Hence, + * we prefer to set the struct 'pka_vfio_dev' instead to avoid + * indirection when we have to retrieve this structure during the + * open(), mmap(), and ioctl() calls. Since, this structure is used + * as driver data here, it will be immediately reachable for these + * functions (see first argument passed (void *device_data) passed + * to those functions). + */ + ret = vfio_add_group_dev(dev, &pka_ring_vfio_ops, ring_dev); + if (ret) { + PKA_DEBUG(PKA_DRIVER, + "failed to add group device %d\n", + ring_dev->device_id); + vfio_iommu_group_put(ring_dev->group, dev); + return ret; + } + + ring_dev->group_id = iommu_group_id(ring_dev->group); + + PKA_DEBUG(PKA_DRIVER, + "ring device %d bus:%p iommu_ops:%p group:%p\n", + ring_dev->device_id, + dev->bus, + dev->bus->iommu_ops, + ring_dev->group); + + return 0; +} + +static struct pka_ring_device *pka_drv_del_ring_device(struct device *dev) +{ + struct pka_ring_device *ring_dev; + + ring_dev = vfio_del_group_dev(dev); + if (ring_dev) + vfio_iommu_group_put(dev->iommu_group, dev); + + return ring_dev; +} + +static int pka_drv_init_class(void) +{ + return 0; +} + +static void pka_drv_destroy_class(void) +{ +} +#else +static struct pka { + struct class *class; + struct idr ring_idr; + struct mutex ring_lock; + struct cdev ring_cdev; + dev_t ring_devt; +} pka; + +static int pka_drv_open(struct inode *inode, struct file *filep) +{ + struct pka_ring_device *ring_dev; + int ret; + + ring_dev = idr_find(&pka.ring_idr, iminor(inode)); + if (!ring_dev) { + PKA_ERROR(PKA_DRIVER, + "failed to find idr for device %d\n", + ring_dev->device_id); + return -ENODEV; + } + + ret = pka_drv_ring_open(ring_dev); + if (ret) + return ret; + + filep->private_data = ring_dev; + return 0; +} + +static int pka_drv_release(struct inode *inode, struct file *filep) +{ + struct pka_ring_device *ring_dev = filep->private_data; + + filep->private_data = NULL; + pka_drv_ring_release(ring_dev); + + return 0; +} + +static int pka_drv_mmap(struct file *filep, struct vm_area_struct *vma) +{ + return pka_drv_ring_mmap(filep->private_data, vma); +} + +static long pka_drv_unlocked_ioctl(struct file *filep, + unsigned int cmd, unsigned long arg) +{ + return pka_drv_ring_ioctl(filep->private_data, cmd, arg); +} + +static const struct file_operations pka_ring_fops = { + .owner = THIS_MODULE, + .open = pka_drv_open, + .release = pka_drv_release, + .unlocked_ioctl = pka_drv_unlocked_ioctl, + .mmap = pka_drv_mmap, +}; + +static int pka_drv_add_ring_device(struct pka_ring_device *ring_dev) +{ + struct device *dev = ring_dev->device; + + ring_dev->minor = idr_alloc(&pka.ring_idr, + ring_dev, 0, MINORMASK + 1, GFP_KERNEL); + if (ring_dev->minor < 0) { + PKA_DEBUG(PKA_DRIVER, + "failed to alloc minor to device %d\n", + ring_dev->device_id); + return ring_dev->minor; + } + + dev = device_create(pka.class, NULL, + MKDEV(MAJOR(pka.ring_devt), ring_dev->minor), + ring_dev, "%d", ring_dev->device_id); + if (IS_ERR(dev)) { + PKA_DEBUG(PKA_DRIVER, + "failed to create device %d\n", + ring_dev->device_id); + idr_remove(&pka.ring_idr, ring_dev->minor); + return PTR_ERR(dev); + } + + PKA_DEBUG(PKA_DRIVER, + "ring device %d minor:%d\n", + ring_dev->device_id, ring_dev->minor); + + return 0; +} + +static struct pka_ring_device *pka_drv_del_ring_device(struct device *dev) +{ + struct platform_device *pdev = + container_of(dev, struct platform_device, dev); + struct pka_platdata *priv = platform_get_drvdata(pdev); + struct pka_info *info = priv->info; + struct pka_ring_device *ring_dev = info->priv; + + if (ring_dev) { + device_destroy(pka.class, MKDEV(MAJOR(pka.ring_devt), + ring_dev->minor)); + idr_remove(&pka.ring_idr, ring_dev->minor); + } + + return ring_dev; +} + +static char *pka_drv_devnode(struct device *dev, umode_t *mode) +{ + if (mode != NULL) + *mode = PKA_DEVICE_ACCESS_MODE; + return kasprintf(GFP_KERNEL, "pka/%s", dev_name(dev)); +} + +static int pka_drv_init_class(void) +{ + int ret; + + idr_init(&pka.ring_idr); + /* /sys/class/pka/$RING */ + pka.class = class_create(THIS_MODULE, "pka"); + if (IS_ERR(pka.class)) + return PTR_ERR(pka.class); + + /* /dev/pka/$RING */ + pka.class->devnode = pka_drv_devnode; + + ret = alloc_chrdev_region(&pka.ring_devt, 0, MINORMASK, "pka"); + if (ret) + goto err_alloc_chrdev; + + cdev_init(&pka.ring_cdev, &pka_ring_fops); + ret = cdev_add(&pka.ring_cdev, pka.ring_devt, MINORMASK); + if (ret) + goto err_cdev_add; + + return 0; + +err_cdev_add: + unregister_chrdev_region(pka.ring_devt, MINORMASK); +err_alloc_chrdev: + class_destroy(pka.class); + pka.class = NULL; + return ret; +} + +static void pka_drv_destroy_class(void) +{ + idr_destroy(&pka.ring_idr); + cdev_del(&pka.ring_cdev); + unregister_chrdev_region(pka.ring_devt, MINORMASK); + class_destroy(pka.class); + pka.class = NULL; +} +#endif + +static void pka_drv_get_mem_res(struct pka_device *pka_dev, + struct pka_dev_mem_res *mem_res, + uint64_t wndw_ram_off_mask) +{ + enum pka_mem_res_idx acpi_mem_idx; + + acpi_mem_idx = PKA_ACPI_EIP154_IDX; + mem_res->wndw_ram_off_mask = wndw_ram_off_mask; + + /* PKA EIP154 MMIO base address*/ + mem_res->eip154_base = pka_dev->resource[acpi_mem_idx]->start; + mem_res->eip154_size = pka_dev->resource[acpi_mem_idx]->end - + mem_res->eip154_base + 1; + acpi_mem_idx++; + + /* PKA window ram base address*/ + mem_res->wndw_ram_base = pka_dev->resource[acpi_mem_idx]->start; + mem_res->wndw_ram_size = pka_dev->resource[acpi_mem_idx]->end - + mem_res->wndw_ram_base + 1; + acpi_mem_idx++; + + /* PKA alternate window ram base address + * Note: Here the size of all the alt window ram is same, depicted by + * 'alt_wndw_ram_size' variable. All alt window ram resources are read + * here even though not all of them are used currently. + */ + mem_res->alt_wndw_ram_0_base = pka_dev->resource[acpi_mem_idx]->start; + mem_res->alt_wndw_ram_size = pka_dev->resource[acpi_mem_idx]->end - + mem_res->alt_wndw_ram_0_base + 1; + + if (mem_res->alt_wndw_ram_size != PKA_WINDOW_RAM_REGION_SIZE) + PKA_ERROR(PKA_DRIVER, + "Alternate Window RAM size read from ACPI is incorrect.\n"); + + acpi_mem_idx++; + + mem_res->alt_wndw_ram_1_base = pka_dev->resource[acpi_mem_idx]->start; + acpi_mem_idx++; + + mem_res->alt_wndw_ram_2_base = pka_dev->resource[acpi_mem_idx]->start; + acpi_mem_idx++; + + mem_res->alt_wndw_ram_3_base = pka_dev->resource[acpi_mem_idx]->start; + acpi_mem_idx++; + + /* PKA CSR base address*/ + mem_res->csr_base = pka_dev->resource[acpi_mem_idx]->start; + mem_res->csr_size = pka_dev->resource[acpi_mem_idx]->end - + mem_res->csr_base + 1; +} + +/* + * Note that this function must be serialized because it calls + * 'pka_dev_register_shim' which manipulates common counters for + * pka devices. + */ +static int pka_drv_register_device(struct pka_device *pka_dev, + uint64_t wndw_ram_off_mask) +{ + uint32_t pka_shim_id; + uint8_t pka_shim_fw_id; + struct pka_dev_mem_res mem_res; + + /* Register Shim */ + pka_shim_id = pka_dev->device_id; + pka_shim_fw_id = pka_dev->fw_id; + + pka_drv_get_mem_res(pka_dev, &mem_res, wndw_ram_off_mask); + + pka_dev->shim = pka_dev_register_shim(pka_shim_id, pka_shim_fw_id, + &mem_res); + if (!pka_dev->shim) { + PKA_DEBUG(PKA_DRIVER, + "failed to register shim id=%u\n", pka_shim_id); + return -EFAULT; + } + + return 0; +} + +static int pka_drv_unregister_device(struct pka_device *pka_dev) +{ + if (!pka_dev) + return -EINVAL; + + if (pka_dev->shim) { + PKA_DEBUG(PKA_DRIVER, + "unregister device shim %u\n", + pka_dev->shim->shim_id); + return pka_dev_unregister_shim(pka_dev->shim); + } + + return 0; +} + +/* + * Note that this function must be serialized because it calls + * 'pka_dev_register_ring' which manipulates common counters for + * vfio devices. + */ +static int pka_drv_register_ring_device(struct pka_ring_device *ring_dev) +{ + uint32_t ring_id; + uint32_t shim_id; + + ring_id = ring_dev->device_id; + shim_id = ring_dev->parent_device_id; + + ring_dev->ring = pka_dev_register_ring(ring_id, shim_id); + if (!ring_dev->ring) { + PKA_DEBUG(PKA_DRIVER, + "failed to register ring device %u\n", ring_id); + return -EFAULT; + } + + return 0; +} + +static int pka_drv_unregister_ring_device(struct pka_ring_device *ring_dev) +{ + uint32_t ring_id; + + if (!ring_dev) + return -EINVAL; + + ring_id = ring_dev->ring->ring_id; + + if (ring_dev->ring) { + PKA_DEBUG(PKA_DRIVER, "unregister ring device %u\n", ring_id); + return pka_dev_unregister_ring(ring_dev->ring); + } + + return 0; +} + +static const struct of_device_id pka_ring_match[] = { + { .compatible = PKA_RING_DEVICE_COMPAT }, + {}, +}; + +static int pka_drv_rng_read(struct hwrng *rng, void *data, size_t max, + bool wait) +{ + int ret; + + struct pka_device *pka_dev = container_of(rng, struct pka_device, rng); + uint32_t *buffer = data; + + ret = pka_dev_trng_read(pka_dev->shim, buffer, max); + if (ret) { + PKA_DEBUG(PKA_DRIVER, + "%s: failed to read random bytes ret=%d", + rng->name, ret); + return 0; + } + + return max; +} + +static int pka_drv_probe_device(struct pka_info *info) +{ + struct pka_device *pka_dev; + struct device *dev = info->dev; + struct device_node *of_node = dev->of_node; + struct platform_device *pdev = to_platform_device(dev); + struct hwrng *trng; + const struct acpi_device_id *aid; + struct pka_drv_plat_info *plat_info; + uint64_t wndw_ram_off_mask; + int ret; + enum pka_mem_res_idx acpi_mem_idx; + + if (!info) + return -EINVAL; + + pka_dev = kzalloc(sizeof(*pka_dev), GFP_KERNEL); + if (!pka_dev) + return -ENOMEM; + + mutex_lock(&pka_drv_lock); + pka_device_cnt += 1; + if (pka_device_cnt > PKA_DRIVER_DEV_MAX) { + PKA_DEBUG(PKA_DRIVER, + "cannot support %u devices\n", pka_device_cnt); + kfree(pka_dev); + mutex_unlock(&pka_drv_lock); + return -EPERM; + } + pka_dev->device_id = pka_device_cnt - 1; + mutex_unlock(&pka_drv_lock); + + pka_dev->info = info; + pka_dev->device = dev; + info->flag = PKA_DRIVER_FLAG_DEVICE; + mutex_init(&pka_dev->mutex); + + for (acpi_mem_idx = PKA_ACPI_EIP154_IDX; + acpi_mem_idx < PKA_DEVICE_RES_CNT; acpi_mem_idx++) { + pka_dev->resource[acpi_mem_idx] = + platform_get_resource(pdev, IORESOURCE_MEM, acpi_mem_idx); + } + + /* Window ram offset mask is platform dependent */ + aid = acpi_match_device(pka_drv_acpi_ids, dev); + if (!aid) + return -ENODEV; + + plat_info = (struct pka_drv_plat_info *)aid->driver_data; + if (plat_info->type <= PKA_PLAT_TYPE_BF2) { + wndw_ram_off_mask = PKA_WINDOW_RAM_OFFSET_MASK1; + } else { + PKA_ERROR(PKA_DRIVER, "Invalid platform type: %d\n", + (int)plat_info->type); + return -EINVAL; + } + + /* Set interrupts */ + ret = platform_get_irq(pdev, 0); + pka_dev->irq = ret; + if (ret == -ENXIO && of_node) { + pka_dev->irq = PKA_IRQ_NONE; + } else if (ret < 0) { + PKA_ERROR(PKA_DRIVER, + "failed to get device %u IRQ\n", pka_dev->device_id); + return ret; + } + + /* Register IRQ */ + ret = pka_drv_register_irq(pka_dev); + if (ret) { + PKA_ERROR(PKA_DRIVER, + "failed to register device %u IRQ\n", + pka_dev->device_id); + return ret; + } + + /* Firmware version */ + pka_dev->fw_id = plat_info->fw_id; + + mutex_lock(&pka_drv_lock); + ret = pka_drv_register_device(pka_dev, wndw_ram_off_mask); + if (ret) { + PKA_DEBUG(PKA_DRIVER, "failed to register shim id=%u\n", + pka_dev->device_id); + mutex_unlock(&pka_drv_lock); + return ret; + } + mutex_unlock(&pka_drv_lock); + + /* Setup the TRNG, if needed */ + if (pka_dev_has_trng(pka_dev->shim)) { + trng = &pka_dev->rng; + trng->name = pdev->name; + trng->read = pka_drv_rng_read; + + ret = hwrng_register(&pka_dev->rng); + if (ret) { + PKA_ERROR(PKA_DRIVER, + "failed to register trng\n"); + return ret; + } + } + + info->priv = pka_dev; + +#ifdef BUG_SW_1127083_FIXED + /* + * Create platform devices (pka-ring) from current node. + * This code is reserverd for DT. + */ + if (of_node) { + ret = of_platform_populate(of_node, pka_ring_match, + NULL, dev); + if (ret) { + PKA_ERROR(PKA_DRIVER, + "failed to create platform devices\n"); + return ret; + } + } +#endif + + return 0; +} + +static int pka_drv_remove_device(struct platform_device *pdev) +{ + struct pka_platdata *priv = platform_get_drvdata(pdev); + struct pka_info *info = priv->info; + struct pka_device *pka_dev = (struct pka_device *)info->priv; + + if (!pka_dev) { + PKA_ERROR(PKA_DRIVER, "failed to unregister device\n"); + return -EINVAL; + } + + if (pka_dev_has_trng(pka_dev->shim)) + hwrng_unregister(&pka_dev->rng); + + if (pka_drv_unregister_device(pka_dev)) + PKA_ERROR(PKA_DRIVER, "failed to unregister device\n"); + + return 0; +} + +static int pka_drv_probe_ring_device(struct pka_info *info) +{ + struct pka_ring_device *ring_dev; + struct device *dev = info->dev; + + int ret; + + if (!info) + return -EINVAL; + + ring_dev = kzalloc(sizeof(*ring_dev), GFP_KERNEL); + if (!ring_dev) + return -ENOMEM; + + mutex_lock(&pka_drv_lock); + pka_ring_device_cnt += 1; + if (pka_ring_device_cnt > PKA_DRIVER_RING_DEV_MAX) { + PKA_DEBUG(PKA_DRIVER, "cannot support %u ring devices\n", + pka_ring_device_cnt); + kfree(ring_dev); + mutex_unlock(&pka_drv_lock); + return -EPERM; + } + ring_dev->device_id = pka_ring_device_cnt - 1; + ring_dev->parent_device_id = pka_device_cnt - 1; + mutex_unlock(&pka_drv_lock); + + ring_dev->info = info; + ring_dev->device = dev; + info->flag = PKA_DRIVER_FLAG_RING_DEVICE; + mutex_init(&ring_dev->mutex); + + ret = pka_drv_add_ring_device(ring_dev); + if (ret) { + PKA_DEBUG(PKA_DRIVER, + "failed to add ring device %u\n", + ring_dev->device_id); + kfree(ring_dev); + return ret; + } + + mutex_lock(&pka_drv_lock); + /* Register ring device */ + ret = pka_drv_register_ring_device(ring_dev); + if (ret) { + PKA_DEBUG(PKA_DRIVER, + "failed to register ring device %u\n", + ring_dev->device_id); + mutex_unlock(&pka_drv_lock); + goto err_register_ring; + } + mutex_unlock(&pka_drv_lock); + + info->priv = ring_dev; + + return 0; + + err_register_ring: + pka_drv_del_ring_device(dev); + kfree(ring_dev); + return ret; +} + +static int pka_drv_remove_ring_device(struct platform_device *pdev) +{ + struct pka_ring_device *ring_dev; + struct device *dev = &pdev->dev; + int ret; + + ring_dev = pka_drv_del_ring_device(dev); + if (ring_dev) { + ret = pka_drv_unregister_ring_device(ring_dev); + if (ret) { + PKA_ERROR(PKA_DRIVER, + "failed to unregister vfio device\n"); + return ret; + } + kfree(ring_dev); + } + + return 0; +} + +static int pka_drv_of_probe(struct platform_device *pdev, + struct pka_info *info) +{ +#ifdef BUG_SW_1127083_FIXED + struct device *dev = &pdev->dev; + + int error; + + error = device_property_read_string(dev, "compatible", &info->compat); + if (error) { + PKA_DEBUG(PKA_DRIVER, "cannot retrieve compat for %s\n", + pdev->name); + return -EINVAL; + } + + if (!strcmp(info->compat, pka_ring_compat)) { + PKA_PRINT(PKA_DRIVER, "probe ring device %s\n", + pdev->name); + error = pka_drv_probe_ring_device(info); + if (error) { + PKA_DEBUG(PKA_DRIVER, + "failed to register ring device compat=%s\n", + info->compat); + return error; + } + + } else if (!strcmp(info->compat, pka_compat)) { + PKA_PRINT(PKA_DRIVER, "probe device %s\n", pdev->name); + error = pka_drv_probe_device(info); + if (error) { + PKA_DEBUG(PKA_DRIVER, + "failed to register device compat=%s\n", + info->compat); + return error; + } + } + + return 0; +#endif + return -EPERM; +} + +static int pka_drv_acpi_probe(struct platform_device *pdev, + struct pka_info *info) +{ + struct acpi_device *adev; + struct device *dev = &pdev->dev; + + int error; + + if (acpi_disabled) + return -ENOENT; + + adev = ACPI_COMPANION(dev); + if (!adev) { + PKA_DEBUG(PKA_DRIVER, + "ACPI companion device not found for %s\n", + pdev->name); + return -ENODEV; + } + + info->acpihid = acpi_device_hid(adev); + if (WARN_ON(!info->acpihid)) + return -EINVAL; + + if (!strcmp(info->acpihid, pka_ring_acpihid_bf1) + || !strcmp(info->acpihid, pka_ring_acpihid_bf2)) { + error = pka_drv_probe_ring_device(info); + if (error) { + PKA_DEBUG(PKA_DRIVER, + "failed to register ring device %s\n", + pdev->name); + return error; + } + PKA_DEBUG(PKA_DRIVER, "ring device %s probed\n", + pdev->name); + + } else if (!strcmp(info->acpihid, pka_acpihid_bf1) + || !strcmp(info->acpihid, pka_acpihid_bf2)) { + error = pka_drv_probe_device(info); + if (error) { + PKA_DEBUG(PKA_DRIVER, + "failed to register device %s\n", + pdev->name); + return error; + } + PKA_PRINT(PKA_DRIVER, "device %s probed\n", pdev->name); + } + + return 0; +} + +static int pka_drv_probe(struct platform_device *pdev) +{ + struct pka_platdata *priv; + struct pka_info *info; + struct device *dev = &pdev->dev; + + int ret; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + spin_lock_init(&priv->lock); + priv->pdev = pdev; + /* interrupt is disabled to begin with */ + priv->irq_flags = 0; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + info->name = pdev->name; + info->version = PKA_DRIVER_VERSION; + info->module = THIS_MODULE; + info->dev = dev; + + priv->info = info; + + platform_set_drvdata(pdev, priv); + + /* + * There can be two kernel build combinations. One build where + * ACPI is not selected and another one with the ACPI. + * + * In the first case, 'pka_drv_acpi_probe' will return since + * acpi_disabled is 1. DT user will not see any kind of messages + * from ACPI. + * + * In the second case, both DT and ACPI is compiled in but the + * system is booting with any of these combinations. + * + * If the firmware is DT type, then acpi_disabled is 1. The ACPI + * probe routine terminates immediately without any messages. + * + * If the firmware is ACPI type, then acpi_disabled is 0. All other + * checks are valid checks. We cannot claim that this system is DT. + */ + ret = pka_drv_acpi_probe(pdev, info); + if (ret) + ret = pka_drv_of_probe(pdev, info); + + if (ret) { + PKA_DEBUG(PKA_DRIVER, "unknown device\n"); + return ret; + } + + return 0; +} + +static int pka_drv_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + /* + * Little hack here: + * The issue here is that the driver data structure which holds our + * initialized private data cannot be used when the 'pdev' arguments + * points to child device -i.e. vfio device. Indeed, during the probe + * function we set an initialized structure called 'priv' as driver + * data for all platform devices including parents devices and child + * devices. This driver data is unique to each device - see call to + * 'platform_set_drvdata()'. However, when we add the child device to + * a vfio group through 'vfio_add_group_dev()' call, this function + * creates a new driver data for the device - i.e. a 'vfio_device' + * structure which includes a field called 'device_data' to hold the + * aforementionned initialized private data. So, to retrieve our + * private data, we must call 'dev_get_drvdata()' which returns the + * 'vfio_device' struct and access its 'device_data' field. However, + * this cannot be done before determining if the 'pdev' is associated + * with a child device or a parent device. + * In order to deal with that we propose this little hack which uses + * the iommu_group to distinguich between parent and child devices. + * For now, let's say it is a customized solution that works for our + * case. Indeed, in the current design, the private data holds some + * infos that defines the type of the device. The intuitive way to do + * that is as following: + * + * struct pka_platdata *priv = platform_get_drvdata(pdev); + * struct pka_info *info = priv->info; + * + * if (info->flag == PKA_DRIVER_FLAG_RING_DEVICE) + * return pka_drv_remove_ring_device(info); + * if (info->flag == PKA_DRIVER_FLAG_DEVICE) + * return pka_drv_remove_ring_device(info); + * + * Since the returned private data of child devices -i.e vfio devices + * corresponds to 'vfio_device' structure, we cannot use it to + * differentiate between parent and child devices. This alternative + * solution is used instead. + */ + if (dev->iommu_group) { + PKA_PRINT(PKA_DRIVER, "remove ring device %s\n", + pdev->name); + return pka_drv_remove_ring_device(pdev); + } + + PKA_PRINT(PKA_DRIVER, "remove device %s\n", pdev->name); + return pka_drv_remove_device(pdev); +} + +static const struct of_device_id pka_drv_match[] = { + { .compatible = PKA_DEVICE_COMPAT }, + { .compatible = PKA_RING_DEVICE_COMPAT }, + {} +}; + +MODULE_DEVICE_TABLE(of, pka_drv_match); + +MODULE_DEVICE_TABLE(acpi, pka_drv_acpi_ids); + +static struct platform_driver pka_drv = { + .driver = { + .name = PKA_DRIVER_NAME, + .of_match_table = of_match_ptr(pka_drv_match), + .acpi_match_table = ACPI_PTR(pka_drv_acpi_ids), + }, + .probe = pka_drv_probe, + .remove = pka_drv_remove, +}; + +/* Initialize the module - Register the pka platform driver */ +static int __init pka_drv_register(void) +{ + int ret; + + ret = pka_drv_init_class(); + if (ret) { + PKA_ERROR(PKA_DRIVER, "failed to create class\n"); + return ret; + } + + ret = platform_driver_register(&pka_drv); + if (ret) { + PKA_ERROR(PKA_DRIVER, "failed to register platform driver\n"); + return ret; + } + + PKA_PRINT(PKA_DRIVER, "version: " PKA_DRIVER_VERSION "\n"); + + return 0; +} + +/* Cleanup the module - unregister the pka platform driver */ +static void __exit pka_drv_unregister(void) +{ + platform_driver_unregister(&pka_drv); + pka_drv_destroy_class(); +} + +module_init(pka_drv_register); +module_exit(pka_drv_unregister); + +MODULE_DESCRIPTION(PKA_DRIVER_DESCRIPTION); +MODULE_VERSION(PKA_DRIVER_VERSION); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h new file mode 100644 index 000000000..29ea27ce0 --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h @@ -0,0 +1,4823 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __DRIVERS_MICA_PKA_FW_H__ +#define __DRIVERS_MICA_PKA_FW_H__ + +#include + +// +// Program binaries +// + +// Align to PKA_BUFFER_RAM_SIZE. This is greater than the actual buffer +// length so that the image is zero padded. +static const uint32_t fw0_farm_img_data_buf[2048] = +{ + 0x137001C9, 0x692040FA, 0x55502301, 0x328C0200, + 0x5E7000C9, 0x3D7000C8, 0x3670001D, 0x5370001F, + 0x746A4010, 0x046B4014, 0x3C621FF8, 0x4B631FF4, + 0x2A684000, 0x5A694004, 0x4F601FF6, 0x3F611FF2, + 0x5A6A4008, 0x2A6B400C, 0x19621FFA, 0x6D631FF0, + 0x0F684034, 0x7070001E, 0x5D34003F, 0x08601FFE, + 0x0328000B, 0x52C40047, 0x69240027, 0x04880000, + 0x76800047, 0x3380002E, 0x36800047, 0x7A800039, + 0xB6800047, 0xDF80003B, 0xD7800027, 0x9B800035, + 0xDC80003D, 0xB980003F, 0xB5800041, 0xF36A4018, + 0xDA621FFC, 0x9997017D, 0xA4300002, 0xD9D00061, + 0xBC30FFFE, 0xFC800056, 0xF36A4018, 0x9A621FFC, + 0xD59701CC, 0xA4300002, 0x99D00061, 0xFC30FFFE, + 0x99800062, 0xD097026C, 0xD38C0400, 0x8B614018, + 0xBC800056, 0xFF97039F, 0xFC800056, 0x9A97039D, + 0xFC800056, 0x9D9703A3, 0xBC800056, 0xF89703A1, + 0xBC800056, 0xDC970367, 0xFC800056, 0x9D200003, + 0xFC800056, 0xB7200023, 0xBC800056, 0xFD7000C8, + 0xD2200021, 0xBA8C5000, 0x9B80006F, 0xF5707FC8, + 0x84702084, 0xF670001D, 0xDB200000, 0xB6010000, + 0xCF220001, 0xB197007F, 0xA0684084, 0xD3340020, + 0xA7CC0052, 0xFC20000F, 0xF18C0100, 0xA4300002, + 0x99D00061, 0xED601FFC, 0xD5681FF0, 0x926A4014, + 0xF6010000, 0xB18C0100, 0x9260400C, 0xF197007F, + 0x34681FFC, 0x7C30FFFE, 0x616A1FF6, 0x336B1FF8, + 0x44624000, 0x3B634010, 0x076A1FF2, 0x526B1FF4, + 0x62624004, 0x1D634014, 0x006A1FFA, 0x7A230000, + 0x03624008, 0x7A8C5000, 0x5A63401C, 0x086440C9, + 0x5B800003, 0x3B6B1FE4, 0x118B4000, 0x7F8C0480, + 0x17BC004B, 0x6D61401C, 0x518B4000, 0x36010000, + 0x3C30FFFE, 0x66500000, 0x66500000, 0x26500000, + 0x66500000, 0x24300002, 0x102A0002, 0x65614000, + 0xAD624010, 0xF4604008, 0xEE218808, 0x93800073, + 0xE5631FEC, 0x8B6B4000, 0x846A1FF4, 0xF3604000, + 0xC3614004, 0x95634008, 0xAD624010, 0xCB624014, + 0xBB218001, 0xD0970073, 0xFA068000, 0x8C6B4008, + 0xE6691FF2, 0x92634000, 0x83614004, 0xF4604008, + 0xAD624010, 0xD6218200, 0xD0970073, 0xBC6B1FEC, + 0x918B4000, 0xE2631FE4, 0xF0681FF2, 0xB56040A0, + 0xE5691FF4, 0xB3604000, 0xB4604008, 0xCC614010, + 0x138C0400, 0x6470081C, 0x5270881D, 0x20F000A3, + 0x7C30FFFE, 0x33490000, 0x34310001, 0x5D200003, + 0x48D40071, 0x0931FFFF, 0x146540B4, 0x706B1FFE, + 0x216A1FF6, 0x7E33FFFF, 0x56D000BA, 0x336B1FF8, + 0x44624000, 0x03624008, 0x3B634010, 0x7F8C0480, + 0x17BC004B, 0x5E70011F, 0x6470081C, 0x1270881D, + 0x08F000B8, 0x538000BC, 0x7F8C0480, 0x17BC004B, + 0x6C6840A0, 0x30694024, 0x2F090000, 0x7FC8017A, + 0x23024000, 0x6E2E0001, 0x4B624014, 0x2F31FFFB, + 0x47684028, 0x1370001F, 0x3734001F, 0x57184000, + 0x592C0001, 0x17020000, 0x24240008, 0x6934FFE0, + 0x04300005, 0x65691FF4, 0x506040A2, 0x366040A6, + 0x592C0001, 0x2F090000, 0x10C400DF, 0x7A6940A0, + 0x0E050000, 0x722DFFFF, 0x6A31FFFE, 0x30510000, + 0x30510000, 0x61691FFA, 0x4E050000, 0x322DFFFF, + 0x6A31FFFE, 0x30510000, 0x30510000, 0x592C0001, + 0x8434FFFE, 0xC4601FEC, 0xF526000C, 0xB0621FEA, + 0xD126005F, 0xBA200060, 0xBA230000, 0xCB0B2000, + 0xF22DFFFF, 0x816140AA, 0x8F2D0001, 0xEA072000, + 0xBF6B1FEA, 0xD4004000, 0xFA30FFFD, 0xAF0AC000, + 0xFA230000, 0xA6631FEA, 0x8B0B2000, 0xFA20000C, + 0xBA230000, 0xF4290007, 0xF9C400F9, 0x95250007, + 0x9B8000FA, 0xED210007, 0xCD084000, 0xB61B4000, + 0xF9634088, 0x986940AA, 0xBA30FFFD, 0xCF2D0001, + 0xAA072000, 0xF22A0008, 0xD5621FE8, 0xB5008000, + 0xEE2E0001, 0xA934FFE0, 0x84300005, 0xD92C0001, + 0xF46B1FF0, 0x8B691FEC, 0xA1601FEE, 0xCD074000, + 0x92634000, 0xDD33FFFE, 0xC7530000, 0x87530000, + 0xC7530000, 0x87530000, 0x85330002, 0xD5634008, + 0xB9070000, 0xE52B0003, 0xE4280004, 0x8FC00130, + 0x992C0001, 0xDA604010, 0xFF8C0480, 0x97BC004B, + 0xDE70011F, 0x9570001C, 0x9270881D, 0xE3F0011F, + 0x07691FFE, 0x66684024, 0x4931FFFF, 0x1BD0012F, + 0x40691FF6, 0x02140000, 0x3ED00177, 0x4D084000, + 0x51694028, 0x2135001F, 0x3930FFFB, 0x57184000, + 0x3BC80174, 0x592C0001, 0x40601FE2, 0x1370001F, + 0x75008000, 0x3E3CFFFF, 0x18218000, 0x6C110000, + 0x1D33FFFE, 0x50340010, 0x57C8013B, 0x0B41C000, + 0x27270002, 0x47530000, 0x5180013D, 0x07530000, + 0x4B41C000, 0x38681FEE, 0x3A6940A0, 0x5A604010, + 0x0B6B4000, 0x7904C000, 0x592C0001, 0x0434FFFE, + 0x43614004, 0x34604008, 0x2268401C, 0x7F8C0480, + 0x57BC004B, 0x1E70011F, 0x1570001C, 0x6D70821D, + 0x07F0014C, 0x7E340008, 0x73C8015E, 0x07691FFE, + 0x66684024, 0x0931FFFF, 0x30D0015E, 0x40691FF6, + 0x02140000, 0x7ED00177, 0x4D084000, 0x11694028, + 0x3930FFFB, 0x6135001F, 0x57184000, 0x3BC80174, + 0x592C0001, 0x00601FE2, 0x1370001F, 0x6D691FE8, + 0x9F20000E, 0xF4310001, 0xC931FFFF, 0xB4D00166, + 0xE42CFFFF, 0x94800162, 0xBC694000, 0xC62207FA, + 0xCC6B4008, 0xA46140A8, 0xB26340A4, 0xE36240AC, + 0xB16040AE, 0xD77000B2, 0xFF8C0480, 0x97BC004B, + 0xF8700484, 0x9CE00171, 0xB8200001, 0xF6800071, + 0xBF200009, 0xD370001F, 0xF6800071, 0x9E200005, + 0x9370001F, 0xF6800071, 0xFB200007, 0x9370001F, + 0xF3C80071, 0x84631FE0, 0xBA230000, 0xE9631FFE, + 0x3F970099, 0x433C0001, 0x7CC80185, 0x033C0001, + 0x558001CA, 0x37681FFA, 0x136040A4, 0x5D8C0180, + 0x57BC004B, 0x1A700184, 0x39E0018A, 0x7D6940A8, + 0x096840A2, 0x65614000, 0x592C0001, 0x346B1FF0, + 0x5A604010, 0x15634008, 0x1D8C0180, 0x57BC004B, + 0x1570001C, 0x5270881D, 0x62691FFC, 0x322DFFFF, + 0x17C801AE, 0x54004000, 0x4034FFF0, 0x1A20000B, + 0x68CC01CA, 0x2A6A1FEC, 0x0100C000, 0x4D048000, + 0x936340A8, 0xF26340A4, 0xFF8C0480, 0x97BC004B, + 0xDA700184, 0xB4E001A5, 0xB26040A8, 0xCD048000, + 0xDD8C0180, 0x97BC004B, 0x99700284, 0xF0E001AB, + 0xB22DFFFF, 0xE8CC01A6, 0xD5681FF0, 0x8B691FEC, + 0xCE050000, 0xA16A1FF6, 0xB86B1FE2, 0xF26040A8, + 0x856140A4, 0xE36240AC, 0xF4681FFC, 0x862B0002, + 0xA42CFFFF, 0xD06340AE, 0xF96040B2, 0x968C5080, + 0xD7BC004B, 0xB8700484, 0x9CE001BE, 0xFE201FE8, + 0x85500001, 0xE4300002, 0xD36040A4, 0x9B200000, + 0xF66040A6, 0x9D8C0180, 0x97BC004B, 0xDA700184, + 0xD7E001C8, 0xB8200001, 0x9D6B1FE0, 0xD18B4000, + 0x87631FE6, 0xE6691FF2, 0xC06A1FFA, 0x83614004, + 0xE5691FF4, 0xB3621FDA, 0xAA614014, 0xD4004000, + 0x86240002, 0xC434FFFE, 0xE1601FD8, 0xBA054000, + 0xA26A1FF0, 0xCC614010, 0xC4624000, 0xAF060000, + 0xEF060000, 0xB1260002, 0x83624008, 0xD6218200, + 0x10970073, 0x516B1FF2, 0x6F060000, 0x39070000, + 0x74634004, 0x03624008, 0x10970073, 0x57020000, + 0x7B694008, 0x15681FF0, 0x3A098000, 0x7A068000, + 0x3197007F, 0x78681FD8, 0x476A1FF2, 0x00691FF6, + 0x736B1FF8, 0x2F060000, 0x21270001, 0x6537FFFE, + 0x2F05C000, 0x746B1FF0, 0x59611FF6, 0x3904C000, + 0x1E621FF2, 0x6E601FFA, 0x4C601FF0, 0x138C0400, + 0x5997017D, 0x01030000, 0x223F0001, 0x6DCC026A, + 0xB18C0100, 0xCF6A1FD8, 0xC3691FF0, 0x94004000, + 0xFA098000, 0x8D048000, 0xB197007F, 0xF6010000, + 0xEA684000, 0xBA098000, 0xBA068000, 0xF197007F, + 0xB36B1FF8, 0xC0691FF6, 0xE1270001, 0xA537FFFE, + 0xCE09C000, 0x996B1FD8, 0x876A1FF2, 0xD9611FF6, + 0xAF0AC000, 0xDE621FF2, 0xD38C0400, 0x9997017D, + 0xBC6B1FDA, 0xCF6A1FD8, 0xC3691FF0, 0x8F631FFA, + 0xFA098000, 0x9A611FF0, 0x81030000, 0xE23F0001, + 0x2DCC026A, 0x718C0100, 0x54004000, 0x0D048000, + 0x5260400C, 0x0D048000, 0x06240002, 0x66691FF2, + 0x446A1FF4, 0x3C30FFFE, 0x26500000, 0x66500000, + 0x24300002, 0x7197007F, 0x4B624014, 0x2A6B400C, + 0x77260001, 0x03691FF0, 0x21280001, 0x6D624010, + 0x34604008, 0x43614004, 0x52634000, 0x162A0001, + 0x1B058000, 0x6A31FFFE, 0x70510000, 0x30510000, + 0x6C078000, 0x1D33FFFE, 0x07530000, 0x47530000, + 0x3D218002, 0x50970073, 0x71260002, 0x2D624010, + 0x61691FFA, 0x1A6A4008, 0x03614004, 0x43624008, + 0x7B218001, 0x10970073, 0x30681FF2, 0x7C694000, + 0x04624000, 0x55604004, 0x526B1FF4, 0x22614008, + 0x5807C000, 0x27270002, 0x3B634010, 0x56218200, + 0x10970073, 0x7B694008, 0x43624008, 0x196B1FD8, + 0x25614000, 0x79070000, 0x73681FF4, 0x34634004, + 0x5A604010, 0x3B218001, 0x10970073, 0x62624004, + 0xA26A1FF0, 0xD8040000, 0xC4624000, 0x83624008, + 0xFC604014, 0xB6218018, 0x90970073, 0xE562400C, + 0xD38C0400, 0xB8200001, 0x9E6B1FE6, 0xD18B4000, + 0xA2631FE4, 0xD5681FF0, 0xD260400C, 0x84691FF8, + 0xF4611FDE, 0x846A1FF4, 0xB0621FDC, 0xFA0A4000, + 0x820E4000, 0xC5D40277, 0xE3024000, 0x92260003, + 0xB336FFFE, 0xC0601FE2, 0xCD048000, 0xA5601FE0, + 0xCD048000, 0xBA068000, 0xBB621FF0, 0xCD048000, + 0x25601FD6, 0x4B68400C, 0x76970077, 0x226A1FF0, + 0x4B68400C, 0x0D048000, 0x36970077, 0x656A1FF8, + 0x59681FE2, 0x346B1FF0, 0x3904C000, 0x40691FF6, + 0x3197007F, 0x538C0400, 0x476B4024, 0x22631FD2, + 0x4D378000, 0x23CC035A, 0x3C681FE0, 0x746B1FF0, + 0x3904C000, 0x66691FF2, 0x446A1FF4, 0x3197007F, + 0x19681FE2, 0x7C30FFFE, 0x45500001, 0x3C681FE0, + 0x66691FF2, 0x3197007F, 0x3D201FD8, 0x66500000, + 0xA6500000, 0xE6691FF2, 0xEA31FFFE, 0x87494000, + 0xF4310001, 0x80D4035D, 0x8931FFFF, 0xDB200000, + 0xC0601FD4, 0x99230001, 0x8F220001, 0xC100C000, + 0x97148000, 0xDCC802B2, 0xD9681FD4, 0x8D048000, + 0xC0601FD4, 0x8D074000, 0xBA054000, 0xFA068000, + 0xA9CC02AB, 0xD9681FE2, 0xF46B1FF0, 0xB904C000, + 0x8D210000, 0xCC6A1FDE, 0xDF970361, 0xBC30FFFE, + 0xE5480000, 0x8D388000, 0xA2300001, 0xD7D002C2, + 0x96250001, 0xF88002BE, 0xF63D0000, 0x94C802F4, + 0xD38C0400, 0x8B614018, 0x93218040, 0xD0970073, + 0xD9681FD4, 0x8F691FE2, 0xAA31FFFE, 0xC7494000, + 0xAA072000, 0xEE210001, 0xE56B4018, 0x9F3FFFFF, + 0xE1270001, 0x8D11C000, 0xB22DFFFF, 0xC1164000, + 0x996B1FD8, 0xD38C0400, 0xF0694024, 0x95611FD2, + 0xBAC802EC, 0xEF1F8000, 0xDEC802E5, 0x96621FD8, + 0xF0681FF2, 0x862107F6, 0xBC970360, 0xCF220001, + 0x0B624014, 0x7C681FD6, 0x74604008, 0x3B218001, + 0x50970073, 0x2A691FD6, 0x19681FE2, 0x446A1FF4, + 0x77260001, 0x1F970361, 0x31218010, 0x50970073, + 0x19681FE2, 0x4D210000, 0x446A1FF4, 0x37260001, + 0x5F970361, 0x13218040, 0x10970073, 0x798002B5, + 0x3C681FE0, 0x746B1FF0, 0x7904C000, 0x15604004, + 0x19681FE2, 0x7904C000, 0x73604000, 0x0C6A1FDE, + 0x7F6B1FDC, 0x1D634014, 0x2F0AC000, 0x570EC000, + 0x05D40302, 0x7602C000, 0x6D624010, 0x37218400, + 0x50970073, 0x0C691FD2, 0x2F1C4000, 0x44CC030F, + 0x6A31FFFE, 0x11484000, 0x033C0001, 0x492D0002, + 0x07494000, 0x57184000, 0x79C80350, 0x138C0400, + 0x40684020, 0x22300001, 0x18D0035A, 0x64300002, + 0x33D0031D, 0x6A684000, 0x5A694004, 0x15604004, + 0x25614000, 0x43684010, 0x73694014, 0x3C604014, + 0x4C614010, 0x0B6B4000, 0x15634008, 0x47631FD0, + 0xB2218020, 0xD0970073, 0xF1D00326, 0xBC681FE0, + 0xCF691FE2, 0xB3800328, 0x99681FE2, 0xEA691FE0, + 0xC46A1FF4, 0xB7260001, 0x9F970361, 0xD38C0400, + 0x916A4024, 0xF2218020, 0xD0970073, 0xBF681FD0, + 0xCE0A0000, 0xB7260001, 0xAA691FE0, 0xF46B1FF0, + 0xAF05C000, 0xCD1D0000, 0xE2CC033D, 0x99681FE2, + 0xAA691FE0, 0xE5601FE0, 0xD6611FE2, 0xBB681FDE, + 0xC7601FDC, 0x95621FDE, 0x99681FE2, 0xE6691FF2, + 0xBC970360, 0xF46A4010, 0xCD048000, 0xBC30FFFE, + 0xD38C0400, 0x844B0000, 0xA6500000, 0xE6500000, + 0xC13F0000, 0xBCC802B5, 0xB1218010, 0xD0970073, + 0xA22CFFFC, 0xD38C0400, 0xE6500000, 0xB98002B5, + 0xCF691FE2, 0xBC681FE0, 0x846A1FF4, 0xF197007F, + 0x8B624014, 0xF8200001, 0xCD210000, 0xAA6B400C, + 0xAD631FF0, 0xF6800071, 0xD2200017, 0xAD210007, + 0xDC800357, 0x9D200003, 0x8321001F, 0xDC800357, + 0x046A1FF4, 0x6D624010, 0x4B624014, 0x33604000, + 0x43614004, 0x34604008, 0x118B4000, 0x47631FE6, + 0x56681FF6, 0x04691FF8, 0x046A1FF4, 0x6E601FCC, + 0x3B611FCA, 0x7C621FF8, 0x52260003, 0x3336FFFE, + 0x7C621FCE, 0x346B1FF0, 0x2C078000, 0x6C078000, + 0x2E631FF6, 0x6C078000, 0x6D631FF0, 0x1097026C, + 0x033C0001, 0x72C8037C, 0x433C0001, 0x3980039A, + 0x55681FF0, 0x256A1FCE, 0x2C088000, 0x76970077, + 0x83691FF0, 0xE56A1FCE, 0xF5034000, 0x94004000, + 0xEC078000, 0x92634000, 0xAC088000, 0xEC088000, + 0xD4970084, 0x83691FF0, 0xA56A1FCE, 0xD4004000, + 0xAC088000, 0xFC30FFFE, 0xC5500001, 0xA7280002, + 0xE4300002, 0xAC088000, 0xAC088000, 0xCC601FF0, + 0x94970084, 0xE1691FCC, 0xC36A1FCA, 0x99611FF6, + 0xBC621FF8, 0xF8200001, 0xD38C0400, 0x9E6B1FE6, + 0xD18B4000, 0xAC220000, 0xBE8003A4, 0xD8224000, + 0x3E8003A4, 0x79228000, 0x7E8003A4, 0x0D22C000, + 0x7F621FFE, 0x07631FE6, 0x3F970099, 0x526B1FF4, + 0x44270003, 0x2537FFFE, 0x22631FBE, 0x76010000, + 0x033C0001, 0x718C0100, 0x67CC04E2, 0x3E6A40A2, + 0x6B6840A8, 0x37260001, 0x1A970658, 0x70681FF2, + 0x046A1FF4, 0x5A970658, 0x77260001, 0x3336FFFE, + 0x276240A2, 0x416240A6, 0x7D6940A8, 0x2D6A1FBE, + 0x70611FBC, 0x13201FC0, 0x13230010, 0x5B058000, + 0x2A410000, 0x5F2C0002, 0x452FFFFF, 0x2BCC03BF, + 0x56681FC0, 0x2E32FFFC, 0x36970077, 0x7B970638, + 0x4F691FD4, 0x30681FF2, 0x0F220001, 0x7197061F, + 0x306B1FFE, 0x7E33FFFF, 0x74D0052F, 0x3B6B1FBE, + 0x66691FF2, 0x0B6A1FD6, 0x2F05C000, 0x7797062A, + 0x00691FC0, 0x4F220001, 0x7E97063D, 0x2D691FDE, + 0x0A220004, 0x7E97063D, 0x6A6A1FDA, 0x21691FFA, + 0x7797062A, 0x2E691FD8, 0x3B6B1FBE, 0x70681FF2, + 0x89220002, 0xF904C000, 0xF904C000, 0xB197061F, + 0xD2970628, 0xB06B1FFE, 0xA1691FFA, 0xE31BC000, + 0xCAD403EF, 0xBB6B1FBE, 0xA26A1FC6, 0xEF05C000, + 0xAF05C000, 0xF797062A, 0xDF8003F2, 0x80691FC0, + 0xD5681FC6, 0xB0970614, 0x8B691FDA, 0xF0681FC4, + 0xA26A1FC6, 0xD46040AC, 0xE46140A8, 0xA46240A4, + 0xBA8C5000, 0xD4700384, 0xFA970605, 0x8D21889C, + 0xC5614092, 0xBA8C5000, 0xB1700080, 0xCF691FE2, + 0xB597064B, 0xE9204096, 0xC0502A27, 0xA15030A7, + 0xE9204096, 0xAA504A52, 0x995024A5, 0xD1970642, + 0xEF502E27, 0xBF502084, 0xB7970646, 0xC450292F, + 0x91970642, 0xE76B4080, 0xF2370020, 0xA2CC0444, + 0xE9503548, 0xA1501CE4, 0xB7970646, 0xF85024A9, + 0x91970642, 0xE150A148, 0xC55035A4, 0xB7970646, + 0x94502530, 0xD1970642, 0xC7502929, 0x8C5035B3, + 0xF7970646, 0xBF502108, 0x91970642, 0xF55025A9, + 0x2E502CA6, 0x77970646, 0x4A50288A, 0x11970642, + 0x7150B4EB, 0x0C509525, 0x37970646, 0x7B501086, + 0x51970642, 0x27502D67, 0x215035AD, 0x77970646, + 0x2350198F, 0x51970642, 0x676B4080, 0x00631FEE, + 0x715098C4, 0x1E509DB1, 0x37970646, 0x4A50316C, + 0x11970642, 0x40509148, 0x4F502CC6, 0x37970646, + 0x20503590, 0x51970642, 0x7A5099AB, 0x01194000, + 0x5CC80447, 0x3597064B, 0x2D204098, 0x615030A7, + 0x37970646, 0x595024A5, 0x51970642, 0x35800408, + 0x7A8C5000, 0x34200013, 0x398004E3, 0x7A8C5000, + 0x716A4080, 0x3B681FDE, 0x24360020, 0x4ECC04F2, + 0x2D6A1FBE, 0x76970077, 0x7B970638, 0x0F220001, + 0x6D691FDE, 0x3E97063D, 0x0C691FD2, 0x7B6B1FBE, + 0x37681FFA, 0x4F220001, 0x7904C000, 0x3197061F, + 0x12970628, 0x7B6B1FBE, 0x66691FF2, 0x086A1FD0, + 0x6F05C000, 0x2F05C000, 0x3797062A, 0x6E691FD8, + 0xBB6B1FBE, 0xF0681FF2, 0xCF220001, 0xB904C000, + 0xF904C000, 0xB197061F, 0x92970628, 0xD8700090, + 0xFA970605, 0xBA8C5000, 0xA9204096, 0xEA504A52, + 0x815029E5, 0xE9204096, 0xEA504A52, 0xBC502491, + 0xD1970642, 0x8150292A, 0xB95020B1, 0xF7970646, + 0x9D501264, 0xD1970642, 0xC0502D04, 0xBD5040B0, + 0xB7970646, 0xD25024E5, 0xD1970642, 0x8B50A088, + 0xDC504130, 0xB7970646, 0xAC502D4B, 0xD1970642, + 0x2A504A52, 0x45502924, 0x77970646, 0x27502CEB, + 0x51970642, 0x24502E0B, 0x3D5011AA, 0x77970646, + 0x7F502108, 0x11970642, 0x2A504A52, 0x45502E6B, + 0x37970646, 0x555020C8, 0x51970642, 0x3250AD0B, + 0x66502925, 0x11970642, 0x03501E52, 0x5550166B, + 0x37970646, 0x4C5019AA, 0x51970642, 0x2A504A52, + 0x115020C6, 0x77970646, 0x595024A5, 0x11970642, + 0x6A504A52, 0x01502D0F, 0x37970646, 0x4E502884, + 0x91970642, 0xCA50296A, 0xD3502188, 0x91970642, + 0xE650A509, 0xA4502944, 0x91970642, 0xEA504A52, + 0xD95024C9, 0x91970642, 0xAD50A549, 0xD5502144, + 0xB7970646, 0xD1502669, 0xD1970642, 0x95681FC6, + 0xFA8C5000, 0xA76B4080, 0xBC30FFFE, 0xDF370008, + 0x80CC04B7, 0xF320001B, 0xF98004E3, 0x85500001, + 0xB06B1FFE, 0xED204098, 0xE31BC000, 0x8DD404C4, + 0xFF5010E4, 0xAD204098, 0xB35014E5, 0xF7970646, + 0xAB5018E6, 0xD1970642, 0xF18C0100, 0xB180051F, + 0xEB5018E6, 0xB46B1FF0, 0x96681FF6, 0xC4691FF8, + 0xCC631FCA, 0xAE601FCC, 0x9D611FCE, 0xF0681FC4, + 0xA5691FF4, 0xF46B1FC6, 0xCF2D0001, 0x9D611FF8, + 0xED631FF0, 0x8F601FF6, 0xBA8C5000, 0xD097026C, + 0x956B1FCA, 0xC06A1FCC, 0xC4691FCE, 0xAD631FF0, + 0xB8621FF6, 0xDD611FF8, 0xD38C0400, 0x833C0001, + 0xE7CC04E2, 0x80691FC0, 0xBA97065F, 0xE5691FC2, + 0x3A97065F, 0x7180051F, 0x433C0001, 0x3423001F, + 0x44601FEC, 0x00631FEE, 0x2D6A1FBE, 0x47691FFE, + 0x55681FF0, 0x01194000, 0x14038000, 0x43D404ED, + 0x3A068000, 0x4E06C000, 0x76970077, 0x1D681FEC, + 0x596B1FEE, 0x1480052B, 0x0F6A1FEE, 0x4E6B4090, + 0x33320005, 0x4D1EC000, 0x6D360001, 0x12C804FB, + 0x1920000D, 0x5A230007, 0x598004E4, 0x2D6A1FBE, + 0x55681FF0, 0x07691FFE, 0x14038000, 0x7A068000, + 0x01194000, 0x47D40503, 0x4E06C000, 0x36970077, + 0x61691FFA, 0x15681FF0, 0x046A1FF4, 0x55970616, + 0x6D6A1FBE, 0x166B1FFA, 0x15681FF0, 0x6C078000, + 0x34634004, 0x4D048000, 0x74604008, 0x26691FF2, + 0x446A1FF4, 0x25614000, 0x0B624014, 0x72218020, + 0x266A1FFE, 0x50970073, 0x411A8000, 0x0FD40529, + 0x3B6B1FBE, 0x55681FF0, 0x5807C000, 0x3904C000, + 0x7C30FFFE, 0x05500001, 0x31800529, 0x6D6A1FBE, + 0x80691FC0, 0xD1681FFE, 0xD4038000, 0xA3180000, + 0xE8D40526, 0xBA068000, 0x8E06C000, 0xD5681FF0, + 0xD5970616, 0xBA230000, 0xB8200001, 0xD38C0400, + 0xBC634018, 0xDE6B1FE6, 0xD18B4000, 0xAD691FDE, + 0xCF220001, 0xBE97063D, 0xA16A1FC0, 0xE1691FFA, + 0xB797062A, 0xFB6B1FBE, 0xE1691FFA, 0x8F6A1FD8, + 0xAF05C000, 0xF797062A, 0xC76A1FC4, 0x80691FF6, + 0xF797062A, 0xBB6B1FBE, 0x80691FF6, 0xEA6A1FDA, + 0xAF05C000, 0xF797062A, 0xD1681FFE, 0xA3180000, + 0xD3D0054C, 0xAD691FDE, 0xB3681FC2, 0xF6970617, + 0xED691FDE, 0x95681FC6, 0xB6970617, 0xDA800558, + 0xBB6B1FBE, 0xE1691FFA, 0xC46A1FC2, 0xAF05C000, + 0xEF05C000, 0xB797062A, 0xBB6B1FBE, 0xC0691FF6, + 0xA26A1FC6, 0xEF05C000, 0xEF05C000, 0xB797062A, + 0x98700090, 0xFA970605, 0xFA8C5000, 0xB1700080, + 0xE9204096, 0xAA504A52, 0xB15024E4, 0xE9204096, + 0x2A504A52, 0x425030A6, 0x51970642, 0x1450B12C, + 0x515020F0, 0x37970646, 0x085028B1, 0x51970642, + 0x7E50A90A, 0x3E50AD8C, 0x11970642, 0x5050456B, + 0x2850BD4A, 0x77970646, 0x676B4080, 0x00631FEE, + 0x71700080, 0x0E50352B, 0x11970642, 0x596B1FEE, + 0x316A4080, 0x63330006, 0x6BD4057A, 0x35320006, + 0x35D005B1, 0x518004F8, 0x6A504A52, 0x0B502D8B, + 0x77970646, 0x37502531, 0x11970642, 0x7C50252B, + 0xB950210B, 0xF7970646, 0xED5018E5, 0x91970642, + 0xEA504A52, 0x99503CCF, 0xB7970646, 0xD1502669, + 0xD1970642, 0x8F50A52F, 0x835018CB, 0xD1970642, + 0xAA504A52, 0xD2503E69, 0xF7970646, 0x9250112C, + 0xD1970642, 0xBF50B5ED, 0x8950326C, 0xD1970642, + 0xAA504A52, 0xC15035AA, 0xD1970642, 0xB250B50D, + 0x92502533, 0xD1970642, 0xC3501E52, 0x9650166D, + 0xD1970642, 0xBB970638, 0xBB6B1FBE, 0xE6691FF2, + 0x0B6A1FD6, 0x6F05C000, 0x7797062A, 0x3B6B1FBE, + 0x66691FF2, 0x086A1FD0, 0x2F05C000, 0x6F05C000, + 0x7797062A, 0x3A970605, 0x3A8C5000, 0x69204096, + 0x2A504A52, 0x515020C6, 0x69204096, 0x2A504A52, + 0x5580049A, 0x3B970638, 0x3B6B1FBE, 0x66691FF2, + 0x0B6A1FD6, 0x6F05C000, 0x7797062A, 0x08691FDC, + 0x1D681FDA, 0x70970614, 0x4B691FDA, 0x09220002, + 0x7E97063D, 0x08691FDC, 0x15681FC6, 0x76970617, + 0x03691FC6, 0x6A220003, 0x7E97063D, 0x3A970605, + 0x7A8C5000, 0x31700080, 0x29204096, 0x6A504A52, + 0x7F502084, 0x29204096, 0x2A504A52, 0x6C503611, + 0x11970642, 0x6A504A52, 0x46502D07, 0x37970646, + 0x6C5034AD, 0x11970642, 0x2A504A52, 0x595024A5, + 0x37970646, 0x665029B0, 0x51970642, 0x27503144, + 0x1A50252F, 0x77970646, 0x4150194A, 0x11970642, + 0x745010C8, 0x0750318C, 0x37970646, 0x695028D1, + 0x91970642, 0xD2502569, 0xEC5019AD, 0xB7970646, + 0xDD501264, 0x91970642, 0x9F50B08C, 0xE8502D29, + 0xF7970646, 0xAD5019A6, 0x91970642, 0xEA504A52, + 0xB550166C, 0xF7970646, 0xDE502191, 0x91970642, + 0xF250AD0B, 0xAD502953, 0x91970642, 0xEA504A52, + 0xA950326B, 0xF7970646, 0xDE5011AB, 0x91970642, + 0x9950B585, 0xD2502533, 0xD1970642, 0xAA504A52, + 0xC75035A9, 0x91970642, 0xB950B54D, 0xC5502E6B, + 0x11970642, 0x43501E52, 0x5650166D, 0x11970642, + 0x7880059D, 0x2D6A1FBE, 0x00691FC0, 0x4B624014, + 0x4B32FFFE, 0x3A098000, 0x25614000, 0x456140A4, + 0x0F691FD4, 0x696A1FDC, 0x62614008, 0x25691FF4, + 0x62624004, 0x0F2D0001, 0x0C614010, 0x518B4000, + 0x046A1FF4, 0x6E2E0001, 0x6D624010, 0x25614000, + 0x34604008, 0x538C0400, 0x5570001C, 0x1270881D, + 0x5B058000, 0x0D048000, 0x118B4000, 0x73604000, + 0xB3681FF4, 0xE2614008, 0xDA604010, 0x938C0400, + 0xEA624018, 0x97020000, 0xB4218080, 0xD3800073, + 0xED684008, 0x99800634, 0xA5631FEC, 0xE5614000, + 0x83624008, 0xF5008000, 0xE9218800, 0x90970073, + 0xC46A1FF4, 0x9A970658, 0xAD684008, 0xFC6B1FEC, + 0xB26040A8, 0xFA8C5000, 0xDA700184, 0x918B4000, + 0x846A1FF4, 0xE9691FBC, 0xED624010, 0x856140A4, + 0xD18B4000, 0x94004000, 0xAA31FFFE, 0xD38C0400, + 0xBF424000, 0xD9800634, 0xD68C5080, 0x97BC004B, + 0xE9204096, 0x918B4000, 0x968C5080, 0xD7BC004B, + 0xE9204096, 0xAA504A52, 0x918B4000, 0xD6681FF6, + 0xB22DFFFF, 0xE3024000, 0xF736FFF0, 0xB0320003, + 0xFC30FFFE, 0xAF060000, 0x874A8000, 0xD4004000, + 0x9E34000F, 0xCD120000, 0xC1624090, 0x918B4000, + 0x8D048000, 0xFC30FFFE, 0xE6500000, 0xA6500000, + 0xE6500000, 0xA6500000, 0x918B4000, 0xE26A1FC6, + 0x246140A8, 0x646240A4, 0x718C0100, 0x1A700184, + 0x476A1FF2, 0x22624004, 0x046A1FF4, 0x4B624014, + 0x65614000, 0x22614008, 0x318C0100, 0x50694080, + 0x0C350001, 0x47CC066F, 0x518B4000, 0x2E2E0001, + 0x6D624010, 0x32218020, 0x13800073, 0x0079084F +}; + +static const uint32_t fw0_boot_img_data_buf[] = +{ + 0x3F200503, 0x6E210001, 0x6A710249, 0x38200001, + 0x5460B41C, 0x1397008C, 0x0D210000, 0x4931FFFF, + 0x6D390001, 0x242CFFFF, 0x00CC0007, 0x736AB1F8, + 0x2361B140, 0x6F3A0000, 0x4FCC0013, 0x1F200777, + 0x5860B438, 0x1F60B45C, 0x14800017, 0x5D200333, + 0x1860B438, 0x5F60B45C, 0x7E60B43C, 0x0520FFFF, + 0x3660B420, 0x4D210000, 0x6F68B420, 0x0561B422, + 0x4934FEFE, 0x22300001, 0x3660B420, 0x4661B424, + 0xA361B426, 0xE761B428, 0xC261B42A, 0x8161B42C, + 0xE461B42E, 0xAF61B434, 0x8A61B436, 0xD397008C, + 0xCE21A0CA, 0xB9228000, 0xBF424000, 0xE12D0100, + 0xA42CFFFF, 0xE8CC002A, 0xCB710449, 0x83B80032, + 0xD8224000, 0x98800033, 0xAC220000, 0xC3210045, + 0x8661B424, 0xFA230000, 0xF663B42C, 0x9397008C, + 0xA9232000, 0xC662B428, 0xD863B434, 0x9269B1F8, + 0xCE390000, 0xABCC0040, 0x89210777, 0xF5800041, + 0x8B210333, 0xF38C0078, 0xD6BC0076, 0x8E61B438, + 0xE42CFFFF, 0x87CC0039, 0x85710649, 0xD397008C, + 0xEB21A0C8, 0xAC220000, 0xBF424000, 0xC92D0002, + 0xBF424000, 0xCC2D00FE, 0xE42CFFFF, 0x89CC004A, + 0xC468B1F8, 0x8D223000, 0x98380000, 0xC0CC005D, + 0x96711049, 0xE5B8005A, 0xEF204000, 0xBF222000, + 0x91230071, 0xD2800078, 0xDB200000, 0x91230071, + 0xD2800078, 0xB7712049, 0x82B80063, 0xF9214000, + 0x3A230000, 0x7F222000, 0x79800065, 0x0D210000, + 0x7A230000, 0x0C20B424, 0x2C500011, 0x45500001, + 0x6850C400, 0x05500001, 0x0161B42C, 0x5363B42E, + 0x0E62B434, 0x7C230333, 0x738C0078, 0x16BC0076, + 0x7963B438, 0x1B200000, 0x3560B140, 0x69710149, + 0x3C8C0000, 0x73800074, 0x7971FF49, 0x33800074, + 0x15320001, 0x45367FFF, 0x75C8008B, 0x322A0008, + 0x4DC00087, 0x26500000, 0x26500000, 0x66500000, + 0xA6500000, 0xE6500000, 0xE6500000, 0xA6500000, + 0xE6500000, 0xB5C8008B, 0x9480007B, 0xD3260008, + 0xE6500000, 0x932EFFFF, 0x8BCC0088, 0xD18B4000, + 0x8468B1F8, 0xDE34000F, 0xDBC80093, 0xA028000A, + 0xFAC40093, 0x8124000A, 0x918B4000, 0xF920000A, + 0x918B4000, 0xE0000000, 0xE0000000, 0xA0000000 +}; + +static const uint32_t fw0_master_img_data_buf[] = +{ + 0x3F200503, 0x6E210001, 0x5E605FF4, 0x2D615FF6, + 0x5B200000, 0x3260B148, 0x0D205FE0, 0x5C215FE8, + 0x7D230008, 0x2F090000, 0x23C000F3, 0x78200001, + 0x1460B41C, 0x719700B0, 0x539700BA, 0x0E208000, + 0x7560B140, 0x20000000, 0x20000000, 0x60000000, + 0x25685FFE, 0x5269B1F8, 0x626B5FFA, 0x353C4600, + 0x2CCC0012, 0x793B0000, 0x48D4001D, 0x1B3700FF, + 0x5763B47A, 0x1D200333, 0x1860B438, 0x5F60B45C, + 0xBE60B43C, 0xFC230003, 0xF722B400, 0x8520FFFF, + 0xE9408000, 0x8D210000, 0xB0488000, 0xF1260002, + 0xFF418000, 0x8934FEFE, 0xA2300001, 0xD02A0002, + 0xA9408000, 0xFE260020, 0xC52FFFFF, 0x8CCC0023, + 0xDB200000, 0x9F60B406, 0xB660B416, 0xF560B426, + 0x9C60B436, 0xD460B446, 0xFD60B456, 0xA16B5FFC, + 0x80210100, 0xE2222F00, 0xF4370080, 0x9FC8003E, + 0xCD210000, 0x8D223000, 0x8C20B424, 0xEC500011, + 0x85500001, 0xE850C400, 0xC5500001, 0xAA410000, + 0xDF2C0002, 0xA6500000, 0x8E62B434, 0xC8205E90, + 0xE6220164, 0xAF970F80, 0x9269B1F8, 0xEA220333, + 0x9B200000, 0xF38C0078, 0xD1BC00EB, 0xAF62B438, + 0xD060B424, 0xB560B426, 0xB9610102, 0xC835000F, + 0x9C610100, 0xC568B400, 0xF969B420, 0x99605FCA, + 0xA9615FCE, 0xFA3400FF, 0xD6380200, 0x9A605FCC, + 0xF235FF00, 0xAB390002, 0x84615FD0, 0xC1970F0D, + 0x38200001, 0x57605EA0, 0x502001A0, 0x2B60010C, + 0x7A203000, 0x0E60010E, 0x38200001, 0x7260B148, + 0x58695EA0, 0x39228000, 0x14004000, 0x433C0001, + 0x26CC006F, 0x4262B140, 0x50800075, 0x14004000, + 0x463C0004, 0x2DCC0075, 0x2C68B140, 0x543C4000, + 0x3560B140, 0x4835000F, 0x4931FFFF, 0x002D0079, + 0x26894000, 0x528C1D78, 0x5F800098, 0x378C1D7A, + 0x5F800098, 0x3E8C1DF8, 0x1F800098, 0x5B8C1DFA, + 0x9F800098, 0xF48C1D7C, 0xDF800098, 0x918C1D7E, + 0xDF800098, 0x988C1DFC, 0x9F800098, 0xFD8C1DFE, + 0xDF800098, 0xB18C1D79, 0x9F800098, 0xD48C1D7B, + 0x9F800098, 0xDD8C1DF9, 0xDF800098, 0xB88C1DFB, + 0xDF800098, 0x978C1D7D, 0x9F800098, 0xF28C1D7F, + 0x9F800098, 0xFB8C1DFD, 0xDF800098, 0x9E8C1DFF, + 0x95B000E9, 0xC8BC0BF6, 0xFDD80CC3, 0x90A00BF7, + 0xEBA40C1D, 0xA5A80C38, 0x8CF80EFB, 0xD3E80CE1, + 0x17E00107, 0x796A5EA0, 0x7F2300A6, 0x2B360002, + 0x5DC800A6, 0x38AC0E86, 0x38215EA2, 0x63220014, + 0x44970F9D, 0x3EC80068, 0x30884000, 0x58380000, + 0x36C80101, 0x78215EA2, 0x63220014, 0x27800FC0, + 0x5B200000, 0x3360B000, 0x3460B008, 0x4F220001, + 0x2B2D0008, 0x6D62B010, 0x7B60B01C, 0x08228800, + 0x0C62B01C, 0x518B4000, 0x4468B1F8, 0x36635E96, + 0x5E34000F, 0x01030000, 0x012B000A, 0x45C000C1, + 0x3920000A, 0x41030000, 0x4D210000, 0x0931FFFF, + 0x6D390001, 0x242CFFFF, 0x01CC00C3, 0x6361B140, + 0x79228000, 0x36010000, 0x10310008, 0x4D39A0CA, + 0x3F424000, 0x6C220000, 0x7F424000, 0x06220020, + 0x7C2DFFBA, 0x3F424000, 0x2C220000, 0x582DFF7C, + 0x3F424000, 0x6B2D0008, 0x7F424000, 0x0F220001, + 0x2B2D0008, 0x7F424000, 0x6C220000, 0x0D2D000C, + 0x7F424000, 0x08228800, 0x3F424000, 0x43220400, + 0xA462B144, 0xD7020000, 0xE13A0200, 0xA462B144, + 0xD92C0001, 0x852FFFFF, 0x80CC00C8, 0xEF6B5E96, + 0xD18B4000, 0x8222008D, 0x988000FC, 0xE4220089, + 0x988000FC, 0xC6220083, 0xD88000FC, 0x85220085, + 0xD88000FC, 0xA9220005, 0x988000FC, 0xE0220087, + 0x988000FC, 0xCC220007, 0xD88000FC, 0xA6220011, + 0x988000FC, 0xC122008B, 0xD88000FC, 0xAD22000B, + 0xEA625FF2, 0x99635FF0, 0xB1320008, 0xC562B148, + 0xB3D00102, 0xD18B4000, 0xF8200001, 0xB19700B0, + 0xD39700BA, 0xBC8C0000, 0x95800105, 0xF9695F20, + 0xFE20011B, 0x8E35C000, 0x91C8010E, 0xC9685F24, + 0x823D4000, 0xC5CC00A1, 0xDF2300A1, 0xB96A5EA0, + 0xE1210080, 0xB336FFFE, 0xA0625EA0, 0xFB655F21, + 0x9A8000AB, 0xF9695F20, 0xC9685F24, 0x8E35C000, + 0x973DC000, 0xF2C8010F, 0xD18B4000, 0xA9970F20, + 0xFBC801BB, 0x90605F24, 0x80685FFC, 0xCD210000, + 0x24615F2E, 0x7F340003, 0x5F2C012D, 0x30884000, + 0x5B200000, 0x3160B122, 0x30800131, 0x4A6BB124, + 0x5C695F22, 0x1B200000, 0x3B370001, 0x4ECC0137, + 0x3C65B123, 0x70800131, 0x5C800124, 0x1A800127, + 0x7B9700FB, 0x2868B122, 0x3D69B124, 0x7734001F, + 0x34310001, 0x6C110000, 0x62D401B1, 0x216B5FFC, + 0x0E645F20, 0x4537FF00, 0x67330008, 0x180B0000, + 0x4EC001AE, 0x3E6A5F24, 0x3F215F26, 0x462E0040, + 0x29408000, 0x7930FFFB, 0x4E2C4000, 0x0F970FDD, + 0x7A695F26, 0x1B2C000C, 0x29350003, 0x49CC01AA, + 0x7F215F26, 0x1122FFFE, 0x21970FF3, 0x5F695F24, + 0x1C2C0004, 0x524A0000, 0x422D0042, 0x3F424000, + 0x6E2E0001, 0x0B420000, 0x26971027, 0x64970C53, + 0x2C685F26, 0x7E695F28, 0x5B60B408, 0x2861B40A, + 0x09685F24, 0x5221B40E, 0x7D60B40C, 0x30510000, + 0x52200021, 0x3A60B404, 0x10200040, 0x5360B414, + 0x91200164, 0xC7210152, 0xFF2300A6, 0xA9800C7A, + 0xEF685F20, 0xB86A5FE8, 0xBA3400FF, 0xD3605F22, + 0xEE2E0001, 0xA1625FE8, 0x81030000, 0xF930FFFB, + 0xA72C4010, 0xD24A0000, 0xDC2C0004, 0xB3490000, + 0xD63B0400, 0x8F2D0001, 0xBA0A4000, 0xF9C40175, + 0x8D210000, 0xEA410000, 0xC9685F24, 0xB563B120, + 0xBE2C0038, 0xE6500000, 0xE6500000, 0xA6500000, + 0xE6500000, 0x802CFFF6, 0x924A0000, 0xE22CFFCA, + 0x0A6B5F2E, 0x5B368000, 0x63CC018A, 0x393B0000, + 0x50C801A6, 0x392F003C, 0x1D40C000, 0x46685F30, + 0x50605F24, 0x158001A6, 0x32605F2E, 0x793B0000, + 0x26CC018F, 0x5F605F30, 0x76800191, 0x392F003C, + 0x5D40C000, 0x39695F20, 0x2B68B124, 0x4F220001, + 0x3A230000, 0x6C3500FF, 0x6C0B4000, 0x2C12C000, + 0x17148000, 0x4FCC019F, 0x5A9700F7, 0x11230191, + 0x71635F24, 0x10200040, 0x198001B4, 0x69970F20, + 0x9EC801B9, 0xD0605F24, 0xEF685F20, 0xBE6A5F24, + 0xFA3400FF, 0x9780013E, 0xBA215FDA, 0xE4970F39, + 0xDE2301B3, 0xB78001C0, 0xAF685F20, 0xFF9700F5, + 0xBA3400FF, 0xF18001AF, 0xFB9700FB, 0xB7380400, + 0xD460B120, 0x89685F24, 0x86970F33, 0xDB200000, + 0xB96A5EA0, 0xED645F21, 0xCC3A0001, 0xA0625EA0, + 0x988000A6, 0xD523019F, 0xDE8001BC, 0x9F23011B, + 0xF1635F24, 0xBC2000C0, 0xAD645F21, 0xD88000A6, + 0xB5695F32, 0xCE208000, 0xD4150000, 0xB7C801C5, + 0xD18B4000, 0xBA605F32, 0xB62001C8, 0xDA8000AB, + 0xCC685FD8, 0x9F215FD8, 0x98380000, 0xDAC801ED, + 0xA0970F5B, 0xF9605F34, 0xF6010000, 0x9F2C0034, + 0xE5480000, 0x9E6A5FEC, 0x81030000, 0xDE34000F, + 0xAE2E0001, 0xC7625FEC, 0xEC220000, 0x8A625F3A, + 0xBA62013E, 0xC6330004, 0xFF37000F, 0x9A2F01DD, + 0xD18B4000, 0xB48003B5, 0x9B80053F, 0xF08006DD, + 0x138006EA, 0x53800200, 0x53800200, 0x13800200, + 0x53800200, 0x13800200, 0x13800200, 0x53800200, + 0x53800200, 0x13800200, 0x13800200, 0x4B800BC6, + 0x13800200, 0x79605F34, 0x7A605F32, 0x188000A6, + 0x682200C1, 0x15800203, 0x2C2200A3, 0x55800203, + 0x2722008F, 0x55800203, 0x45220085, 0x15800203, + 0x0B2200C0, 0x55800203, 0x6A2200A0, 0x15800203, + 0x492200A1, 0x15800203, 0x23220081, 0x55800203, + 0xA0220087, 0xD5800203, 0xEC220000, 0xA3685F32, + 0xEF625F38, 0xB3230208, 0x8B341000, 0xE8CC02A0, + 0xFB97035E, 0xA0685F34, 0xB66A5F38, 0xDA230218, + 0xBC2C0035, 0xF3460000, 0xF6695F34, 0x9D800273, + 0xE860013C, 0xB5635F46, 0xBB97035E, 0xF9200215, + 0x9C605F36, 0xDE970393, 0xC9CC0263, 0x90970236, + 0x856A010C, 0xFA680110, 0xFE2A01A0, 0xB5C801C8, + 0xD8380000, 0x8DCC01C8, 0x94620110, 0xE7970C63, + 0x0D6A0110, 0x4C20B424, 0x6C500011, 0x05500001, + 0x6850C400, 0x05500001, 0x2D5001A0, 0x66500000, + 0x4E62B434, 0x0821022C, 0x172301C8, 0x6B940C7D, + 0x3E6B0112, 0x672201A0, 0x5C62010C, 0x1B200000, + 0x4D6A0110, 0x06600112, 0x23600110, 0x793B0000, + 0x0ACC0385, 0x588000A6, 0x79635F38, 0x201A4000, + 0x0262B140, 0x6F6B5EA0, 0x57020000, 0x1F3B0004, + 0x76635EA0, 0x0D388000, 0x3A605F32, 0x75008000, + 0x07300003, 0x75605F4A, 0x75008000, 0x3F30FFF8, + 0x4F384001, 0x36605F4C, 0x2832FFFF, 0x5D2E0D06, + 0x5D23024A, 0x078A4000, 0x13605F4E, 0x456A010C, + 0x102001A0, 0x4D210000, 0x4E0A0000, 0x26970DE4, + 0x6B970E02, 0x026B5F32, 0x0A685F4E, 0x7F37000F, + 0x343B0100, 0x576A5F34, 0x7263B144, 0x0B420000, + 0x1B695F46, 0x5F2C0002, 0x6A410000, 0x136A5F3A, + 0x5F2C0002, 0x0B420000, 0x31695F3C, 0x606B5F38, + 0x9F2C0002, 0xEA410000, 0xD18B4000, 0xBA20C000, + 0xFA605F32, 0xAE970C74, 0xA7220040, 0xCC20B424, + 0xEC500011, 0xA0500003, 0xA850C400, 0xC5500001, + 0x87500180, 0xE6500000, 0xCE62B434, 0x9E2000A6, + 0xC82100A6, 0xBF2300A6, 0x89800C7D, 0xD4635E9C, + 0xAD6B5FEE, 0xC5615E98, 0xEC2D0036, 0x91484000, + 0xB82F0001, 0xF4635FEE, 0xC0349FFF, 0x88404000, + 0xEC348000, 0xB9C80286, 0x912DFFFE, 0xE64A4000, + 0x2B2D0008, 0x51484000, 0x41625E9A, 0x30510000, + 0x58380000, 0x32C8029C, 0x10605E9E, 0x4A685E98, + 0x79215FDC, 0x2A970F4A, 0x21970E86, 0x49685E9E, + 0x0D6B5E9C, 0x58380000, 0x6BCC0290, 0x118B4000, + 0x586A5E9A, 0x1F215FD8, 0x1336FF00, 0x70D00297, + 0x2A970F4A, 0x4D6B5E9C, 0x778001C0, 0x31320008, + 0x3C2C0035, 0x73460000, 0x5F695E9E, 0x3D800274, + 0x7C9700F3, 0x3C209000, 0x3A605F32, 0x4480101D, + 0x8E208000, 0xFA605F32, 0xE480102C, 0xBD635F36, + 0xEC685F4A, 0xB9695F4C, 0x8B32FFFE, 0xCD048000, + 0xF0C402AB, 0x8F2D0001, 0xA0615F4C, 0xF5605F4A, + 0x93320002, 0xE4685F3A, 0xD88002B9, 0xBD635F36, + 0xD8380000, 0xBCD002B3, 0x99970354, 0xE4685F3A, + 0x8E390000, 0xDDC802B9, 0xE4300002, 0x88404000, + 0xBC30FFFE, 0xF6010000, 0xE72D01A0, 0x9F610106, + 0xCB32FFFE, 0x9CC80352, 0x94038000, 0xC3330001, + 0xAFD402C2, 0xEB2E0004, 0xD40C8000, 0xBD605F3A, + 0xD4038000, 0xBF37000F, 0x95C802C9, 0xF736FFF0, + 0xE42E0010, 0xAF6B5F40, 0xAC625F3E, 0xCD0B8000, + 0x94C402CE, 0xE0625F40, 0xDC6A5F42, 0x9B200000, + 0xE93600C0, 0xB5320006, 0x9BC802D6, 0xF12C0040, + 0x932EFFFF, 0xF88002D2, 0xEC600104, 0x85970CA6, + 0x9E2000A6, 0xE1970CAF, 0xEC970CB6, 0xA7970C63, + 0xE3690104, 0xB5680104, 0xAF2D0030, 0xE64A4000, + 0x092D0002, 0x704B4000, 0x493EFFFF, 0x0D1EC000, + 0x6CCC0322, 0x1A21B424, 0x18510041, 0x7160B428, + 0x4A2D0004, 0x30510000, 0x3851C010, 0x53510001, + 0x28220038, 0x4E62B434, 0x4C2102DB, 0x3F2300A6, + 0x6B940C7D, 0x3920003C, 0x3C60B348, 0x64970C53, + 0x27970C63, 0x50680106, 0x7B21B428, 0x356A5F3E, + 0x2A6B5FD0, 0x4251E000, 0x53510001, 0x1760B42C, + 0x492D0002, 0x30510000, 0x12200311, 0x5763B420, + 0x1060B424, 0x4E62B434, 0x6C685F4A, 0x39695F4C, + 0x5B60B408, 0x2861B40A, 0x226B5FCC, 0x7721B40C, + 0x4251E000, 0x13510001, 0x2B201061, 0x7D63B400, + 0x3A60B404, 0x6462B414, 0x5D200003, 0x3E605F50, + 0x7020031B, 0x21210325, 0x0A970C7D, 0x7F2300A6, + 0x0B940C7A, 0x67685F50, 0x4434FFFE, 0x3E605F50, + 0x18380000, 0x71C80320, 0x588000A6, 0x27685F50, + 0x4234FFFD, 0x3E605F50, 0x18380000, 0x65CC00A6, + 0xA46B5F36, 0xEE800CBD, 0xEA970C83, 0xB62301F2, + 0xEE800CBD, 0xBB2302DB, 0xA9800C83, 0xFD635F36, + 0xD8380000, 0xB3D0032B, 0x99970354, 0xE4685F3A, + 0x8E390000, 0xFBC80331, 0xE4300002, 0x88404000, + 0xFC30FFFE, 0xB6010000, 0xA72D01A0, 0xDF610106, + 0x8B32FFFE, 0xDCC80352, 0xEF6B5F40, 0xAC625F3E, + 0x8D0B8000, 0xF8C4033B, 0xE0625F40, 0x94038000, + 0xE6330003, 0x84D4033F, 0xAB2E0004, 0xD40C8000, + 0xBD605F3A, 0xE4970C53, 0xEC685F4A, 0xB9695F4C, + 0xDB60B408, 0xA861B40A, 0x90680106, 0xF56A5F3E, + 0xD221B40E, 0xB0510000, 0xBD60B40C, 0xD2200021, + 0xBA60B404, 0xE462B414, 0xC5685F36, 0xA6210341, + 0xFF2300A6, 0xA9800C7A, 0xA46B5F36, 0xF88000FB, + 0xB5635E90, 0xC16B5F34, 0xE00CC000, 0x844B0000, + 0x9F2C0002, 0xE5480000, 0xD4635F4A, 0xAC6B5E90, + 0xF6605F4C, 0x918B4000, 0xB96A5F40, 0xDB200000, + 0x17605F40, 0x6F3A0000, 0x7ECC0C95, 0x118B4000, + 0x4520FFFF, 0x2C2D0036, 0x264A4000, 0x772DFFFA, + 0x45625F42, 0x1D34003F, 0x17148000, 0x6CCC01F2, + 0x118B4000, 0x664A4000, 0x492D0002, 0x273607FC, + 0x57C801F4, 0x13320002, 0x2C088000, 0x4EC001F4, + 0x35008000, 0x62300001, 0x6FD40378, 0x2E2E0001, + 0x1F30FFFF, 0x518B4000, 0x76635E96, 0x33200102, + 0x7E97036D, 0x09600130, 0x06625F44, 0x73200102, + 0xBE97036D, 0xEF6B5E96, 0xEF600134, 0xA3625F46, + 0xD18B4000, 0xA469010C, 0x9768010E, 0xFD3D01A0, + 0xE6CC0390, 0x862E01A0, 0x9C62010C, 0xD8380000, + 0x90C8038F, 0xEC088000, 0xE8C001F0, 0x918B4000, + 0xD4620110, 0xA7630112, 0x988000A6, 0xD3680100, + 0xB6635E96, 0xDB6AB140, 0xEE210001, 0xBA230000, + 0xA1280001, 0xD80B0000, 0xCD11C000, 0x94038000, + 0xD7174000, 0xBEC803A1, 0xB4310001, 0xE1280001, + 0x3EC4039B, 0x6F6B5E96, 0x518B4000, 0x36635E96, + 0x6C220000, 0x05625E94, 0x0D6BB140, 0x45690100, + 0x78200001, 0x3602C000, 0x35160000, 0x5C6A5E94, + 0x02CC03AF, 0x6E2E0001, 0x45625E94, 0x1F30FFFF, + 0x722DFFFF, 0x01CC03A9, 0x2F6B5E96, 0x5C6A5E94, + 0x118B4000, 0x64625F4E, 0x512C03B8, 0x30884000, + 0x13800200, 0x7E8003C8, 0x5C800442, 0x3C800445, + 0x56800465, 0x1D800486, 0x3E8004EB, 0x7B8004EE, + 0x1B800509, 0x5E80050C, 0x7780052A, 0x13800200, + 0x53800200, 0x13800200, 0x13800200, 0x53800200, + 0x54230018, 0x0963013C, 0x1A970364, 0x7797037A, + 0x276A0130, 0x41030000, 0x4D0B8000, 0x2FC003D1, + 0x57020000, 0x106B013C, 0x28685F44, 0x5B695F46, + 0x32370020, 0x4DCC03D7, 0x6E2E0001, 0x09625F3C, + 0x360E0000, 0x420E4000, 0x4B32FFFE, 0x34970385, + 0x5797029D, 0x1B200000, 0x2A210120, 0x5F6A5F44, + 0x97970327, 0xDC200008, 0xCC210124, 0xBA6A5F46, + 0xD7970327, 0x969702A0, 0xA4685F3A, 0xE4210010, + 0xE4300002, 0xA7600128, 0xBA610104, 0xFB97035E, + 0xA6970CCB, 0xD0680130, 0xE0690134, 0x8E6A0120, + 0xFE6B0124, 0x9A60B010, 0xAA61B014, 0xFE680128, + 0x8E69012C, 0xEB2E0068, 0xC462B000, 0xBD2F0068, + 0xB463B004, 0xE06A0138, 0xDC2C0068, 0xB460B008, + 0xCA2D0068, 0x8461B00C, 0xAA62B018, 0xF168013C, + 0xBF2300A6, 0xCD388000, 0xFB60B01C, 0xAF940CD0, + 0xCA685F4E, 0x976A5F34, 0x98380000, 0xF5C8040D, + 0xF0884000, 0x8E208000, 0xA9408000, 0xDB200000, + 0xBF800419, 0xE4685F3A, 0xF069B024, 0xA02E0028, + 0xCE390000, 0x90D00409, 0xA4300002, 0xDC2C0068, + 0xAF090000, 0xEA31FFFE, 0xC768B028, 0xBF418000, + 0xB734001F, 0xE82E0002, 0xE9408000, 0xB5008000, + 0xDF2C0002, 0xA6500000, 0xA6500000, 0xC9970CD8, + 0x106A5F3C, 0x60685F34, 0x4B32FFFE, 0x33C80202, + 0x546B0104, 0x32695F3A, 0x09625F3C, 0x60625F40, + 0x600CC000, 0x272D01A0, 0x3A610104, 0x73490000, + 0x1F2C0002, 0x65480000, 0x63615F4A, 0x36605F4C, + 0x64970C53, 0x2C685F4A, 0x39695F4C, 0x7D60B40C, + 0x0E61B40E, 0x75680104, 0x4D210000, 0x2861B40A, + 0x1B60B408, 0x506A5F3C, 0x54200081, 0x3A60B404, + 0x6462B414, 0x21210430, 0x3F2300A6, 0x4B940C7A, + 0x11230202, 0x7880035E, 0x57230028, 0x0963013C, + 0x5B8003CA, 0x1A970364, 0x33200102, 0x7E97036D, + 0x49600130, 0x06625F44, 0x192C0001, 0x7E605F3C, + 0x2E32FFFC, 0x6B2E0004, 0x74970385, 0x1797029D, + 0x5B200000, 0x2A210120, 0x1F6A5F44, 0x57970327, + 0x1F6A5F44, 0x5C200008, 0x4C210124, 0x17970327, + 0x1F6A5F44, 0x72200010, 0x6D210128, 0x17970327, + 0x569702A0, 0x24685F3A, 0x23210018, 0x64300002, + 0x8160012C, 0xFA610104, 0xD823000A, 0x8963013C, + 0xD28003EB, 0x9A970364, 0xB797037A, 0xE8685F44, + 0xF60E0000, 0x8B32FFFE, 0xB4970385, 0xD797029D, + 0x9B200000, 0xEA210120, 0xDF6A5F44, 0x97970327, + 0xFA6A5F46, 0x9C200008, 0x8C210124, 0xD7970327, + 0x969702A0, 0xE4685F3A, 0xE76A0130, 0x976B0134, + 0xA4300002, 0xE7600128, 0xD70EC000, 0x8B32FFFE, + 0xC9625F3C, 0xAA208009, 0xB9970210, 0xC1970D7E, + 0x1F680148, 0x61970E49, 0x4D210000, 0x316A5F5C, + 0x72200010, 0x2F800E66, 0x03208100, 0x6860013C, + 0x5A970364, 0x3797037A, 0x316B0130, 0x7E695F44, + 0x180B0000, 0x4EC001F4, 0x4434FFFE, 0x17C801F4, + 0x420E4000, 0x0B32FFFE, 0x34970385, 0x5797029D, + 0x1B200000, 0x6A210120, 0x5F6A5F44, 0x17970327, + 0x3A6A5F46, 0x5C200008, 0x4C210124, 0x17970327, + 0x569702A0, 0x016A0134, 0x09690124, 0x532EFFFF, + 0x820D8000, 0xEA31FFFE, 0xE72D01A0, 0xA64A4000, + 0xC92D0002, 0x87494000, 0xB168013C, 0xE01A4000, + 0xD3C801FA, 0xB2695F3A, 0x816A0134, 0xF2310002, + 0xB1610128, 0xF4340100, 0xFAC804BA, 0xB16B0130, + 0xF5008000, 0x8D0B8000, 0xB82F0001, 0xEE2E0001, + 0xA2300001, 0xFBD004B7, 0xEE2E0001, 0x820D8000, + 0x9761012C, 0xD70EC000, 0xCB32FFFE, 0x89625F3C, + 0xF168013C, 0xB9970210, 0x81970D7E, 0xC669015C, + 0xB968014C, 0xE2350100, 0xDCC804E4, 0xA1970E49, + 0xD1520000, 0xAB2E0004, 0xA3690168, 0xDF680148, + 0xCE390000, 0x91D004CD, 0xAF090000, 0xEA31FFFE, + 0x918004CE, 0xD8218000, 0xC2685F52, 0x952EFFFC, + 0xFF418000, 0xAA381000, 0x9B605F52, 0xC797101D, + 0xA06A0154, 0xD068015C, 0xCD210000, 0x8B32FFFE, + 0xB4340100, 0xF2200010, 0xFCC804E3, 0x8F970E67, + 0xDF680148, 0xAF69014C, 0xB16A5F5C, 0xEF090000, + 0x2A31FFFE, 0x7A0A4000, 0x75200018, 0x2F800E66, + 0x576A5F58, 0x202E0028, 0x11520000, 0x51520000, + 0x51520000, 0x11520000, 0x168004C6, 0x40208200, + 0x2860013C, 0x59800488, 0x70200088, 0x2860013C, + 0x5A970364, 0x21361F00, 0x31320008, 0x79620138, + 0x33200102, 0x7E97036D, 0x49600130, 0x366B0138, + 0x06625F44, 0x793B0000, 0x506B013C, 0x29CC04FD, + 0x7F800500, 0x13370040, 0x02CC0500, 0x592C0001, + 0x3E605F3C, 0x760E0000, 0x4B32FFFE, 0x34970385, + 0x5B200000, 0x2A210120, 0x1F6A5F44, 0x772303E6, + 0x54800327, 0x17200048, 0x2860013C, 0x568004F0, + 0x1A970364, 0x73200102, 0x7E97036D, 0x09600130, + 0x46625F44, 0x0D32FFFD, 0x34970385, 0x5797029D, + 0x1B200000, 0x6A210120, 0x5F6A5F44, 0x17970327, + 0x1F6A5F44, 0x5C200008, 0x4C210124, 0x17970327, + 0x569702A0, 0x36200522, 0x13605F4E, 0x55230400, + 0x8963013C, 0xD28003EB, 0xD669B020, 0xA02E0028, + 0xD1520000, 0x91520000, 0x91520000, 0xFF418000, + 0xD1230202, 0x8A800CD8, 0x9A970364, 0xD52001FF, + 0xBE97036D, 0xC9600130, 0xFE605F3C, 0x97020000, + 0xC6625F44, 0x8B32FFFE, 0xB4970385, 0xDB200000, + 0xAA210120, 0xDF6A5F44, 0xD7970327, 0x9B200000, + 0xBD605F3A, 0xE7600128, 0xE4210010, 0xBA610104, + 0xCC230808, 0x8963013C, 0x928003EB, 0xC1030000, + 0xA637FFF8, 0xEECC0200, 0xF52C0544, 0xB0884000, + 0xD580054C, 0xBC800593, 0x9A800604, 0xD3800200, + 0xD780061D, 0xB380064E, 0x93800200, 0xD3800200, + 0x8320FFFC, 0xF9970365, 0xE1361F00, 0xB2C801F6, + 0xF1320008, 0xB9620138, 0xBF2A0011, 0xD3C401F6, + 0xB797037A, 0xE2300001, 0xDCD00558, 0xA82E0002, + 0xB2347FFF, 0xD7C801F4, 0xD7680138, 0xA3625F46, + 0xF6010000, 0x92290003, 0xBAC40560, 0xDD200003, + 0x3C2C0003, 0x63018000, 0x6A072000, 0x393B0000, + 0x4ECC01F8, 0x3E695F44, 0x242E0010, 0x420E4000, + 0x442A0800, 0x3A6A5F46, 0x17C401F8, 0x6832FFFF, + 0x020E4000, 0x4B32FFFE, 0x74970385, 0x1797029D, + 0x5B200000, 0x2A210120, 0x0A6B5F42, 0x5F6A5F44, + 0x03330001, 0x76D00578, 0x74230579, 0x14800327, + 0x319702AF, 0x4A6B5F42, 0x5C200008, 0x0C210124, + 0x7A6A5F46, 0x05330002, 0x36D00581, 0x51230582, + 0x94800327, 0xF19702AF, 0xC56B5F3A, 0xBA6A5F46, + 0xED210128, 0xB5635F46, 0xB2200010, 0xD7970327, + 0xD69702A0, 0xAC6B5F46, 0xBE680128, 0xC16A0134, + 0x8160012C, 0xCB32FFFE, 0xDC635F3A, 0x89625F3C, + 0xE920E000, 0xBE2305FD, 0xBA800210, 0xE520FFF8, + 0xB9970365, 0xE1361F00, 0xF2C801F6, 0xB1320008, + 0xB9620138, 0xFF2A0011, 0xD3C401F6, 0x92200082, + 0xFE97036D, 0x89600130, 0x86625F44, 0xD2200082, + 0x3E97036D, 0x6F600134, 0x62300001, 0x3AD005A5, + 0x682E0002, 0x32347FFF, 0x17C801F4, 0x57680138, + 0x63625F46, 0x36010000, 0x12290003, 0x5FC405AD, + 0x1D200003, 0x792C0006, 0x63018000, 0x2A072000, + 0x793B0000, 0x0ECC01F8, 0x3E695F44, 0x76680134, + 0x242E0010, 0x4931FFFF, 0x420E4000, 0x042A0800, + 0x17C401F8, 0x57020000, 0x4B32FFFE, 0x360E0000, + 0x420E4000, 0x082E0005, 0x0B32FFFE, 0x74970385, + 0x1797029D, 0x5B200000, 0x6A210120, 0x0A6B5F42, + 0x5F6A5F44, 0x03330001, 0x3CD005CA, 0x6832FFFF, + 0x7D2305CD, 0x14800327, 0x319702AF, 0x5F6A5F44, + 0x109702A3, 0x4A6B5F42, 0x5C200008, 0x0C210124, + 0x7A6A5F46, 0x05330002, 0x34D005D6, 0x6832FFFF, + 0x322305D9, 0x54800327, 0x719702AF, 0x3A6A5F46, + 0x109702A3, 0x49690124, 0x7A6A5F46, 0x2A31FFFE, + 0x672D01A0, 0x11484000, 0x0B32FFFE, 0x420D8000, + 0xB04B4000, 0xDA340001, 0xF5C801FE, 0xBB370001, + 0xF5C801FE, 0x816A0134, 0xB2200010, 0xCA6B5F42, + 0xED210128, 0xA6330003, 0xB6D005ED, 0xD12305EE, + 0x94800327, 0xF19702AF, 0xE4685F3A, 0x816A0134, + 0xD3605F4E, 0xB6200028, 0x8B21012C, 0xE832FFFF, + 0x97970327, 0xD69702A0, 0xCA685F4E, 0x816A0134, + 0xBD605F3A, 0xFC209000, 0xCD32FFFD, 0x89625F3C, + 0xF9970210, 0x81970D7E, 0xB968014C, 0xE1970E49, + 0x0D210000, 0x716A5F5C, 0x75200018, 0x2F800E66, + 0x5A970364, 0x3797037A, 0x096B5F44, 0x570EC000, + 0x4B32FFFE, 0x34970385, 0x1797029D, 0x5B200000, + 0x2A210120, 0x5F6A5F44, 0x57970327, 0x1C200008, + 0x4C210124, 0x3A6A5F46, 0x17970327, 0x569702A0, + 0x056B5F3A, 0x416A0134, 0x45330002, 0x2063012C, + 0x0B32FFFE, 0x49625F3C, 0x5B20F000, 0x3E2305FD, + 0x7A800210, 0x0620FFF9, 0x39970365, 0x45625F42, + 0x892D0002, 0xF5200018, 0xFE97036D, 0xAF600134, + 0xC434FFFE, 0x97C801F4, 0xA82E0002, 0xE3625F46, + 0xF420013C, 0xB3508000, 0x85500001, 0xF1290002, + 0x91484000, 0xD4038000, 0xCD32FFFD, 0x970EC000, + 0xFF340003, 0x90605F48, 0x8B32FFFE, 0xF4970385, + 0x9797029D, 0xFA6A5F46, 0xE86B5F48, 0xB5008000, + 0xA832FFFF, 0xFB370001, 0xDBC8063C, 0xB60E0000, + 0xEA210120, 0x9B200000, 0x97970327, 0xE86B5F48, + 0xBA6A5F46, 0xFB370001, 0xCCCC0675, 0x96230675, + 0xE4685F3A, 0x9701C000, 0xB12C01A0, 0xC5500001, + 0xCB32FFFE, 0x902A0002, 0xAF970F80, 0xC92801A0, + 0xBD605F3A, 0xE6894000, 0xE520FFF8, 0xB9970365, + 0xC5625F42, 0xB5200018, 0xBE97036D, 0xC9600130, + 0x86625F44, 0xF5200018, 0xFE97036D, 0xAF600134, + 0x8434FFFE, 0xD7C801F4, 0xE82E0002, 0xA3625F46, + 0xF420013C, 0x81509000, 0x85500001, 0xF1290002, + 0x11484000, 0x7E695F44, 0x5C340002, 0x10605F48, + 0x6832FFFF, 0x14038000, 0x170EC000, 0x570EC000, + 0x420E4000, 0x0B32FFFE, 0x34970385, 0x5797029D, + 0x1B200000, 0x6A210120, 0x4A6B5F42, 0x1F6A5F44, + 0x43330001, 0x14D00674, 0x16230675, 0x54800327, + 0x319702AF, 0x4A6B5F42, 0x7A6A5F46, 0x1C200008, + 0x05330002, 0x56D00680, 0x63018000, 0x2832FFFF, + 0x420E4000, 0x0C210124, 0x34230686, 0x54800327, + 0x8C210124, 0xF19702AF, 0xFA6A5F46, 0x909702A3, + 0xFA6A5F46, 0x909702A3, 0x8A6B5F42, 0xFA6A5F46, + 0xED210128, 0xA6330003, 0xBED006AD, 0xE86B5F48, + 0xB5008000, 0xE832FFFF, 0xFB370001, 0x9FC80691, + 0xF60E0000, 0xB2200010, 0x97970327, 0xE86B5F48, + 0xBA6A5F46, 0xFB370001, 0xEDCC06B6, 0xA769013C, + 0xA0685F34, 0xFA6A5F46, 0xD13D9000, 0x86CC06AB, + 0xD72C0028, 0x844B0000, 0x9F2C0002, 0xF3490000, + 0x1F2C0002, 0x761B4000, 0x73490000, 0x1F2C0002, + 0x761B4000, 0x33490000, 0x36200028, 0x761B4000, + 0x7EC806AB, 0x372306B6, 0x14800327, 0x772306B6, + 0x11800644, 0x72200010, 0x719702AF, 0x3A6A5F46, + 0x509702A3, 0x286B5F48, 0x3A6A5F46, 0x7B370001, + 0x1CC80697, 0x509702A3, 0x569702A0, 0x3E6A5F48, + 0x24685F3A, 0x6B360002, 0x5EC806C0, 0x3A6A5F46, + 0x60690134, 0x2832FFFF, 0x020E4000, 0x4B32FFFE, + 0x09625F3C, 0x64300002, 0x4160012C, 0x3168013C, + 0x79970210, 0x36695F58, 0x0A2D0032, 0x51484000, + 0x5C340002, 0x0CCC06D6, 0x206A0154, 0x5D20A000, + 0x14038000, 0x43330001, 0x4CD406D0, 0x2E2E0001, + 0x682E0002, 0x3E33FFFF, 0x170EC000, 0x4B32FFFE, + 0x28625F5C, 0x4E970D6A, 0x41970D7E, 0x3968014C, + 0x21970E49, 0x4D210000, 0x716A5F5C, 0x35200018, + 0x6F800E66, 0x01030000, 0x2637FFF8, 0x6ECC0200, + 0xB32C06E2, 0xF0884000, 0xF38006ED, 0x978007A7, + 0xE38009AE, 0xAE800A87, 0x93800200, 0xD78007A7, + 0xD3800200, 0xAE800A87, 0x98380000, 0xEECC0200, + 0x8D800BC5, 0xC320FFFC, 0xF9970365, 0x892D0002, + 0xF5200018, 0xBE97036D, 0x89600130, 0xEF600134, + 0x8434FFFE, 0xD7C801F4, 0xE82E0002, 0xB1290002, + 0x91484000, 0xE3625F46, 0xDA340001, 0x90605F48, + 0xF5008000, 0xBA30FFFD, 0xB60E0000, 0xF60E0000, + 0x8B32FFFE, 0xF4970385, 0xD797029D, 0x9B200000, + 0xEA210120, 0x8A6B5F42, 0xBA6A5F46, 0xC3330001, + 0xF6D0070B, 0xB723070C, 0x94800327, 0xF19702AF, + 0xA897097D, 0xFA6A5F46, 0xF6200028, 0x8D210000, + 0xD7970327, 0x969702A0, 0x8D685F46, 0xDB695F46, + 0xBA30FFFD, 0xF50C4000, 0xE0600120, 0xAA31FFFE, + 0x90610124, 0xC16A0134, 0xFC30FFFE, 0xB12C01A0, + 0xE832FFFF, 0x8D210000, 0x844B0000, 0xDF2C0002, + 0x1419C000, 0x532EFFFF, 0x61CC071E, 0x1235FFFE, + 0x50C801FC, 0x26970CCB, 0x20690134, 0x4E6A0120, + 0x7E6B0124, 0x21208400, 0x2B2E0068, 0x7D2F0068, + 0x0C61B010, 0x4462B000, 0x7463B004, 0x3B60B01C, + 0x7F2300A6, 0x2F940CD0, 0x1669B020, 0x72310002, + 0x14D00737, 0x49970CD8, 0x558001FC, 0x09970CD8, + 0x0D685F46, 0x6C220000, 0x46600124, 0x36010000, + 0x6A31FFFE, 0x170D0000, 0x31610128, 0x630D4000, + 0x170D0000, 0x5761012C, 0x49625F3C, 0x38200001, + 0x4D60013E, 0x3C209000, 0x39970210, 0x5D20A000, + 0x4E970D6A, 0x14680164, 0x286A0148, 0x58380000, + 0x20D00E47, 0x6F69014C, 0x630E8000, 0x17610140, + 0x71620148, 0x3A098000, 0x3661014C, 0x6A31FFFE, + 0x31610144, 0x40208200, 0x4D970D6C, 0x35680168, + 0x0E6A014C, 0x58380000, 0x60D00E47, 0x09690148, + 0x71620148, 0x3A098000, 0x17610140, 0x7A098000, + 0x8B32FFFE, 0xC20D8000, 0xF661014C, 0x9B20F000, + 0xCD970D6C, 0x9F680148, 0x8E690140, 0xEC220000, + 0xD0620144, 0xA060014C, 0x970D0000, 0xD7610140, + 0x9930FFFC, 0xC6600148, 0xED208001, 0x8D970D6C, + 0xE86A0148, 0xB968014C, 0xB66B0154, 0xF6620140, + 0xB6010000, 0xFA30FFFD, 0xE7600144, 0xA2300001, + 0x8E0A0000, 0xC20D8000, 0xD0610148, 0x810FC000, + 0xC9630150, 0xA7208010, 0x8D970D6C, 0xD4680164, + 0x0E690140, 0x58380000, 0x60D00E47, 0x286A0148, + 0x7968014C, 0x106B0150, 0x10610148, 0x76620140, + 0x782F0001, 0x09630150, 0x0E0A0000, 0x50620144, + 0x2D208001, 0x4D970D6C, 0x466A0150, 0x366B0154, + 0x7968014C, 0x09690148, 0x170EC000, 0x5F620150, + 0x096A0144, 0x57610140, 0x4E0A0000, 0x31620148, + 0x200F0000, 0x5D33FFFE, 0x7E635F5C, 0x3C30FFFE, + 0x67600144, 0x00208200, 0x0D970D6C, 0x41970D7E, + 0xA3690168, 0xF16A5F5C, 0xCE390000, 0xA0D00E47, + 0xE8970E5E, 0xB5200018, 0xAF800E66, 0xE020FFFD, + 0xF9970365, 0x892D0002, 0xB5200018, 0xFE97036D, + 0x89600130, 0xEF600134, 0xC434FFFE, 0x97C801F4, + 0xE82E0002, 0xB1290002, 0x91484000, 0xE3625F46, + 0x9C340002, 0xD0605F48, 0xF5008000, 0xA3018000, + 0xBC30FFFE, 0xCD32FFFD, 0xF60E0000, 0x820E4000, + 0xCB32FFFE, 0xB4970385, 0x9797029D, 0xE897097D, + 0xBA6A5F46, 0xF6200028, 0xCD210000, 0xA832FFFF, + 0xD7970327, 0x9B200000, 0xBA6A5F46, 0xCD210000, + 0xE832FFFF, 0x97970327, 0x969702A0, 0xFA6A5F46, + 0x92970644, 0xDB695F46, 0xCD685F46, 0xAC31FFFD, + 0xF6610120, 0xB4310001, 0xAF090000, 0xD0610124, + 0xA6970CCB, 0xE0690134, 0xCE6A0120, 0x8C61B010, + 0xAB2E0068, 0xC462B000, 0xC362B008, 0xB8208808, + 0xFB60B01C, 0xBF2300A6, 0xAF940CD0, 0xF069B024, + 0x0E390000, 0x62D00889, 0x49690124, 0x21208400, + 0x4A2D0068, 0x0361B004, 0x3B60B01C, 0x7F2300A6, + 0x6F940CD0, 0x1669B020, 0x32310002, 0x5AD40889, + 0x1B695F46, 0x4E6A0120, 0x78208808, 0x020E4000, + 0x57620120, 0x2B2E0068, 0x0462B000, 0x4362B008, + 0x3B60B01C, 0x7F2300A6, 0x6F940CD0, 0x3069B024, + 0x0E390000, 0x62D00889, 0x61208400, 0x3B60B01C, + 0x7F2300A6, 0x2F940CD0, 0x1669B020, 0x72310002, + 0x9AD40889, 0xC9970CD8, 0xCD685F46, 0xAF690120, + 0xE7600128, 0xBC30FFFE, 0x970D0000, 0xD761012C, + 0xDD9703A3, 0xA8615F3C, 0x9B20F000, 0xD02A0002, + 0xA5C4088B, 0xDF695F48, 0xCA350002, 0xBCCC088B, + 0xF9970210, 0x83970956, 0xA0970961, 0xE06A0154, + 0xB968014C, 0xF96B0140, 0xDF620150, 0x89690148, + 0xA7630148, 0xD80B0000, 0xC6630144, 0x9F30FFFF, + 0xEF090000, 0x97610140, 0xAD208001, 0xCD970D6C, + 0x2A970970, 0x7968014C, 0x6F6A0140, 0x09690148, + 0x766B0154, 0x0E0A0000, 0x1762014C, 0x5F30FFFF, + 0x570D0000, 0x17610140, 0x22300001, 0x570D0000, + 0x10610148, 0x5B200000, 0x67600144, 0x09630150, + 0x7C209000, 0x0E970D6A, 0x1F680148, 0x4E690140, + 0x0E6A014C, 0x4D084000, 0x6060014C, 0x10610148, + 0x36620140, 0x76010000, 0x5F30FFFF, 0x170D0000, + 0x7E610150, 0x3F208800, 0x0D970D6C, 0x7968014C, + 0x2F6A0140, 0x49690148, 0x766B0154, 0x0E0A0000, + 0x5762014C, 0x1F30FFFF, 0x2F090000, 0x57610140, + 0x7C30FFFE, 0x0E0A0000, 0x31620148, 0x49630150, + 0x3C209000, 0x4E970D6A, 0x7968014C, 0x09690148, + 0x6F6A0140, 0x06600148, 0x0D084000, 0x54038000, + 0x360E0000, 0x5762014C, 0x64300002, 0x200F0000, + 0x20630140, 0x4E208000, 0x4E970D6A, 0x1D20A000, + 0x4E970D6A, 0x17680154, 0x0E6A014C, 0x76010000, + 0xB4310001, 0xF5D40863, 0xD92C0001, 0x9F2C0002, + 0xE060014C, 0xB6620140, 0xB6010000, 0xDF30FFFF, + 0xF50C4000, 0xA7600144, 0xB6010000, 0xDF30FFFF, + 0x970D0000, 0xD0610148, 0xC0208200, 0x8D970D6C, + 0xDF680148, 0x986B014C, 0xA06A0154, 0xC1600140, + 0xB6010000, 0xFC30FFFE, 0xDC605F5A, 0x8E09C000, + 0xB1610144, 0xCB32FFFE, 0xE8625F5C, 0xA1208400, + 0xCD970D6C, 0x81970D7E, 0xA8970E5E, 0xC16B5F58, + 0x056A0160, 0x7E2F0034, 0x654BC000, 0x0B420000, + 0x7E370004, 0x34CC0D3E, 0x316A5F5C, 0x75200018, + 0x6F800E66, 0x09970CD8, 0x168001FA, 0x6860013C, + 0x3B97035E, 0x61230939, 0x75635F46, 0x0C200891, + 0x5C605F36, 0x1E970393, 0x09CC0263, 0x50970236, + 0x2E230897, 0x75635F46, 0x7C800213, 0x1F680148, + 0x0E6A014C, 0x4E690140, 0x6060014C, 0x10620144, + 0x760E0000, 0x1F30FFFF, 0x2F090000, 0x57610140, + 0xB1620148, 0xED208001, 0xCD970D6C, 0xAA970970, + 0xC9690148, 0xB968014C, 0xAF6A0140, 0xF66B0154, + 0xD7610140, 0x8E0A0000, 0x8E0A0000, 0xD762014C, + 0xBC30FFFE, 0xC6600148, 0xDB200000, 0xA7600144, + 0xC9630150, 0xBC209000, 0x8E970D6A, 0xF968014C, + 0x89690148, 0xEF6A0140, 0xC6600148, 0x8D084000, + 0xA4300002, 0xF60E0000, 0xF6620140, 0xA2300001, + 0xE060014C, 0xB2200010, 0x94695F52, 0xEC220000, + 0xB5190000, 0xCD615F52, 0xD3695F6C, 0xAF238000, + 0xDC635F56, 0x91484000, 0x816B5F34, 0xC92D0002, + 0xFF424000, 0xBA1F0000, 0xA0C80D47, 0xCB235F7A, + 0x9249C000, 0xFE2F0002, 0xCD1D0000, 0xBFCC08D7, + 0xD249C000, 0x8E390000, 0x98CC0D47, 0xF2695F56, + 0x8E390000, 0xFED408DA, 0xCA625F56, 0x982F0006, + 0xAE2E0001, 0xEA8008CC, 0xC2685F52, 0xA36B5F52, + 0xDE34000F, 0xBC3700F0, 0xB9CC08E2, 0xCE1C8000, + 0x3ACC08E4, 0x628008E6, 0x4E1C8000, 0x1FCC08E6, + 0x6E32FFFC, 0x018008E7, 0x0F31FFFC, 0x60198000, + 0x6B615F56, 0x236B5F52, 0x31310004, 0x4835000F, + 0x3F37000F, 0x4E1F4000, 0x6CC808FC, 0x14004000, + 0x63645F52, 0x2931FFF8, 0x19394001, 0x49615F6A, + 0x36010000, 0x51310003, 0x6C615F68, 0x1F30FFFF, + 0x2A2C0D06, 0x6E2308FB, 0x70884000, 0x1C605F6C, + 0x686A0148, 0x2F69014C, 0x18680140, 0x420D8000, + 0x2A31FFFE, 0x6B615F60, 0x7E6B0148, 0x0E0A0000, + 0x750F8000, 0x0163014C, 0x3C30FFFE, 0x58605F62, + 0x4B32FFFE, 0x09625F66, 0x05970C69, 0x5A200051, + 0x3160B444, 0x64685F56, 0x456B5F60, 0x1E34000F, + 0x47300003, 0x36010000, 0x2434FF00, 0x600CC000, + 0x1060B448, 0x6C3500FF, 0x6361B44A, 0x23685F68, + 0x206B5F62, 0x506A5F66, 0x76010000, 0x2434FF00, + 0x600CC000, 0x3660B44C, 0x2C3500FF, 0x4561B44E, + 0xAF62B454, 0xC8200925, 0xD321090A, 0xBF2300A6, + 0xEF800C80, 0xAE210001, 0xBA61015E, 0xCE208000, + 0xC960015C, 0x89970E08, 0xA36B5F52, 0xC5685F6C, + 0xBF37000F, 0xF43B0100, 0xF263B144, 0x9F21085B, + 0xDF2C0002, 0xAA410000, 0xA4685F56, 0xC2230D47, + 0x9E34000F, 0xE3645F52, 0xC7300003, 0xBA605F68, + 0x82800D7E, 0xC3970956, 0xE0970961, 0xB968014C, + 0xEF6A0140, 0x89690148, 0xB66B0154, 0xCE0A0000, + 0x9762014C, 0xEF6A0140, 0xC9630150, 0x97610140, + 0xFC30FFFE, 0x8E0A0000, 0xB1620148, 0xDB200000, + 0xE7600144, 0xBC209000, 0x8E970D6A, 0xCE690140, + 0x9F680148, 0xE86A0148, 0xD7610140, 0x8D084000, + 0xE060014C, 0x9F30FFFF, 0xB60E0000, 0xF1620148, + 0x9B200000, 0xC78008BE, 0xDF680148, 0x8E6A014C, + 0x8E690140, 0xE060014C, 0xD0620144, 0xAF090000, + 0xF60E0000, 0x97610140, 0xB1620148, 0xED208001, + 0x0E800D6C, 0x7968014C, 0x49690148, 0x2F6A0140, + 0x57610140, 0x360E0000, 0x31620148, 0x57020000, + 0x4B32FFFE, 0x0E0A0000, 0x17680154, 0x50620144, + 0x010C0000, 0x68600150, 0x40208200, 0x0E800D6C, + 0x6F6A0140, 0x09690148, 0x3968014C, 0x71620148, + 0x17610140, 0x7C30FFFE, 0x4E0A0000, 0x17680154, + 0x10620144, 0x410C0000, 0x68600150, 0x00208200, + 0x4E800D6C, 0x32635F4E, 0x0A6B5F42, 0x7A6A5F46, + 0x9C200008, 0xCD210000, 0xC5330002, 0xA9D0098A, + 0xD4038000, 0x8B32FFFE, 0xBE33FFFF, 0xD70EC000, + 0xC6230995, 0x94800327, 0xB19702AF, 0xFA6A5F46, + 0x909702A3, 0xFA6A5F46, 0xD09702A3, 0xBA6A5F46, + 0xD09702A3, 0xBA6A5F46, 0x909702A3, 0xFA6A5F46, + 0x909702A3, 0xDF695F48, 0xFA6A5F46, 0x8C350001, + 0xA5C809A8, 0xF6200028, 0xD9970354, 0xAC685F4A, + 0xF9695F4C, 0x8B32FFFE, 0x8D048000, 0xE6C409A2, + 0x0F2D0001, 0x60615F4C, 0x75605F4A, 0x0520FFFF, + 0x4D210000, 0x3A6A5F46, 0x242309A9, 0x54800327, + 0x52970644, 0x3A6A5F46, 0x32200010, 0x4D210000, + 0x2B6B5F4E, 0x54800327, 0x4320FFFC, 0x39970365, + 0x61361F00, 0x32C801F6, 0x31320008, 0x79620138, + 0x3F2A0011, 0x53C401F6, 0x7797037A, 0x316B0130, + 0x36010000, 0x5235FFFE, 0x57C801F4, 0x1808C000, + 0x56C009BE, 0x2FCC01F4, 0x096B5F44, 0x682E0002, + 0x23625F46, 0x7E2F0002, 0x50635F44, 0x3E33FFFF, + 0x4B32FFFE, 0x170EC000, 0x0B32FFFE, 0x74970385, + 0x57680138, 0x3E695F44, 0x01030000, 0x652B0003, + 0x26C409CE, 0x5D200003, 0x7C2C0003, 0x2A072000, + 0x793B0000, 0x0ECC01F8, 0x1B695F46, 0x642E0010, + 0x35034000, 0x6C31FFFD, 0x4E09C000, 0x020E4000, + 0x042A0800, 0x57C401F8, 0x5797029D, 0x1B200000, + 0x6A210120, 0x0A6B5F42, 0x3A6A5F46, 0x43330001, + 0xACD009E3, 0xED2309E4, 0xD4800327, 0xB19702AF, + 0xCC970BA4, 0xBA6A5F46, 0xB6200028, 0xCD210000, + 0xD7970327, 0x969702A0, 0xBE695F44, 0xCD685F46, + 0x8931FFFF, 0xD70D0000, 0xD0610124, 0x9F30FFFF, + 0xD70D0000, 0xB6610120, 0xA6970CCB, 0xE0690134, + 0x8E6A0120, 0xCC61B010, 0xEB2E0068, 0x8462B000, + 0x8362B008, 0xF8208808, 0xFB60B01C, 0xBF2300A6, + 0xEF940CD0, 0xB069B024, 0x8E390000, 0xC6D00A0A, + 0x09690124, 0x61208400, 0x4A2D0068, 0x0361B004, + 0x7B60B01C, 0x3F2300A6, 0x2F940CD0, 0x5669B020, + 0x72310002, 0x05D00A0C, 0x09970CD8, 0x558001FC, + 0x09970CD8, 0x4D685F46, 0x7E695F44, 0x0E6A0120, + 0x46600124, 0x170D0000, 0x31610128, 0x46690130, + 0x176B0134, 0x7C30FFFE, 0x760E0000, 0x3662012C, + 0x28630130, 0x79610134, 0x6C220000, 0x09625F3C, + 0x6920E000, 0x39970210, 0x14680164, 0x67690150, + 0x98380000, 0xE0D00E47, 0xF66B0154, 0x896A0144, + 0xF968014C, 0x98610154, 0xB82F0001, 0xC9630150, + 0xCE690140, 0x9762014C, 0x81600140, 0xD4004000, + 0x820D8000, 0xD0610148, 0xE832FFFF, 0xAC088000, + 0xE7600144, 0x80208200, 0x8D970D6C, 0xF5680168, + 0xB66B0154, 0xD8380000, 0xE0D00E47, 0x8E6A014C, + 0x89690148, 0xC9630150, 0xF1620148, 0xBA098000, + 0xD7610140, 0x820D8000, 0xA832FFFF, 0xC20D8000, + 0xB661014C, 0xDB20F000, 0xCD970D6C, 0x9F680148, + 0xEF69014C, 0xAF6A0140, 0xBA230000, 0xC6630144, + 0xE060014C, 0x970D0000, 0x90610148, 0xF60E0000, + 0xB6620140, 0xED208001, 0xCD970D6C, 0xA86A0148, + 0xF968014C, 0x8E690140, 0xB66B0154, 0xF6620140, + 0xB60E0000, 0xDF30FFFF, 0xF60E0000, 0xB1620148, + 0xAF090000, 0xF1610144, 0xFE33FFFF, 0x89630150, + 0xE7208010, 0x8D970D6C, 0x82690164, 0xF968014C, + 0x0E390000, 0x60D00E47, 0x4E690140, 0x286A0148, + 0x506B0150, 0x10610148, 0x36620140, 0x782F0001, + 0x49630150, 0x2F090000, 0x31610144, 0x6D208001, + 0x0D970D6C, 0x466A0150, 0x766B0154, 0x3968014C, + 0x49690148, 0x170EC000, 0x1F620150, 0x600F0000, + 0x1D33FFFE, 0x7E635F5C, 0x5F6B0144, 0x17610140, + 0x180B0000, 0x67630148, 0x7C30FFFE, 0x180B0000, + 0x46630144, 0x00208200, 0x0D970D6C, 0x41970D7E, + 0xA3690168, 0xF16A5F5C, 0xCE390000, 0xA0D00E47, + 0xE8970E5E, 0xB5200018, 0xAF800E66, 0xE020FFFD, + 0xF9970365, 0xA1361F00, 0xB2C801F6, 0xF1320008, + 0xB9620138, 0xFF2A0011, 0xD3C401F6, 0xB797037A, + 0xF16B0130, 0xB6010000, 0x9235FFFE, 0xD7C801F4, + 0x9808C000, 0xDBC00A97, 0xEFCC01F4, 0x896B5F44, + 0xA82E0002, 0xE3625F46, 0xFE2F0002, 0x90635F44, + 0xC100C000, 0xBE33FFFF, 0xA00F0000, 0xCB32FFFE, + 0x170EC000, 0x4B32FFFE, 0x74970385, 0x17680138, + 0x7E695F44, 0x01030000, 0x252B0003, 0x64C40AA9, + 0x5D200003, 0x3F2C0005, 0x2A072000, 0x793B0000, + 0x0ECC01F8, 0x5B695F46, 0x642E0010, 0x2A31FFFE, + 0x420E4000, 0x042A0800, 0x17C401F8, 0x5797029D, + 0x1B200000, 0x4D210000, 0x5F6A5F44, 0x17970327, + 0x0C970BA4, 0x7A6A5F46, 0x76200028, 0x0D210000, + 0x6832FFFF, 0x17970327, 0x169702A0, 0x68685F44, + 0x1B695F46, 0x57020000, 0x75034000, 0x1F30FFFF, + 0x4931FFFF, 0x140C8000, 0x06600124, 0x750C4000, + 0x67600128, 0x200CC000, 0x20600120, 0x66970CCB, + 0x20690134, 0x496A0128, 0x5F610130, 0x0C61B010, + 0x6B2E0068, 0x0462B000, 0x0362B008, 0x78208808, + 0x3B60B01C, 0x7F2300A6, 0x6F940CD0, 0x3069B024, + 0x0E390000, 0x73D40ADC, 0x49970CD8, 0x168001FA, + 0x49690124, 0x21208400, 0x0A2D0068, 0x4361B004, + 0xBB60B01C, 0xFF2300A6, 0xEF940CD0, 0x9669B020, + 0xF2310002, 0xB0D40ADA, 0x8E6A0120, 0xF8208808, + 0xEB2E0068, 0x8462B000, 0x8362B008, 0xFB60B01C, + 0xBF2300A6, 0xEF940CD0, 0xF069B024, 0x8E390000, + 0xC8D00ADA, 0xA1208400, 0xBB60B01C, 0xFF2300A6, + 0xAF940CD0, 0xD669B020, 0xF2310002, 0xB0D40ADA, + 0x89970CD8, 0xCD685F46, 0xEF690120, 0xA7600128, + 0xD70D0000, 0x9761012C, 0xAC220000, 0xC9625F3C, + 0x9B20F000, 0xF9970210, 0xDF680148, 0x8E6A014C, + 0xCE690140, 0xA060014C, 0x90620144, 0xEF090000, + 0xD7610140, 0xB60E0000, 0xB1620148, 0xED208001, + 0x8D970D6C, 0xF968014C, 0xC9690148, 0xAF6A0140, + 0xD7610140, 0xA3018000, 0x970D0000, 0xD0610148, + 0x9F30FFFF, 0xCE0A0000, 0xD7680154, 0x90620144, + 0x810C0000, 0xE8600150, 0xC0208200, 0x8D970D6C, + 0xE06A0154, 0xB968014C, 0xB96B0140, 0xDF620150, + 0x09690148, 0x67630148, 0x580B0000, 0x06630144, + 0x5F30FFFF, 0x2F090000, 0x17610140, 0x6D208001, + 0x4D970D6C, 0x3968014C, 0x2F6A0140, 0x49690148, + 0x31620148, 0x4E0A0000, 0x57680154, 0x10620144, + 0x57610140, 0x010C0000, 0x28600150, 0x40208200, + 0x0D970D6C, 0x7968014C, 0x766B0154, 0x09690148, + 0x2F6A0140, 0x49630150, 0x57610140, 0x36695F58, + 0x4E0A0000, 0x1762014C, 0x2F2D0030, 0x664A4000, + 0x2F2D0006, 0x47494000, 0x673607FC, 0x13320002, + 0x79620154, 0x14038000, 0x03330001, 0x7ED40B49, + 0x6E2E0001, 0x282E0002, 0x10620144, 0x6832FFFF, + 0x31620148, 0x40351F00, 0x50310008, 0x39610158, + 0x6920E000, 0x0D970D6C, 0x3E680144, 0x4E6A014C, + 0x0E690140, 0x506B0150, 0x760E0000, 0x1762014C, + 0x0100C000, 0x43330001, 0x52D40B5C, 0x192C0001, + 0x5F2C0002, 0x1F30FFFF, 0x170D0000, 0x57610140, + 0x8D210000, 0xD0610148, 0xE920E000, 0x8D970D6C, + 0xD06B0150, 0x97680154, 0x8E6A014C, 0xC163014C, + 0xE8600150, 0x8E600154, 0x81030000, 0xC3330001, + 0xB4D40B6E, 0xD92C0001, 0xDF2C0002, 0x90620144, + 0xCE0A0000, 0xB6620140, 0x9F30FFFF, 0xF60E0000, + 0xB1620148, 0xED208001, 0xCD970D6C, 0x89690148, + 0x896A0144, 0xD06B0150, 0xD7610140, 0xB1620148, + 0xC100C000, 0xBE33FFFF, 0x89630150, 0xCE600154, + 0x01030000, 0x43330001, 0x5BD40B84, 0x192C0001, + 0x5F2C0002, 0x27600144, 0x00208200, 0x4D970D6C, + 0x68690144, 0x286A0148, 0x3968014C, 0x766B0154, + 0x36620140, 0x49630150, 0x4E600154, 0x01030000, + 0x43330001, 0x12D40B93, 0x192C0001, 0x5F2C0002, + 0x2060014C, 0x7A0A4000, 0x71620148, 0x3C30FFFE, + 0x0E0A0000, 0x50620144, 0x40208200, 0x0D970D6C, + 0x49690148, 0x206A0154, 0x186B014C, 0x57610140, + 0x9F620150, 0xFE33FFFF, 0xCE09C000, 0xA3800878, + 0xF2635F4E, 0x8A6B5F42, 0x9C200008, 0xCD210000, + 0xDF6A5F44, 0x85330002, 0x86D00BB0, 0xEC6B5F46, + 0xA832FFFF, 0xD70EC000, 0xEF230BC0, 0x94800327, + 0xF19702AF, 0x9F6A5F44, 0x909702A3, 0xDF6A5F44, + 0xAC685F4A, 0xF9695F4C, 0xCB32FFFE, 0x8D048000, + 0xA5C40BBB, 0xCF2D0001, 0xE0615F4C, 0xB5605F4A, + 0xFA6A5F46, 0x8520FFFF, 0x8D210000, 0xF19702AF, + 0xBA6A5F46, 0xF2200010, 0xCD210000, 0xAB6B5F4E, + 0xD4800327, 0x93800200, 0x81030000, 0xC637FFFF, + 0xEECC0200, 0xAE2C0BCB, 0xB0884000, 0xE9800BCC, + 0x9A970364, 0xDF20000E, 0xFE97036D, 0xA43C000E, + 0xEFCC01F4, 0x952001FF, 0xBE97036D, 0xFE605F3C, + 0xBF340003, 0xEFCC01F4, 0xC92E000E, 0x8B32FFFE, + 0xB4970385, 0xD797029D, 0xE822000E, 0x9B200000, + 0xCD210000, 0x97970327, 0xA0685F34, 0xC92101D8, + 0x1F610106, 0x7D2C0008, 0x73490000, 0x1F2C0002, + 0x65480000, 0x23615F4A, 0x36605F4C, 0x67685F3C, + 0x58695F40, 0x3C30FFFE, 0x1B605F3E, 0x6F090000, + 0x02C40BEE, 0x57605F40, 0x502001A0, 0x2A230BF3, + 0x6C600104, 0x3D635F36, 0x3D8002D7, 0x72200010, + 0x2C600104, 0x58800420, 0x529700EB, 0x2A220003, + 0x2F62B438, 0x56695FCA, 0x42685EDE, 0x2C220000, + 0x4A61B400, 0x2862B406, 0x18380000, 0x7CC8009C, + 0x15340080, 0x43C80C05, 0x6F200C16, 0x27230C06, + 0x5A8000AB, 0x1B605EDE, 0x24685EEC, 0x5E23009C, + 0x6C220000, 0x0A625EEC, 0x14695EDE, 0x5B6A5EF0, + 0x18380000, 0x7AC800F3, 0x60198000, 0x176A5F02, + 0x60198000, 0x396A5EA0, 0x1CD000AB, 0x5E36FDFF, + 0x20625EA0, 0x5A8000AB, 0x51215EDE, 0x2F220006, + 0x04970F9D, 0x77215EEC, 0x70510000, 0x30510000, + 0x70884000, 0x2F220030, 0x2F62B438, 0x70695FCE, + 0xAC685EF0, 0xEC220000, 0xE061B420, 0x8262B426, + 0xD8380000, 0x9FC8009D, 0x95340080, 0xEDC80C2B, + 0xE5200C31, 0xAF230C2C, 0x9A8000AB, 0xF5605EF0, + 0xA8685EFE, 0xFD23009D, 0xEC220000, 0x86625EFE, + 0xE1800C0A, 0xBF215EF0, 0xAF220006, 0xC4970F9D, + 0xBB215EFE, 0xF0510000, 0xF0510000, 0xB0884000, + 0xAF220300, 0xEF62B438, 0xF0695FCE, 0xA0685F02, + 0xEC220000, 0x8161B440, 0xA362B446, 0xD8380000, + 0x99C8009E, 0xD5340080, 0xCEC80C46, 0xAF200C4C, + 0xCF230C47, 0x9A8000AB, 0xB9605F02, 0xEC685F10, + 0xFB23009E, 0xAC220000, 0x82625F10, 0xE1800C0A, + 0xB3215F02, 0xEF220006, 0xC4970F9D, 0xBF215F10, + 0xF0510000, 0xB0510000, 0xB0884000, 0xC2685EDE, + 0x91215EDE, 0xD8380000, 0xC0D00C5F, 0xA1205EEC, + 0xA5518000, 0xE6500000, 0xD8695EA0, 0xA6500000, + 0xC0390200, 0x81615EA0, 0x918B4000, 0xC100C000, + 0x2F220006, 0x7F2300A6, 0x67800FC0, 0x2C685EF0, + 0x7F215EF0, 0x18380000, 0x00D00C5F, 0x6D205EFE, + 0x66800C58, 0x20685F02, 0x33215F02, 0x58380000, + 0x00D00C5F, 0x69205F10, 0x66800C58, 0x02685EDE, + 0x51215EDE, 0x18380000, 0x3FD40C57, 0x588000A6, + 0x2C685EF0, 0x7F215EF0, 0x58380000, 0x1ED000A6, + 0x2D205EFE, 0x66800C58, 0x7D605EEC, 0x0E615EEE, + 0x518B4000, 0x31605EFE, 0x0A615F00, 0x518B4000, + 0xB5605F10, 0xC6615F12, 0xD18B4000, 0xAC685EF0, + 0xCD210000, 0x98380000, 0xA5C80C94, 0xEF61B434, + 0xD16A5FCE, 0xA361B426, 0x8162B420, 0xD5340080, + 0x85C80C93, 0xD4635E9C, 0xFF215EF0, 0xAF220006, + 0xC4970F9D, 0x8D6B5E9C, 0x9A8000AB, 0xE3615EF0, + 0x918B4000, 0xD7620116, 0xC7200C98, 0x9A8000AB, + 0x86970C6F, 0xCE6A0116, 0xE620B404, 0xAC500011, + 0xE0500003, 0xA850C400, 0x85500001, 0xC7500180, + 0x26500000, 0x6462B414, 0x5E2000A6, 0x082100A6, + 0x7F2300A6, 0x29800C7A, 0x20690102, 0x5B200000, + 0x45350020, 0x14C801F2, 0x18218000, 0x6F615ED4, + 0x3D605EDA, 0x7E605EDC, 0x518B4000, 0x36695ED4, + 0x58380000, 0x3AC800F3, 0x0E390000, 0x49D400EF, + 0x3D605EDA, 0x518B4000, 0x76695ED4, 0x18380000, + 0x3AC800F3, 0x4E390000, 0x49D400EF, 0x3E605EDC, + 0x518B4000, 0x20685ED4, 0x33215ED4, 0x58380000, + 0x24D400F1, 0x70510000, 0x518B4000, 0x18695ECC, + 0x63685ED2, 0x0E390000, 0x27D4009B, 0x58380000, + 0x5CC8009B, 0x3E23009B, 0x1A8000AB, 0x5D215ECC, + 0x25518000, 0x5B200000, 0x7A605ED2, 0x118B4000, + 0x58695ECC, 0x3A605ED2, 0x0E390000, 0x58695EA0, + 0x09D400EF, 0x49390008, 0x41615EA0, 0x118B4000, + 0x396A5EA0, 0x4E685ECC, 0x5D215ECC, 0x1736FFF7, + 0x60625EA0, 0x18380000, 0x24D400F1, 0x70510000, + 0x918B4000, 0xC2685F52, 0xD8218000, 0xB6144000, + 0xE6CC00A0, 0x8D615F52, 0xBC2300A0, 0xEC200CE9, + 0xDA8000AB, 0xB4200400, 0x9360B144, 0xC3210200, + 0x8A68B144, 0xDE34000F, 0xF5190000, 0x8561B144, + 0xE3645F52, 0xB6010000, 0x90310008, 0xE839A0C8, + 0xB04B4000, 0xE72D002C, 0xC7494000, 0x97020000, + 0x83330001, 0xD0377F00, 0xC963010A, 0xB0320003, + 0xCD625F68, 0x97020000, 0x8832FFF8, 0xF83A4001, + 0xA8625F6A, 0xD7020000, 0xE832FFFF, 0x9D2E0D06, + 0xE2230D1A, 0x878A4000, 0xAA205F7A, 0xD18B4000, + 0xC9205F82, 0x918B4000, 0x8E205F8A, 0xD18B4000, + 0xA0205F92, 0xD18B4000, 0xE7205F9A, 0x918B4000, + 0xE3205FA2, 0x918B4000, 0xA4205FAA, 0xD18B4000, + 0x8A205FB2, 0xD18B4000, 0xCD205FBA, 0x918B4000, + 0x82205FC2, 0xD18B4000, 0xDC605F6C, 0xB3490000, + 0xDF2C0002, 0x844B0000, 0x9F2C0002, 0xD24A0000, + 0x1F2C0002, 0x65480000, 0x6F615F58, 0x1C635F56, + 0x6B625F5A, 0x1F605F5C, 0x27970E26, 0x716A5F5C, + 0x536B010C, 0x2F3A0000, 0x0BC80D36, 0x6C213000, + 0x3A098000, 0x6C0B4000, 0x5861010E, 0x32C00D31, + 0x7ECC0E45, 0x05685F5A, 0x29230D36, 0x79635F54, + 0x026B5F68, 0x66800E2B, 0x6769010A, 0x056B5F56, + 0x10310008, 0x4AC80D67, 0x576A5F58, 0x22390080, + 0x4B2E0035, 0x07458000, 0x01970D7E, 0x42685F52, + 0x24230D43, 0x4B341000, 0x59CC102C, 0x1D2000A0, + 0x40645F53, 0x36695F58, 0x1E970273, 0x4169010E, + 0x4D223000, 0x3A0A4000, 0x2CC80D63, 0x54680108, + 0x32620114, 0x58380000, 0x69C80D50, 0x00970C95, + 0x45970C69, 0x0169010E, 0x2D20B444, 0x6C500011, + 0x05500001, 0x6850C400, 0x45500001, 0x3135FFFF, + 0x2A410000, 0x6B6A0114, 0x5F2C0002, 0x26500000, + 0x6F62B454, 0x0A200D61, 0x1C210D61, 0x7F2300A6, + 0xAF800C80, 0xFA203000, 0xCE60010E, 0x8D210000, + 0xDB610108, 0x8D615F52, 0x988000A6, 0xEC220000, + 0xDB62015E, 0x918B4000, 0xAE210001, 0xFA61015E, + 0x8960015C, 0xDC635F56, 0xC9970E08, 0xA36B5F52, + 0xC5685F6C, 0xBF37000F, 0xB43B0100, 0xF263B144, + 0xB2695F56, 0xDF2C0002, 0xEA410000, 0x93695F5A, + 0x9F2C0002, 0xEA410000, 0xD0695F5C, 0x9F2C0002, + 0xEA410000, 0xA5800D47, 0x82685F52, 0xFA69B140, + 0x3C30FFFE, 0x53D0038F, 0x79635F54, 0x24300002, + 0x41030000, 0x1E34000F, 0x3E3CFFFF, 0x79228000, + 0x4D120000, 0x181D8000, 0x2361B140, 0x796A5EA0, + 0x38CC0D8F, 0x7636FFFB, 0x60625EA0, 0x2A3B2000, + 0x63685F32, 0x3A635F52, 0x0D344000, 0x6AC80D99, + 0x05685F36, 0x599700AB, 0x41685F54, 0x3F2300A6, + 0x1A8000AB, 0x42685F52, 0x7A69B140, 0x2F238000, + 0x5E34000F, 0x17020000, 0x093EFFFF, 0x4E138000, + 0x9419C000, 0xE361B140, 0xFF30FFF8, 0x9438A084, + 0xCC500020, 0xBD680118, 0x97695F54, 0xC218C000, + 0xE4600118, 0xBA1CC000, 0xB8CC0DE3, 0xF161011E, + 0xA3685F68, 0xE363011C, 0xC160011A, 0x85970C69, + 0xF96B011A, 0xAD20B444, 0x8E500041, 0xC5500001, + 0x87500180, 0xE6500000, 0xF602C000, 0x9336FF00, + 0x8162B44C, 0xDB3700FF, 0xF263B44E, 0xBF222000, + 0xEF62B454, 0x9F6B011E, 0x9B200000, 0xE760011E, + 0xB93B0000, 0xD2CC0DC3, 0xFF2300A6, 0xAC200DC6, + 0xFA210DC6, 0xAF800C80, 0x9B68011C, 0xFA69B140, + 0xCA6A0118, 0x8D1D0000, 0xA361B140, 0xEC1E0000, + 0x93620118, 0xE2C80DDF, 0xDB200000, 0xAE210001, + 0xD4038000, 0x97174000, 0xBECC0DD6, 0xD92C0001, + 0x8931FFFF, 0xC0800DD0, 0xD461011C, 0x87300003, + 0xB5695F32, 0xC160011A, 0xDB354000, 0xAAC80DAF, + 0xE9200DAF, 0xA46B5F36, 0x9A8000AB, 0xE3685F32, + 0x13695F36, 0x4D344000, 0x5DC800A6, 0x26894000, + 0x6F3A0000, 0x10C8038F, 0x3D635F36, 0x4D6B5F4A, + 0x6C600104, 0x1F610106, 0x2C625F3E, 0x71635F48, + 0x27970C63, 0x75680104, 0x676A0106, 0x286B5F48, + 0x7160B428, 0x1E21B42A, 0x30510000, 0x4100C000, + 0x2434FF00, 0x541A0000, 0x6062B42C, 0x1B3700FF, + 0x1363B42E, 0x756A5F3E, 0x73200041, 0x1060B424, + 0x4E62B434, 0x32210DEC, 0x3F2300A6, 0x6B940C7D, + 0xA46B5F36, 0xD18B4000, 0xFD635F36, 0xBC200120, + 0xCD210000, 0x86220020, 0x8E6B5F4C, 0xC4800DE8, + 0xF9635F54, 0xA76B5F6A, 0x9D200140, 0xCD210000, + 0x86220020, 0xFD605F60, 0xCE615F62, 0x89625F66, + 0xDB635F5E, 0x85970C69, 0xA4685F60, 0xF66A5F62, + 0x826B5F5E, 0xD060B448, 0xFF21B44A, 0xB0510000, + 0x8100C000, 0xE434FF00, 0xD41A0000, 0x8162B44C, + 0xDB3700FF, 0xB263B44E, 0x906A5F66, 0xF3200041, + 0x3160B444, 0x6F62B454, 0x46200E43, 0x17210E11, + 0x7F2300A6, 0x2F800C80, 0x39635F54, 0x5B200000, + 0x4B210140, 0x2722002C, 0x276B5F6A, 0x7D605F60, + 0x0E615F62, 0x49625F66, 0x5B635F5E, 0x05970C69, + 0x546A5F5E, 0x24685F60, 0x17695F62, 0x54038000, + 0x0537FF00, 0x4218C000, 0x5060B448, 0x0D3600FF, + 0x0262B44A, 0x6061B44C, 0x5B200000, 0x1360B44E, + 0x506A5F66, 0x11200011, 0x3160B444, 0x6F62B454, + 0x10210E2F, 0x7F2300A6, 0x4D940C80, 0x206B5F54, + 0x518B4000, 0x25210041, 0x2F800D3A, 0x44210021, + 0x6F800D3A, 0x176A5F58, 0x02690164, 0x602E0028, + 0x0E390000, 0x4BD00E5A, 0x6F090000, 0x2A31FFFE, + 0x75680168, 0x3F418000, 0x3734001F, 0x682E0002, + 0x29408000, 0x75008000, 0x5F2C0002, 0x26500000, + 0x26500000, 0x518B4000, 0x4E208000, 0x29408000, + 0x5B200000, 0x29800E53, 0x20685F58, 0x4D210000, + 0x972C0028, 0xE6500000, 0xE6500000, 0xA6500000, + 0xEA410000, 0x918B4000, 0xAE230D3E, 0xE73607FC, + 0xD0C8038F, 0xB9635F54, 0x816B5F58, 0xC9625F66, + 0xA00CC000, 0xC44B0000, 0xDF2C0002, 0xA5480000, + 0xF9635F62, 0xB66B010E, 0x9B605F64, 0xF60DC000, + 0x9B610108, 0xE4970C53, 0xC1685F62, 0x94695F64, + 0xBD60B40C, 0xCE61B40E, 0xD4680108, 0x906A5F66, + 0xF421B40A, 0x9B60B408, 0xB0510000, 0xD4200081, + 0x3A60B404, 0x6462B414, 0x41685F54, 0x10210E75, + 0x7F2300A6, 0x29800C7A, 0x36695F6E, 0x4E208000, + 0x54150000, 0x25C80E8B, 0x118B4000, 0x796A5EA0, + 0x39605F6E, 0x6D200E91, 0x7536FFFD, 0x20625EA0, + 0x5A8000AB, 0x2A685FDC, 0x36695F6E, 0x58380000, + 0x0AC80EF4, 0x54605F70, 0x712C0040, 0x33490000, + 0x17655F6E, 0x5C65B112, 0x6F31FFFB, 0x312D4010, + 0x664A4000, 0x2F6BB110, 0x092D0002, 0x6F0AC000, + 0x9BC00EE8, 0xF04B4000, 0xD62DFFF6, 0xB93B0000, + 0xF7D40EAD, 0x8D685F70, 0xA02D0012, 0xE64A4000, + 0xD42C0042, 0x844B0000, 0xB82DFFEE, 0xEF1F8000, + 0x9FCC0EEA, 0xD4004000, 0xFB215F72, 0x8F970FDD, + 0xFE695F72, 0xB92C0006, 0xA9350003, 0xDACC0EEF, + 0xBB215F72, 0xF422FFFC, 0xE1970FF3, 0x8D685F70, + 0xB9215FDC, 0xE0970F5B, 0xE6971027, 0xA4970C53, + 0xEC6B5F70, 0xA8685F72, 0xBD695F74, 0xD522B40A, + 0xBA63B408, 0xD1520000, 0xFD60B40C, 0x8E61B40E, + 0xD4200081, 0xBA60B404, 0x90200040, 0xD360B414, + 0xD0210EBA, 0xBF2300A6, 0x8B940C7A, 0xE0685F6E, + 0xBC695FEA, 0xFA3400FF, 0xF930FFFB, 0x852C401A, + 0xC44B0000, 0x8F2D0001, 0xB82F0001, 0xDD430000, + 0x802CFFF6, 0xD24A0000, 0xF92C0006, 0x844B0000, + 0xA5615FEA, 0xF82F0001, 0xEF0AC000, 0xA5C40EDD, + 0xFA230000, 0x9D430000, 0x976A5F6E, 0xCD685F70, + 0x0D3600FF, 0x5D3A1000, 0x4A62B130, 0x06970F33, + 0x4E208000, 0x39605F6E, 0x0C230E91, 0x7C800115, + 0x66210088, 0x34655F6F, 0x0D685F70, 0x76695F6E, + 0x3E2C0038, 0x65480000, 0x4E800E93, 0x3F9700F5, + 0x4D685F70, 0x39215FDC, 0x21230EE3, 0x63800F5B, + 0x396A5EA0, 0x5E350800, 0x6F615F6E, 0x1DC800A6, + 0x0A3A0002, 0x60625EA0, 0x588000A6, 0x2B68B148, + 0x62300001, 0x20D00F04, 0x21300007, 0x62D00F09, + 0x06300008, 0x7E3CFFFF, 0x4A64B148, 0x3F80009F, + 0x7A230000, 0x1363B148, 0x3C635FF2, 0x59635FF0, + 0x6D800EFE, 0x07710048, 0x29710149, 0x5471804B, + 0x01800F0B, 0x40685FFC, 0x736AB1F8, 0x2434FF00, + 0x46300008, 0x192C0001, 0x21361F00, 0x71320008, + 0x0E0A0000, 0x41C000F9, 0x7F225E90, 0x3930FFFB, + 0x0E2C4000, 0x4E0A0000, 0x63C000F3, 0x37605FD2, + 0x43625FD4, 0x122A000F, 0x0EC000ED, 0x518B4000, + 0x88685FD6, 0xFB695FD4, 0xD8380000, 0x8FC80F27, + 0xF3490000, 0x87615FD6, 0x918B4000, 0xF9290044, + 0xD1C00F2F, 0xAE685FD2, 0xA2615FD4, 0xF6010000, + 0x812D0044, 0xE1615FD2, 0xD18B4000, 0x9B1C0000, + 0xF7605FD2, 0xB4605FD4, 0x918B4000, 0xDE695FD6, + 0x98380000, 0xFAC800F3, 0xEA410000, 0x91605FD6, + 0x918B4000, 0xCE390000, 0xD7C800ED, 0xA64A4000, + 0xD8380000, 0xBAC800F3, 0x88404000, 0xEF3A0000, + 0xAEC80F47, 0xDB2C003A, 0xCB420000, 0x892E0038, + 0xC32CFFC6, 0xA9408000, 0x918B4000, 0xD12DFFFE, + 0xC8404000, 0x918B4000, 0x8E390000, 0xD7C800ED, + 0xA64A4000, 0xD8380000, 0xFAC800F3, 0x88404000, + 0xEF3A0000, 0xA0C80F58, 0xBE2C0038, 0xCB420000, + 0xAC2E003A, 0xC72CFFC8, 0xE9408000, 0x918B4000, + 0x892D0002, 0xC8404000, 0xD18B4000, 0x8E390000, + 0xD7C800ED, 0x98380000, 0xBAC800F3, 0xF6635E96, + 0x1B2C003A, 0x444B0000, 0x472CFFFE, 0x124A0000, + 0x793B0000, 0x20C80F6E, 0x2F3A0000, 0x4CC80F7B, + 0x5F2F0038, 0x2A42C000, 0x2C2E003A, 0x662FFFC8, + 0x08438000, 0x4B800F76, 0x7F424000, 0x2F3A0000, + 0x6BC80F74, 0x2C2E003A, 0x08438000, 0x4B800F76, + 0x092D0002, 0x7F424000, 0x66500000, 0x26500000, + 0x2F6B5E96, 0x662CFFC4, 0x518B4000, 0x092D0002, + 0x7F424000, 0x1F2F0038, 0x2A42C000, 0x4B800F76, + 0x95320001, 0xC5367FFF, 0xC6C80F93, 0xB22A0008, + 0xD7C00F8F, 0xA6500000, 0xA6500000, 0xE6500000, + 0xE6500000, 0xA6500000, 0xA6500000, 0xE6500000, + 0xA6500000, 0xC6C80F93, 0xEA800F83, 0x93260008, + 0xE6500000, 0x932EFFFF, 0xB8CC0F90, 0xD18B4000, + 0x93635E94, 0xC4970F9D, 0xCA6B5E94, 0x9A8000AB, + 0x93635E94, 0xC4970F9D, 0xC1030000, 0xAB685E94, + 0xDA8000AB, 0x91484000, 0xA7615E92, 0xD4605E90, + 0x06300008, 0x55D40FBE, 0x76635E96, 0x1634007F, + 0x5F30FFFF, 0x092D0002, 0x170D0000, 0x704B4000, + 0x62300001, 0x192C0001, 0x1B695E90, 0x6C1E0000, + 0x3FCC0FAE, 0x5B200000, 0x63024000, 0x1B368000, + 0x4035007F, 0x0D1D0000, 0x3E695E92, 0x4BC80FBC, + 0x31320008, 0x541A0000, 0x4F2D0001, 0x07464000, + 0x0100C000, 0x6F6B5E96, 0x58380000, 0x118B4000, + 0x7F424000, 0x28800FB8, 0x1B1C0000, 0x518B4000, + 0x14605E90, 0x51484000, 0x45625E94, 0x06300008, + 0x71D40FDB, 0x17020000, 0x06300008, 0x5634007F, + 0x6136007F, 0x2C1E0000, 0x17C800ED, 0x5F30FFFF, + 0x3A6A5E90, 0x67615E92, 0x492D0002, 0x170D0000, + 0x7F424000, 0x1C6A5E94, 0x3E695E92, 0x62300001, + 0x192C0001, 0x6C1E0000, 0x74CC0FD8, 0x1B200000, + 0x34380080, 0x70444000, 0x518B4000, 0x1B200000, + 0x46800FCC, 0x36635E96, 0x044B0000, 0x5F2C0002, + 0xA9434000, 0xD24A0000, 0xC92D0002, 0xBF424000, + 0xD71B8000, 0x9F2C0002, 0x924A0000, 0xC92D0002, + 0xFF424000, 0x971B8000, 0x9F2C0002, 0xD24A0000, + 0x892D0002, 0xFF424000, 0xF51AC000, 0xAF6B5E96, + 0xDF2C0002, 0x892D0002, 0x918B4000, 0xD4605E90, + 0xA7615E92, 0xF6635E96, 0xF3490000, 0x940C8000, + 0xA5480000, 0xCE390000, 0xE1C8101A, 0xA1340FFC, + 0xCFC81002, 0xAA280041, 0x96C01002, 0xCB240041, + 0xAA072000, 0xCF801007, 0xCC31FFFA, 0xA3024000, + 0xF436FFC0, 0xB5034000, 0xBC37003F, 0xFE695E92, + 0xD1484000, 0x8D048000, 0x88404000, 0xC92D0002, + 0x91484000, 0xD604C400, 0xC8404000, 0x80C4101A, + 0xC92D0002, 0x91484000, 0xAC220000, 0xE2048400, + 0x88404000, 0xC0C4101A, 0xC92D0002, 0x91484000, + 0xA2048400, 0xC8404000, 0xEF6B5E96, 0x8D685E90, + 0xD18B4000, 0x8A685F14, 0x99215F14, 0xD8380000, + 0x05D01023, 0x65518000, 0x518B4000, 0x0100C000, + 0x49220002, 0x3F2300A6, 0x27800FC0, 0x4A685F14, + 0x5D215F1A, 0x18380000, 0x05D01023, 0x518B4000, + 0x0A685F14, 0x59215F14, 0x58380000, 0x24D400F1, + 0x55340080, 0x0FC81034, 0x09220002, 0x42800F98, + 0x30510000, 0x4E685F1A, 0x54635E9C, 0x18380000, + 0x33CC103A, 0x518B4000, 0x5D215F1A, 0x09220002, + 0x60970F94, 0x0D6B5E9C, 0x29801035, 0x60000000, + 0x20000000 +}; + +// Align to PKA_BUFFER_RAM_SIZE. This is greater than the actual buffer +// length so that the image is zero padded. +static const uint32_t fw1_farm_img_data_buf[2048] = +{ + 0x267001C9, 0x132040FA, 0x26502421, 0x032040D0, + 0x295046C7, 0x0D500000, 0x258C0200, 0x0F70AAC9, + 0x3B7000C8, 0x2D70001D, 0x2670001F, 0x296A4010, + 0x086B4014, 0x39621FF8, 0x16631FF4, 0x15684000, + 0x34694004, 0x1E601FF6, 0x3F611FF2, 0x346A4008, + 0x156B400C, 0x32621FFA, 0x1B631FF0, 0x219700BB, + 0x1E684034, 0x2170001E, 0x3A34003F, 0x281A0000, + 0x3F621FFE, 0x0628000B, 0x20C4004A, 0x1124002C, + 0x21884000, 0x2980004A, 0x30800033, 0x22800048, + 0x3480003E, 0x2980004A, 0x2C800040, 0x2C80002C, + 0x3980003A, 0x27800042, 0x21800044, 0x2A800046, + 0x276A4018, 0x34621FFC, 0x339701D9, 0x09300002, + 0x39D00063, 0x3930FFFE, 0x36800059, 0x276A4018, + 0x34621FFC, 0x2A97025F, 0x09300002, 0x39D00063, + 0x3930FFFE, 0x34800064, 0x2E970327, 0x268C0400, + 0x16614018, 0x36800059, 0x2F970733, 0x36800059, + 0x2A9706EF, 0x36800059, 0x29970735, 0x36800059, + 0x319706F1, 0x36800059, 0x3D970422, 0x36800059, + 0x27970767, 0x36800059, 0x3B7000C8, 0x24200021, + 0x358C5000, 0x26800073, 0x2B707FC8, 0x08702084, + 0x2D70001D, 0x36200000, 0x2D010000, 0x1E220001, + 0x2F970085, 0x01684084, 0x26340020, 0x0ECC0055, + 0x3920000F, 0x238C0100, 0x09300002, 0x39D00063, + 0x1B601FFC, 0x2A681FF0, 0x246A4014, 0x2D010000, + 0x2460400C, 0x2F970085, 0x29681FFC, 0x3930FFFE, + 0x036A1FF6, 0x276B1FF8, 0x08624000, 0x37634010, + 0x0D6A1FFE, 0x3F9700C3, 0x0E6A1FF2, 0x246B1FF4, + 0x05624004, 0x3A634014, 0x006A1FFA, 0x35230000, + 0x06624008, 0x358C5000, 0x3463401C, 0x106440C9, + 0x3C800006, 0x376B1FE4, 0x228B4000, 0x3C6B1FE6, + 0x228B4000, 0x3F8C0480, 0x24BC004E, 0x1B61401C, + 0x228B4000, 0x2D010000, 0x3930FFFE, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x09300002, + 0x202A0002, 0x0B614000, 0x1B624010, 0x29604008, + 0x1D218808, 0x23800079, 0x0B631FEC, 0x166B4000, + 0x086A1FF4, 0x27604000, 0x06614004, 0x2A634008, + 0x1B624010, 0x16624014, 0x37218001, 0x25970079, + 0x35068000, 0x186B4008, 0x0D691FF2, 0x24634000, + 0x06614004, 0x29604008, 0x1B624010, 0x2A320001, + 0x262EFFFF, 0x36058000, 0x1531FFFE, 0x214B4000, + 0x20250002, 0x0E494000, 0x2819C000, 0x07CC00A5, + 0x16624014, 0x2C218200, 0x25970079, 0x396B1FEC, + 0x228B4000, 0x37694008, 0x268C0400, 0x0D684024, + 0x04140000, 0x18D400B0, 0x36200000, 0x228B4000, + 0x00240001, 0x1A084000, 0x228B4000, 0x13684030, + 0x37380001, 0x21604030, 0x228B4000, 0x13684030, + 0x0834FFFE, 0x21604030, 0x228B4000, 0x386A40C4, + 0x3F694030, 0x1B360001, 0x1732FFF9, 0x18350001, + 0x1831FFFA, 0x011A4000, 0x228B4000, 0x07018000, + 0x28310006, 0x18350001, 0x0D614030, 0x2C320007, + 0x1B360001, 0x0A6240C4, 0x228B4000, 0x29604008, + 0x06614004, 0x16624014, 0x37218001, 0x268C0400, + 0x1B61401C, 0x2A694010, 0x27604000, 0x36064000, + 0x1B624010, 0x228B4000, 0x29604008, 0x06614004, + 0x16624014, 0x2D218018, 0x268C0400, 0x1B61401C, + 0x296A4010, 0x27604000, 0x2F260001, 0x1B624010, + 0x228B4000, 0x29604008, 0x06614004, 0x16624014, + 0x2C218200, 0x268C0400, 0x1B61401C, 0x246A4014, + 0x27604000, 0x1B624010, 0x228B4000, 0x1C2100FF, + 0x288000EE, 0x1A210000, 0x05631FE4, 0x24611FEC, + 0x21681FF2, 0x2B6040A0, 0x0B691FF4, 0x27604000, + 0x29604008, 0x18614010, 0x268C0400, 0x0970081C, + 0x2470881D, 0x01F000F9, 0x3930FFFE, 0x27490000, + 0x29310001, 0x3A200003, 0x1DD40075, 0x1231FFFF, + 0x286540B4, 0x216B1FFE, 0x036A1FF6, 0x3D33FFFF, + 0x3FD00110, 0x276B1FF8, 0x08624000, 0x06624008, + 0x37634010, 0x3F8C0480, 0x24BC004E, 0x3C70011F, + 0x0970081C, 0x2470881D, 0x13F0010E, 0x38800112, + 0x3F8C0480, 0x24BC004E, 0x196840A0, 0x21694024, + 0x1F090000, 0x30C801D6, 0x07024000, 0x1D2E0001, + 0x16624014, 0x1F31FFFB, 0x0E684028, 0x2670001F, + 0x2F34001F, 0x2E184000, 0x322C0001, 0x2E020000, + 0x09240008, 0x1334FFE0, 0x08300005, 0x0B691FF4, + 0x206040A2, 0x2D6040A6, 0x322C0001, 0x1F090000, + 0x25C40135, 0x356940A0, 0x1C050000, 0x252DFFFF, + 0x1531FFFE, 0x21510000, 0x21510000, 0x03691FFA, + 0x1C050000, 0x252DFFFF, 0x1531FFFE, 0x21510000, + 0x21510000, 0x322C0001, 0x16691FEC, 0x0834FFFE, + 0x2B3D00FF, 0x19CC013D, 0x27681FF4, 0x0B240003, + 0x0834FFFE, 0x08601FEC, 0x2B26000C, 0x21621FEA, + 0x2226005F, 0x35200060, 0x35230000, 0x160B2000, + 0x252DFFFF, 0x026140AA, 0x1E2D0001, 0x15072000, + 0x3F6B1FEA, 0x28004000, 0x3530FFFD, 0x1F0AC000, + 0x35230000, 0x0D631FEA, 0x160B2000, 0x3520000C, + 0x35230000, 0x29290007, 0x26C40155, 0x2A250007, + 0x23800156, 0x1B210007, 0x1A084000, 0x2D1B4000, + 0x33634088, 0x306940AA, 0x3530FFFD, 0x1E2D0001, + 0x15072000, 0x252A0008, 0x2A621FE8, 0x2B008000, + 0x1D2E0001, 0x1334FFE0, 0x08300005, 0x322C0001, + 0x296B1FF0, 0x16691FEC, 0x03601FEE, 0x1A074000, + 0x24634000, 0x3A33FFFE, 0x0E530000, 0x0E530000, + 0x0E530000, 0x0E530000, 0x0A330002, 0x2A634008, + 0x33070000, 0x0B2B0003, 0x09280004, 0x02C0018C, + 0x322C0001, 0x34604010, 0x3F8C0480, 0x24BC004E, + 0x3C70011F, 0x2A70001C, 0x2470881D, 0x09F0017B, + 0x0E691FFE, 0x0D684024, 0x1231FFFF, 0x37D0018B, + 0x00691FF6, 0x04140000, 0x3CD001D3, 0x1A084000, + 0x22694028, 0x0335001F, 0x3330FFFB, 0x2E184000, + 0x36C801D0, 0x322C0001, 0x00601FE2, 0x2670001F, + 0x2B008000, 0x3D3CFFFF, 0x30218000, 0x19110000, + 0x3A33FFFE, 0x20340010, 0x21C80197, 0x1641C000, + 0x0F270002, 0x0E530000, 0x23800199, 0x0E530000, + 0x1641C000, 0x31681FEE, 0x356940A0, 0x34604010, + 0x166B4000, 0x3304C000, 0x322C0001, 0x0834FFFE, + 0x06614004, 0x29604008, 0x0568401C, 0x3F8C0480, + 0x24BC004E, 0x3C70011F, 0x2A70001C, 0x1B70821D, + 0x19F001A8, 0x3D340008, 0x30C801BA, 0x0E691FFE, + 0x0D684024, 0x1231FFFF, 0x36D001BA, 0x00691FF6, + 0x04140000, 0x3CD001D3, 0x1A084000, 0x22694028, + 0x3330FFFB, 0x0335001F, 0x2E184000, 0x36C801D0, + 0x322C0001, 0x00601FE2, 0x2670001F, 0x1B691FE8, + 0x3E20000E, 0x29310001, 0x1231FFFF, 0x28D001C2, + 0x092CFFFF, 0x378001BE, 0x39694000, 0x0C2207FA, + 0x186B4008, 0x096140A8, 0x256340A4, 0x076240AC, + 0x236040AE, 0x2E7000B2, 0x3F8C0480, 0x24BC004E, + 0x31700484, 0x24E001CD, 0x31200001, 0x20800075, + 0x3F200009, 0x2670001F, 0x20800075, 0x3C200005, + 0x2670001F, 0x20800075, 0x37200007, 0x2670001F, + 0x20800075, 0x08631FE0, 0x35230000, 0x25671FFF, + 0x227001C4, 0x229700ED, 0x063C0001, 0x3BC801E2, + 0x063C0001, 0x3180022B, 0x2F681FFA, 0x266040A4, + 0x3A8C0180, 0x24BC004E, 0x34700184, 0x34E001E7, + 0x3B6940A8, 0x126840A2, 0x0B614000, 0x322C0001, + 0x296B1FF0, 0x34604010, 0x2A634008, 0x3A8C0180, + 0x24BC004E, 0x2A70001C, 0x2470881D, 0x05691FFC, + 0x2D3D0000, 0x3DC8022D, 0x252DFFFF, 0x28C8020D, + 0x28004000, 0x0034FFF0, 0x3420000B, 0x0ACC022B, + 0x156A1FEC, 0x0200C000, 0x1A048000, 0x266340A8, + 0x256340A4, 0x3F8C0480, 0x24BC004E, 0x34700184, + 0x24E00204, 0x256040A8, 0x1A048000, 0x3A8C0180, + 0x24BC004E, 0x32700284, 0x2CE0020A, 0x252DFFFF, + 0x17CC0205, 0x2A681FF0, 0x16691FEC, 0x1C050000, + 0x036A1FF6, 0x316B1FE2, 0x256040A8, 0x0A6140A4, + 0x076240AC, 0x29681FFC, 0x0C2B0002, 0x092CFFFF, + 0x206340AE, 0x336040B2, 0x2C8C5080, 0x24BC004E, + 0x31700484, 0x3EE0021D, 0x06691FF0, 0x3D201FE8, + 0x096140A8, 0x0A500001, 0x09300002, 0x266040A4, + 0x36200000, 0x2D6040A6, 0x3A8C0180, 0x24BC004E, + 0x34700184, 0x35E00229, 0x31200001, 0x3A6B1FE0, + 0x228B4000, 0x06691FF0, 0x156A1FEC, 0x28004000, + 0x1A048000, 0x03601FEE, 0x268C0400, 0x2F970085, + 0x2D010000, 0x268C0400, 0x2C970259, 0x1E691FE2, + 0x252DFFFF, 0x37C8021E, 0x2C611FE2, 0x3297024D, + 0x1B360001, 0x0DCC0246, 0x28200078, 0x31681FEE, + 0x06691FF0, 0x2C970259, 0x2A681FF0, 0x2E230237, + 0x2D010000, 0x2A800259, 0x2A681FF0, 0x1D691FEE, + 0x2C970259, 0x31681FEE, 0x2E230237, 0x2D010000, + 0x2A800259, 0x2C681FF6, 0x252DFFFF, 0x07024000, + 0x2F36FFF0, 0x21320003, 0x3930FFFE, 0x1F060000, + 0x0E4A8000, 0x28004000, 0x3C34000F, 0x1A120000, + 0x228B4000, 0x0A6140A4, 0x256040A8, 0x3A8C0180, + 0x24BC004E, 0x34700184, 0x228B4000, 0x0E631FE6, + 0x2B9702A1, 0x239702AF, 0x39681FD6, 0x0E6A1FF2, + 0x00691FF6, 0x276B1FF8, 0x1F060000, 0x03270001, + 0x0B37FFFE, 0x1F05C000, 0x296B1FF0, 0x32611FF6, + 0x3304C000, 0x3C621FF2, 0x1D601FFA, 0x18601FF0, + 0x268C0400, 0x339701D9, 0x02030000, 0x053F0001, + 0x1FCC029E, 0x238C0100, 0x166A1FD6, 0x06691FF0, + 0x28004000, 0x35098000, 0x1A048000, 0x2F970085, + 0x2D010000, 0x15684000, 0x35098000, 0x35068000, + 0x2F970085, 0x276B1FF8, 0x00691FF6, 0x03270001, + 0x0B37FFFE, 0x1C09C000, 0x3A6B1FD6, 0x0E6A1FF2, + 0x32611FF6, 0x1F0AC000, 0x3C621FF2, 0x268C0400, + 0x339701D9, 0x326B1FD8, 0x166A1FD6, 0x06691FF0, + 0x1E631FFA, 0x35098000, 0x34611FF0, 0x02030000, + 0x053F0001, 0x1FCC029E, 0x238C0100, 0x1A210000, + 0x3C9702E6, 0x22970312, 0x2A681FF0, 0x2460400C, + 0x268C0400, 0x31200001, 0x2B800077, 0x37200007, + 0x2480029E, 0x0B631FEC, 0x0D691FF2, 0x006A1FFA, + 0x06614004, 0x0B691FF4, 0x2C621FD8, 0x15614014, + 0x2D3D0000, 0x29C8029F, 0x28004000, 0x0C240002, + 0x0834FFFE, 0x0B601FD6, 0x228B4000, 0x0B631FEC, + 0x39681FD6, 0x0D691FF2, 0x086A1FF4, 0x28004000, + 0x2F970085, 0x399700A9, 0x0F280002, 0x1BC0029F, + 0x0C240002, 0x39604014, 0x2F9700B3, 0x0B691FF4, + 0x39681FD6, 0x35054000, 0x056A1FF0, 0x18614010, + 0x08624000, 0x1F060000, 0x1F060000, 0x23260002, + 0x06624008, 0x0B62400C, 0x2C218200, 0x25970079, + 0x226B1FF2, 0x086A1FF4, 0x3304C000, 0x2D010000, + 0x2F970085, 0x399700A9, 0x0F280002, 0x1BC0029F, + 0x0C240002, 0x39604014, 0x35068000, 0x1B624010, + 0x39681FD6, 0x396A400C, 0x186B4008, 0x1F060000, + 0x2A681FF0, 0x29634004, 0x06624008, 0x27604000, + 0x2C218200, 0x25970079, 0x166A1FD6, 0x3A69400C, + 0x2A681FF0, 0x35068000, 0x2F970085, 0x229700B7, + 0x396B1FEC, 0x228B4000, 0x0B631FEC, 0x2A681FF0, + 0x1A048000, 0x2460400C, 0x1A048000, 0x0C240002, + 0x19044000, 0x086A1FF4, 0x0D691FF2, 0x3930FFFE, + 0x0D500000, 0x0D500000, 0x09300002, 0x2F970085, + 0x399700A9, 0x39604014, 0x1B684008, 0x156B400C, + 0x2F260001, 0x06691FF0, 0x03280001, 0x1B624010, + 0x29604008, 0x06614004, 0x24634000, 0x2C2A0001, + 0x36058000, 0x1531FFFE, 0x21510000, 0x21510000, + 0x19078000, 0x3A33FFFE, 0x0E530000, 0x0E530000, + 0x3B218002, 0x25970079, 0x23260002, 0x1B624010, + 0x246A4014, 0x03691FFA, 0x1B684008, 0x319700CB, + 0x396B1FEC, 0x228B4000, 0x0B631FEC, 0x2F9700B3, + 0x166B4000, 0x1668400C, 0x2763400C, 0x0D691FF2, + 0x246A4014, 0x219700E1, 0x3A6B1FD6, 0x0D691FF2, + 0x1668400C, 0x1F05C000, 0x086A1FF4, 0x319700CB, + 0x2A681FF0, 0x086A1FF4, 0x2D010000, 0x269700D6, + 0x229700B7, 0x396B1FEC, 0x228B4000, 0x05631FE4, + 0x2A681FF0, 0x2460400C, 0x08691FF8, 0x29611FDE, + 0x086A1FF4, 0x21621FDC, 0x350A4000, 0x040E4000, + 0x0CD40332, 0x07024000, 0x24260003, 0x2736FFFE, + 0x00601FE2, 0x1A048000, 0x0B601FE0, 0x1A048000, + 0x35068000, 0x37621FF0, 0x1A048000, 0x0B601FD6, + 0x1668400C, 0x2897007D, 0x056A1FF0, 0x1668400C, + 0x1A048000, 0x2897007D, 0x0B6A1FF8, 0x32681FE2, + 0x296B1FF0, 0x3304C000, 0x00691FF6, 0x2F970085, + 0x268C0400, 0x0E6B4024, 0x05631FD2, 0x1A378000, + 0x07CC0415, 0x39681FE0, 0x296B1FF0, 0x3304C000, + 0x0D691FF2, 0x086A1FF4, 0x2F970085, 0x32681FE2, + 0x3930FFFE, 0x0A500001, 0x39681FE0, 0x0D691FF2, + 0x2F970085, 0x3B201FD8, 0x0D500000, 0x0D500000, + 0x0D691FF2, 0x1531FFFE, 0x0E494000, 0x29310001, + 0x05D40418, 0x1231FFFF, 0x36200000, 0x00601FD4, + 0x32230001, 0x1E220001, 0x0200C000, 0x2E148000, + 0x31C8036D, 0x32681FD4, 0x1A048000, 0x00601FD4, + 0x1A074000, 0x35054000, 0x35068000, 0x02CC0366, + 0x32681FE2, 0x296B1FF0, 0x3304C000, 0x1A210000, + 0x186A1FDE, 0x3397041C, 0x3930FFFE, 0x0B480000, + 0x1A388000, 0x05300001, 0x24D0037D, 0x2C250001, + 0x25800379, 0x2D3D0000, 0x35C803AF, 0x268C0400, + 0x16614018, 0x26218040, 0x25970079, 0x32681FD4, + 0x1E691FE2, 0x1531FFFE, 0x0E494000, 0x15072000, + 0x1D210001, 0x0B6B4018, 0x3E3FFFFF, 0x03270001, + 0x1A11C000, 0x252DFFFF, 0x02164000, 0x326B1FD8, + 0x268C0400, 0x21694024, 0x2A611FD2, 0x3BC803A7, + 0x1F1F8000, 0x3AC803A0, 0x2C621FD8, 0x21681FF2, + 0x0C2107F6, 0x3297041B, 0x1E220001, 0x16624014, + 0x39681FD6, 0x29604008, 0x37218001, 0x25970079, + 0x15691FD6, 0x32681FE2, 0x086A1FF4, 0x2F260001, + 0x3397041C, 0x23218010, 0x25970079, 0x32681FE2, + 0x1A210000, 0x086A1FF4, 0x2F260001, 0x3397041C, + 0x26218040, 0x25970079, 0x2C800370, 0x39681FE0, + 0x296B1FF0, 0x3304C000, 0x2A604004, 0x32681FE2, + 0x3304C000, 0x27604000, 0x186A1FDE, 0x3F6B1FDC, + 0x3A634014, 0x1F0AC000, 0x2E0EC000, 0x1AD403BD, + 0x2D02C000, 0x1B624010, 0x2F218400, 0x25970079, + 0x18691FD2, 0x1F1C4000, 0x0DCC03CA, 0x1531FFFE, + 0x22484000, 0x063C0001, 0x122D0002, 0x0E494000, + 0x2E184000, 0x2DC8040B, 0x268C0400, 0x00684020, + 0x05300001, 0x30D00415, 0x09300002, 0x22D003D8, + 0x15684000, 0x34694004, 0x2A604004, 0x0B614000, + 0x06684010, 0x27694014, 0x39604014, 0x18614010, + 0x166B4000, 0x2A634008, 0x0E631FD0, 0x25218020, + 0x25970079, 0x2DD003E1, 0x39681FE0, 0x1E691FE2, + 0x2A8003E3, 0x32681FE2, 0x15691FE0, 0x086A1FF4, + 0x2F260001, 0x3397041C, 0x268C0400, 0x226A4024, + 0x25218020, 0x25970079, 0x3F681FD0, 0x1C0A0000, + 0x2F260001, 0x15691FE0, 0x296B1FF0, 0x1F05C000, + 0x1A1D0000, 0x00CC03F8, 0x32681FE2, 0x15691FE0, + 0x0B601FE0, 0x2C611FE2, 0x37681FDE, 0x0E601FDC, + 0x2A621FDE, 0x32681FE2, 0x0D691FF2, 0x3297041B, + 0x296A4010, 0x1A048000, 0x3930FFFE, 0x268C0400, + 0x084B0000, 0x0D500000, 0x0D500000, 0x023F0000, + 0x26C80370, 0x23218010, 0x25970079, 0x052CFFFC, + 0x268C0400, 0x0D500000, 0x2C800370, 0x1E691FE2, + 0x39681FE0, 0x086A1FF4, 0x2F970085, 0x16624014, + 0x31200001, 0x1A210000, 0x156B400C, 0x1B631FF0, + 0x20800075, 0x24200017, 0x1B210007, 0x3D800412, + 0x3A200003, 0x0621001F, 0x3D800412, 0x086A1FF4, + 0x1B624010, 0x16624014, 0x27604000, 0x06614004, + 0x29604008, 0x228B4000, 0x0E631FE6, 0x2C681FF6, + 0x08691FF8, 0x086A1FF4, 0x1D601FCC, 0x37611FCA, + 0x39621FF8, 0x24260003, 0x2736FFFE, 0x39621FCE, + 0x296B1FF0, 0x19078000, 0x19078000, 0x1D631FF6, + 0x19078000, 0x1B631FF0, 0x2E970327, 0x063C0001, + 0x28C80437, 0x063C0001, 0x2A800455, 0x2A681FF0, + 0x0B6A1FCE, 0x19088000, 0x2897007D, 0x06691FF0, + 0x0B6A1FCE, 0x2B034000, 0x28004000, 0x19078000, + 0x24634000, 0x19088000, 0x19088000, 0x2097008A, + 0x06691FF0, 0x0B6A1FCE, 0x28004000, 0x19088000, + 0x3930FFFE, 0x0A500001, 0x0F280002, 0x09300002, + 0x19088000, 0x19088000, 0x18601FF0, 0x2097008A, + 0x03691FCC, 0x066A1FCA, 0x32611FF6, 0x39621FF8, + 0x31200001, 0x268C0400, 0x2B800077, 0x0D601FD0, + 0x296A4010, 0x15684000, 0x2C621FD8, 0x08601FDA, + 0x10691FDC, 0x2A681FF0, 0x07024000, 0x36064000, + 0x36064000, 0x2897007D, 0x1E6A1FD8, 0x3A681FDA, + 0x1B624010, 0x27604000, 0x3F681FD0, 0x063C0001, + 0x09CC0471, 0x216B1FFE, 0x071BC000, 0x25D0046F, + 0x229706BB, 0x0D601FD0, 0x33800476, 0x379706AD, + 0x33800476, 0x0D3C0003, 0x08CC0476, 0x36970483, + 0x31200001, 0x0D601FD0, 0x3F681FD0, 0x35230000, + 0x2D010000, 0x293D000D, 0x0ACC047D, 0x34230007, + 0x3C800480, 0x2E3D000C, 0x36C80480, 0x2923001F, + 0x268C0400, 0x39634018, 0x2B800077, 0x08631FD6, + 0x37681FB2, 0x03691FFA, 0x086A1FF4, 0x2F970085, + 0x16624014, 0x2F681FFA, 0x226B1FF2, 0x136A1FDC, + 0x1D691FB4, 0x1A048000, 0x2A604004, 0x05614008, + 0x24634000, 0x25218020, 0x25970079, 0x3A681FB6, + 0x3930FFFE, 0x0A500001, 0x3A6B1FD6, 0x228B4000, + 0x1A048000, 0x3930FFFE, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x228B4000, 0x086A1FF4, + 0x1D2E0001, 0x1B624010, 0x0B614000, 0x29604008, + 0x268C0400, 0x2A70001C, 0x2470881D, 0x36058000, + 0x1A048000, 0x228B4000, 0x27604000, 0x27681FF4, + 0x05614008, 0x34604010, 0x268C0400, 0x15624018, + 0x2E020000, 0x29218080, 0x23800079, 0x08631FD6, + 0x387000C4, 0x249700EB, 0x246B1FF4, 0x08270003, + 0x0B37FFFE, 0x0D631FDC, 0x2D010000, 0x2A3D0001, + 0x238C0100, 0x1ACC0457, 0x3D6A40A2, 0x176840A8, + 0x2F260001, 0x27970498, 0x21681FF2, 0x086A1FF4, + 0x27970498, 0x2F260001, 0x2736FFFE, 0x0F6240A2, + 0x026240A6, 0x3A6B1FD6, 0x228B4000, 0x08631FD6, + 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x136A1FDC, + 0x06691FF0, 0x3D201FB2, 0x2D230012, 0x35098000, + 0x36058000, 0x15410000, 0x3E2C0002, 0x0A2FFFFF, + 0x0FCC04D4, 0x37681FB2, 0x2897007D, 0x136A1FDC, + 0x3A681FB6, 0x1D32FFFC, 0x2897007D, 0x2E97052B, + 0x16691FB6, 0x21681FF2, 0x1E220001, 0x2A9704AA, + 0x1E220001, 0x1B691FB2, 0x3F970530, 0x3A6B1FD6, + 0x228B4000, 0x08631FD6, 0x3F6B1FDC, 0x0D691FF2, + 0x1D6A1FD4, 0x1F05C000, 0x2E97051D, 0x15691FBA, + 0x1E220001, 0x3F970530, 0x106A1FD0, 0x03691FFA, + 0x2E97051D, 0x216B1FFE, 0x03691FFA, 0x071BC000, + 0x1ED404FF, 0x3F6B1FDC, 0x036A1FC0, 0x1F05C000, + 0x1F05C000, 0x2E97051D, 0x34800502, 0x15691FBA, + 0x2C681FC0, 0x2697049F, 0x13691FD0, 0x34681FBE, + 0x036A1FC0, 0x286040AC, 0x096140A8, 0x096240A4, + 0x358C5000, 0x28700384, 0x3A6B1FD6, 0x228B4000, + 0x136A1FDC, 0x15691FBA, 0x16624014, 0x1632FFFE, + 0x35098000, 0x0B614000, 0x0A6140A4, 0x16691FB6, + 0x1D6A1FB8, 0x05614008, 0x0B691FF4, 0x05624004, + 0x1E2D0001, 0x18614010, 0x228B4000, 0x1B684008, + 0x2B800527, 0x0B631FEC, 0x0B614000, 0x06624008, + 0x2B008000, 0x13218800, 0x25970079, 0x086A1FF4, + 0x27970498, 0x1B684008, 0x396B1FEC, 0x256040A8, + 0x358C5000, 0x34700184, 0x228B4000, 0x086A1FF4, + 0x1D691FB4, 0x1B624010, 0x0A6140A4, 0x228B4000, + 0x28004000, 0x1531FFFE, 0x268C0400, 0x3F424000, + 0x2B800527, 0x2C8C5080, 0x24BC004E, 0x13204096, + 0x228B4000, 0x2C8C5080, 0x24BC004E, 0x13204096, + 0x3E500C63, 0x228B4000, 0x2C681FF6, 0x252DFFFF, + 0x07024000, 0x2F36FFF0, 0x21320003, 0x3930FFFE, + 0x1F060000, 0x0E4A8000, 0x28004000, 0x3C34000F, + 0x1A120000, 0x02624090, 0x228B4000, 0x036A1FC0, + 0x096140A8, 0x096240A4, 0x238C0100, 0x34700184, + 0x0E6A1FF2, 0x05624004, 0x086A1FF4, 0x16624014, + 0x0B614000, 0x05614008, 0x238C0100, 0x20694080, + 0x18350001, 0x03CC055B, 0x228B4000, 0x1D2E0001, + 0x1B624010, 0x25218020, 0x23800079, 0x08631FD6, + 0x16502DE7, 0x3F502084, 0x36970539, 0x13502931, + 0x35970535, 0x0F6B4080, 0x25370020, 0x0FCC071D, + 0x13503548, 0x03501CE4, 0x36970539, 0x315024A9, + 0x35970535, 0x0350A148, 0x0A5035A4, 0x36970539, + 0x3350252E, 0x35970535, 0x0E502929, 0x145035B0, + 0x36970539, 0x3F502108, 0x35970535, 0x2B5025A9, + 0x1D502CA6, 0x36970539, 0x1450288A, 0x35970535, + 0x2350B4EB, 0x18509525, 0x36970539, 0x37501086, + 0x35970535, 0x0F502D67, 0x035035AD, 0x36970539, + 0x1C501991, 0x35970535, 0x0F6B4080, 0x00631FEE, + 0x235098C4, 0x27509DAF, 0x36970539, 0x1450316C, + 0x35970535, 0x00509148, 0x1E502CC6, 0x36970539, + 0x1A50358E, 0x35970535, 0x355099AB, 0x3A6B1FD6, + 0x228B4000, 0x08631FD6, 0x30700090, 0x3A97050C, + 0x358C5000, 0x23700080, 0x13204096, 0x3E500C63, + 0x235024E4, 0x13204096, 0x3E500C63, 0x045030A6, + 0x35970535, 0x2850B12C, 0x395020EE, 0x36970539, + 0x0B5028AF, 0x35970535, 0x3D50A90A, 0x3D50AD8C, + 0x35970535, 0x29503D6B, 0x1850C54A, 0x36970539, + 0x0F6B4080, 0x00631FEE, 0x23700080, 0x1C50352B, + 0x35970535, 0x326B1FEE, 0x236A4080, 0x07330006, + 0x14D405B9, 0x2B320006, 0x27D005DE, 0x3220000D, + 0x21800457, 0x3E500C63, 0x16502D8B, 0x36970539, + 0x3450252F, 0x35970535, 0x3950252B, 0x3350210B, + 0x36970539, 0x1B5018E5, 0x35970535, 0x3E500C63, + 0x205044D1, 0x36970539, 0x3D502409, 0x35970535, + 0x0550A531, 0x065018CB, 0x35970535, 0x3E500C63, + 0x32504409, 0x36970539, 0x2450112C, 0x35970535, + 0x3650B62D, 0x0D50300C, 0x35970535, 0x3E500C63, + 0x025035AA, 0x35970535, 0x2550B50D, 0x3B502520, + 0x35970535, 0x1B501C63, 0x3350140D, 0x35970535, + 0x3A6B1FD6, 0x228B4000, 0x2E97052B, 0x3F6B1FDC, + 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000, 0x2E97051D, + 0x1E691FB8, 0x3F681FD0, 0x2697049F, 0x13691FD0, + 0x12220002, 0x3F970530, 0x1E691FB8, 0x2C681FC0, + 0x249704A2, 0x00691FC0, 0x15220003, 0x3F970530, + 0x3A97050C, 0x358C5000, 0x23700080, 0x13204096, + 0x3E500C63, 0x3F502084, 0x13204096, 0x3E500C63, + 0x0B5035CF, 0x35970535, 0x3E500C63, 0x0C502D07, + 0x36970539, 0x195034AD, 0x35970535, 0x3E500C63, + 0x325024A5, 0x36970539, 0x165029AE, 0x35970535, + 0x0F503144, 0x2F502531, 0x36970539, 0x0250194A, + 0x35970535, 0x295010C8, 0x0E50318C, 0x36970539, + 0x085028CF, 0x35970535, 0x24502569, 0x195019AD, + 0x36970539, 0x25501004, 0x35970535, 0x3E50B08C, + 0x11502D29, 0x36970539, 0x1B5019A6, 0x35970535, + 0x3E500C63, 0x3450140C, 0x36970539, 0x2750218F, + 0x35970535, 0x2550AD0B, 0x04502940, 0x35970535, + 0x3E500C63, 0x0C50300B, 0x36970539, 0x3C5011AB, + 0x35970535, 0x3250B585, 0x3B502520, 0x35970535, + 0x3E500C63, 0x0E5035A9, 0x35970535, 0x3350B54D, + 0x15502C0B, 0x35970535, 0x1B501C63, 0x3350140D, + 0x35970535, 0x3A6B1FD6, 0x228B4000, 0x08631FD6, + 0x2E97052B, 0x03691FCC, 0x3F6B1FDC, 0x2F681FFA, + 0x1E220001, 0x3304C000, 0x2A9704AA, 0x2897051B, + 0x08691FCE, 0x3F6B1FDC, 0x21681FF2, 0x1E220001, + 0x3304C000, 0x3304C000, 0x2A9704AA, 0x2897051B, + 0x30700090, 0x3A97050C, 0x358C5000, 0x13204096, + 0x3E500C63, 0x0B502A25, 0x13204096, 0x3E500C63, + 0x2250248F, 0x35970535, 0x0250292A, 0x285020AF, + 0x36970539, 0x25501004, 0x35970535, 0x00502D04, + 0x295038AE, 0x36970539, 0x245024E5, 0x35970535, + 0x1650A088, 0x2A50392E, 0x36970539, 0x19502D4B, + 0x35970535, 0x3E500C63, 0x0A502924, 0x36970539, + 0x0F502CEB, 0x35970535, 0x00502DCB, 0x3B5011AA, + 0x36970539, 0x3F502108, 0x35970535, 0x3E500C63, + 0x15502C0B, 0x36970539, 0x2A5020C8, 0x35970535, + 0x2550AD0B, 0x0D502925, 0x35970535, 0x1B501C63, + 0x3550140B, 0x36970539, 0x185019AA, 0x35970535, + 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x21681FF2, + 0x10691FDC, 0x086A1FF4, 0x19044000, 0x27604000, + 0x27970498, 0x21681FF2, 0x35054000, 0x19044000, + 0x27970498, 0x07024000, 0x39694000, 0x29681FCA, + 0x2F970085, 0x3A97050C, 0x13204096, 0x268C0400, + 0x3E500C63, 0x225020C6, 0x36970539, 0x325024A5, + 0x35970535, 0x3E500C63, 0x0E502D0C, 0x36970539, + 0x1C502884, 0x35970535, 0x3E500C63, 0x335021A8, + 0x36970539, 0x00502C2B, 0x35970535, 0x1450296A, + 0x30502028, 0x35970535, 0x0D50A509, 0x09502944, + 0x35970535, 0x3E500C63, 0x325024C9, 0x35970535, + 0x1B50A549, 0x2A502144, 0x36970539, 0x3D502409, + 0x35970535, 0x358C5000, 0x0F6B4080, 0x3E370008, + 0x0CCC06AB, 0x2720001B, 0x21800457, 0x3A6B1FD6, + 0x228B4000, 0x08631FD6, 0x2C681FC0, 0x3930FFFE, + 0x0A500001, 0x1B204098, 0x1A5000E4, 0x1B204098, + 0x025004E5, 0x36970539, 0x325008E6, 0x35970535, + 0x238C0100, 0x3A6B1FD6, 0x228B4000, 0x08631FD6, + 0x2C681FC0, 0x3930FFFE, 0x358C5000, 0x0A500001, + 0x1B204098, 0x175018E6, 0x296B1FF0, 0x2C681FF6, + 0x08691FF8, 0x10631FC4, 0x18601FC6, 0x3C611FC8, + 0x3F6B1FDC, 0x39681FD6, 0x18631FCA, 0x1D601FCC, + 0x34681FBE, 0x0B691FF4, 0x2F6B1FC0, 0x1E2D0001, + 0x3A611FF8, 0x1B631FF0, 0x1E601FF6, 0x358C5000, + 0x2E970327, 0x226B1FC4, 0x056A1FC6, 0x0E691FC8, + 0x1B631FF0, 0x31621FF6, 0x3A611FF8, 0x2A6B1FCA, + 0x006A1FCC, 0x0D631FDC, 0x24621FD6, 0x268C0400, + 0x02030000, 0x053F0001, 0x1CCC06ED, 0x15691FBA, + 0x2D97054B, 0x13691FBC, 0x2D97054B, 0x136A1FDC, + 0x15691FBA, 0x2A681FF0, 0x35068000, 0x2F970085, + 0x31200001, 0x3A6B1FD6, 0x228B4000, 0x19220000, + 0x3C8006F3, 0x00220080, 0x3C8006F3, 0x09661FFF, + 0x0E631FE6, 0x309704B3, 0x249704CE, 0x2E9704CB, + 0x309704E9, 0x2E97052B, 0x18691FD2, 0x14220004, + 0x3F970530, 0x08691FCE, 0x3F6B1FDC, 0x21681FF2, + 0x12220002, 0x3304C000, 0x3304C000, 0x2A9704AA, + 0x2897051B, 0x3A97050C, 0x1A21889C, 0x0A614092, + 0x358C5000, 0x23700080, 0x1E691FE2, 0x3797053E, + 0x13204096, 0x095029E7, 0x035030A7, 0x13204096, + 0x095029E7, 0x325024A5, 0x35970535, 0x3397055F, + 0x02194000, 0x3CC80720, 0x3797053E, 0x1B204098, + 0x035030A7, 0x36970539, 0x325024A5, 0x35970535, + 0x3C800713, 0x358C5000, 0x29200013, 0x21800457, + 0x358C5000, 0x236A4080, 0x09360020, 0x04CC0729, + 0x35970633, 0x358C5000, 0x29970676, 0x31200001, + 0x21800457, 0x1E6A1FEE, 0x1C6B4090, 0x27320005, + 0x1A1EC000, 0x1B360001, 0x28C80731, 0x3220000D, + 0x21800457, 0x3D200002, 0x21800457, 0x0F220040, + 0x24800737, 0x162200C0, 0x24800737, 0x09661FFF, + 0x0E631FE6, 0x309704B3, 0x249704CE, 0x2E9704CB, + 0x166A1FBA, 0x03691FFA, 0x2E97051D, 0x3F6B1FDC, + 0x03691FFA, 0x0B6A1FCE, 0x1F05C000, 0x2E97051D, + 0x1B6A1FBE, 0x00691FF6, 0x2E97051D, 0x3F6B1FDC, + 0x00691FF6, 0x106A1FD0, 0x1F05C000, 0x2E97051D, + 0x22681FFE, 0x07180000, 0x2CD00756, 0x1B691FB2, + 0x3F681FBC, 0x249704A2, 0x1B691FB2, 0x2C681FC0, + 0x249704A2, 0x2B800762, 0x3F6B1FDC, 0x03691FFA, + 0x106A1FBC, 0x1F05C000, 0x1F05C000, 0x2E97051D, + 0x3F6B1FDC, 0x00691FF6, 0x036A1FC0, 0x1F05C000, + 0x1F05C000, 0x2E97051D, 0x39970595, 0x358C5000, + 0x29970676, 0x31200001, 0x21800457, 0x0C220020, + 0x29800769, 0x09661FFF, 0x0E631FE6, 0x309704B3, + 0x249704CE, 0x2E9704CB, 0x309704E9, 0x2E97052B, + 0x18691FD2, 0x12220002, 0x3F970530, 0x32681FD4, + 0x18691FD2, 0x27604000, 0x06614004, 0x24681FCE, + 0x29604008, 0x238C0100, 0x25218020, 0x1B61401C, + 0x27604000, 0x29604008, 0x12220002, 0x268C0400, + 0x15624018, 0x26218040, 0x1B61401C, 0x3A97050C, + 0x1A21889C, 0x0A614092, 0x358C5000, 0x23700080, + 0x1E691FE2, 0x3797053E, 0x13204096, 0x358C5000, + 0x2A5020A4, 0x13204096, 0x1F50A4A4, 0x35970535, + 0x145028E6, 0x1A503108, 0x35970535, 0x358C5000, + 0x2150ACE6, 0x17503529, 0x0F6B4080, 0x13204096, + 0x25370020, 0x0FCC071D, 0x1B50C1AC, 0x31502549, + 0x35970535, 0x3E500C63, 0x3C502168, 0x35970535, + 0x04502D09, 0x3D5011AC, 0x35970535, 0x0D50A509, + 0x0E5029D0, 0x35970535, 0x2450214C, 0x1050196B, + 0x35970535, 0x3E500C63, 0x12501D29, 0x35970535, + 0x3E500C63, 0x14509510, 0x35970535, 0x3E500C63, + 0x3F509DE7, 0x35970535, 0x0F6B4080, 0x00631FEE, + 0x02194000, 0x38C807B8, 0x3797053E, 0x3F80078A, + 0x358C5000, 0x236A4080, 0x09360020, 0x16CC07C7, + 0x30700090, 0x02501865, 0x35970535, 0x1B501C63, + 0x35970535, 0x38501463, 0x35970535, 0x2C681FC0, + 0x268C0400, 0x31200001, 0x21800457, 0x1E6A1FEE, + 0x1C6B4090, 0x27320005, 0x1A1EC000, 0x1B360001, + 0x35C807BC, 0x3220000D, 0x21800457, 0x1E79084F +}; + +static const uint32_t fw1_boot_img_data_buf[] = +{ + 0x36200000, 0x11210002, 0x15710249, 0x31200001, + 0x2860B41C, 0x21970074, 0x1A210000, 0x1231FFFF, + 0x1B390001, 0x092CFFFF, 0x00CC0007, 0x0761B140, + 0x3A200333, 0x3060B438, 0x3E60B45C, 0x3D60B43C, + 0x0A20FFFF, 0x2D60B420, 0x1A210000, 0x1F68B420, + 0x0A61B422, 0x1234FEFE, 0x05300001, 0x2D60B420, + 0x0C61B424, 0x0761B426, 0x0F61B428, 0x0461B42A, + 0x0261B42C, 0x0961B42E, 0x1F61B434, 0x1461B436, + 0x21970074, 0x1C21A0CA, 0x33228000, 0x3F424000, + 0x032D0100, 0x092CFFFF, 0x18CC0023, 0x16710449, + 0x1CB8002B, 0x30224000, 0x2C80002C, 0x19220000, + 0x06210045, 0x0C61B424, 0x35230000, 0x2D63B42C, + 0x21970074, 0x13232000, 0x0C62B428, 0x3063B434, + 0x16210333, 0x278C0078, 0x37BC005E, 0x1C61B438, + 0x092CFFFF, 0x0CCC0032, 0x0A710649, 0x21970074, + 0x1721A0C8, 0x19220000, 0x3F424000, 0x122D0002, + 0x3F424000, 0x182D00FE, 0x092CFFFF, 0x0FCC003E, + 0x1A223000, 0x2F712049, 0x1FB8004B, 0x33214000, + 0x35230000, 0x3F222000, 0x2880004D, 0x1A210000, + 0x35230000, 0x1820B424, 0x19500011, 0x0A500001, + 0x1150C400, 0x0A500001, 0x0261B42C, 0x2663B42E, + 0x1C62B434, 0x39230333, 0x278C0078, 0x37BC005E, + 0x3363B438, 0x36200000, 0x2B60B140, 0x13710149, + 0x398C0000, 0x3C80005C, 0x3371FF49, 0x3C80005C, + 0x2A320001, 0x0A367FFF, 0x2CC80073, 0x252A0008, + 0x0EC0006F, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x2CC80073, 0x35800063, 0x26260008, + 0x0D500000, 0x262EFFFF, 0x11CC0070, 0x228B4000, + 0x0868B1F8, 0x3C34000F, 0x0128000A, 0x26C4007A, + 0x0224000A, 0x228B4000, 0x3320000A, 0x228B4000, + 0x01000000, 0x01000000, 0x01000000 +}; + +static const uint32_t fw1_master_img_data_buf[] = +{ + 0x36200000, 0x11210002, 0x3C605FF4, 0x1B615FF6, + 0x36200000, 0x2560B148, 0x1A205FE0, 0x38215FE8, + 0x3B230008, 0x1F090000, 0x15C00104, 0x31200001, + 0x2860B41C, 0x2A9700B9, 0x329700C7, 0x1C208000, + 0x2B60B140, 0x01000000, 0x19220000, 0x0B685FFE, + 0x2469B1F8, 0x2B3C4600, 0x1ECC0013, 0x1D2E0001, + 0x28038000, 0x01000000, 0x0A2FFFFF, 0x1BCC0019, + 0x0B685FFE, 0x2469B1F8, 0x2B3C4600, 0x22C80021, + 0x25800013, 0x056B5FFA, 0x333B0000, 0x14D40026, + 0x363700FF, 0x2E63B47A, 0x3A200333, 0x3060B438, + 0x3E60B45C, 0x3D60B43C, 0x39230003, 0x2F22B400, + 0x0A20FFFF, 0x13408000, 0x1A210000, 0x21488000, + 0x23260002, 0x3F418000, 0x1234FEFE, 0x05300001, + 0x202A0002, 0x13408000, 0x3D260020, 0x0A2FFFFF, + 0x17CC002C, 0x36200000, 0x3E60B406, 0x2D60B416, + 0x2B60B426, 0x3860B436, 0x2860B446, 0x3B60B456, + 0x036B5FFC, 0x00210100, 0x05222F00, 0x29370080, + 0x27C80047, 0x1A210000, 0x1A223000, 0x1820B424, + 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001, + 0x15410000, 0x3E2C0002, 0x0D500000, 0x1C62B434, + 0x10205E90, 0x0D220164, 0x0D970F97, 0x2469B1F8, + 0x15220333, 0x36200000, 0x278C0078, 0x30BC00FC, + 0x1F62B438, 0x2060B424, 0x2B60B426, 0x33610102, + 0x1035000F, 0x38610100, 0x0A68B400, 0x3369B420, + 0x32605FCA, 0x13615FCE, 0x353400FF, 0x2C380200, + 0x34605FCC, 0x2535FF00, 0x17390002, 0x08615FD0, + 0x1E970F24, 0x31200001, 0x2E605EA0, 0x202001A0, + 0x1760010C, 0x35203000, 0x1C60010E, 0x31200001, + 0x2560B148, 0x30695EA0, 0x33228000, 0x28004000, + 0x063C0001, 0x1FCC0078, 0x0462B140, 0x2280007E, + 0x28004000, 0x0C3C0004, 0x19CC007E, 0x1968B140, + 0x283C4000, 0x2B60B140, 0x1035000F, 0x1231FFFF, + 0x0B2D0082, 0x0D894000, 0x248C1D78, 0x318000A1, + 0x2F8C1D7A, 0x318000A1, 0x3D8C1DF8, 0x318000A1, + 0x368C1DFA, 0x318000A1, 0x298C1D7C, 0x318000A1, + 0x228C1D7E, 0x318000A1, 0x308C1DFC, 0x318000A1, + 0x3B8C1DFE, 0x318000A1, 0x238C1D79, 0x318000A1, + 0x288C1D7B, 0x318000A1, 0x3A8C1DF9, 0x318000A1, + 0x318C1DFB, 0x318000A1, 0x2E8C1D7D, 0x318000A1, + 0x258C1D7F, 0x318000A1, 0x378C1DFD, 0x318000A1, + 0x3C8C1DFF, 0x35B000FA, 0x07BC0C07, 0x29D80CD4, + 0x3FA00C08, 0x1DA40C2E, 0x1CA80C49, 0x11F80F12, + 0x39E80CF2, 0x32E00118, 0x336A5EA0, 0x362300AF, + 0x17360002, 0x33C800AF, 0x20AC0E9D, 0x31215EA2, + 0x07220014, 0x14970FB4, 0x27C80071, 0x21884000, + 0x30380000, 0x32C80112, 0x31215EA2, 0x07220014, + 0x1D800FD7, 0x36200000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x36200000, 0x2760B000, + 0x2960B008, 0x1E220001, 0x1B62B010, 0x3760B01C, + 0x10228800, 0x1862B01C, 0x228B4000, 0x0868B1F8, + 0x2D635E96, 0x3C34000F, 0x02030000, 0x022B000A, + 0x05C000CE, 0x3320000A, 0x02030000, 0x1A210000, + 0x1231FFFF, 0x1B390001, 0x092CFFFF, 0x1DCC00D0, + 0x0761B140, 0x33228000, 0x2D010000, 0x20310008, + 0x1A39A0CA, 0x3F424000, 0x19220000, 0x3F424000, + 0x0C220020, 0x392DFFBA, 0x3F424000, 0x3860B150, + 0x1A22C000, 0x22520000, 0x22520000, 0x19220000, + 0x302DFF7C, 0x3F424000, 0x172D0008, 0x3F424000, + 0x1E220001, 0x172D0008, 0x3F424000, 0x19220000, + 0x1A2D000C, 0x3F424000, 0x10228800, 0x3F424000, + 0x06220400, 0x0962B144, 0x2E020000, 0x033A0200, + 0x0962B144, 0x322C0001, 0x0A2FFFFF, 0x17CC00D5, + 0x1F6B5E96, 0x228B4000, 0x0422008D, 0x2480010D, + 0x09220089, 0x2480010D, 0x0C220083, 0x2480010D, + 0x0A220085, 0x2480010D, 0x13220005, 0x2480010D, + 0x01220087, 0x2480010D, 0x18220007, 0x2480010D, + 0x0D220011, 0x2480010D, 0x0222008B, 0x2480010D, + 0x1B22000B, 0x15625FF2, 0x32635FF0, 0x23320008, + 0x0A62B148, 0x33D00113, 0x228B4000, 0x31200001, + 0x2A9700B9, 0x329700C7, 0x398C0000, 0x35800116, + 0x33695F20, 0x3A20012C, 0x1C35C000, 0x36C8011F, + 0x12685F24, 0x043D4000, 0x08CC00AA, 0x3C2300AA, + 0x336A5EA0, 0x03210080, 0x2736FFFE, 0x01625EA0, + 0x37655F21, 0x288000B4, 0x33695F20, 0x12685F24, + 0x1C35C000, 0x2E3DC000, 0x3FC80120, 0x228B4000, + 0x01970F37, 0x26C801CC, 0x20605F24, 0x00685FFC, + 0x1A210000, 0x09615F2E, 0x3F340003, 0x212C013E, + 0x21884000, 0x36200000, 0x2360B122, 0x3D800142, + 0x146BB124, 0x38695F22, 0x36200000, 0x37370001, + 0x03CC0148, 0x3965B123, 0x3D800142, 0x2C800135, + 0x28800138, 0x2597010C, 0x1168B122, 0x3B69B124, + 0x2F34001F, 0x29310001, 0x19110000, 0x19D401C2, + 0x036B5FFC, 0x1C645F20, 0x0A37FF00, 0x0F330008, + 0x300B0000, 0x08C001BF, 0x3D6A5F24, 0x3F215F26, + 0x0C2E0040, 0x13408000, 0x3330FFFB, 0x1C2C4000, + 0x02970FF4, 0x35695F26, 0x362C000C, 0x13350003, + 0x06CC01BB, 0x3F215F26, 0x2222FFFE, 0x1C97100A, + 0x3E695F24, 0x382C0004, 0x244A0000, 0x042D0042, + 0x3F424000, 0x1D2E0001, 0x16420000, 0x1797103E, + 0x0E970C64, 0x19685F26, 0x3D695F28, 0x3660B408, + 0x1161B40A, 0x12685F24, 0x2421B40E, 0x3B60B40C, + 0x21510000, 0x24200021, 0x3560B404, 0x20200040, + 0x2660B414, 0x36200175, 0x0F210163, 0x362300AF, + 0x1D800C8B, 0x1F685F20, 0x316A5FE8, 0x353400FF, + 0x26605F22, 0x1D2E0001, 0x03625FE8, 0x02030000, + 0x3330FFFB, 0x0F2C4010, 0x244A0000, 0x382C0004, + 0x27490000, 0x2C3B0400, 0x1E2D0001, 0x350A4000, + 0x36C40186, 0x1A210000, 0x15410000, 0x12685F24, + 0x2B63B120, 0x3D2C0038, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x002CFFF6, 0x244A0000, + 0x052CFFCA, 0x146B5F2E, 0x36368000, 0x13CC019B, + 0x333B0000, 0x34C801B7, 0x332F003C, 0x3A40C000, + 0x0C685F30, 0x20605F24, 0x3E8001B7, 0x25605F2E, + 0x333B0000, 0x17CC01A0, 0x3E605F30, 0x278001A2, + 0x332F003C, 0x3A40C000, 0x33695F20, 0x1768B124, + 0x1E220001, 0x35230000, 0x193500FF, 0x190B4000, + 0x1912C000, 0x2E148000, 0x04CC01B0, 0x28970108, + 0x282301A2, 0x23635F24, 0x20200040, 0x258001C5, + 0x01970F37, 0x20C801CA, 0x20605F24, 0x1F685F20, + 0x3D6A5F24, 0x353400FF, 0x3980014F, 0x35215FDA, + 0x03970F50, 0x2D2301C4, 0x3B8001D1, 0x1F685F20, + 0x20970106, 0x353400FF, 0x2F8001C0, 0x2597010C, + 0x2F380400, 0x2860B120, 0x12685F24, 0x15970F4A, + 0x36200000, 0x336A5EA0, 0x1B645F21, 0x183A0001, + 0x01625EA0, 0x398000AF, 0x302301B0, 0x2B8001CD, + 0x3923012C, 0x23635F24, 0x392000C0, 0x1B645F21, + 0x398000AF, 0x2B695F32, 0x1C208000, 0x28150000, + 0x30C801D6, 0x228B4000, 0x35605F32, 0x392001D9, + 0x288000B4, 0x18685FD8, 0x3E215FD8, 0x30380000, + 0x2BC801FE, 0x1D970F72, 0x33605F34, 0x2D010000, + 0x3E2C0034, 0x0B480000, 0x3C6A5FEC, 0x02030000, + 0x3C34000F, 0x1D2E0001, 0x0E625FEC, 0x19220000, + 0x14625F3A, 0x3562013E, 0x0C330004, 0x3F37000F, + 0x3E2F01EE, 0x228B4000, 0x358003C6, 0x3A800550, + 0x2B8006EE, 0x328006FB, 0x32800211, 0x32800211, + 0x32800211, 0x32800211, 0x32800211, 0x32800211, + 0x32800211, 0x32800211, 0x32800211, 0x32800211, + 0x02800BD7, 0x32800211, 0x33605F34, 0x35605F32, + 0x398000AF, 0x112200C1, 0x38800214, 0x192200A3, + 0x38800214, 0x0F22008F, 0x38800214, 0x0A220085, + 0x38800214, 0x162200C0, 0x38800214, 0x152200A0, + 0x38800214, 0x122200A1, 0x38800214, 0x07220081, + 0x38800214, 0x01220087, 0x38800214, 0x19220000, + 0x07685F32, 0x1F625F38, 0x33230219, 0x16341000, + 0x05CC02B1, 0x3697036F, 0x01685F34, 0x2D6A5F38, + 0x35230229, 0x392C0035, 0x27460000, 0x2D695F34, + 0x32800284, 0x1160013C, 0x2B635F46, 0x3697036F, + 0x39200226, 0x38605F36, 0x3B9703A4, 0x00CC0274, + 0x37970247, 0x0A6A010C, 0x35680110, 0x3D2A01A0, + 0x3FC801D9, 0x30380000, 0x0ECC01D9, 0x28620110, + 0x1D970C74, 0x1A6A0110, 0x1820B424, 0x19500011, + 0x0A500001, 0x1150C400, 0x0A500001, 0x1B5001A0, + 0x0D500000, 0x1C62B434, 0x0421023D, 0x3A2301D9, + 0x12940C8E, 0x3D6B0112, 0x0F2201A0, 0x3862010C, + 0x36200000, 0x1A6A0110, 0x0C600112, 0x07600110, + 0x333B0000, 0x0BCC0396, 0x398000AF, 0x33635F38, + 0x011A4000, 0x0462B140, 0x1F6B5EA0, 0x2E020000, + 0x3E3B0004, 0x2D635EA0, 0x1A388000, 0x35605F32, + 0x2B008000, 0x0E300003, 0x2B605F4A, 0x2B008000, + 0x3F30FFF8, 0x1E384001, 0x2D605F4C, 0x1132FFFF, + 0x2E2E0D17, 0x2E23025B, 0x0E8A4000, 0x26605F4E, + 0x0A6A010C, 0x202001A0, 0x1A210000, 0x1C0A0000, + 0x11970DFB, 0x06970E19, 0x046B5F32, 0x14685F4E, + 0x3F37000F, 0x293B0100, 0x2E6A5F34, 0x2563B144, + 0x16420000, 0x36695F46, 0x3E2C0002, 0x15410000, + 0x266A5F3A, 0x3E2C0002, 0x16420000, 0x23695F3C, + 0x016B5F38, 0x3E2C0002, 0x15410000, 0x228B4000, + 0x3520C000, 0x35605F32, 0x13970C85, 0x0F220040, + 0x1820B424, 0x19500011, 0x01500003, 0x1150C400, + 0x0A500001, 0x0E500180, 0x0D500000, 0x1C62B434, + 0x352000AF, 0x192100AF, 0x362300AF, 0x17800C8E, + 0x28635E9C, 0x1B6B5FEE, 0x0A615E98, 0x192D0036, + 0x22484000, 0x312F0001, 0x29635FEE, 0x00349FFF, + 0x10404000, 0x19348000, 0x27C80297, 0x222DFFFE, + 0x0D4A4000, 0x172D0008, 0x22484000, 0x02625E9A, + 0x21510000, 0x30380000, 0x24C802AD, 0x20605E9E, + 0x14685E98, 0x33215FDC, 0x02970F61, 0x12970E9D, + 0x12685E9E, 0x1A6B5E9C, 0x30380000, 0x16CC02A1, + 0x228B4000, 0x306A5E9A, 0x3E215FD8, 0x2636FF00, + 0x28D002A8, 0x02970F61, 0x1A6B5E9C, 0x3B8001D1, + 0x23320008, 0x392C0035, 0x27460000, 0x3E695E9E, + 0x35800285, 0x2B970104, 0x39209000, 0x35605F32, + 0x14801034, 0x1C208000, 0x35605F32, 0x05801043, + 0x3B635F36, 0x19685F4A, 0x33695F4C, 0x1632FFFE, + 0x1A048000, 0x33C402BC, 0x1E2D0001, 0x01615F4C, + 0x2B605F4A, 0x26320002, 0x09685F3A, 0x2C8002CA, + 0x3B635F36, 0x30380000, 0x28D002C4, 0x33970365, + 0x09685F3A, 0x1C390000, 0x26C802CA, 0x09300002, + 0x10404000, 0x3930FFFE, 0x2D010000, 0x0F2D01A0, + 0x3E610106, 0x1632FFFE, 0x39C80363, 0x28038000, + 0x06330001, 0x0BD402D3, 0x172E0004, 0x280C8000, + 0x3B605F3A, 0x28038000, 0x3F37000F, 0x35C802DA, + 0x2F36FFF0, 0x092E0010, 0x1F6B5F40, 0x19625F3E, + 0x1A0B8000, 0x3CC402DF, 0x01625F40, 0x386A5F42, + 0x36200000, 0x133600C0, 0x2B320006, 0x37C802E7, + 0x232C0040, 0x262EFFFF, 0x308002E3, 0x19600104, + 0x1E970CB7, 0x352000AF, 0x0F970CC0, 0x0E970CC7, + 0x1D970C74, 0x07690104, 0x2B680104, 0x1F2D0030, + 0x0D4A4000, 0x122D0002, 0x214B4000, 0x123EFFFF, + 0x1A1EC000, 0x0DCC0333, 0x3421B424, 0x30510041, + 0x2360B428, 0x142D0004, 0x21510000, 0x3151C010, + 0x26510001, 0x11220038, 0x1C62B434, 0x1F2102EC, + 0x362300AF, 0x12940C8E, 0x3320003C, 0x3960B348, + 0x0E970C64, 0x1D970C74, 0x20680106, 0x3721B428, + 0x2B6A5F3E, 0x156B5FD0, 0x0451E000, 0x26510001, + 0x2E60B42C, 0x122D0002, 0x21510000, 0x24200311, + 0x2E63B420, 0x2060B424, 0x1C62B434, 0x19685F4A, + 0x33695F4C, 0x3660B408, 0x1161B40A, 0x056B5FCC, + 0x2F21B40C, 0x0451E000, 0x26510001, 0x17201061, + 0x3B63B400, 0x3560B404, 0x0962B414, 0x3A200003, + 0x3D605F50, 0x2620032C, 0x1C210336, 0x11970C8E, + 0x362300AF, 0x18940C8B, 0x0F685F50, 0x0834FFFE, + 0x3D605F50, 0x30380000, 0x37C80331, 0x398000AF, + 0x0F685F50, 0x0434FFFD, 0x3D605F50, 0x30380000, + 0x02CC00AF, 0x096B5F36, 0x01800CCE, 0x07970C94, + 0x25230203, 0x01800CCE, 0x302302EC, 0x01800C94, + 0x3B635F36, 0x30380000, 0x35D0033C, 0x33970365, + 0x09685F3A, 0x1C390000, 0x2BC80342, 0x09300002, + 0x10404000, 0x3930FFFE, 0x2D010000, 0x0F2D01A0, + 0x3E610106, 0x1632FFFE, 0x39C80363, 0x1F6B5F40, + 0x19625F3E, 0x1A0B8000, 0x20C4034C, 0x01625F40, + 0x28038000, 0x0D330003, 0x04D40350, 0x172E0004, + 0x280C8000, 0x3B605F3A, 0x0E970C64, 0x19685F4A, + 0x33695F4C, 0x3660B408, 0x1161B40A, 0x20680106, + 0x2B6A5F3E, 0x2421B40E, 0x21510000, 0x3B60B40C, + 0x24200021, 0x3560B404, 0x0962B414, 0x0A685F36, + 0x12210352, 0x362300AF, 0x1D800C8B, 0x096B5F36, + 0x2380010C, 0x2B635E90, 0x026B5F34, 0x010CC000, + 0x084B0000, 0x3E2C0002, 0x0B480000, 0x28635F4A, + 0x196B5E90, 0x2D605F4C, 0x228B4000, 0x336A5F40, + 0x36200000, 0x2E605F40, 0x1F3A0000, 0x37CC0CA6, + 0x228B4000, 0x0A20FFFF, 0x192D0036, 0x0D4A4000, + 0x2F2DFFFA, 0x0A625F42, 0x3A34003F, 0x2E148000, + 0x11CC0203, 0x228B4000, 0x0D4A4000, 0x122D0002, + 0x0F3607FC, 0x26C80205, 0x26320002, 0x19088000, + 0x14C00205, 0x2B008000, 0x05300001, 0x11D40389, + 0x1D2E0001, 0x3E30FFFF, 0x228B4000, 0x2D635E96, + 0x27200102, 0x2297037E, 0x12600130, 0x0C625F44, + 0x27200102, 0x2297037E, 0x1F6B5E96, 0x1F600134, + 0x07625F46, 0x228B4000, 0x0969010C, 0x2E68010E, + 0x3B3D01A0, 0x0CCC03A1, 0x0C2E01A0, 0x3862010C, + 0x30380000, 0x3AC803A0, 0x19088000, 0x19C00201, + 0x228B4000, 0x28620110, 0x0F630112, 0x398000AF, + 0x26680100, 0x2D635E96, 0x366AB140, 0x1D210001, + 0x35230000, 0x03280001, 0x300B0000, 0x1A11C000, + 0x28038000, 0x2E174000, 0x22C803B2, 0x29310001, + 0x03280001, 0x3AC403AC, 0x1F6B5E96, 0x228B4000, + 0x2D635E96, 0x19220000, 0x0A625E94, 0x1A6BB140, + 0x0A690100, 0x31200001, 0x2D02C000, 0x2B160000, + 0x386A5E94, 0x08CC03C0, 0x1D2E0001, 0x0A625E94, + 0x3E30FFFF, 0x252DFFFF, 0x1DCC03BA, 0x1F6B5E96, + 0x386A5E94, 0x228B4000, 0x09625F4E, 0x352C03C9, + 0x21884000, 0x32800211, 0x298003D9, 0x2C800453, + 0x26800456, 0x33800476, 0x2E800497, 0x2F8004FC, + 0x238004FF, 0x2980051A, 0x2880051D, 0x3B80053B, + 0x32800211, 0x32800211, 0x32800211, 0x32800211, + 0x32800211, 0x28230018, 0x1263013C, 0x20970375, + 0x2197038B, 0x0F6A0130, 0x02030000, 0x1A0B8000, + 0x15C003E2, 0x2E020000, 0x206B013C, 0x11685F44, + 0x36695F46, 0x25370020, 0x13CC03E8, 0x1D2E0001, + 0x12625F3C, 0x2D0E0000, 0x040E4000, 0x1632FFFE, + 0x36970396, 0x249702AE, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x32970338, 0x38200008, 0x18210124, + 0x356A5F46, 0x32970338, 0x389702B1, 0x09685F3A, + 0x09210010, 0x09300002, 0x0F600128, 0x35610104, + 0x3697036F, 0x1F970CDC, 0x20680130, 0x01690134, + 0x1C6A0120, 0x3D6B0124, 0x3460B010, 0x1561B014, + 0x3D680128, 0x1C69012C, 0x172E0068, 0x0862B000, + 0x3B2F0068, 0x2963B004, 0x016A0138, 0x382C0068, + 0x2960B008, 0x142D0068, 0x0861B00C, 0x1562B018, + 0x2368013C, 0x362300AF, 0x1A388000, 0x3760B01C, + 0x1E940CE1, 0x14685F4E, 0x2E6A5F34, 0x30380000, + 0x34C8041E, 0x21884000, 0x1C208000, 0x13408000, + 0x36200000, 0x3580042A, 0x09685F3A, 0x2169B024, + 0x012E0028, 0x1C390000, 0x3FD0041A, 0x09300002, + 0x382C0068, 0x1F090000, 0x1531FFFE, 0x0E68B028, + 0x3F418000, 0x2F34001F, 0x112E0002, 0x13408000, + 0x2B008000, 0x3E2C0002, 0x0D500000, 0x0D500000, + 0x13970CE9, 0x206A5F3C, 0x01685F34, 0x1632FFFE, + 0x33C80213, 0x286B0104, 0x25695F3A, 0x12625F3C, + 0x01625F40, 0x010CC000, 0x0F2D01A0, 0x35610104, + 0x27490000, 0x3E2C0002, 0x0B480000, 0x07615F4A, + 0x2D605F4C, 0x0E970C64, 0x19685F4A, 0x33695F4C, + 0x3B60B40C, 0x1C61B40E, 0x2B680104, 0x1A210000, + 0x1161B40A, 0x3660B408, 0x206A5F3C, 0x28200081, + 0x3560B404, 0x0962B414, 0x14210441, 0x362300AF, + 0x18940C8B, 0x36230213, 0x3080036F, 0x2E230028, + 0x1263013C, 0x228003DB, 0x20970375, 0x27200102, + 0x2297037E, 0x12600130, 0x0C625F44, 0x322C0001, + 0x3D605F3C, 0x1D32FFFC, 0x172E0004, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x32970338, 0x3E6A5F44, 0x38200008, 0x18210124, + 0x32970338, 0x3E6A5F44, 0x25200010, 0x1B210128, + 0x32970338, 0x389702B1, 0x09685F3A, 0x07210018, + 0x09300002, 0x0260012C, 0x35610104, 0x3023000A, + 0x1263013C, 0x368003FC, 0x20970375, 0x2197038B, + 0x11685F44, 0x2D0E0000, 0x1632FFFE, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x32970338, 0x356A5F46, 0x38200008, 0x18210124, + 0x32970338, 0x389702B1, 0x09685F3A, 0x0F6A0130, + 0x2E6B0134, 0x09300002, 0x0F600128, 0x2E0EC000, + 0x1632FFFE, 0x12625F3C, 0x15208009, 0x32970221, + 0x0C970D8F, 0x3E680148, 0x1F970E60, 0x1A210000, + 0x236A5F5C, 0x25200010, 0x0E800E7D, 0x06208100, + 0x1160013C, 0x20970375, 0x2197038B, 0x236B0130, + 0x3D695F44, 0x300B0000, 0x14C00205, 0x0834FFFE, + 0x26C80205, 0x040E4000, 0x1632FFFE, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x32970338, 0x356A5F46, 0x38200008, 0x18210124, + 0x32970338, 0x389702B1, 0x026A0134, 0x12690124, + 0x262EFFFF, 0x040D8000, 0x1531FFFE, 0x0F2D01A0, + 0x0D4A4000, 0x122D0002, 0x0E494000, 0x2368013C, + 0x011A4000, 0x2EC8020B, 0x25695F3A, 0x026A0134, + 0x25310002, 0x23610128, 0x29340100, 0x22C804CB, + 0x236B0130, 0x2B008000, 0x1A0B8000, 0x312F0001, + 0x1D2E0001, 0x05300001, 0x28D004C8, 0x1D2E0001, + 0x040D8000, 0x2E61012C, 0x2E0EC000, 0x1632FFFE, + 0x12625F3C, 0x2368013C, 0x32970221, 0x0C970D8F, + 0x0C69015C, 0x3368014C, 0x05350100, 0x2CC804F5, + 0x1F970E60, 0x22520000, 0x172E0004, 0x07690168, + 0x3E680148, 0x1C390000, 0x3DD004DE, 0x1F090000, + 0x1531FFFE, 0x368004DF, 0x30218000, 0x04685F52, + 0x2A2EFFFC, 0x3F418000, 0x15381000, 0x36605F52, + 0x12971034, 0x016A0154, 0x2068015C, 0x1A210000, + 0x1632FFFE, 0x29340100, 0x25200010, 0x2BC804F4, + 0x04970E7E, 0x3E680148, 0x1F69014C, 0x236A5F5C, + 0x1F090000, 0x1531FFFE, 0x350A4000, 0x2B200018, + 0x0E800E7D, 0x2E6A5F58, 0x012E0028, 0x22520000, + 0x22520000, 0x22520000, 0x22520000, 0x388004D7, + 0x00208200, 0x1160013C, 0x26800499, 0x21200088, + 0x1160013C, 0x20970375, 0x03361F00, 0x23320008, + 0x33620138, 0x27200102, 0x2297037E, 0x12600130, + 0x2D6B0138, 0x0C625F44, 0x333B0000, 0x206B013C, + 0x0CCC050E, 0x2B800511, 0x26370040, 0x10CC0511, + 0x322C0001, 0x3D605F3C, 0x2D0E0000, 0x1632FFFE, + 0x36970396, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x3B2303F7, 0x34800338, 0x2E200048, 0x1160013C, + 0x38800501, 0x20970375, 0x27200102, 0x2297037E, + 0x12600130, 0x0C625F44, 0x1A32FFFD, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x32970338, 0x3E6A5F44, 0x38200008, 0x18210124, + 0x32970338, 0x389702B1, 0x39200533, 0x26605F4E, + 0x2A230400, 0x1263013C, 0x368003FC, 0x2C69B020, + 0x012E0028, 0x22520000, 0x22520000, 0x22520000, + 0x3F418000, 0x36230213, 0x15800CE9, 0x20970375, + 0x2A2001FF, 0x2297037E, 0x12600130, 0x3D605F3C, + 0x2E020000, 0x0C625F44, 0x1632FFFE, 0x36970396, + 0x36200000, 0x15210120, 0x3E6A5F44, 0x32970338, + 0x36200000, 0x3B605F3A, 0x0F600128, 0x09210010, + 0x35610104, 0x18230808, 0x1263013C, 0x368003FC, + 0x02030000, 0x0D37FFF8, 0x09CC0211, 0x3F2C0555, + 0x21884000, 0x3E80055D, 0x3E8005A4, 0x20800615, + 0x32800211, 0x2480062E, 0x3380065F, 0x32800211, + 0x32800211, 0x0620FFFC, 0x2C970376, 0x03361F00, + 0x2DC80207, 0x23320008, 0x33620138, 0x3F2A0011, + 0x2EC40207, 0x2197038B, 0x05300001, 0x39D00569, + 0x112E0002, 0x25347FFF, 0x26C80205, 0x2E680138, + 0x07625F46, 0x2D010000, 0x24290003, 0x21C40571, + 0x3A200003, 0x392C0003, 0x07018000, 0x15072000, + 0x333B0000, 0x14CC0209, 0x3D695F44, 0x092E0010, + 0x040E4000, 0x082A0800, 0x356A5F46, 0x26C40209, + 0x1132FFFF, 0x040E4000, 0x1632FFFE, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x146B5F42, + 0x3E6A5F44, 0x06330001, 0x23D00589, 0x2C23058A, + 0x34800338, 0x2F9702C0, 0x146B5F42, 0x38200008, + 0x18210124, 0x356A5F46, 0x0A330002, 0x32D00592, + 0x36230593, 0x34800338, 0x2F9702C0, 0x0A6B5F3A, + 0x356A5F46, 0x1B210128, 0x2B635F46, 0x25200010, + 0x32970338, 0x389702B1, 0x196B5F46, 0x3D680128, + 0x026A0134, 0x0260012C, 0x1632FFFE, 0x38635F3A, + 0x12625F3C, 0x1320E000, 0x3E23060E, 0x34800221, + 0x0B20FFF8, 0x2C970376, 0x03361F00, 0x2DC80207, + 0x23320008, 0x33620138, 0x3F2A0011, 0x2EC40207, + 0x24200082, 0x2297037E, 0x12600130, 0x0C625F44, + 0x24200082, 0x2297037E, 0x1F600134, 0x05300001, + 0x2AD005B6, 0x112E0002, 0x25347FFF, 0x26C80205, + 0x2E680138, 0x07625F46, 0x2D010000, 0x24290003, + 0x21C405BE, 0x3A200003, 0x332C0006, 0x07018000, + 0x15072000, 0x333B0000, 0x14CC0209, 0x3D695F44, + 0x2D680134, 0x092E0010, 0x1231FFFF, 0x040E4000, + 0x082A0800, 0x26C40209, 0x2E020000, 0x1632FFFE, + 0x2D0E0000, 0x040E4000, 0x102E0005, 0x1632FFFE, + 0x36970396, 0x249702AE, 0x36200000, 0x15210120, + 0x146B5F42, 0x3E6A5F44, 0x06330001, 0x2DD005DB, + 0x1132FFFF, 0x242305DE, 0x34800338, 0x2F9702C0, + 0x3E6A5F44, 0x329702B4, 0x146B5F42, 0x38200008, + 0x18210124, 0x356A5F46, 0x0A330002, 0x28D005E7, + 0x1132FFFF, 0x2F2305EA, 0x34800338, 0x2F9702C0, + 0x356A5F46, 0x329702B4, 0x12690124, 0x356A5F46, + 0x1531FFFE, 0x0F2D01A0, 0x22484000, 0x1632FFFE, + 0x040D8000, 0x214B4000, 0x34340001, 0x23C8020F, + 0x37370001, 0x23C8020F, 0x026A0134, 0x25200010, + 0x146B5F42, 0x1B210128, 0x0D330003, 0x32D005FE, + 0x362305FF, 0x34800338, 0x2F9702C0, 0x09685F3A, + 0x026A0134, 0x26605F4E, 0x2D200028, 0x1621012C, + 0x1132FFFF, 0x32970338, 0x389702B1, 0x14685F4E, + 0x026A0134, 0x3B605F3A, 0x39209000, 0x1A32FFFD, + 0x12625F3C, 0x32970221, 0x0C970D8F, 0x3368014C, + 0x1F970E60, 0x1A210000, 0x236A5F5C, 0x2B200018, + 0x0E800E7D, 0x20970375, 0x2197038B, 0x126B5F44, + 0x2E0EC000, 0x1632FFFE, 0x36970396, 0x249702AE, + 0x36200000, 0x15210120, 0x3E6A5F44, 0x32970338, + 0x38200008, 0x18210124, 0x356A5F46, 0x32970338, + 0x389702B1, 0x0A6B5F3A, 0x026A0134, 0x0A330002, + 0x0163012C, 0x1632FFFE, 0x12625F3C, 0x3620F000, + 0x3E23060E, 0x34800221, 0x0C20FFF9, 0x2C970376, + 0x0A625F42, 0x122D0002, 0x2B200018, 0x2297037E, + 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002, + 0x07625F46, 0x2920013C, 0x27508000, 0x0A500001, + 0x23290002, 0x22484000, 0x28038000, 0x1A32FFFD, + 0x2E0EC000, 0x3F340003, 0x20605F48, 0x1632FFFE, + 0x36970396, 0x249702AE, 0x356A5F46, 0x116B5F48, + 0x2B008000, 0x1132FFFF, 0x37370001, 0x21C8064D, + 0x2D0E0000, 0x15210120, 0x36200000, 0x32970338, + 0x116B5F48, 0x356A5F46, 0x37370001, 0x1DCC0686, + 0x29230686, 0x09685F3A, 0x2E01C000, 0x232C01A0, + 0x0A500001, 0x1632FFFE, 0x202A0002, 0x0D970F97, + 0x122801A0, 0x3B605F3A, 0x0D894000, 0x0B20FFF8, + 0x2C970376, 0x0A625F42, 0x2B200018, 0x2297037E, + 0x12600130, 0x0C625F44, 0x2B200018, 0x2297037E, + 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002, + 0x07625F46, 0x2920013C, 0x02509000, 0x0A500001, + 0x23290002, 0x22484000, 0x3D695F44, 0x38340002, + 0x20605F48, 0x1132FFFF, 0x28038000, 0x2E0EC000, + 0x2E0EC000, 0x040E4000, 0x1632FFFE, 0x36970396, + 0x249702AE, 0x36200000, 0x15210120, 0x146B5F42, + 0x3E6A5F44, 0x06330001, 0x26D00685, 0x29230686, + 0x34800338, 0x2F9702C0, 0x146B5F42, 0x356A5F46, + 0x38200008, 0x0A330002, 0x38D00691, 0x07018000, + 0x1132FFFF, 0x040E4000, 0x18210124, 0x3D230697, + 0x34800338, 0x18210124, 0x2F9702C0, 0x356A5F46, + 0x329702B4, 0x356A5F46, 0x329702B4, 0x146B5F42, + 0x356A5F46, 0x1B210128, 0x0D330003, 0x22D006BE, + 0x116B5F48, 0x2B008000, 0x1132FFFF, 0x37370001, + 0x34C806A2, 0x2D0E0000, 0x25200010, 0x32970338, + 0x116B5F48, 0x356A5F46, 0x37370001, 0x0CCC06C7, + 0x0F69013C, 0x01685F34, 0x356A5F46, 0x223D9000, + 0x1ECC06BC, 0x2E2C0028, 0x084B0000, 0x3E2C0002, + 0x27490000, 0x3E2C0002, 0x2D1B4000, 0x27490000, + 0x3E2C0002, 0x2D1B4000, 0x27490000, 0x2D200028, + 0x2D1B4000, 0x2FC806BC, 0x382306C7, 0x34800338, + 0x382306C7, 0x36800655, 0x25200010, 0x2F9702C0, + 0x356A5F46, 0x329702B4, 0x116B5F48, 0x356A5F46, + 0x37370001, 0x31C806A8, 0x329702B4, 0x389702B1, + 0x3D6A5F48, 0x09685F3A, 0x17360002, 0x28C806D1, + 0x356A5F46, 0x01690134, 0x1132FFFF, 0x040E4000, + 0x1632FFFE, 0x12625F3C, 0x09300002, 0x0260012C, + 0x2368013C, 0x32970221, 0x2D695F58, 0x142D0032, + 0x22484000, 0x38340002, 0x19CC06E7, 0x016A0154, + 0x3A20A000, 0x28038000, 0x06330001, 0x19D406E1, + 0x1D2E0001, 0x112E0002, 0x3D33FFFF, 0x2E0EC000, + 0x1632FFFE, 0x11625F5C, 0x08970D7B, 0x0C970D8F, + 0x3368014C, 0x1F970E60, 0x1A210000, 0x236A5F5C, + 0x2B200018, 0x0E800E7D, 0x02030000, 0x0D37FFF8, + 0x09CC0211, 0x332C06F3, 0x21884000, 0x388006FE, + 0x328007B8, 0x138009BF, 0x01800A98, 0x32800211, + 0x328007B8, 0x32800211, 0x01800A98, 0x30380000, + 0x09CC0211, 0x05800BD6, 0x0620FFFC, 0x2C970376, + 0x122D0002, 0x2B200018, 0x2297037E, 0x12600130, + 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002, + 0x23290002, 0x22484000, 0x07625F46, 0x34340001, + 0x20605F48, 0x2B008000, 0x3530FFFD, 0x2D0E0000, + 0x2D0E0000, 0x1632FFFE, 0x36970396, 0x249702AE, + 0x36200000, 0x15210120, 0x146B5F42, 0x356A5F46, + 0x06330001, 0x3FD0071C, 0x3B23071D, 0x34800338, + 0x2F9702C0, 0x1497098E, 0x356A5F46, 0x2D200028, + 0x1A210000, 0x32970338, 0x389702B1, 0x1A685F46, + 0x36695F46, 0x3530FFFD, 0x2B0C4000, 0x01600120, + 0x1531FFFE, 0x20610124, 0x026A0134, 0x3930FFFE, + 0x232C01A0, 0x1132FFFF, 0x1A210000, 0x084B0000, + 0x3E2C0002, 0x2819C000, 0x262EFFFF, 0x02CC072F, + 0x2435FFFE, 0x28C8020D, 0x1F970CDC, 0x01690134, + 0x1C6A0120, 0x3D6B0124, 0x03208400, 0x172E0068, + 0x3B2F0068, 0x1861B010, 0x0862B000, 0x2963B004, + 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2C69B020, + 0x25310002, 0x37D00748, 0x13970CE9, 0x2280020D, + 0x13970CE9, 0x1A685F46, 0x19220000, 0x0C600124, + 0x2D010000, 0x1531FFFE, 0x2E0D0000, 0x23610128, + 0x070D4000, 0x2E0D0000, 0x2E61012C, 0x12625F3C, + 0x31200001, 0x1A60013E, 0x39209000, 0x32970221, + 0x3A20A000, 0x08970D7B, 0x28680164, 0x116A0148, + 0x30380000, 0x1BD00E5E, 0x1F69014C, 0x070E8000, + 0x2E610140, 0x23620148, 0x35098000, 0x2D61014C, + 0x1531FFFE, 0x23610144, 0x00208200, 0x0E970D7D, + 0x2B680168, 0x1C6A014C, 0x30380000, 0x1BD00E5E, + 0x12690148, 0x23620148, 0x35098000, 0x2E610140, + 0x35098000, 0x1632FFFE, 0x040D8000, 0x2D61014C, + 0x3620F000, 0x0E970D7D, 0x3E680148, 0x1C690140, + 0x19220000, 0x20620144, 0x0160014C, 0x2E0D0000, + 0x2E610140, 0x3230FFFC, 0x0C600148, 0x1B208001, + 0x0E970D7D, 0x116A0148, 0x3368014C, 0x2D6B0154, + 0x2D620140, 0x2D010000, 0x3530FFFD, 0x0F600144, + 0x05300001, 0x1C0A0000, 0x040D8000, 0x20610148, + 0x020FC000, 0x12630150, 0x0F208010, 0x0E970D7D, + 0x28680164, 0x1C690140, 0x30380000, 0x1BD00E5E, + 0x116A0148, 0x3368014C, 0x206B0150, 0x20610148, + 0x2D620140, 0x312F0001, 0x12630150, 0x1C0A0000, + 0x20620144, 0x1B208001, 0x0E970D7D, 0x0C6A0150, + 0x2D6B0154, 0x3368014C, 0x12690148, 0x2E0EC000, + 0x3E620150, 0x126A0144, 0x2E610140, 0x1C0A0000, + 0x23620148, 0x010F0000, 0x3A33FFFE, 0x3D635F5C, + 0x3930FFFE, 0x0F600144, 0x00208200, 0x0E970D7D, + 0x0C970D8F, 0x07690168, 0x236A5F5C, 0x1C390000, + 0x1BD00E5E, 0x06970E75, 0x2B200018, 0x0E800E7D, + 0x0120FFFD, 0x2C970376, 0x122D0002, 0x2B200018, + 0x2297037E, 0x12600130, 0x1F600134, 0x0834FFFE, + 0x26C80205, 0x112E0002, 0x23290002, 0x22484000, + 0x07625F46, 0x38340002, 0x20605F48, 0x2B008000, + 0x07018000, 0x3930FFFE, 0x1A32FFFD, 0x2D0E0000, + 0x040E4000, 0x1632FFFE, 0x36970396, 0x249702AE, + 0x1497098E, 0x356A5F46, 0x2D200028, 0x1A210000, + 0x1132FFFF, 0x32970338, 0x36200000, 0x356A5F46, + 0x1A210000, 0x1132FFFF, 0x32970338, 0x389702B1, + 0x356A5F46, 0x30970655, 0x36695F46, 0x1A685F46, + 0x1931FFFD, 0x2D610120, 0x29310001, 0x1F090000, + 0x20610124, 0x1F970CDC, 0x01690134, 0x1C6A0120, + 0x1861B010, 0x172E0068, 0x0862B000, 0x0662B008, + 0x31208808, 0x3760B01C, 0x362300AF, 0x1E940CE1, + 0x2169B024, 0x1C390000, 0x1AD0089A, 0x12690124, + 0x03208400, 0x142D0068, 0x0661B004, 0x3760B01C, + 0x362300AF, 0x1E940CE1, 0x2C69B020, 0x25310002, + 0x2BD4089A, 0x36695F46, 0x1C6A0120, 0x31208808, + 0x040E4000, 0x2E620120, 0x172E0068, 0x0862B000, + 0x0662B008, 0x3760B01C, 0x362300AF, 0x1E940CE1, + 0x2169B024, 0x1C390000, 0x1AD0089A, 0x03208400, + 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2C69B020, + 0x25310002, 0x2BD4089A, 0x13970CE9, 0x1A685F46, + 0x1F690120, 0x0F600128, 0x3930FFFE, 0x2E0D0000, + 0x2E61012C, 0x289703B4, 0x11615F3C, 0x3620F000, + 0x202A0002, 0x19C4089C, 0x3E695F48, 0x14350002, + 0x2BCC089C, 0x32970221, 0x07970967, 0x1E970972, + 0x016A0154, 0x3368014C, 0x336B0140, 0x3E620150, + 0x12690148, 0x0F630148, 0x300B0000, 0x0C630144, + 0x3E30FFFF, 0x1F090000, 0x2E610140, 0x1B208001, + 0x0E970D7D, 0x1B970981, 0x3368014C, 0x1F6A0140, + 0x12690148, 0x2D6B0154, 0x1C0A0000, 0x2E62014C, + 0x3E30FFFF, 0x2E0D0000, 0x2E610140, 0x05300001, + 0x2E0D0000, 0x20610148, 0x36200000, 0x0F600144, + 0x12630150, 0x39209000, 0x08970D7B, 0x3E680148, + 0x1C690140, 0x1C6A014C, 0x1A084000, 0x0160014C, + 0x20610148, 0x2D620140, 0x2D010000, 0x3E30FFFF, + 0x2E0D0000, 0x3D610150, 0x3F208800, 0x0E970D7D, + 0x3368014C, 0x1F6A0140, 0x12690148, 0x2D6B0154, + 0x1C0A0000, 0x2E62014C, 0x3E30FFFF, 0x1F090000, + 0x2E610140, 0x3930FFFE, 0x1C0A0000, 0x23620148, + 0x12630150, 0x39209000, 0x08970D7B, 0x3368014C, + 0x12690148, 0x1F6A0140, 0x0C600148, 0x1A084000, + 0x28038000, 0x2D0E0000, 0x2E62014C, 0x09300002, + 0x010F0000, 0x01630140, 0x1C208000, 0x08970D7B, + 0x3A20A000, 0x08970D7B, 0x2E680154, 0x1C6A014C, + 0x2D010000, 0x29310001, 0x39D40874, 0x322C0001, + 0x3E2C0002, 0x0160014C, 0x2D620140, 0x2D010000, + 0x3E30FFFF, 0x2B0C4000, 0x0F600144, 0x2D010000, + 0x3E30FFFF, 0x2E0D0000, 0x20610148, 0x00208200, + 0x0E970D7D, 0x3E680148, 0x306B014C, 0x016A0154, + 0x02600140, 0x2D010000, 0x3930FFFE, 0x38605F5A, + 0x1C09C000, 0x23610144, 0x1632FFFE, 0x11625F5C, + 0x03208400, 0x0E970D7D, 0x0C970D8F, 0x06970E75, + 0x026B5F58, 0x0A6A0160, 0x3D2F0034, 0x0B4BC000, + 0x16420000, 0x3D370004, 0x3ECC0D4F, 0x236A5F5C, + 0x2B200018, 0x0E800E7D, 0x13970CE9, 0x2480020B, + 0x1160013C, 0x3697036F, 0x1F23094A, 0x2B635F46, + 0x122008A2, 0x38605F36, 0x3B9703A4, 0x00CC0274, + 0x37970247, 0x142308A8, 0x2B635F46, 0x3E800224, + 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C, + 0x20620144, 0x2D0E0000, 0x3E30FFFF, 0x1F090000, + 0x2E610140, 0x23620148, 0x1B208001, 0x0E970D7D, + 0x1B970981, 0x12690148, 0x3368014C, 0x1F6A0140, + 0x2D6B0154, 0x2E610140, 0x1C0A0000, 0x1C0A0000, + 0x2E62014C, 0x3930FFFE, 0x0C600148, 0x36200000, + 0x0F600144, 0x12630150, 0x39209000, 0x08970D7B, + 0x3368014C, 0x12690148, 0x1F6A0140, 0x0C600148, + 0x1A084000, 0x09300002, 0x2D0E0000, 0x2D620140, + 0x05300001, 0x0160014C, 0x25200010, 0x28695F52, + 0x19220000, 0x2B190000, 0x1A615F52, 0x26695F6C, + 0x1F238000, 0x38635F56, 0x22484000, 0x026B5F34, + 0x122D0002, 0x3F424000, 0x351F0000, 0x1DC80D58, + 0x16235F7A, 0x2449C000, 0x3D2F0002, 0x1A1D0000, + 0x36CC08E8, 0x2449C000, 0x1C390000, 0x2CCC0D58, + 0x25695F56, 0x1C390000, 0x3CD408EB, 0x14625F56, + 0x302F0006, 0x1D2E0001, 0x018008DD, 0x04685F52, + 0x076B5F52, 0x3C34000F, 0x393700F0, 0x27CC08F3, + 0x1C1C8000, 0x21CC08F5, 0x118008F7, 0x1C1C8000, + 0x2ACC08F7, 0x1D32FFFC, 0x1E8008F8, 0x1E31FFFC, + 0x01198000, 0x17615F56, 0x076B5F52, 0x23310004, + 0x1035000F, 0x3F37000F, 0x1C1F4000, 0x0DC8090D, + 0x28004000, 0x07645F52, 0x1331FFF8, 0x32394001, + 0x12615F6A, 0x2D010000, 0x22310003, 0x19615F68, + 0x3E30FFFF, 0x012C0D17, 0x0F23090C, 0x21884000, + 0x38605F6C, 0x116A0148, 0x1F69014C, 0x30680140, + 0x040D8000, 0x1531FFFE, 0x17615F60, 0x3D6B0148, + 0x1C0A0000, 0x2B0F8000, 0x0263014C, 0x3930FFFE, + 0x30605F62, 0x1632FFFE, 0x12625F66, 0x15970C7A, + 0x34200051, 0x2360B444, 0x09685F56, 0x0A6B5F60, + 0x3C34000F, 0x0E300003, 0x2D010000, 0x0934FF00, + 0x010CC000, 0x2060B448, 0x193500FF, 0x0761B44A, + 0x07685F68, 0x016B5F62, 0x206A5F66, 0x2D010000, + 0x0934FF00, 0x010CC000, 0x2D60B44C, 0x193500FF, + 0x0A61B44E, 0x1F62B454, 0x0F200936, 0x3221091B, + 0x362300AF, 0x0B800C91, 0x1D210001, 0x3561015E, + 0x1C208000, 0x1260015C, 0x00970E1F, 0x076B5F52, + 0x0A685F6C, 0x3F37000F, 0x293B0100, 0x2563B144, + 0x3921086C, 0x3E2C0002, 0x15410000, 0x09685F56, + 0x18230D58, 0x3C34000F, 0x07645F52, 0x0E300003, + 0x35605F68, 0x0A800D8F, 0x07970967, 0x1E970972, + 0x3368014C, 0x1F6A0140, 0x12690148, 0x2D6B0154, + 0x1C0A0000, 0x2E62014C, 0x1F6A0140, 0x12630150, + 0x2E610140, 0x3930FFFE, 0x1C0A0000, 0x23620148, + 0x36200000, 0x0F600144, 0x39209000, 0x08970D7B, + 0x1C690140, 0x3E680148, 0x116A0148, 0x2E610140, + 0x1A084000, 0x0160014C, 0x3E30FFFF, 0x2D0E0000, + 0x23620148, 0x36200000, 0x198008CF, 0x3E680148, + 0x1C6A014C, 0x1C690140, 0x0160014C, 0x20620144, + 0x1F090000, 0x2D0E0000, 0x2E610140, 0x23620148, + 0x1B208001, 0x08800D7D, 0x3368014C, 0x12690148, + 0x1F6A0140, 0x2E610140, 0x2D0E0000, 0x23620148, + 0x2E020000, 0x1632FFFE, 0x1C0A0000, 0x2E680154, + 0x20620144, 0x020C0000, 0x11600150, 0x00208200, + 0x08800D7D, 0x1F6A0140, 0x12690148, 0x3368014C, + 0x23620148, 0x2E610140, 0x3930FFFE, 0x1C0A0000, + 0x2E680154, 0x20620144, 0x020C0000, 0x11600150, + 0x00208200, 0x08800D7D, 0x25635F4E, 0x146B5F42, + 0x356A5F46, 0x38200008, 0x1A210000, 0x0A330002, + 0x07D0099B, 0x28038000, 0x1632FFFE, 0x3D33FFFF, + 0x2E0EC000, 0x062309A6, 0x34800338, 0x2F9702C0, + 0x356A5F46, 0x329702B4, 0x356A5F46, 0x329702B4, + 0x356A5F46, 0x329702B4, 0x356A5F46, 0x329702B4, + 0x356A5F46, 0x329702B4, 0x3E695F48, 0x356A5F46, + 0x18350001, 0x1FC809B9, 0x2D200028, 0x33970365, + 0x19685F4A, 0x33695F4C, 0x1632FFFE, 0x1A048000, + 0x19C409B3, 0x1E2D0001, 0x01615F4C, 0x2B605F4A, + 0x0A20FFFF, 0x1A210000, 0x356A5F46, 0x162309BA, + 0x34800338, 0x30970655, 0x356A5F46, 0x25200010, + 0x1A210000, 0x176B5F4E, 0x34800338, 0x0620FFFC, + 0x2C970376, 0x03361F00, 0x2DC80207, 0x23320008, + 0x33620138, 0x3F2A0011, 0x2EC40207, 0x2197038B, + 0x236B0130, 0x2D010000, 0x2435FFFE, 0x26C80205, + 0x3008C000, 0x3BC009CF, 0x17CC0205, 0x126B5F44, + 0x112E0002, 0x07625F46, 0x3D2F0002, 0x20635F44, + 0x3D33FFFF, 0x1632FFFE, 0x2E0EC000, 0x1632FFFE, + 0x36970396, 0x2E680138, 0x3D695F44, 0x02030000, + 0x0B2B0003, 0x19C409DF, 0x3A200003, 0x392C0003, + 0x15072000, 0x333B0000, 0x14CC0209, 0x36695F46, + 0x092E0010, 0x2B034000, 0x1931FFFD, 0x1C09C000, + 0x040E4000, 0x082A0800, 0x26C40209, 0x249702AE, + 0x36200000, 0x15210120, 0x146B5F42, 0x356A5F46, + 0x06330001, 0x0BD009F4, 0x0F2309F5, 0x34800338, + 0x2F9702C0, 0x0C970BB5, 0x356A5F46, 0x2D200028, + 0x1A210000, 0x32970338, 0x389702B1, 0x3D695F44, + 0x1A685F46, 0x1231FFFF, 0x2E0D0000, 0x20610124, + 0x3E30FFFF, 0x2E0D0000, 0x2D610120, 0x1F970CDC, + 0x01690134, 0x1C6A0120, 0x1861B010, 0x172E0068, + 0x0862B000, 0x0662B008, 0x31208808, 0x3760B01C, + 0x362300AF, 0x1E940CE1, 0x2169B024, 0x1C390000, + 0x18D00A1B, 0x12690124, 0x03208400, 0x142D0068, + 0x0661B004, 0x3760B01C, 0x362300AF, 0x1E940CE1, + 0x2C69B020, 0x25310002, 0x1ED00A1D, 0x13970CE9, + 0x2280020D, 0x13970CE9, 0x1A685F46, 0x3D695F44, + 0x1C6A0120, 0x0C600124, 0x2E0D0000, 0x23610128, + 0x0C690130, 0x2E6B0134, 0x3930FFFE, 0x2D0E0000, + 0x2D62012C, 0x11630130, 0x33610134, 0x19220000, + 0x12625F3C, 0x1320E000, 0x32970221, 0x28680164, + 0x0F690150, 0x30380000, 0x1BD00E5E, 0x2D6B0154, + 0x126A0144, 0x3368014C, 0x30610154, 0x312F0001, + 0x12630150, 0x1C690140, 0x2E62014C, 0x02600140, + 0x28004000, 0x040D8000, 0x20610148, 0x1132FFFF, + 0x19088000, 0x0F600144, 0x00208200, 0x0E970D7D, + 0x2B680168, 0x2D6B0154, 0x30380000, 0x1BD00E5E, + 0x1C6A014C, 0x12690148, 0x12630150, 0x23620148, + 0x35098000, 0x2E610140, 0x040D8000, 0x1132FFFF, + 0x040D8000, 0x2D61014C, 0x3620F000, 0x0E970D7D, + 0x3E680148, 0x1F69014C, 0x1F6A0140, 0x35230000, + 0x0C630144, 0x0160014C, 0x2E0D0000, 0x20610148, + 0x2D0E0000, 0x2D620140, 0x1B208001, 0x0E970D7D, + 0x116A0148, 0x3368014C, 0x1C690140, 0x2D6B0154, + 0x2D620140, 0x2D0E0000, 0x3E30FFFF, 0x2D0E0000, + 0x23620148, 0x1F090000, 0x23610144, 0x3D33FFFF, + 0x12630150, 0x0F208010, 0x0E970D7D, 0x04690164, + 0x3368014C, 0x1C390000, 0x1BD00E5E, 0x1C690140, + 0x116A0148, 0x206B0150, 0x20610148, 0x2D620140, + 0x312F0001, 0x12630150, 0x1F090000, 0x23610144, + 0x1B208001, 0x0E970D7D, 0x0C6A0150, 0x2D6B0154, + 0x3368014C, 0x12690148, 0x2E0EC000, 0x3E620150, + 0x010F0000, 0x3A33FFFE, 0x3D635F5C, 0x3E6B0144, + 0x2E610140, 0x300B0000, 0x0F630148, 0x3930FFFE, + 0x300B0000, 0x0C630144, 0x00208200, 0x0E970D7D, + 0x0C970D8F, 0x07690168, 0x236A5F5C, 0x1C390000, + 0x1BD00E5E, 0x06970E75, 0x2B200018, 0x0E800E7D, + 0x0120FFFD, 0x2C970376, 0x03361F00, 0x2DC80207, + 0x23320008, 0x33620138, 0x3F2A0011, 0x2EC40207, + 0x2197038B, 0x236B0130, 0x2D010000, 0x2435FFFE, + 0x26C80205, 0x3008C000, 0x3FC00AA8, 0x17CC0205, + 0x126B5F44, 0x112E0002, 0x07625F46, 0x3D2F0002, + 0x20635F44, 0x0200C000, 0x3D33FFFF, 0x010F0000, + 0x1632FFFE, 0x2E0EC000, 0x1632FFFE, 0x36970396, + 0x2E680138, 0x3D695F44, 0x02030000, 0x0B2B0003, + 0x16C40ABA, 0x3A200003, 0x3F2C0005, 0x15072000, + 0x333B0000, 0x14CC0209, 0x36695F46, 0x092E0010, + 0x1531FFFE, 0x040E4000, 0x082A0800, 0x26C40209, + 0x249702AE, 0x36200000, 0x1A210000, 0x3E6A5F44, + 0x32970338, 0x0C970BB5, 0x356A5F46, 0x2D200028, + 0x1A210000, 0x1132FFFF, 0x32970338, 0x389702B1, + 0x11685F44, 0x36695F46, 0x2E020000, 0x2B034000, + 0x3E30FFFF, 0x1231FFFF, 0x280C8000, 0x0C600124, + 0x2B0C4000, 0x0F600128, 0x010CC000, 0x01600120, + 0x1F970CDC, 0x01690134, 0x126A0128, 0x3E610130, + 0x1861B010, 0x172E0068, 0x0862B000, 0x0662B008, + 0x31208808, 0x3760B01C, 0x362300AF, 0x1E940CE1, + 0x2169B024, 0x1C390000, 0x26D40AED, 0x13970CE9, + 0x2480020B, 0x12690124, 0x03208400, 0x142D0068, + 0x0661B004, 0x3760B01C, 0x362300AF, 0x1E940CE1, + 0x2C69B020, 0x25310002, 0x20D40AEB, 0x1C6A0120, + 0x31208808, 0x172E0068, 0x0862B000, 0x0662B008, + 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2169B024, + 0x1C390000, 0x11D00AEB, 0x03208400, 0x3760B01C, + 0x362300AF, 0x1E940CE1, 0x2C69B020, 0x25310002, + 0x20D40AEB, 0x13970CE9, 0x1A685F46, 0x1F690120, + 0x0F600128, 0x2E0D0000, 0x2E61012C, 0x19220000, + 0x12625F3C, 0x3620F000, 0x32970221, 0x3E680148, + 0x1C6A014C, 0x1C690140, 0x0160014C, 0x20620144, + 0x1F090000, 0x2E610140, 0x2D0E0000, 0x23620148, + 0x1B208001, 0x0E970D7D, 0x3368014C, 0x12690148, + 0x1F6A0140, 0x2E610140, 0x07018000, 0x2E0D0000, + 0x20610148, 0x3E30FFFF, 0x1C0A0000, 0x2E680154, + 0x20620144, 0x020C0000, 0x11600150, 0x00208200, + 0x0E970D7D, 0x016A0154, 0x3368014C, 0x336B0140, + 0x3E620150, 0x12690148, 0x0F630148, 0x300B0000, + 0x0C630144, 0x3E30FFFF, 0x1F090000, 0x2E610140, + 0x1B208001, 0x0E970D7D, 0x3368014C, 0x1F6A0140, + 0x12690148, 0x23620148, 0x1C0A0000, 0x2E680154, + 0x20620144, 0x2E610140, 0x020C0000, 0x11600150, + 0x00208200, 0x0E970D7D, 0x3368014C, 0x2D6B0154, + 0x12690148, 0x1F6A0140, 0x12630150, 0x2E610140, + 0x2D695F58, 0x1C0A0000, 0x2E62014C, 0x1F2D0030, + 0x0D4A4000, 0x1F2D0006, 0x0E494000, 0x0F3607FC, + 0x26320002, 0x33620154, 0x28038000, 0x06330001, + 0x22D40B5A, 0x1D2E0001, 0x112E0002, 0x20620144, + 0x1132FFFF, 0x23620148, 0x00351F00, 0x20310008, + 0x33610158, 0x1320E000, 0x0E970D7D, 0x3D680144, + 0x1C6A014C, 0x1C690140, 0x206B0150, 0x2D0E0000, + 0x2E62014C, 0x0200C000, 0x06330001, 0x25D40B6D, + 0x322C0001, 0x3E2C0002, 0x3E30FFFF, 0x2E0D0000, + 0x2E610140, 0x1A210000, 0x20610148, 0x1320E000, + 0x0E970D7D, 0x206B0150, 0x2E680154, 0x1C6A014C, + 0x0263014C, 0x11600150, 0x1C600154, 0x02030000, + 0x06330001, 0x3DD40B7F, 0x322C0001, 0x3E2C0002, + 0x20620144, 0x1C0A0000, 0x2D620140, 0x3E30FFFF, + 0x2D0E0000, 0x23620148, 0x1B208001, 0x0E970D7D, + 0x12690148, 0x126A0144, 0x206B0150, 0x2E610140, + 0x23620148, 0x0200C000, 0x3D33FFFF, 0x12630150, + 0x1C600154, 0x02030000, 0x06330001, 0x22D40B95, + 0x322C0001, 0x3E2C0002, 0x0F600144, 0x00208200, + 0x0E970D7D, 0x11690144, 0x116A0148, 0x3368014C, + 0x2D6B0154, 0x2D620140, 0x12630150, 0x1C600154, + 0x02030000, 0x06330001, 0x23D40BA4, 0x322C0001, + 0x3E2C0002, 0x0160014C, 0x350A4000, 0x23620148, + 0x3930FFFE, 0x1C0A0000, 0x20620144, 0x00208200, + 0x0E970D7D, 0x12690148, 0x016A0154, 0x306B014C, + 0x2E610140, 0x3E620150, 0x3D33FFFF, 0x1C09C000, + 0x09800889, 0x25635F4E, 0x146B5F42, 0x38200008, + 0x1A210000, 0x3E6A5F44, 0x0A330002, 0x1BD00BC1, + 0x196B5F46, 0x1132FFFF, 0x2E0EC000, 0x0B230BD1, + 0x34800338, 0x2F9702C0, 0x3E6A5F44, 0x329702B4, + 0x3E6A5F44, 0x19685F4A, 0x33695F4C, 0x1632FFFE, + 0x1A048000, 0x1AC40BCC, 0x1E2D0001, 0x01615F4C, + 0x2B605F4A, 0x356A5F46, 0x0A20FFFF, 0x1A210000, + 0x2F9702C0, 0x356A5F46, 0x25200010, 0x1A210000, + 0x176B5F4E, 0x34800338, 0x32800211, 0x02030000, + 0x0C37FFFF, 0x09CC0211, 0x0F2C0BDC, 0x21884000, + 0x07800BDD, 0x20970375, 0x3E20000E, 0x2297037E, + 0x093C000E, 0x17CC0205, 0x2A2001FF, 0x2297037E, + 0x3D605F3C, 0x3F340003, 0x17CC0205, 0x122E000E, + 0x1632FFFE, 0x36970396, 0x249702AE, 0x1122000E, + 0x36200000, 0x1A210000, 0x32970338, 0x01685F34, + 0x122101D8, 0x3E610106, 0x3B2C0008, 0x27490000, + 0x3E2C0002, 0x0B480000, 0x07615F4A, 0x2D605F4C, + 0x0F685F3C, 0x30695F40, 0x3930FFFE, 0x36605F3E, + 0x1F090000, 0x10C40BFF, 0x2E605F40, 0x202001A0, + 0x04230C04, 0x19600104, 0x3B635F36, 0x328002E8, + 0x25200010, 0x19600104, 0x24800431, 0x369700FC, + 0x15220003, 0x1F62B438, 0x2C695FCA, 0x04685EDE, + 0x19220000, 0x1461B400, 0x1162B406, 0x30380000, + 0x36C800A5, 0x2A340080, 0x19C80C16, 0x1E200C27, + 0x1B230C17, 0x288000B4, 0x36605EDE, 0x09685EEC, + 0x332300A5, 0x19220000, 0x14625EEC, 0x28695EDE, + 0x366A5EF0, 0x30380000, 0x27C80104, 0x01198000, + 0x2E6A5F02, 0x01198000, 0x336A5EA0, 0x24D000B4, + 0x3C36FDFF, 0x01625EA0, 0x288000B4, 0x22215EDE, + 0x1F220006, 0x14970FB4, 0x2F215EEC, 0x21510000, + 0x21510000, 0x21884000, 0x1F220030, 0x1F62B438, + 0x21695FCE, 0x19685EF0, 0x19220000, 0x0161B420, + 0x0462B426, 0x30380000, 0x3AC800A6, 0x2A340080, + 0x09C80C3C, 0x17200C42, 0x0B230C3D, 0x288000B4, + 0x2B605EF0, 0x11685EFE, 0x3F2300A6, 0x19220000, + 0x0C625EFE, 0x17800C1B, 0x3F215EF0, 0x1F220006, + 0x14970FB4, 0x37215EFE, 0x21510000, 0x21510000, + 0x21884000, 0x1F220300, 0x1F62B438, 0x21695FCE, + 0x01685F02, 0x19220000, 0x0261B440, 0x0762B446, + 0x30380000, 0x3DC800A7, 0x2A340080, 0x08C80C57, + 0x0B200C5D, 0x02230C58, 0x288000B4, 0x33605F02, + 0x19685F10, 0x382300A7, 0x19220000, 0x04625F10, + 0x17800C1B, 0x27215F02, 0x1F220006, 0x14970FB4, + 0x3F215F10, 0x21510000, 0x21510000, 0x21884000, + 0x04685EDE, 0x22215EDE, 0x30380000, 0x1AD00C70, + 0x03205EEC, 0x0B518000, 0x0D500000, 0x30695EA0, + 0x0D500000, 0x00390200, 0x02615EA0, 0x228B4000, + 0x0200C000, 0x1F220006, 0x362300AF, 0x1D800FD7, + 0x19685EF0, 0x3F215EF0, 0x30380000, 0x1AD00C70, + 0x1B205EFE, 0x0C800C69, 0x01685F02, 0x27215F02, + 0x30380000, 0x1AD00C70, 0x13205F10, 0x0C800C69, + 0x04685EDE, 0x22215EDE, 0x30380000, 0x36D40C68, + 0x398000AF, 0x19685EF0, 0x3F215EF0, 0x30380000, + 0x35D000AF, 0x1B205EFE, 0x0C800C69, 0x3B605EEC, + 0x1C615EEE, 0x228B4000, 0x23605EFE, 0x14615F00, + 0x228B4000, 0x2B605F10, 0x0C615F12, 0x228B4000, + 0x19685EF0, 0x1A210000, 0x30380000, 0x0AC80CA5, + 0x1F61B434, 0x226A5FCE, 0x0761B426, 0x0262B420, + 0x2A340080, 0x0DC80CA4, 0x28635E9C, 0x3F215EF0, + 0x1F220006, 0x14970FB4, 0x1A6B5E9C, 0x288000B4, + 0x07615EF0, 0x228B4000, 0x2E620116, 0x0F200CA9, + 0x288000B4, 0x19970C80, 0x1C6A0116, 0x0D20B404, + 0x19500011, 0x01500003, 0x1150C400, 0x0A500001, + 0x0E500180, 0x0D500000, 0x0962B414, 0x352000AF, + 0x192100AF, 0x362300AF, 0x1D800C8B, 0x01690102, + 0x36200000, 0x0A350020, 0x20C80203, 0x30218000, + 0x1F615ED4, 0x3B605EDA, 0x3D605EDC, 0x228B4000, + 0x2D695ED4, 0x30380000, 0x27C80104, 0x1C390000, + 0x1DD40100, 0x3B605EDA, 0x228B4000, 0x2D695ED4, + 0x30380000, 0x27C80104, 0x1C390000, 0x1DD40100, + 0x3D605EDC, 0x228B4000, 0x01685ED4, 0x27215ED4, + 0x30380000, 0x16D40102, 0x21510000, 0x228B4000, + 0x30695ECC, 0x07685ED2, 0x1C390000, 0x06D400A4, + 0x30380000, 0x31C800A4, 0x342300A4, 0x288000B4, + 0x3A215ECC, 0x0B518000, 0x36200000, 0x35605ED2, + 0x228B4000, 0x30695ECC, 0x35605ED2, 0x1C390000, + 0x30695EA0, 0x1DD40100, 0x12390008, 0x02615EA0, + 0x228B4000, 0x336A5EA0, 0x1C685ECC, 0x3A215ECC, + 0x2E36FFF7, 0x01625EA0, 0x30380000, 0x16D40102, + 0x21510000, 0x228B4000, 0x04685F52, 0x30218000, + 0x2D144000, 0x04CC00A9, 0x1A615F52, 0x302300A9, + 0x06200CFA, 0x288000B4, 0x29200400, 0x2660B144, + 0x06210200, 0x1468B144, 0x3C34000F, 0x2B190000, + 0x0A61B144, 0x07645F52, 0x2D010000, 0x20310008, + 0x1139A0C8, 0x214B4000, 0x0F2D002C, 0x0E494000, + 0x2E020000, 0x06330001, 0x20377F00, 0x1263010A, + 0x21320003, 0x1A625F68, 0x2E020000, 0x1032FFF8, + 0x313A4001, 0x11625F6A, 0x2E020000, 0x1132FFFF, + 0x2E2E0D17, 0x04230D2B, 0x0E8A4000, 0x15205F7A, + 0x228B4000, 0x12205F82, 0x228B4000, 0x1C205F8A, + 0x228B4000, 0x01205F92, 0x228B4000, 0x0F205F9A, + 0x228B4000, 0x07205FA2, 0x228B4000, 0x09205FAA, + 0x228B4000, 0x14205FB2, 0x228B4000, 0x1A205FBA, + 0x228B4000, 0x04205FC2, 0x228B4000, 0x38605F6C, + 0x27490000, 0x3E2C0002, 0x084B0000, 0x3E2C0002, + 0x244A0000, 0x3E2C0002, 0x0B480000, 0x1F615F58, + 0x38635F56, 0x17625F5A, 0x3E605F5C, 0x1E970E3D, + 0x236A5F5C, 0x266B010C, 0x1F3A0000, 0x01C80D47, + 0x19213000, 0x35098000, 0x190B4000, 0x3061010E, + 0x39C00D42, 0x27CC0E5C, 0x0A685F5A, 0x04230D47, + 0x33635F54, 0x046B5F68, 0x07800E42, 0x0F69010A, + 0x0A6B5F56, 0x20310008, 0x08C80D78, 0x2E6A5F58, + 0x05390080, 0x162E0035, 0x0E458000, 0x0C970D8F, + 0x04685F52, 0x1B230D54, 0x16341000, 0x3ECC1043, + 0x3A2000A0, 0x00645F53, 0x2D695F58, 0x34970284, + 0x0269010E, 0x1A223000, 0x350A4000, 0x0BC80D74, + 0x28680108, 0x25620114, 0x30380000, 0x12C80D61, + 0x0A970CA6, 0x15970C7A, 0x0269010E, 0x1B20B444, + 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001, + 0x2335FFFF, 0x15410000, 0x176A0114, 0x3E2C0002, + 0x0D500000, 0x1F62B454, 0x0B200D72, 0x27210D72, + 0x362300AF, 0x0B800C91, 0x35203000, 0x1C60010E, + 0x1A210000, 0x36610108, 0x1A615F52, 0x398000AF, + 0x19220000, 0x3662015E, 0x228B4000, 0x1D210001, + 0x3561015E, 0x1260015C, 0x38635F56, 0x00970E1F, + 0x076B5F52, 0x0A685F6C, 0x3F37000F, 0x293B0100, + 0x2563B144, 0x25695F56, 0x3E2C0002, 0x15410000, + 0x26695F5A, 0x3E2C0002, 0x15410000, 0x20695F5C, + 0x3E2C0002, 0x15410000, 0x17800D58, 0x04685F52, + 0x3569B140, 0x3930FFFE, 0x3CD003A0, 0x33635F54, + 0x09300002, 0x02030000, 0x3C34000F, 0x3D3CFFFF, + 0x33228000, 0x1A120000, 0x301D8000, 0x0761B140, + 0x336A5EA0, 0x2BCC0DA0, 0x2D36FFFB, 0x01625EA0, + 0x3D3CFFFF, 0x3A225F7A, 0x3530FFFD, 0x1F060000, + 0x22520000, 0x22520000, 0x153B2000, 0x07685F32, + 0x35635F52, 0x1A344000, 0x09C80DB0, 0x0A685F36, + 0x2E9700B4, 0x02685F54, 0x362300AF, 0x288000B4, + 0x04685F52, 0x3569B140, 0x1F238000, 0x3C34000F, + 0x2E020000, 0x123EFFFF, 0x1C138000, 0x2819C000, + 0x0761B140, 0x3F30FFF8, 0x2838A084, 0x18500020, + 0x3B680118, 0x2E695F54, 0x0418C000, 0x09600118, + 0x351CC000, 0x2BCC0DFA, 0x2361011E, 0x07685F68, + 0x0763011C, 0x0260011A, 0x15970C7A, 0x336B011A, + 0x1B20B444, 0x1C500041, 0x0A500001, 0x0E500180, + 0x0D500000, 0x2D02C000, 0x2636FF00, 0x0262B44C, + 0x363700FF, 0x2563B44E, 0x3F222000, 0x1F62B454, + 0x3E6B011E, 0x36200000, 0x0F60011E, 0x333B0000, + 0x3ECC0DDA, 0x362300AF, 0x08200DDD, 0x24210DDD, + 0x0B800C91, 0x3668011C, 0x3569B140, 0x146A0118, + 0x1A1D0000, 0x0761B140, 0x191E0000, 0x26620118, + 0x19C80DF6, 0x36200000, 0x1D210001, 0x28038000, + 0x2E174000, 0x39CC0DED, 0x322C0001, 0x1231FFFF, + 0x07800DE7, 0x2861011C, 0x0E300003, 0x2B695F32, + 0x0260011A, 0x36354000, 0x1FC80DC6, 0x19200DC6, + 0x096B5F36, 0x288000B4, 0x07685F32, 0x26695F36, + 0x1A344000, 0x33C800AF, 0x0D894000, 0x1F3A0000, + 0x3AC803A0, 0x3B635F36, 0x1A6B5F4A, 0x19600104, + 0x3E610106, 0x19625F3E, 0x23635F48, 0x1D970C74, + 0x2B680104, 0x0F6A0106, 0x116B5F48, 0x2360B428, + 0x3C21B42A, 0x21510000, 0x0200C000, 0x0934FF00, + 0x281A0000, 0x0162B42C, 0x363700FF, 0x2663B42E, + 0x2B6A5F3E, 0x27200041, 0x2060B424, 0x1C62B434, + 0x36210E03, 0x362300AF, 0x12940C8E, 0x096B5F36, + 0x228B4000, 0x3B635F36, 0x39200120, 0x1A210000, + 0x0C220020, 0x1C6B5F4C, 0x1A800DFF, 0x33635F54, + 0x0F6B5F6A, 0x3A200140, 0x1A210000, 0x0C220020, + 0x3B605F60, 0x1C615F62, 0x12625F66, 0x36635F5E, + 0x15970C7A, 0x09685F60, 0x2D6A5F62, 0x046B5F5E, + 0x2060B448, 0x3F21B44A, 0x21510000, 0x0200C000, + 0x0934FF00, 0x281A0000, 0x0262B44C, 0x363700FF, + 0x2563B44E, 0x206A5F66, 0x27200041, 0x2360B444, + 0x1F62B454, 0x16200E5A, 0x21210E28, 0x362300AF, + 0x0B800C91, 0x33635F54, 0x36200000, 0x16210140, + 0x0F22002C, 0x0F6B5F6A, 0x3B605F60, 0x1C615F62, + 0x12625F66, 0x36635F5E, 0x15970C7A, 0x286A5F5E, + 0x09685F60, 0x2E695F62, 0x28038000, 0x0A37FF00, + 0x0418C000, 0x2060B448, 0x1A3600FF, 0x0462B44A, + 0x0161B44C, 0x36200000, 0x2660B44E, 0x206A5F66, + 0x22200011, 0x2360B444, 0x1F62B454, 0x2A210E46, + 0x362300AF, 0x0E940C91, 0x016B5F54, 0x228B4000, + 0x0B210041, 0x08800D4B, 0x08210021, 0x08800D4B, + 0x2E6A5F58, 0x04690164, 0x012E0028, 0x1C390000, + 0x01D00E71, 0x1F090000, 0x1531FFFE, 0x2B680168, + 0x3F418000, 0x2F34001F, 0x112E0002, 0x13408000, + 0x2B008000, 0x3E2C0002, 0x0D500000, 0x0D500000, + 0x228B4000, 0x1C208000, 0x13408000, 0x36200000, + 0x1C800E6A, 0x01685F58, 0x1A210000, 0x2E2C0028, + 0x0D500000, 0x0D500000, 0x0D500000, 0x15410000, + 0x228B4000, 0x0A230D4F, 0x0F3607FC, 0x3AC803A0, + 0x33635F54, 0x026B5F58, 0x12625F66, 0x010CC000, + 0x084B0000, 0x3E2C0002, 0x0B480000, 0x33635F62, + 0x2D6B010E, 0x36605F64, 0x2D0DC000, 0x36610108, + 0x0E970C64, 0x02685F62, 0x28695F64, 0x3B60B40C, + 0x1C61B40E, 0x28680108, 0x206A5F66, 0x2921B40A, + 0x3660B408, 0x21510000, 0x28200081, 0x3560B404, + 0x0962B414, 0x02685F54, 0x20210E8C, 0x362300AF, + 0x1D800C8B, 0x2D695F6E, 0x1C208000, 0x28150000, + 0x17C80EA2, 0x228B4000, 0x336A5EA0, 0x33605F6E, + 0x14200EA8, 0x2B36FFFD, 0x01625EA0, 0x288000B4, + 0x15685FDC, 0x2D695F6E, 0x30380000, 0x08C80F0B, + 0x28605F70, 0x232C0040, 0x27490000, 0x2E655F6E, + 0x3865B112, 0x1F31FFFB, 0x232D4010, 0x0D4A4000, + 0x1F6BB110, 0x122D0002, 0x1F0AC000, 0x24C00EFF, + 0x214B4000, 0x2C2DFFF6, 0x333B0000, 0x25D40EC4, + 0x1A685F70, 0x012D0012, 0x0D4A4000, 0x282C0042, + 0x084B0000, 0x312DFFEE, 0x1F1F8000, 0x3CCC0F01, + 0x28004000, 0x37215F72, 0x02970FF4, 0x3D695F72, + 0x332C0006, 0x13350003, 0x3DCC0F06, 0x37215F72, + 0x2922FFFC, 0x1C97100A, 0x1A685F70, 0x33215FDC, + 0x1D970F72, 0x1797103E, 0x0E970C64, 0x196B5F70, + 0x11685F72, 0x3B695F74, 0x2A22B40A, 0x3563B408, + 0x22520000, 0x3B60B40C, 0x1C61B40E, 0x28200081, + 0x3560B404, 0x20200040, 0x2660B414, 0x21210ED1, + 0x362300AF, 0x18940C8B, 0x01685F6E, 0x39695FEA, + 0x353400FF, 0x3330FFFB, 0x0A2C401A, 0x084B0000, + 0x1E2D0001, 0x312F0001, 0x3A430000, 0x002CFFF6, + 0x244A0000, 0x332C0006, 0x084B0000, 0x0B615FEA, + 0x312F0001, 0x1F0AC000, 0x17C40EF4, 0x35230000, + 0x3A430000, 0x2E6A5F6E, 0x1A685F70, 0x1A3600FF, + 0x3A3A1000, 0x1462B130, 0x15970F4A, 0x1C208000, + 0x33605F6E, 0x17230EA8, 0x33800126, 0x0D210088, + 0x29655F6F, 0x1A685F70, 0x2D695F6E, 0x3D2C0038, + 0x0B480000, 0x13800EAA, 0x20970106, 0x1A685F70, + 0x33215FDC, 0x19230EFA, 0x1B800F72, 0x336A5EA0, + 0x3C350800, 0x1F615F6E, 0x33C800AF, 0x143A0002, + 0x01625EA0, 0x398000AF, 0x1768B148, 0x05300001, + 0x1DD00F1B, 0x03300007, 0x19D00F20, 0x0C300008, + 0x3D3CFFFF, 0x1464B148, 0x388000A8, 0x35230000, + 0x2663B148, 0x39635FF2, 0x32635FF0, 0x19800F15, + 0x0E710048, 0x13710149, 0x2871804B, 0x1E800F22, + 0x00685FFC, 0x276AB1F8, 0x0934FF00, 0x0C300008, + 0x322C0001, 0x03361F00, 0x23320008, 0x1C0A0000, + 0x1DC0010A, 0x3F225E90, 0x3330FFFB, 0x1C2C4000, + 0x1C0A0000, 0x15C00104, 0x2F605FD2, 0x06625FD4, + 0x242A000F, 0x03C000FE, 0x228B4000, 0x10685FD6, + 0x37695FD4, 0x30380000, 0x04C80F3E, 0x27490000, + 0x0E615FD6, 0x228B4000, 0x33290044, 0x28C00F46, + 0x1D685FD2, 0x05615FD4, 0x2D010000, 0x022D0044, + 0x03615FD2, 0x228B4000, 0x361C0000, 0x2F605FD2, + 0x29605FD4, 0x228B4000, 0x3C695FD6, 0x30380000, + 0x27C80104, 0x15410000, 0x22605FD6, 0x228B4000, + 0x1C390000, 0x31C800FE, 0x0D4A4000, 0x30380000, + 0x27C80104, 0x10404000, 0x1F3A0000, 0x07C80F5E, + 0x362C003A, 0x16420000, 0x122E0038, 0x062CFFC6, + 0x13408000, 0x228B4000, 0x222DFFFE, 0x10404000, + 0x228B4000, 0x1C390000, 0x31C800FE, 0x0D4A4000, + 0x30380000, 0x27C80104, 0x10404000, 0x1F3A0000, + 0x06C80F6F, 0x3D2C0038, 0x16420000, 0x192E003A, + 0x0E2CFFC8, 0x13408000, 0x228B4000, 0x122D0002, + 0x10404000, 0x228B4000, 0x1C390000, 0x31C800FE, + 0x30380000, 0x27C80104, 0x2D635E96, 0x362C003A, + 0x084B0000, 0x0E2CFFFE, 0x244A0000, 0x333B0000, + 0x19C80F85, 0x1F3A0000, 0x0BC80F92, 0x3E2F0038, + 0x1542C000, 0x192E003A, 0x0D2FFFC8, 0x10438000, + 0x1D800F8D, 0x3F424000, 0x1F3A0000, 0x11C80F8B, + 0x192E003A, 0x10438000, 0x1D800F8D, 0x122D0002, + 0x3F424000, 0x0D500000, 0x0D500000, 0x1F6B5E96, + 0x0D2CFFC4, 0x228B4000, 0x122D0002, 0x3F424000, + 0x3E2F0038, 0x1542C000, 0x1D800F8D, 0x2A320001, + 0x0A367FFF, 0x03C80FAA, 0x252A0008, 0x32C00FA6, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x03C80FAA, 0x0F800F9A, 0x26260008, 0x0D500000, + 0x262EFFFF, 0x36CC0FA7, 0x228B4000, 0x26635E94, + 0x14970FB4, 0x146B5E94, 0x288000B4, 0x26635E94, + 0x14970FB4, 0x02030000, 0x17685E94, 0x288000B4, + 0x22484000, 0x0F615E92, 0x28605E90, 0x0C300008, + 0x2BD40FD5, 0x2D635E96, 0x2C34007F, 0x3E30FFFF, + 0x122D0002, 0x2E0D0000, 0x214B4000, 0x05300001, + 0x322C0001, 0x36695E90, 0x191E0000, 0x3ECC0FC5, + 0x36200000, 0x07024000, 0x36368000, 0x0035007F, + 0x1A1D0000, 0x3D695E92, 0x1AC80FD3, 0x23320008, + 0x281A0000, 0x1E2D0001, 0x0E464000, 0x0200C000, + 0x1F6B5E96, 0x30380000, 0x228B4000, 0x3F424000, + 0x00800FCF, 0x361C0000, 0x228B4000, 0x28605E90, + 0x22484000, 0x0A625E94, 0x0C300008, 0x3FD40FF2, + 0x2E020000, 0x0C300008, 0x2C34007F, 0x0336007F, + 0x191E0000, 0x31C800FE, 0x3E30FFFF, 0x356A5E90, + 0x0F615E92, 0x122D0002, 0x2E0D0000, 0x3F424000, + 0x386A5E94, 0x3D695E92, 0x05300001, 0x322C0001, + 0x191E0000, 0x2ECC0FEF, 0x36200000, 0x29380080, + 0x21444000, 0x228B4000, 0x36200000, 0x16800FE3, + 0x2D635E96, 0x084B0000, 0x3E2C0002, 0x13434000, + 0x244A0000, 0x122D0002, 0x3F424000, 0x2E1B8000, + 0x3E2C0002, 0x244A0000, 0x122D0002, 0x3F424000, + 0x2E1B8000, 0x3E2C0002, 0x244A0000, 0x122D0002, + 0x3F424000, 0x2B1AC000, 0x1F6B5E96, 0x3E2C0002, + 0x122D0002, 0x228B4000, 0x28605E90, 0x0F615E92, + 0x2D635E96, 0x27490000, 0x280C8000, 0x0B480000, + 0x1C390000, 0x14C81031, 0x03340FFC, 0x0FC81019, + 0x15280041, 0x3DC01019, 0x16240041, 0x15072000, + 0x0480101E, 0x1831FFFA, 0x07024000, 0x2936FFC0, + 0x2B034000, 0x3937003F, 0x3D695E92, 0x22484000, + 0x1A048000, 0x10404000, 0x122D0002, 0x22484000, + 0x2C04C400, 0x10404000, 0x17C41031, 0x122D0002, + 0x22484000, 0x19220000, 0x05048400, 0x10404000, + 0x17C41031, 0x122D0002, 0x22484000, 0x05048400, + 0x10404000, 0x1F6B5E96, 0x1A685E90, 0x228B4000, + 0x14685F14, 0x32215F14, 0x30380000, 0x10D0103A, + 0x0B518000, 0x228B4000, 0x0200C000, 0x12220002, + 0x362300AF, 0x1D800FD7, 0x14685F14, 0x3A215F1A, + 0x30380000, 0x10D0103A, 0x228B4000, 0x14685F14, + 0x32215F14, 0x30380000, 0x16D40102, 0x2A340080, + 0x01C8104B, 0x12220002, 0x03800FAF, 0x21510000, + 0x1C685F1A, 0x28635E9C, 0x30380000, 0x26CC1051, + 0x228B4000, 0x3A215F1A, 0x12220002, 0x08970FAB, + 0x1A6B5E9C, 0x0A80104C, 0x3DFFFFFF, 0x01000000, + 0x01000000, 0x01000000 +}; + +static const uint32_t fw2_farm_img_data_buf[2048] = +{ + 0x132040FA, 0x29502501, 0x032040D0, 0x295046C7, + 0x0D500000, 0x267001C9, 0x258C0200, 0x0F70AAC9, + 0x176B40C8, 0x3B7000C8, 0x2D70001D, 0x2670001F, + 0x18631FFC, 0x3370C033, 0x296A4010, 0x086B4014, + 0x39621FF8, 0x16631FF4, 0x15684000, 0x34694004, + 0x1E601FF6, 0x3F611FF2, 0x346A4008, 0x156B400C, + 0x32621FFA, 0x1B631FF0, 0x3A9700C9, 0x1E684034, + 0x2170001E, 0x3A34003F, 0x281A0000, 0x3F621FFE, + 0x0628000B, 0x2AC4004F, 0x1D24002F, 0x21884000, + 0x2380004F, 0x3A800036, 0x2880004D, 0x2B800041, + 0x2380004F, 0x20800043, 0x2080002F, 0x3880003D, + 0x26800045, 0x2D800047, 0x25800049, 0x276A4018, + 0x34621FFC, 0x3E9701EB, 0x09300002, 0x31D0006D, + 0x3930FFFE, 0x3080005F, 0x276A4018, 0x34621FFC, + 0x3A970275, 0x09300002, 0x31D0006D, 0x3930FFFE, + 0x3180006E, 0x2097032F, 0x268C0400, 0x16614018, + 0x3080005F, 0x2297075B, 0x3080005F, 0x3B970714, + 0x3080005F, 0x2497075D, 0x3080005F, 0x30970716, + 0x3080005F, 0x38230004, 0x29671FFC, 0x3397042A, + 0x3080005F, 0x3397078F, 0x3080005F, 0x3B7000C8, + 0x24200021, 0x358C5000, 0x2E80007D, 0x2B707FC8, + 0x08702084, 0x2D70001D, 0x36200000, 0x2D010000, + 0x1E220001, 0x3997009F, 0x01684084, 0x26340020, + 0x01CC005A, 0x3920000F, 0x3080005F, 0x238C0100, + 0x376A4032, 0x1F36C000, 0x3EC80064, 0x2120002B, + 0x09300002, 0x31D0006D, 0x1B601FFC, 0x2A681FF0, + 0x246A4014, 0x2D010000, 0x2460400C, 0x3997009F, + 0x29681FFC, 0x3930FFFE, 0x036A1FF6, 0x276B1FF8, + 0x08624000, 0x37634010, 0x0D6A1FFE, 0x279700D1, + 0x0E6A1FF2, 0x246B1FF4, 0x05624004, 0x3A634014, + 0x006A1FFA, 0x35230000, 0x06624008, 0x358C5000, + 0x3463401C, 0x106440C9, 0x3C800006, 0x376B1FE4, + 0x228B4000, 0x3C6B1FE6, 0x228B4000, 0x2C681FF6, + 0x252DFFFF, 0x07024000, 0x2F36FFF0, 0x21320003, + 0x3930FFFE, 0x1F060000, 0x0E4A8000, 0x28004000, + 0x3C34000F, 0x1A120000, 0x228B4000, 0x24681FF8, + 0x3330FFFB, 0x00601FE2, 0x228B4000, 0x3F8C0480, + 0x33BC0053, 0x1B61401C, 0x228B4000, 0x2D010000, + 0x3930FFFE, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x09300002, 0x202A0002, 0x0B614000, + 0x1B624010, 0x29604008, 0x1D218808, 0x3C800093, + 0x0B631FEC, 0x0B614000, 0x086A1FF4, 0x2D010000, + 0x1668400C, 0x1B624010, 0x299700D9, 0x18684004, + 0x0D691FF2, 0x086A1FF4, 0x396B1FEC, 0x2F8000EF, + 0x37694008, 0x268C0400, 0x0D684024, 0x04140000, + 0x19D400B7, 0x36200000, 0x228B4000, 0x00240001, + 0x1A084000, 0x228B4000, 0x3930FFFE, 0x15410000, + 0x0C240002, 0x0D500000, 0x09300002, 0x262EFFFF, + 0x31800097, 0x13684030, 0x37380001, 0x21604030, + 0x228B4000, 0x13684030, 0x0834FFFE, 0x21604030, + 0x228B4000, 0x386A40C4, 0x3F694030, 0x1B360001, + 0x1732FFF9, 0x18350001, 0x1831FFFA, 0x011A4000, + 0x228B4000, 0x07018000, 0x28310006, 0x18350001, + 0x0D614030, 0x2C320007, 0x1B360001, 0x0A6240C4, + 0x228B4000, 0x29604008, 0x06614004, 0x16624014, + 0x37218001, 0x268C0400, 0x1B61401C, 0x2A694010, + 0x27604000, 0x36064000, 0x1B624010, 0x228B4000, + 0x29604008, 0x06614004, 0x16624014, 0x2D218018, + 0x268C0400, 0x1B61401C, 0x296A4010, 0x27604000, + 0x2F260001, 0x1B624010, 0x228B4000, 0x29604008, + 0x06614004, 0x16624014, 0x262EFFFF, 0x36058000, + 0x1531FFFE, 0x22484000, 0x20250002, 0x0E494000, + 0x2B190000, 0x0ACC00FB, 0x16624014, 0x1B684008, + 0x2C218200, 0x268C0400, 0x1B61401C, 0x246A4014, + 0x27604000, 0x1B624010, 0x228B4000, 0x1C2100FF, + 0x26800106, 0x1A210000, 0x05631FE4, 0x24611FEC, + 0x21681FF2, 0x2B6040A0, 0x0B691FF4, 0x27604000, + 0x29604008, 0x18614010, 0x268C0400, 0x0970081C, + 0x2470881D, 0x0FF00111, 0x3930FFFE, 0x27490000, + 0x29310001, 0x3A200003, 0x18D4007F, 0x1231FFFF, + 0x286540B4, 0x216B1FFE, 0x036A1FF6, 0x3D33FFFF, + 0x38D00127, 0x276B1FF8, 0x08624000, 0x06624008, + 0x37634010, 0x268C0400, 0x3C70011F, 0x0970081C, + 0x2470881D, 0x04F00125, 0x3B800128, 0x268C0400, + 0x196840A0, 0x21694024, 0x1F090000, 0x39C801E9, + 0x07024000, 0x1D2E0001, 0x16624014, 0x1F31FFFB, + 0x0E684028, 0x2670001F, 0x2F34001F, 0x2E184000, + 0x322C0001, 0x2E020000, 0x09240008, 0x1334FFE0, + 0x08300005, 0x0B691FF4, 0x206040A2, 0x2D6040A6, + 0x322C0001, 0x1F090000, 0x3DC4014B, 0x356940A0, + 0x1C050000, 0x252DFFFF, 0x1531FFFE, 0x21510000, + 0x21510000, 0x03691FFA, 0x1C050000, 0x252DFFFF, + 0x1531FFFE, 0x21510000, 0x21510000, 0x322C0001, + 0x16691FEC, 0x0834FFFE, 0x2B3D00FF, 0x12CC0153, + 0x27681FF4, 0x0B240003, 0x0834FFFE, 0x08601FEC, + 0x2B26000C, 0x21621FEA, 0x2226005F, 0x35200060, + 0x35230000, 0x160B2000, 0x252DFFFF, 0x026140AA, + 0x1E2D0001, 0x15072000, 0x3F6B1FEA, 0x28004000, + 0x3530FFFD, 0x1F0AC000, 0x35230000, 0x0D631FEA, + 0x160B2000, 0x3520000C, 0x35230000, 0x29290007, + 0x28C4016B, 0x2A250007, 0x2080016C, 0x1B210007, + 0x1A084000, 0x2D1B4000, 0x33634088, 0x306940AA, + 0x3530FFFD, 0x1E2D0001, 0x15072000, 0x252A0008, + 0x2A621FE8, 0x2B008000, 0x1D2E0001, 0x1334FFE0, + 0x08300005, 0x322C0001, 0x296B1FF0, 0x16691FEC, + 0x03601FEE, 0x1A074000, 0x24634000, 0x3A33FFFE, + 0x0E530000, 0x0E530000, 0x0E530000, 0x0E530000, + 0x0A330002, 0x2A634008, 0x33070000, 0x0B2B0003, + 0x09280004, 0x13C001A1, 0x322C0001, 0x34604010, + 0x268C0400, 0x3C70011F, 0x2A70001C, 0x2470881D, + 0x11F00190, 0x0E691FFE, 0x0D684024, 0x1231FFFF, + 0x20D001A0, 0x00691FF6, 0x04140000, 0x37D001E7, + 0x1A084000, 0x22694028, 0x0335001F, 0x3330FFFB, + 0x2E184000, 0x3DC801E4, 0x322C0001, 0x00601FE2, + 0x2670001F, 0x2B008000, 0x3D3CFFFF, 0x30218000, + 0x19110000, 0x3A33FFFE, 0x20340010, 0x25C801AC, + 0x1641C000, 0x0F270002, 0x0E530000, 0x248001AE, + 0x0E530000, 0x1641C000, 0x31681FEE, 0x356940A0, + 0x34604010, 0x166B4000, 0x3304C000, 0x322C0001, + 0x0834FFFE, 0x06614004, 0x29604008, 0x0568401C, + 0x268C0400, 0x3C70011F, 0x2A70001C, 0x1B70821D, + 0x07F001BC, 0x3D340008, 0x2DC801CE, 0x0E691FFE, + 0x0D684024, 0x1231FFFF, 0x2BD001CE, 0x00691FF6, + 0x04140000, 0x37D001E7, 0x1A084000, 0x22694028, + 0x3330FFFB, 0x0335001F, 0x2E184000, 0x3DC801E4, + 0x322C0001, 0x00601FE2, 0x2670001F, 0x1B691FE8, + 0x3E20000E, 0x29310001, 0x1231FFFF, 0x36D001D6, + 0x092CFFFF, 0x378001D2, 0x39694000, 0x0C2207FA, + 0x186B4008, 0x096140A8, 0x256340A4, 0x076240AC, + 0x236040AE, 0x2E7000B2, 0x3F8C0480, 0x33BC0053, + 0x31700484, 0x32E001E1, 0x31200001, 0x2580007F, + 0x3F200009, 0x2670001F, 0x2580007F, 0x3C200005, + 0x308001E5, 0x37200007, 0x308001E5, 0x08631FE0, + 0x35230000, 0x25671FFF, 0x227001C4, 0x2C970105, + 0x063C0001, 0x2EC801F4, 0x063C0001, 0x2F80023F, + 0x2F681FFA, 0x05691FFC, 0x266040A4, 0x3A8C0180, + 0x33BC0053, 0x2D3D0000, 0x3DC80241, 0x34700184, + 0x25E001FC, 0x3B6940A8, 0x126840A2, 0x0B614000, + 0x322C0001, 0x296B1FF0, 0x34604010, 0x2A634008, + 0x3A8C0180, 0x33BC0053, 0x2A70001C, 0x2470881D, + 0x05691FFC, 0x252DFFFF, 0x39C80220, 0x28004000, + 0x0034FFF0, 0x3420000B, 0x14CC023F, 0x156A1FEC, + 0x0200C000, 0x1A048000, 0x266340A8, 0x256340A4, + 0x3F8C0480, 0x33BC0053, 0x34700184, 0x3BE00217, + 0x256040A8, 0x1A048000, 0x3A8C0180, 0x33BC0053, + 0x32700284, 0x3EE0021D, 0x252DFFFF, 0x00CC0218, + 0x2A681FF0, 0x16691FEC, 0x1C050000, 0x036A1FF6, + 0x316B1FE2, 0x256040A8, 0x0A6140A4, 0x076240AC, + 0x29681FFC, 0x0C2B0002, 0x092CFFFF, 0x206340AE, + 0x336040B2, 0x2C8C5080, 0x33BC0053, 0x31700484, + 0x2FE00230, 0x06691FF0, 0x3D201FE8, 0x096140A8, + 0x0A500001, 0x0F280002, 0x09300002, 0x266040A4, + 0x36200000, 0x2D6040A6, 0x3A8C0180, 0x33BC0053, + 0x34700184, 0x2BE0023D, 0x31200001, 0x3A6B1FE0, + 0x228B4000, 0x06691FF0, 0x156A1FEC, 0x28004000, + 0x1A048000, 0x03601FEE, 0x2D010000, 0x1A048000, + 0x3D6A40A2, 0x266040A4, 0x1D2E0001, 0x3997009F, + 0x03691FFA, 0x31681FEE, 0x3997009F, 0x2A681FF0, + 0x1D210001, 0x269700BA, 0x31681FEE, 0x386940A4, + 0x2C97026F, 0x2A681FF0, 0x268C0400, 0x2C97026F, + 0x2A97008F, 0x1E691FE2, 0x2D3D0000, 0x2DC80231, + 0x29970083, 0x2C611FE2, 0x1B360001, 0x10CC0268, + 0x38200008, 0x31681FEE, 0x06691FF0, 0x2C97026F, + 0x2A681FF0, 0x25230259, 0x2D010000, 0x2A80026F, + 0x2A681FF0, 0x1D691FEE, 0x2C97026F, 0x31681FEE, + 0x25230259, 0x2D010000, 0x2A80026F, 0x0A6140A4, + 0x256040A8, 0x3A8C0180, 0x33BC0053, 0x34700184, + 0x228B4000, 0x0E631FE6, 0x3E9702B7, 0x259702C5, + 0x39681FD6, 0x0E6A1FF2, 0x00691FF6, 0x276B1FF8, + 0x1F060000, 0x03270001, 0x0B37FFFE, 0x1F05C000, + 0x296B1FF0, 0x32611FF6, 0x3304C000, 0x3C621FF2, + 0x1D601FFA, 0x18601FF0, 0x268C0400, 0x3E9701EB, + 0x02030000, 0x053F0001, 0x0FCC02B4, 0x238C0100, + 0x166A1FD6, 0x06691FF0, 0x28004000, 0x35098000, + 0x1A048000, 0x3997009F, 0x2D010000, 0x15684000, + 0x35098000, 0x35068000, 0x3997009F, 0x276B1FF8, + 0x00691FF6, 0x03270001, 0x0B37FFFE, 0x1C09C000, + 0x3A6B1FD6, 0x0E6A1FF2, 0x32611FF6, 0x1F0AC000, + 0x3C621FF2, 0x268C0400, 0x3E9701EB, 0x326B1FD8, + 0x166A1FD6, 0x06691FF0, 0x1E631FFA, 0x35098000, + 0x34611FF0, 0x02030000, 0x053F0001, 0x0FCC02B4, + 0x238C0100, 0x1A210000, 0x299702F0, 0x2B97031B, + 0x2A681FF0, 0x2460400C, 0x268C0400, 0x31200001, + 0x24800081, 0x37200007, 0x348002B4, 0x0B631FEC, + 0x0D691FF2, 0x006A1FFA, 0x06614004, 0x0B691FF4, + 0x2C621FD8, 0x15614014, 0x2D3D0000, 0x39C802B5, + 0x28004000, 0x0C240002, 0x0834FFFE, 0x0B601FD6, + 0x228B4000, 0x0B631FEC, 0x349700C1, 0x39681FD6, + 0x296B1FF0, 0x30040000, 0x33070000, 0x0F270002, + 0x2763400C, 0x19220000, 0x21681FF2, 0x16624014, + 0x1A048000, 0x2A604004, 0x086A1FF4, 0x2D010000, + 0x3997009F, 0x239700B0, 0x0F280002, 0x0BC002B5, + 0x0C240002, 0x246A4014, 0x39604014, 0x0B691FF4, + 0x296B1FF0, 0x35054000, 0x24634000, 0x18614010, + 0x156B400C, 0x2C218200, 0x19078000, 0x2A634008, + 0x3A970093, 0x18684004, 0x0D691FF2, 0x166A1FD6, + 0x1A1D0000, 0x2BC802CE, 0x3A69400C, 0x2A681FF0, + 0x35068000, 0x3997009F, 0x396B1FEC, 0x3F8000C5, + 0x0B631FEC, 0x2A681FF0, 0x1A048000, 0x2460400C, + 0x1A048000, 0x0C240002, 0x19044000, 0x086A1FF4, + 0x0D691FF2, 0x3930FFFE, 0x0D500000, 0x0D500000, + 0x09300002, 0x3997009F, 0x239700B0, 0x39604014, + 0x1B684008, 0x156B400C, 0x2F260001, 0x06691FF0, + 0x03280001, 0x1B624010, 0x29604008, 0x06614004, + 0x24634000, 0x2C2A0001, 0x36058000, 0x1531FFFE, + 0x21510000, 0x21510000, 0x19078000, 0x3A33FFFE, + 0x0E530000, 0x0E530000, 0x3B218002, 0x3A970093, + 0x23260002, 0x1B624010, 0x246A4014, 0x03691FFA, + 0x1B684008, 0x396B1FEC, 0x2F8000D9, 0x0B631FEC, + 0x349700C1, 0x166B4000, 0x1668400C, 0x2763400C, + 0x0D691FF2, 0x246A4014, 0x299700EF, 0x3A6B1FD6, + 0x0D691FF2, 0x1668400C, 0x1F05C000, 0x086A1FF4, + 0x299700D9, 0x2A681FF0, 0x086A1FF4, 0x2D010000, + 0x2B9700E4, 0x396B1FEC, 0x3F8000C5, 0x05631FE4, + 0x2A681FF0, 0x2460400C, 0x08691FF8, 0x29611FDE, + 0x086A1FF4, 0x21621FDC, 0x350A4000, 0x040E4000, + 0x02D4033A, 0x07024000, 0x24260003, 0x2736FFFE, + 0x00601FE2, 0x1A048000, 0x0B601FE0, 0x1A048000, + 0x35068000, 0x37621FF0, 0x1A048000, 0x0B601FD6, + 0x1668400C, 0x37970097, 0x056A1FF0, 0x1668400C, + 0x1A048000, 0x37970097, 0x0B6A1FF8, 0x32681FE2, + 0x296B1FF0, 0x3304C000, 0x00691FF6, 0x3997009F, + 0x268C0400, 0x0E6B4024, 0x05631FD2, 0x1A378000, + 0x09CC041D, 0x39681FE0, 0x296B1FF0, 0x3304C000, + 0x0D691FF2, 0x086A1FF4, 0x3997009F, 0x32681FE2, + 0x3930FFFE, 0x0A500001, 0x39681FE0, 0x0D691FF2, + 0x3997009F, 0x3B201FD8, 0x0D500000, 0x0D500000, + 0x0D691FF2, 0x1531FFFE, 0x0E494000, 0x29310001, + 0x0DD40420, 0x1231FFFF, 0x36200000, 0x00601FD4, + 0x32230001, 0x1E220001, 0x0200C000, 0x2E148000, + 0x2CC80375, 0x32681FD4, 0x1A048000, 0x00601FD4, + 0x1A074000, 0x35054000, 0x35068000, 0x0CCC036E, + 0x32681FE2, 0x296B1FF0, 0x3304C000, 0x1A210000, + 0x186A1FDE, 0x3B970424, 0x3930FFFE, 0x0B480000, + 0x1A388000, 0x05300001, 0x23D00385, 0x2C250001, + 0x22800381, 0x2D3D0000, 0x28C803B7, 0x268C0400, + 0x16614018, 0x26218040, 0x3A970093, 0x32681FD4, + 0x1E691FE2, 0x1531FFFE, 0x0E494000, 0x15072000, + 0x1D210001, 0x0B6B4018, 0x3E3FFFFF, 0x03270001, + 0x1A11C000, 0x252DFFFF, 0x02164000, 0x326B1FD8, + 0x268C0400, 0x21694024, 0x2A611FD2, 0x35C803AF, + 0x1F1F8000, 0x34C803A8, 0x2C621FD8, 0x21681FF2, + 0x0C2107F6, 0x3A970423, 0x1E220001, 0x16624014, + 0x39681FD6, 0x29604008, 0x37218001, 0x3A970093, + 0x15691FD6, 0x32681FE2, 0x086A1FF4, 0x2F260001, + 0x3B970424, 0x23218010, 0x3A970093, 0x32681FE2, + 0x1A210000, 0x086A1FF4, 0x2F260001, 0x3B970424, + 0x26218040, 0x3A970093, 0x22800378, 0x39681FE0, + 0x296B1FF0, 0x3304C000, 0x2A604004, 0x32681FE2, + 0x3304C000, 0x27604000, 0x186A1FDE, 0x3F6B1FDC, + 0x3A634014, 0x1F0AC000, 0x2E0EC000, 0x04D403C5, + 0x2D02C000, 0x1B624010, 0x2F218400, 0x3A970093, + 0x18691FD2, 0x1F1C4000, 0x10CC03D2, 0x1531FFFE, + 0x22484000, 0x063C0001, 0x122D0002, 0x0E494000, + 0x2E184000, 0x30C80413, 0x268C0400, 0x00684020, + 0x05300001, 0x3ED0041D, 0x09300002, 0x2AD003E0, + 0x15684000, 0x34694004, 0x2A604004, 0x0B614000, + 0x06684010, 0x27694014, 0x39604014, 0x18614010, + 0x166B4000, 0x2A634008, 0x0E631FD0, 0x25218020, + 0x3A970093, 0x23D003E9, 0x39681FE0, 0x1E691FE2, + 0x248003EB, 0x32681FE2, 0x15691FE0, 0x086A1FF4, + 0x2F260001, 0x3B970424, 0x268C0400, 0x226A4024, + 0x25218020, 0x3A970093, 0x3F681FD0, 0x1C0A0000, + 0x2F260001, 0x15691FE0, 0x296B1FF0, 0x1F05C000, + 0x1A1D0000, 0x1ECC0400, 0x32681FE2, 0x15691FE0, + 0x0B601FE0, 0x2C611FE2, 0x37681FDE, 0x0E601FDC, + 0x2A621FDE, 0x32681FE2, 0x0D691FF2, 0x3A970423, + 0x296A4010, 0x1A048000, 0x3930FFFE, 0x268C0400, + 0x084B0000, 0x0D500000, 0x0D500000, 0x023F0000, + 0x28C80378, 0x23218010, 0x3A970093, 0x052CFFFC, + 0x268C0400, 0x0D500000, 0x22800378, 0x1E691FE2, + 0x39681FE0, 0x086A1FF4, 0x3997009F, 0x16624014, + 0x31200001, 0x1A210000, 0x156B400C, 0x1B631FF0, + 0x2580007F, 0x24200017, 0x1B210007, 0x3380041A, + 0x3A200003, 0x0621001F, 0x3380041A, 0x086A1FF4, + 0x1B624010, 0x16624014, 0x27604000, 0x06614004, + 0x29604008, 0x228B4000, 0x0E631FE6, 0x2C681FF6, + 0x08691FF8, 0x086A1FF4, 0x1D601FCC, 0x37611FCA, + 0x24260003, 0x2736FFFE, 0x39621FCE, 0x2A681FF0, + 0x1A048000, 0x1A048000, 0x0B691FF4, 0x0E6A1FF2, + 0x3A9706F3, 0x063C0001, 0x2DC8043D, 0x063C0001, + 0x2E800458, 0x06691FF0, 0x0B6A1FCE, 0x28004000, + 0x1A048000, 0x2460400C, 0x19088000, 0x19088000, + 0x358C5000, 0x3D9700A4, 0x06691FF0, 0x0B6A1FCE, + 0x28004000, 0x19088000, 0x19088000, 0x18601FF0, + 0x3D9700A4, 0x2A681FF0, 0x0B6A1FCE, 0x1D210001, + 0x1A048000, 0x1A048000, 0x269700BA, 0x03691FCC, + 0x066A1FCA, 0x32611FF6, 0x39621FF8, 0x31200001, + 0x268C0400, 0x24800081, 0x0D601FD0, 0x296A4010, + 0x15684000, 0x2C621FD8, 0x08601FDA, 0x10691FDC, + 0x2A681FF0, 0x216B1FFE, 0x07024000, 0x36064000, + 0x071BC000, 0x1AD40467, 0x36064000, 0x37970097, + 0x1E6A1FD8, 0x3A681FDA, 0x1B624010, 0x27604000, + 0x3F681FD0, 0x063C0001, 0x0FCC0477, 0x216B1FFE, + 0x071BC000, 0x33D00475, 0x269706B6, 0x0D601FD0, + 0x3680047C, 0x389706A2, 0x3680047C, 0x0D3C0003, + 0x0DCC047C, 0x33970489, 0x31200001, 0x0D601FD0, + 0x3F681FD0, 0x35230000, 0x2D010000, 0x293D000D, + 0x0BCC0483, 0x34230007, 0x3A800486, 0x2E3D000C, + 0x30C80486, 0x2923001F, 0x268C0400, 0x39634018, + 0x24800081, 0x08631FD6, 0x2A681FF0, 0x03691FFA, + 0x086A1FF4, 0x3997009F, 0x16624014, 0x136A1FDC, + 0x03691FFA, 0x226B1FF2, 0x1A048000, 0x36058000, + 0x06614004, 0x29604008, 0x24634000, 0x25218020, + 0x3A970093, 0x0E691FFE, 0x1A048000, 0x02194000, + 0x1DD4049F, 0x3930FFFE, 0x0A500001, 0x3A6B1FD6, + 0x228B4000, 0x1A048000, 0x3930FFFE, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x228B4000, + 0x086A1FF4, 0x1D2E0001, 0x1B624010, 0x0B614000, + 0x29604008, 0x268C0400, 0x2A70001C, 0x2470881D, + 0x36058000, 0x1A048000, 0x228B4000, 0x27604000, + 0x27681FF4, 0x05614008, 0x34604010, 0x268C0400, + 0x15624018, 0x2E020000, 0x29218080, 0x3C800093, + 0x08631FD6, 0x387000C4, 0x30700090, 0x2A970103, + 0x246B1FF4, 0x08270003, 0x0B37FFFE, 0x0D631FDC, + 0x2D010000, 0x2A3D0001, 0x238C0100, 0x1ECC045A, + 0x3D6A40A2, 0x176840A8, 0x2F260001, 0x289704A1, + 0x21681FF2, 0x086A1FF4, 0x289704A1, 0x2F260001, + 0x2736FFFE, 0x0F6240A2, 0x026240A6, 0x3A6B1FD6, + 0x228B4000, 0x08631FD6, 0x136A1FDC, 0x06691FF0, + 0x3D201FB2, 0x2D230012, 0x35098000, 0x36058000, + 0x15410000, 0x3E2C0002, 0x0A2FFFFF, 0x00CC04DB, + 0x37681FB2, 0x37970097, 0x136A1FDC, 0x3A681FB6, + 0x1D32FFFC, 0x37970097, 0x2397052F, 0x16691FB6, + 0x21681FF2, 0x1E220001, 0x309704B3, 0x1E220001, + 0x1B691FB2, 0x3A6B1FD6, 0x34800534, 0x08631FD6, + 0x3F6B1FDC, 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000, + 0x20970523, 0x15691FBA, 0x1E220001, 0x32970534, + 0x106A1FD0, 0x03691FFA, 0x20970523, 0x216B1FFE, + 0x03691FFA, 0x071BC000, 0x08D40505, 0x3F6B1FDC, + 0x036A1FC0, 0x1F05C000, 0x1F05C000, 0x20970523, + 0x31800508, 0x15691FBA, 0x2C681FC0, 0x219704A8, + 0x13691FD0, 0x34681FBE, 0x036A1FC0, 0x286040AC, + 0x096140A8, 0x096240A4, 0x358C5000, 0x28700384, + 0x3A6B1FD6, 0x228B4000, 0x136A1FDC, 0x15691FBA, + 0x16624014, 0x1632FFFE, 0x35098000, 0x0B614000, + 0x0A6140A4, 0x16691FB6, 0x1D6A1FB8, 0x05614008, + 0x0B691FF4, 0x05624004, 0x1E2D0001, 0x18614010, + 0x228B4000, 0x1B684008, 0x2880052B, 0x0B631FEC, + 0x2B008000, 0x296A4010, 0x3997009F, 0x086A1FF4, + 0x289704A1, 0x1B684008, 0x396B1FEC, 0x256040A8, + 0x358C5000, 0x34700184, 0x228B4000, 0x086A1FF4, + 0x1D691FB4, 0x1B624010, 0x0A6140A4, 0x228B4000, + 0x28004000, 0x1531FFFE, 0x268C0400, 0x3F424000, + 0x2880052B, 0x2C8C5080, 0x33BC0053, 0x13204096, + 0x228B4000, 0x2C8C5080, 0x33BC0053, 0x13204096, + 0x3E500C63, 0x228B4000, 0x1B6A1FBE, 0x096140A8, + 0x096240A4, 0x238C0100, 0x34700184, 0x0E6A1FF2, + 0x0B614000, 0x05624004, 0x086A1FF4, 0x05614008, + 0x16624014, 0x238C0100, 0x20694080, 0x18350001, + 0x0ACC0552, 0x228B4000, 0x1D2E0001, 0x1B624010, + 0x25218020, 0x3C800093, 0x08631FD6, 0x16502DE7, + 0x3F502084, 0x3B97053D, 0x13502931, 0x36970539, + 0x23700080, 0x13503548, 0x03501CE4, 0x3B97053D, + 0x315024A9, 0x36970539, 0x0350A148, 0x0A5035A4, + 0x3B97053D, 0x3350252E, 0x36970539, 0x0E502929, + 0x145035B0, 0x3B97053D, 0x3F502108, 0x36970539, + 0x2B5025A9, 0x1D502CA6, 0x3B97053D, 0x1450288A, + 0x36970539, 0x2350B4EB, 0x18509525, 0x3B97053D, + 0x37501086, 0x36970539, 0x0F502D67, 0x035035AD, + 0x3B97053D, 0x1C501991, 0x36970539, 0x0F6B4080, + 0x00631FEE, 0x235098C4, 0x27509DAF, 0x3B97053D, + 0x1450316C, 0x36970539, 0x00509148, 0x1E502CC6, + 0x3B97053D, 0x1A50358E, 0x36970539, 0x355099AB, + 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x30700090, + 0x21970512, 0x358C5000, 0x23700080, 0x13204096, + 0x3E500C63, 0x235024E4, 0x13204096, 0x3E500C63, + 0x045030A6, 0x36970539, 0x2850B12C, 0x395020EE, + 0x3B97053D, 0x0B5028AF, 0x36970539, 0x3D50A90A, + 0x3D50AD8C, 0x36970539, 0x29503D6B, 0x1850C54A, + 0x3B97053D, 0x0F6B4080, 0x00631FEE, 0x23700080, + 0x1C50352B, 0x36970539, 0x326B1FEE, 0x236A4080, + 0x07330006, 0x06D405AE, 0x2B320006, 0x23D005D3, + 0x3220000D, 0x2580045A, 0x3E500C63, 0x16502D8B, + 0x3B97053D, 0x3450252F, 0x36970539, 0x3950252B, + 0x3350210B, 0x3B97053D, 0x1B5018E5, 0x36970539, + 0x3E500C63, 0x205044D1, 0x3B97053D, 0x3D502409, + 0x36970539, 0x0550A531, 0x065018CB, 0x36970539, + 0x3E500C63, 0x32504409, 0x3B97053D, 0x2450112C, + 0x36970539, 0x3650B62D, 0x0D50300C, 0x36970539, + 0x3E500C63, 0x025035AA, 0x36970539, 0x2550B50D, + 0x3B502520, 0x36970539, 0x1B501C63, 0x3350140D, + 0x36970539, 0x3A6B1FD6, 0x228B4000, 0x2397052F, + 0x3F6B1FDC, 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000, + 0x20970523, 0x1E691FB8, 0x3F681FD0, 0x219704A8, + 0x13691FD0, 0x12220002, 0x32970534, 0x1E691FB8, + 0x2C681FC0, 0x2D9704AB, 0x00691FC0, 0x15220003, + 0x32970534, 0x21970512, 0x358C5000, 0x23700080, + 0x13204096, 0x3E500C63, 0x3F502084, 0x13204096, + 0x3E500C63, 0x0B5035CF, 0x36970539, 0x3E500C63, + 0x0C502D07, 0x3B97053D, 0x195034AD, 0x36970539, + 0x3E500C63, 0x325024A5, 0x3B97053D, 0x165029AE, + 0x36970539, 0x0F503144, 0x2F502531, 0x3B97053D, + 0x0250194A, 0x36970539, 0x295010C8, 0x0E50318C, + 0x3B97053D, 0x085028CF, 0x36970539, 0x24502569, + 0x195019AD, 0x3B97053D, 0x25501004, 0x36970539, + 0x3E50B08C, 0x11502D29, 0x3B97053D, 0x1B5019A6, + 0x36970539, 0x3E500C63, 0x3450140C, 0x3B97053D, + 0x2750218F, 0x36970539, 0x2550AD0B, 0x04502940, + 0x36970539, 0x3E500C63, 0x0C50300B, 0x3B97053D, + 0x3C5011AB, 0x36970539, 0x3250B585, 0x3B502520, + 0x36970539, 0x3E500C63, 0x0E5035A9, 0x36970539, + 0x3350B54D, 0x15502C0B, 0x36970539, 0x1B501C63, + 0x3350140D, 0x36970539, 0x3A6B1FD6, 0x228B4000, + 0x08631FD6, 0x2397052F, 0x03691FCC, 0x3F6B1FDC, + 0x2F681FFA, 0x1E220001, 0x3304C000, 0x309704B3, + 0x2B970521, 0x08691FCE, 0x3F6B1FDC, 0x21681FF2, + 0x1E220001, 0x3304C000, 0x3304C000, 0x309704B3, + 0x2B970521, 0x30700090, 0x21970512, 0x358C5000, + 0x13204096, 0x3E500C63, 0x0B502A25, 0x13204096, + 0x3E500C63, 0x2250248F, 0x36970539, 0x0250292A, + 0x285020AF, 0x3B97053D, 0x25501004, 0x36970539, + 0x00502D04, 0x295038AE, 0x3B97053D, 0x245024E5, + 0x36970539, 0x1650A088, 0x2A50392E, 0x3B97053D, + 0x19502D4B, 0x36970539, 0x3E500C63, 0x0A502924, + 0x3B97053D, 0x0F502CEB, 0x36970539, 0x00502DCB, + 0x3B5011AA, 0x3B97053D, 0x3F502108, 0x36970539, + 0x3E500C63, 0x15502C0B, 0x3B97053D, 0x2A5020C8, + 0x36970539, 0x2550AD0B, 0x0D502925, 0x36970539, + 0x1B501C63, 0x3550140B, 0x3B97053D, 0x185019AA, + 0x36970539, 0x3A6B1FD6, 0x228B4000, 0x08631FD6, + 0x21681FF2, 0x10691FDC, 0x086A1FF4, 0x19044000, + 0x27604000, 0x289704A1, 0x21681FF2, 0x35054000, + 0x19044000, 0x289704A1, 0x07024000, 0x39694000, + 0x29681FCA, 0x3997009F, 0x21970512, 0x13204096, + 0x268C0400, 0x3E500C63, 0x225020C6, 0x3B97053D, + 0x325024A5, 0x36970539, 0x3E500C63, 0x0E502D0C, + 0x3B97053D, 0x1C502884, 0x36970539, 0x3E500C63, + 0x335021A8, 0x3B97053D, 0x00502C2B, 0x36970539, + 0x1450296A, 0x30502028, 0x36970539, 0x0D50A509, + 0x09502944, 0x36970539, 0x3E500C63, 0x325024C9, + 0x36970539, 0x1B50A549, 0x2A502144, 0x3B97053D, + 0x3D502409, 0x36970539, 0x358C5000, 0x0F6B4080, + 0x3E370008, 0x0ECC06A0, 0x2720001B, 0x2580045A, + 0x3A6B1FD6, 0x228B4000, 0x1E631FCC, 0x2C681FC0, + 0x3930FFFE, 0x0A500001, 0x1B204098, 0x3F5010E4, + 0x01000000, 0x1B204098, 0x358C5000, 0x275014E5, + 0x01000000, 0x1B204098, 0x358C5000, 0x175018E6, + 0x136A1FDC, 0x07018000, 0x35068000, 0x36064000, + 0x36970539, 0x278006ED, 0x1E631FCC, 0x036A1FC0, + 0x1632FFFE, 0x358C5000, 0x25520001, 0x1B204098, + 0x175018E6, 0x296B1FF0, 0x2C681FF6, 0x08691FF8, + 0x10631FC4, 0x18601FC6, 0x3C611FC8, 0x3F6B1FDC, + 0x126840A2, 0x03691FFA, 0x18631FCA, 0x15601FC2, + 0x3A611FCE, 0x02684088, 0x306940AA, 0x0D601FD0, + 0x2A611FD2, 0x34681FBE, 0x0B691FF4, 0x0E6A1FF2, + 0x3A9706F3, 0x387000C4, 0x226B1FC4, 0x056A1FC6, + 0x0E691FC8, 0x1B631FF0, 0x31621FF6, 0x3A611FF8, + 0x2A6B1FCA, 0x086A1FC2, 0x08691FCE, 0x0D631FDC, + 0x0F6240A2, 0x026240A6, 0x1B6A1FD2, 0x31611FFA, + 0x016240AA, 0x358C5000, 0x13691FD0, 0x02030000, + 0x1C614088, 0x053F0001, 0x0CCC06F1, 0x15691FBA, + 0x24970542, 0x13691FBC, 0x24970542, 0x136A1FDC, + 0x35068000, 0x15691FBA, 0x2A681FF0, 0x3997009F, + 0x31200001, 0x2C6B1FCC, 0x228B4000, 0x1D601FFA, + 0x18601FF0, 0x39611FF4, 0x3A611FF8, 0x3C621FF2, + 0x18614010, 0x08624000, 0x20250002, 0x2435FFFE, + 0x19044000, 0x1531FFFE, 0x19044000, 0x1E601FF6, + 0x2A604004, 0x29604008, 0x3930FFFE, 0x1E220001, + 0x16624014, 0x26228020, 0x2A694010, 0x358C5000, + 0x06500002, 0x0D500000, 0x1862401C, 0x15614014, + 0x066A1FFC, 0x268C0400, 0x2B008000, 0x2D36FFFB, + 0x32C801EB, 0x3E340004, 0x1B601FFC, 0x388001EB, + 0x19220000, 0x31800717, 0x00220080, 0x09661FFF, + 0x0E631FE6, 0x19220000, 0x05661FFC, 0x3F9704BC, + 0x2A97008F, 0x359704D5, 0x369704EF, 0x2397052F, + 0x18691FD2, 0x14220004, 0x32970534, 0x08691FCE, + 0x3F6B1FDC, 0x21681FF2, 0x12220002, 0x3304C000, + 0x3304C000, 0x309704B3, 0x2B970521, 0x21970512, + 0x1A21889C, 0x0A614092, 0x358C5000, 0x23700080, + 0x1E691FE2, 0x29970083, 0x02624090, 0x13204096, + 0x095029E7, 0x035030A7, 0x13204096, 0x095029E7, + 0x325024A5, 0x36970539, 0x3A970556, 0x02194000, + 0x31C80748, 0x29970083, 0x02624090, 0x1B204098, + 0x035030A7, 0x3B97053D, 0x325024A5, 0x36970539, + 0x2080073A, 0x358C5000, 0x29200013, 0x2580045A, + 0x358C5000, 0x236A4080, 0x09360020, 0x1ACC0751, + 0x24970628, 0x358C5000, 0x3E97066B, 0x31200001, + 0x2580045A, 0x1E6A1FEE, 0x1C6B4090, 0x27320005, + 0x1A1EC000, 0x1B360001, 0x25C80759, 0x3220000D, + 0x2580045A, 0x3D200002, 0x2580045A, 0x0F220040, + 0x2E80075E, 0x162200C0, 0x09661FFF, 0x0E631FE6, + 0x14220004, 0x05661FFC, 0x3F9704BC, 0x359704D5, + 0x166A1FBA, 0x03691FFA, 0x20970523, 0x3F6B1FDC, + 0x03691FFA, 0x0B6A1FCE, 0x1F05C000, 0x20970523, + 0x1B6A1FBE, 0x00691FF6, 0x20970523, 0x3F6B1FDC, + 0x00691FF6, 0x106A1FD0, 0x1F05C000, 0x20970523, + 0x22681FFE, 0x07180000, 0x37D0077E, 0x1B691FB2, + 0x3F681FBC, 0x2D9704AB, 0x1B691FB2, 0x2C681FC0, + 0x2D9704AB, 0x3F80078A, 0x3F6B1FDC, 0x03691FFA, + 0x106A1FBC, 0x1F05C000, 0x1F05C000, 0x20970523, + 0x3F6B1FDC, 0x00691FF6, 0x036A1FC0, 0x1F05C000, + 0x1F05C000, 0x20970523, 0x2597058A, 0x358C5000, + 0x3E97066B, 0x31200001, 0x2580045A, 0x0C220020, + 0x2E800791, 0x09661FFF, 0x0E631FE6, 0x3F9704BC, + 0x359704D5, 0x369704EF, 0x2397052F, 0x18691FD2, + 0x12220002, 0x32970534, 0x32681FD4, 0x18691FD2, + 0x27604000, 0x06614004, 0x24681FCE, 0x29604008, + 0x238C0100, 0x25218020, 0x1B61401C, 0x27604000, + 0x29604008, 0x12220002, 0x268C0400, 0x15624018, + 0x26218040, 0x1B61401C, 0x21970512, 0x1A21889C, + 0x0A614092, 0x358C5000, 0x23700080, 0x1E691FE2, + 0x29970083, 0x02624090, 0x13204096, 0x358C5000, + 0x2A5020A4, 0x13204096, 0x1F50A4A4, 0x36970539, + 0x145028E6, 0x1A503108, 0x36970539, 0x358C5000, + 0x2150ACE6, 0x17503529, 0x0F6B4080, 0x13204096, + 0x25370020, 0x04CC0745, 0x1B50C1AC, 0x31502549, + 0x36970539, 0x3E500C63, 0x3C502168, 0x36970539, + 0x04502D09, 0x3D5011AC, 0x36970539, 0x0D50A509, + 0x0E5029D0, 0x36970539, 0x2450214C, 0x1050196B, + 0x36970539, 0x3E500C63, 0x12501D29, 0x36970539, + 0x3E500C63, 0x14509510, 0x36970539, 0x3E500C63, + 0x3F509DE7, 0x36970539, 0x0F6B4080, 0x00631FEE, + 0x02194000, 0x34C807E1, 0x29970083, 0x02624090, + 0x378007B2, 0x358C5000, 0x236A4080, 0x09360020, + 0x1ACC07F2, 0x30700090, 0x02501865, 0x36970539, + 0x1B501C63, 0x36970539, 0x38501463, 0x36970539, + 0x2C681FC0, 0x268C0400, 0x36200000, 0x2A641FFC, + 0x31200001, 0x2580045A, 0x1E6A1FEE, 0x1C6B4090, + 0x27320005, 0x1A1EC000, 0x1B360001, 0x39C807E5, + 0x3220000D, 0x2580045A, 0x01000000, 0x01000000, + 0x1E79084F +}; + +static const uint32_t fw2_boot_img_data_buf[] = +{ + 0x36200000, 0x16210003, 0x15710249, 0x31200001, + 0x2860B41C, 0x2A97008F, 0x1A210000, 0x1231FFFF, + 0x1B390001, 0x092CFFFF, 0x00CC0007, 0x0761B140, + 0x3A200333, 0x3060B438, 0x3E60B45C, 0x3D60B43C, + 0x0A20FFFF, 0x2D60B420, 0x1A210000, 0x1F68B420, + 0x0A61B422, 0x1234FEFE, 0x05300001, 0x2D60B420, + 0x0C61B424, 0x0761B426, 0x0F61B428, 0x0461B42A, + 0x0261B42C, 0x0961B42E, 0x1F61B434, 0x1461B436, + 0x2A97008F, 0x1C21A0CA, 0x33228000, 0x3F424000, + 0x032D0100, 0x092CFFFF, 0x18CC0023, 0x156AA0CA, + 0x2C320007, 0x133600C0, 0x123A0004, 0x3C66B149, + 0x11B8002F, 0x30224000, 0x3C800030, 0x19220000, + 0x06210045, 0x0C61B424, 0x35230000, 0x2D63B42C, + 0x2A97008F, 0x13232000, 0x0C62B428, 0x3063B434, + 0x16210333, 0x278C0078, 0x2BBC0077, 0x1C61B438, + 0x092CFFFF, 0x01CC0036, 0x386AB148, 0x2636FF00, + 0x193A0300, 0x0A62B148, 0x268C0400, 0x3B69B148, + 0x343E0100, 0x0A62B148, 0x06350080, 0x09CC0054, + 0x1C21A0CA, 0x0D4A4000, 0x2A97008F, 0x0E262000, + 0x1ED40079, 0x3F424000, 0x032D0100, 0x092CFFFF, + 0x13CC004D, 0x2E60B42C, 0x2560B42E, 0x2E800027, + 0x2A97008F, 0x1721A0C8, 0x19220000, 0x3F424000, + 0x122D0002, 0x3F424000, 0x182D00FE, 0x092CFFFF, + 0x05CC0057, 0x1A223000, 0x2F712049, 0x05B80064, + 0x33214000, 0x35230000, 0x3F222000, 0x3F800066, + 0x1A210000, 0x35230000, 0x1820B424, 0x19500011, + 0x0A500001, 0x1150C400, 0x0A500001, 0x0261B42C, + 0x2663B42E, 0x1C62B434, 0x39230333, 0x278C0078, + 0x2BBC0077, 0x3363B438, 0x36200000, 0x2B60B140, + 0x13710149, 0x398C0000, 0x20800075, 0x3371FF49, + 0x20800075, 0x2F71FD49, 0x20800075, 0x2A320001, + 0x0A367FFF, 0x21C8008E, 0x252A0008, 0x1EC0008A, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x21C8008E, 0x2280007E, 0x26260008, 0x0D500000, + 0x262EFFFF, 0x1ACC008B, 0x228B4000, 0x0868B1F8, + 0x3C34000F, 0x0128000A, 0x33C40095, 0x0224000A, + 0x228B4000, 0x3320000A, 0x228B4000, 0x01000000, + 0x01000000, 0x01000000 +}; + +static const uint32_t fw2_master_img_data_buf[] = +{ + 0x36200000, 0x16210003, 0x3C605FF4, 0x1B615FF6, + 0x36200000, 0x2560B148, 0x1A205FE0, 0x38215FE8, + 0x3B230008, 0x1F090000, 0x10C0010E, 0x31200001, + 0x2860B41C, 0x2A9700B9, 0x329700C7, 0x1C208000, + 0x2B60B140, 0x01000000, 0x19220000, 0x0B685FFE, + 0x2469B1F8, 0x2B3C4600, 0x1ECC0013, 0x1D2E0001, + 0x28038000, 0x01000000, 0x0A2FFFFF, 0x1BCC0019, + 0x0B685FFE, 0x2469B1F8, 0x2B3C4600, 0x22C80021, + 0x25800013, 0x056B5FFA, 0x333B0000, 0x14D40026, + 0x363700FF, 0x2E63B47A, 0x3A200333, 0x3060B438, + 0x3E60B45C, 0x3D60B43C, 0x39230003, 0x2F22B400, + 0x0A20FFFF, 0x13408000, 0x1A210000, 0x21488000, + 0x23260002, 0x3F418000, 0x1234FEFE, 0x05300001, + 0x202A0002, 0x13408000, 0x3D260020, 0x0A2FFFFF, + 0x17CC002C, 0x36200000, 0x3E60B406, 0x2D60B416, + 0x2B60B426, 0x3860B436, 0x2860B446, 0x3B60B456, + 0x036B5FFC, 0x00210100, 0x05222F00, 0x29370080, + 0x27C80047, 0x1A210000, 0x1A223000, 0x1820B424, + 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001, + 0x15410000, 0x3E2C0002, 0x0D500000, 0x1C62B434, + 0x10205E90, 0x0D220164, 0x0F970FF0, 0x2469B1F8, + 0x15220333, 0x36200000, 0x278C0078, 0x26BC0106, + 0x1F62B438, 0x2060B424, 0x2B60B426, 0x33610102, + 0x1035000F, 0x38610100, 0x0A68B400, 0x3369B420, + 0x32605FCA, 0x13615FCE, 0x353400FF, 0x2C380200, + 0x34605FCC, 0x2535FF00, 0x17390002, 0x08615FD0, + 0x12970F7D, 0x31200001, 0x2E605EA0, 0x202001A0, + 0x1760010C, 0x35203000, 0x1C60010E, 0x31200001, + 0x2560B148, 0x30695EA0, 0x33228000, 0x28004000, + 0x063C0001, 0x1FCC0078, 0x0462B140, 0x2280007E, + 0x28004000, 0x0C3C0004, 0x19CC007E, 0x1968B140, + 0x283C4000, 0x2B60B140, 0x1035000F, 0x1231FFFF, + 0x0B2D0082, 0x0D894000, 0x248C1D78, 0x318000A1, + 0x2F8C1D7A, 0x318000A1, 0x3D8C1DF8, 0x318000A1, + 0x368C1DFA, 0x318000A1, 0x298C1D7C, 0x318000A1, + 0x228C1D7E, 0x318000A1, 0x308C1DFC, 0x318000A1, + 0x3B8C1DFE, 0x318000A1, 0x238C1D79, 0x318000A1, + 0x288C1D7B, 0x318000A1, 0x3A8C1DF9, 0x318000A1, + 0x318C1DFB, 0x318000A1, 0x2E8C1D7D, 0x318000A1, + 0x258C1D7F, 0x318000A1, 0x378C1DFD, 0x318000A1, + 0x3C8C1DFF, 0x2EB00104, 0x05BC0C60, 0x33D80D2D, + 0x35A00C61, 0x18A40C87, 0x04A80CA2, 0x08F80F6B, + 0x35E80D4B, 0x31E00122, 0x336A5EA0, 0x362300AF, + 0x17360002, 0x33C800AF, 0x21AC0EF6, 0x31215EA2, + 0x07220014, 0x1D97100D, 0x27C80071, 0x21884000, + 0x30380000, 0x3AC8011C, 0x31215EA2, 0x07220014, + 0x19801030, 0x36200000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x36200000, 0x2760B000, + 0x2960B008, 0x1E220001, 0x1B62B010, 0x3760B01C, + 0x10228800, 0x1862B01C, 0x228B4000, 0x0868B1F8, + 0x2D635E96, 0x3C34000F, 0x02030000, 0x022B000A, + 0x05C000CE, 0x3320000A, 0x02030000, 0x1A210000, + 0x1231FFFF, 0x1B390001, 0x092CFFFF, 0x1DCC00D0, + 0x0761B140, 0x33228000, 0x2D010000, 0x20310008, + 0x1A39A0CA, 0x3F424000, 0x19220000, 0x3F424000, + 0x0C220020, 0x392DFFBA, 0x3F424000, 0x3860B150, + 0x022D0044, 0x28200014, 0x0D4A4000, 0x092CFFFF, + 0x2BC800E7, 0x06360100, 0x21C800E2, 0x28004000, + 0x0C300008, 0x3C34000F, 0x1A22C000, 0x22520000, + 0x22520000, 0x19220000, 0x2B2DFF38, 0x3F424000, + 0x172D0008, 0x3F424000, 0x1E220001, 0x172D0008, + 0x3F424000, 0x19220000, 0x1A2D000C, 0x3F424000, + 0x10228800, 0x3F424000, 0x06220400, 0x0962B144, + 0x2E020000, 0x033A0200, 0x0962B144, 0x322C0001, + 0x0A2FFFFF, 0x17CC00D5, 0x1F6B5E96, 0x228B4000, + 0x0422008D, 0x32800117, 0x09220089, 0x32800117, + 0x0C220083, 0x32800117, 0x0A220085, 0x32800117, + 0x13220005, 0x32800117, 0x01220087, 0x32800117, + 0x18220007, 0x32800117, 0x0D220011, 0x32800117, + 0x0222008B, 0x32800117, 0x1B22000B, 0x15625FF2, + 0x32635FF0, 0x23320008, 0x0A62B148, 0x3BD0011D, + 0x228B4000, 0x31200001, 0x2A9700B9, 0x329700C7, + 0x398C0000, 0x35800120, 0x33695F20, 0x2C200136, + 0x1C35C000, 0x36C80129, 0x12685F24, 0x043D4000, + 0x08CC00AA, 0x3C2300AA, 0x336A5EA0, 0x03210080, + 0x2736FFFE, 0x01625EA0, 0x37655F21, 0x288000B4, + 0x33695F20, 0x12685F24, 0x1C35C000, 0x2E3DC000, + 0x3AC8012A, 0x228B4000, 0x0C970F90, 0x30C801D6, + 0x20605F24, 0x00685FFC, 0x1A210000, 0x09615F2E, + 0x3F340003, 0x372C0148, 0x21884000, 0x36200000, + 0x2360B122, 0x3580014C, 0x146BB124, 0x38695F22, + 0x36200000, 0x37370001, 0x15CC0152, 0x3965B123, + 0x3580014C, 0x2980013F, 0x3D800142, 0x33970116, + 0x1168B122, 0x3B69B124, 0x2F34001F, 0x29310001, + 0x19110000, 0x11D401CC, 0x036B5FFC, 0x1C645F20, + 0x0A37FF00, 0x0F330008, 0x300B0000, 0x1EC001C9, + 0x3D6A5F24, 0x3F215F26, 0x0C2E0040, 0x13408000, + 0x3330FFFB, 0x1C2C4000, 0x0B97104D, 0x35695F26, + 0x362C000C, 0x13350003, 0x1ECC01C5, 0x3F215F26, + 0x2222FFFE, 0x16971063, 0x3E695F24, 0x382C0004, + 0x244A0000, 0x042D0042, 0x3F424000, 0x1D2E0001, + 0x16420000, 0x12971097, 0x1B970CBD, 0x19685F26, + 0x3D695F28, 0x3660B408, 0x1161B40A, 0x12685F24, + 0x2421B40E, 0x3B60B40C, 0x21510000, 0x24200021, + 0x3560B404, 0x20200040, 0x2660B414, 0x3320017F, + 0x0721016D, 0x362300AF, 0x11800CE4, 0x1F685F20, + 0x316A5FE8, 0x353400FF, 0x26605F22, 0x1D2E0001, + 0x03625FE8, 0x02030000, 0x3330FFFB, 0x0F2C4010, + 0x244A0000, 0x382C0004, 0x27490000, 0x2C3B0400, + 0x1E2D0001, 0x350A4000, 0x23C40190, 0x1A210000, + 0x15410000, 0x12685F24, 0x2B63B120, 0x3D2C0038, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x002CFFF6, 0x244A0000, 0x052CFFCA, 0x146B5F2E, + 0x36368000, 0x1DCC01A5, 0x333B0000, 0x22C801C1, + 0x332F003C, 0x3A40C000, 0x0C685F30, 0x20605F24, + 0x288001C1, 0x25605F2E, 0x333B0000, 0x12CC01AA, + 0x3E605F30, 0x2F8001AC, 0x332F003C, 0x3A40C000, + 0x33695F20, 0x1768B124, 0x1E220001, 0x35230000, + 0x193500FF, 0x190B4000, 0x1912C000, 0x2E148000, + 0x01CC01BA, 0x3E970112, 0x202301AC, 0x23635F24, + 0x20200040, 0x208001CF, 0x0C970F90, 0x3BC801D4, + 0x20605F24, 0x1F685F20, 0x3D6A5F24, 0x353400FF, + 0x2C800159, 0x35215FDA, 0x03970FA9, 0x282301CE, + 0x3E8001DB, 0x1F685F20, 0x35970110, 0x353400FF, + 0x2A8001CA, 0x33970116, 0x2F380400, 0x2860B120, + 0x12685F24, 0x06970FA3, 0x36200000, 0x336A5EA0, + 0x1B645F21, 0x183A0001, 0x01625EA0, 0x398000AF, + 0x352301BA, 0x3D8001D7, 0x2F230136, 0x23635F24, + 0x392000C0, 0x1B645F21, 0x398000AF, 0x2B695F32, + 0x1C208000, 0x28150000, 0x30C801E0, 0x228B4000, + 0x35605F32, 0x3A2001E3, 0x288000B4, 0x18685FD8, + 0x3E215FD8, 0x30380000, 0x22C80208, 0x0B970FCB, + 0x33605F34, 0x2D010000, 0x3E2C0034, 0x0B480000, + 0x3C6A5FEC, 0x02030000, 0x3C34000F, 0x1D2E0001, + 0x0E625FEC, 0x19220000, 0x14625F3A, 0x3562013E, + 0x0C330004, 0x3F37000F, 0x2B2F01F8, 0x228B4000, + 0x2C8003D3, 0x3E80055D, 0x2A80073F, 0x3A80074F, + 0x3780021B, 0x3780021B, 0x3780021B, 0x3780021B, + 0x3780021B, 0x3780021B, 0x3780021B, 0x3780021B, + 0x3780021B, 0x3780021B, 0x00800C30, 0x3780021B, + 0x33605F34, 0x35605F32, 0x398000AF, 0x112200C1, + 0x3D80021E, 0x192200A3, 0x3D80021E, 0x0F22008F, + 0x3D80021E, 0x0A220085, 0x3D80021E, 0x162200C0, + 0x3D80021E, 0x152200A0, 0x3D80021E, 0x122200A1, + 0x3D80021E, 0x07220081, 0x3D80021E, 0x01220087, + 0x3D80021E, 0x19220000, 0x07685F32, 0x1F625F38, + 0x30230223, 0x16341000, 0x00CC02BB, 0x2997037C, + 0x01685F34, 0x2D6A5F38, 0x23230233, 0x392C0035, + 0x27460000, 0x2D695F34, 0x3780028E, 0x1160013C, + 0x2B635F46, 0x2997037C, 0x2C200230, 0x38605F36, + 0x229703B1, 0x05CC027E, 0x22970251, 0x0A6A010C, + 0x35680110, 0x3D2A01A0, 0x3CC801E3, 0x30380000, + 0x0DCC01E3, 0x28620110, 0x0B970CCD, 0x1A6A0110, + 0x1820B424, 0x19500011, 0x0A500001, 0x1150C400, + 0x0A500001, 0x1B5001A0, 0x0D500000, 0x1C62B434, + 0x11210247, 0x392301E3, 0x18940CE7, 0x3D6B0112, + 0x0F2201A0, 0x3862010C, 0x36200000, 0x1A6A0110, + 0x0C600112, 0x07600110, 0x333B0000, 0x07CC03A3, + 0x398000AF, 0x33635F38, 0x011A4000, 0x0462B140, + 0x1F6B5EA0, 0x2E020000, 0x3E3B0004, 0x2D635EA0, + 0x1A388000, 0x35605F32, 0x2B008000, 0x0E300003, + 0x2B605F4A, 0x2B008000, 0x3F30FFF8, 0x1E384001, + 0x2D605F4C, 0x1132FFFF, 0x2C2E0D70, 0x20230265, + 0x0E8A4000, 0x26605F4E, 0x0A6A010C, 0x202001A0, + 0x1A210000, 0x1C0A0000, 0x14970E54, 0x07970E72, + 0x046B5F32, 0x14685F4E, 0x3F37000F, 0x293B0100, + 0x2E6A5F34, 0x2563B144, 0x16420000, 0x36695F46, + 0x3E2C0002, 0x15410000, 0x266A5F3A, 0x3E2C0002, + 0x16420000, 0x23695F3C, 0x016B5F38, 0x3E2C0002, + 0x15410000, 0x228B4000, 0x3520C000, 0x35605F32, + 0x14970CDE, 0x0F220040, 0x1820B424, 0x19500011, + 0x01500003, 0x1150C400, 0x0A500001, 0x0E500180, + 0x0D500000, 0x1C62B434, 0x352000AF, 0x192100AF, + 0x362300AF, 0x1D800CE7, 0x28635E9C, 0x1B6B5FEE, + 0x0A615E98, 0x192D0036, 0x22484000, 0x312F0001, + 0x29635FEE, 0x00349FFF, 0x10404000, 0x19348000, + 0x27C802A1, 0x222DFFFE, 0x0D4A4000, 0x172D0008, + 0x22484000, 0x02625E9A, 0x21510000, 0x30380000, + 0x32C802B7, 0x20605E9E, 0x14685E98, 0x33215FDC, + 0x1C970FBA, 0x13970EF6, 0x12685E9E, 0x1A6B5E9C, + 0x30380000, 0x13CC02AB, 0x228B4000, 0x306A5E9A, + 0x3E215FD8, 0x2636FF00, 0x3ED002B2, 0x1C970FBA, + 0x1A6B5E9C, 0x3E8001DB, 0x23320008, 0x392C0035, + 0x27460000, 0x3E695E9E, 0x3080028F, 0x2E97010E, + 0x39209000, 0x35605F32, 0x0280108D, 0x1C208000, + 0x35605F32, 0x1680109C, 0x19685F4A, 0x33695F4C, + 0x1632FFFE, 0x1A048000, 0x19220000, 0x29058400, + 0x2B605F4A, 0x01615F4C, 0x228B4000, 0x3B635F36, + 0x0A625E94, 0x379702BE, 0x386A5E94, 0x09685F3A, + 0x3B8002D7, 0x3B635F36, 0x30380000, 0x31D002D1, + 0x21970372, 0x09685F3A, 0x1C390000, 0x31C802D7, + 0x09300002, 0x10404000, 0x3930FFFE, 0x2D010000, + 0x0F2D01A0, 0x3E610106, 0x1632FFFE, 0x26C80370, + 0x28038000, 0x06330001, 0x01D402E0, 0x172E0004, + 0x280C8000, 0x3B605F3A, 0x28038000, 0x3F37000F, + 0x37C802E7, 0x2F36FFF0, 0x092E0010, 0x1F6B5F40, + 0x19625F3E, 0x1A0B8000, 0x36C402EC, 0x01625F40, + 0x386A5F42, 0x36200000, 0x133600C0, 0x2B320006, + 0x28C802F4, 0x232C0040, 0x262EFFFF, 0x2F8002F0, + 0x19600104, 0x09970D10, 0x352000AF, 0x00970D19, + 0x0F970D20, 0x0B970CCD, 0x07690104, 0x2B680104, + 0x1F2D0030, 0x0D4A4000, 0x122D0002, 0x214B4000, + 0x123EFFFF, 0x1A1EC000, 0x11CC0340, 0x3421B424, + 0x30510041, 0x2360B428, 0x142D0004, 0x21510000, + 0x3151C010, 0x26510001, 0x11220038, 0x1C62B434, + 0x062102F9, 0x362300AF, 0x18940CE7, 0x3320003C, + 0x3960B348, 0x1B970CBD, 0x0B970CCD, 0x20680106, + 0x3721B428, 0x2B6A5F3E, 0x156B5FD0, 0x0451E000, + 0x26510001, 0x2E60B42C, 0x122D0002, 0x21510000, + 0x24200311, 0x2E63B420, 0x2060B424, 0x1C62B434, + 0x19685F4A, 0x33695F4C, 0x3660B408, 0x1161B40A, + 0x056B5FCC, 0x2F21B40C, 0x0451E000, 0x26510001, + 0x17201061, 0x3B63B400, 0x3560B404, 0x0962B414, + 0x3A200003, 0x3D605F50, 0x3F200339, 0x06210343, + 0x1B970CE7, 0x362300AF, 0x14940CE4, 0x0F685F50, + 0x0834FFFE, 0x3D605F50, 0x30380000, 0x38C8033E, + 0x398000AF, 0x0F685F50, 0x0434FFFD, 0x3D605F50, + 0x30380000, 0x02CC00AF, 0x096B5F36, 0x08800D27, + 0x1E970CED, 0x2D23020D, 0x08800D27, 0x292302F9, + 0x18800CED, 0x3B635F36, 0x30380000, 0x2FD00349, + 0x21970372, 0x09685F3A, 0x1C390000, 0x2FC8034F, + 0x09300002, 0x10404000, 0x3930FFFE, 0x2D010000, + 0x0F2D01A0, 0x3E610106, 0x1632FFFE, 0x26C80370, + 0x1F6B5F40, 0x19625F3E, 0x1A0B8000, 0x39C40359, + 0x01625F40, 0x28038000, 0x0D330003, 0x00D4035D, + 0x172E0004, 0x280C8000, 0x3B605F3A, 0x1B970CBD, + 0x19685F4A, 0x33695F4C, 0x3660B408, 0x1161B40A, + 0x20680106, 0x2B6A5F3E, 0x2421B40E, 0x21510000, + 0x3B60B40C, 0x24200021, 0x3560B404, 0x0962B414, + 0x0A685F36, 0x1621035F, 0x362300AF, 0x11800CE4, + 0x096B5F36, 0x35800116, 0x2B635E90, 0x026B5F34, + 0x010CC000, 0x084B0000, 0x3E2C0002, 0x0B480000, + 0x28635F4A, 0x196B5E90, 0x2D605F4C, 0x228B4000, + 0x336A5F40, 0x36200000, 0x2E605F40, 0x1F3A0000, + 0x3BCC0CFF, 0x228B4000, 0x0A20FFFF, 0x192D0036, + 0x0D4A4000, 0x2F2DFFFA, 0x0A625F42, 0x3A34003F, + 0x2E148000, 0x19CC020D, 0x228B4000, 0x0D4A4000, + 0x122D0002, 0x0F3607FC, 0x23C8020F, 0x26320002, + 0x19088000, 0x11C0020F, 0x2B008000, 0x05300001, + 0x0DD40396, 0x1D2E0001, 0x3E30FFFF, 0x228B4000, + 0x2D635E96, 0x27200102, 0x2197038B, 0x12600130, + 0x0C625F44, 0x27200102, 0x2197038B, 0x1F6B5E96, + 0x1F600134, 0x07625F46, 0x228B4000, 0x0969010C, + 0x2E68010E, 0x3B3D01A0, 0x03CC03AE, 0x0C2E01A0, + 0x3862010C, 0x30380000, 0x3EC803AD, 0x19088000, + 0x1CC0020B, 0x228B4000, 0x28620110, 0x0F630112, + 0x398000AF, 0x26680100, 0x2D635E96, 0x366AB140, + 0x1D210001, 0x35230000, 0x03280001, 0x300B0000, + 0x1A11C000, 0x28038000, 0x2E174000, 0x26C803BF, + 0x29310001, 0x03280001, 0x23C403B9, 0x1F6B5E96, + 0x228B4000, 0x2D635E96, 0x19220000, 0x0A625E94, + 0x1A6BB140, 0x0A690100, 0x31200001, 0x2D02C000, + 0x2B160000, 0x386A5E94, 0x0CCC03CD, 0x1D2E0001, + 0x0A625E94, 0x3E30FFFF, 0x252DFFFF, 0x09CC03C7, + 0x1F6B5E96, 0x386A5E94, 0x228B4000, 0x09625F4E, + 0x292C03D6, 0x21884000, 0x3780021B, 0x208003E6, + 0x26800460, 0x2A800463, 0x30800483, 0x248004A4, + 0x36800509, 0x3C80050C, 0x2B800527, 0x2F80052A, + 0x27800548, 0x3780021B, 0x3780021B, 0x3780021B, + 0x3780021B, 0x3780021B, 0x28230018, 0x1263013C, + 0x28970382, 0x3E970398, 0x0F6A0130, 0x02030000, + 0x1A0B8000, 0x11C003EF, 0x2E020000, 0x206B013C, + 0x11685F44, 0x36695F46, 0x25370020, 0x04CC03F5, + 0x1D2E0001, 0x12625F3C, 0x2D0E0000, 0x040E4000, + 0x1632FFFE, 0x3A9703A3, 0x319702B8, 0x36200000, + 0x15210120, 0x3E6A5F44, 0x26970345, 0x38200008, + 0x18210124, 0x356A5F46, 0x26970345, 0x3D9702BB, + 0x09685F3A, 0x09210010, 0x09300002, 0x0F600128, + 0x35610104, 0x2997037C, 0x16970D35, 0x20680130, + 0x01690134, 0x1C6A0120, 0x3D6B0124, 0x3460B010, + 0x1561B014, 0x3D680128, 0x1C69012C, 0x172E0068, + 0x0862B000, 0x3B2F0068, 0x2963B004, 0x016A0138, + 0x382C0068, 0x2960B008, 0x142D0068, 0x0861B00C, + 0x1562B018, 0x2368013C, 0x362300AF, 0x1A388000, + 0x3760B01C, 0x1A940D3A, 0x14685F4E, 0x2E6A5F34, + 0x30380000, 0x38C8042B, 0x21884000, 0x1C208000, + 0x13408000, 0x36200000, 0x22800437, 0x09685F3A, + 0x2169B024, 0x012E0028, 0x1C390000, 0x3DD00427, + 0x09300002, 0x382C0068, 0x1F090000, 0x1531FFFE, + 0x0E68B028, 0x3F418000, 0x2F34001F, 0x112E0002, + 0x13408000, 0x2B008000, 0x3E2C0002, 0x0D500000, + 0x0D500000, 0x07970D42, 0x206A5F3C, 0x01685F34, + 0x1632FFFE, 0x3BC8021D, 0x286B0104, 0x25695F3A, + 0x12625F3C, 0x01625F40, 0x010CC000, 0x0F2D01A0, + 0x35610104, 0x27490000, 0x3E2C0002, 0x0B480000, + 0x07615F4A, 0x2D605F4C, 0x1B970CBD, 0x19685F4A, + 0x33695F4C, 0x3B60B40C, 0x1C61B40E, 0x2B680104, + 0x1A210000, 0x1161B40A, 0x3660B408, 0x206A5F3C, + 0x28200081, 0x3560B404, 0x0962B414, 0x1B21044E, + 0x362300AF, 0x14940CE4, 0x3E23021D, 0x2F80037C, + 0x2E230028, 0x1263013C, 0x288003E8, 0x28970382, + 0x27200102, 0x2197038B, 0x12600130, 0x0C625F44, + 0x322C0001, 0x3D605F3C, 0x1D32FFFC, 0x172E0004, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x26970345, 0x3E6A5F44, 0x38200008, + 0x18210124, 0x26970345, 0x3E6A5F44, 0x25200010, + 0x1B210128, 0x26970345, 0x3D9702BB, 0x09685F3A, + 0x07210018, 0x09300002, 0x0260012C, 0x35610104, + 0x3023000A, 0x1263013C, 0x2C800409, 0x28970382, + 0x3E970398, 0x11685F44, 0x2D0E0000, 0x1632FFFE, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x26970345, 0x356A5F46, 0x38200008, + 0x18210124, 0x26970345, 0x3D9702BB, 0x09685F3A, + 0x0F6A0130, 0x2E6B0134, 0x09300002, 0x0F600128, + 0x2E0EC000, 0x1632FFFE, 0x12625F3C, 0x15208009, + 0x3797022B, 0x0E970DE8, 0x3E680148, 0x0A970EB9, + 0x1A210000, 0x236A5F5C, 0x25200010, 0x00800ED6, + 0x06208100, 0x1160013C, 0x28970382, 0x3E970398, + 0x236B0130, 0x3D695F44, 0x300B0000, 0x11C0020F, + 0x0834FFFE, 0x23C8020F, 0x040E4000, 0x1632FFFE, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x26970345, 0x356A5F46, 0x38200008, + 0x18210124, 0x26970345, 0x3D9702BB, 0x026A0134, + 0x12690124, 0x262EFFFF, 0x040D8000, 0x1531FFFE, + 0x0F2D01A0, 0x0D4A4000, 0x122D0002, 0x0E494000, + 0x2368013C, 0x011A4000, 0x35C80215, 0x25695F3A, + 0x026A0134, 0x25310002, 0x23610128, 0x29340100, + 0x3DC804D8, 0x236B0130, 0x2B008000, 0x1A0B8000, + 0x312F0001, 0x1D2E0001, 0x05300001, 0x3FD004D5, + 0x1D2E0001, 0x040D8000, 0x2E61012C, 0x2E0EC000, + 0x1632FFFE, 0x12625F3C, 0x2368013C, 0x3797022B, + 0x0E970DE8, 0x0C69015C, 0x3368014C, 0x05350100, + 0x3EC80502, 0x0A970EB9, 0x22520000, 0x172E0004, + 0x07690168, 0x3E680148, 0x1C390000, 0x31D004EB, + 0x1F090000, 0x1531FFFE, 0x3C8004EC, 0x30218000, + 0x04685F52, 0x2A2EFFFC, 0x3F418000, 0x15381000, + 0x36605F52, 0x0497108D, 0x016A0154, 0x2068015C, + 0x1A210000, 0x1632FFFE, 0x29340100, 0x25200010, + 0x32C80501, 0x01970ED7, 0x3E680148, 0x1F69014C, + 0x236A5F5C, 0x1F090000, 0x1531FFFE, 0x350A4000, + 0x2B200018, 0x00800ED6, 0x2E6A5F58, 0x012E0028, + 0x22520000, 0x22520000, 0x22520000, 0x22520000, + 0x328004E4, 0x00208200, 0x1160013C, 0x2F8004A6, + 0x21200088, 0x1160013C, 0x28970382, 0x03361F00, + 0x23320008, 0x33620138, 0x27200102, 0x2197038B, + 0x12600130, 0x2D6B0138, 0x0C625F44, 0x333B0000, + 0x206B013C, 0x15CC051B, 0x2480051E, 0x26370040, + 0x1FCC051E, 0x322C0001, 0x3D605F3C, 0x2D0E0000, + 0x1632FFFE, 0x3A9703A3, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x27230404, 0x20800345, 0x2E200048, + 0x1160013C, 0x3780050E, 0x28970382, 0x27200102, + 0x2197038B, 0x12600130, 0x0C625F44, 0x1A32FFFD, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x26970345, 0x3E6A5F44, 0x38200008, + 0x18210124, 0x26970345, 0x3D9702BB, 0x25200540, + 0x26605F4E, 0x2A230400, 0x1263013C, 0x2C800409, + 0x2C69B020, 0x012E0028, 0x22520000, 0x22520000, + 0x22520000, 0x3F418000, 0x3E23021D, 0x01800D42, + 0x28970382, 0x2A2001FF, 0x2197038B, 0x12600130, + 0x3D605F3C, 0x2E020000, 0x0C625F44, 0x1632FFFE, + 0x3A9703A3, 0x36200000, 0x15210120, 0x3E6A5F44, + 0x26970345, 0x36200000, 0x3B605F3A, 0x0F600128, + 0x09210010, 0x35610104, 0x18230808, 0x1263013C, + 0x2C800409, 0x02030000, 0x0D37FFF8, 0x0CCC021B, + 0x382C0562, 0x21884000, 0x3980056A, 0x208005B0, + 0x2580061F, 0x31800638, 0x2680067F, 0x268006B0, + 0x3780021B, 0x3780021B, 0x0620FFFC, 0x2F970383, + 0x03361F00, 0x23320008, 0x33620138, 0x3F2A0011, + 0x3BC40211, 0x3E970398, 0x05300001, 0x29D00575, + 0x112E0002, 0x25347FFF, 0x23C8020F, 0x2E680138, + 0x07625F46, 0x322C0001, 0x08280003, 0x22C4057D, + 0x36200000, 0x0D240005, 0x07018000, 0x15072000, + 0x333B0000, 0x02CC0213, 0x3D695F44, 0x092E0010, + 0x040E4000, 0x082A0800, 0x356A5F46, 0x30C40213, + 0x1132FFFF, 0x040E4000, 0x1632FFFE, 0x3A9703A3, + 0x319702B8, 0x36200000, 0x15210120, 0x146B5F42, + 0x3E6A5F44, 0x06330001, 0x33D00595, 0x3C230596, + 0x20800345, 0x2B9702CD, 0x146B5F42, 0x38200008, + 0x18210124, 0x356A5F46, 0x0A330002, 0x31D0059E, + 0x3523059F, 0x20800345, 0x2B9702CD, 0x0A6B5F3A, + 0x356A5F46, 0x1B210128, 0x2B635F46, 0x25200010, + 0x26970345, 0x3D9702BB, 0x196B5F46, 0x3D680128, + 0x026A0134, 0x0260012C, 0x1632FFFE, 0x38635F3A, + 0x12625F3C, 0x1320E000, 0x2B230618, 0x3180022B, + 0x0B20FFF8, 0x2F970383, 0x03361F00, 0x23320008, + 0x33620138, 0x3F2A0011, 0x3BC40211, 0x24200082, + 0x2197038B, 0x12600130, 0x0C625F44, 0x24200082, + 0x2197038B, 0x1F600134, 0x05300001, 0x3BD005C1, + 0x112E0002, 0x25347FFF, 0x23C8020F, 0x2E680138, + 0x07625F46, 0x3E2C0002, 0x09280004, 0x30C405C9, + 0x36200000, 0x3C2C0009, 0x07018000, 0x15072000, + 0x333B0000, 0x02CC0213, 0x3D695F44, 0x2D680134, + 0x092E0010, 0x1231FFFF, 0x082A0800, 0x30C40213, + 0x2E020000, 0x1632FFFE, 0x2D0E0000, 0x040E4000, + 0x102E0005, 0x1632FFFE, 0x3A9703A3, 0x319702B8, + 0x36200000, 0x15210120, 0x146B5F42, 0x3E6A5F44, + 0x06330001, 0x23D005E5, 0x1132FFFF, 0x242305E8, + 0x20800345, 0x2B9702CD, 0x3E6A5F44, 0x2E9702C7, + 0x146B5F42, 0x38200008, 0x18210124, 0x356A5F46, + 0x0A330002, 0x3DD005F1, 0x1132FFFF, 0x342305F4, + 0x20800345, 0x2B9702CD, 0x356A5F46, 0x2E9702C7, + 0x12690124, 0x356A5F46, 0x1531FFFE, 0x0F2D01A0, + 0x22484000, 0x1632FFFE, 0x040D8000, 0x214B4000, + 0x34340001, 0x36C80219, 0x37370001, 0x36C80219, + 0x026A0134, 0x25200010, 0x146B5F42, 0x1B210128, + 0x0D330003, 0x3BD00608, 0x3F230609, 0x20800345, + 0x2B9702CD, 0x09685F3A, 0x026A0134, 0x26605F4E, + 0x2D200028, 0x1621012C, 0x1132FFFF, 0x26970345, + 0x3D9702BB, 0x14685F4E, 0x026A0134, 0x3B605F3A, + 0x39209000, 0x1A32FFFD, 0x12625F3C, 0x3797022B, + 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000, + 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x28970382, + 0x3E970398, 0x126B5F44, 0x2E0EC000, 0x1632FFFE, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x3E6A5F44, 0x26970345, 0x38200008, 0x18210124, + 0x356A5F46, 0x26970345, 0x3D9702BB, 0x0A6B5F3A, + 0x026A0134, 0x0A330002, 0x0163012C, 0x1632FFFE, + 0x12625F3C, 0x3620F000, 0x2B230618, 0x3180022B, + 0x0B20FFF8, 0x2F970383, 0x0A625F42, 0x2B200018, + 0x2197038B, 0x12600130, 0x0C625F44, 0x2B200018, + 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F, + 0x112E0002, 0x07625F46, 0x3A20A000, 0x1160013C, + 0x3D695F44, 0x28038000, 0x070E8000, 0x2E0EC000, + 0x040E4000, 0x1632FFFE, 0x3A9703A3, 0x319702B8, + 0x36200000, 0x15210120, 0x146B5F42, 0x3E6A5F44, + 0x06330001, 0x3ED00658, 0x3A230659, 0x20800345, + 0x2B9702CD, 0x146B5F42, 0x356A5F46, 0x38200008, + 0x0A330002, 0x3DD00662, 0x1132FFFF, 0x18210124, + 0x33230666, 0x20800345, 0x18210124, 0x2B9702CD, + 0x356A5F46, 0x2E9702C7, 0x25200010, 0x1B210128, + 0x146B5F42, 0x356A5F46, 0x0D330003, 0x3ED0066E, + 0x3A23066F, 0x20800345, 0x2B9702CD, 0x3D9702BB, + 0x09685F3A, 0x356A5F46, 0x1632FFFE, 0x12625F3C, + 0x09300002, 0x0260012C, 0x2368013C, 0x3797022B, + 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000, + 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x0C20FFF9, + 0x2F970383, 0x0A625F42, 0x122D0002, 0x2B200018, + 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F, + 0x112E0002, 0x07625F46, 0x2920013C, 0x27508000, + 0x0A500001, 0x23290002, 0x22484000, 0x28038000, + 0x1A32FFFD, 0x2E0EC000, 0x3F340003, 0x20605F48, + 0x1632FFFE, 0x3A9703A3, 0x319702B8, 0x356A5F46, + 0x116B5F48, 0x2B008000, 0x1132FFFF, 0x37370001, + 0x31C8069E, 0x2D0E0000, 0x15210120, 0x36200000, + 0x26970345, 0x116B5F48, 0x356A5F46, 0x37370001, + 0x1FCC06D7, 0x2B2306D7, 0x09685F3A, 0x2E01C000, + 0x232C01A0, 0x0A500001, 0x1632FFFE, 0x202A0002, + 0x0F970FF0, 0x122801A0, 0x3B605F3A, 0x0D894000, + 0x0B20FFF8, 0x2F970383, 0x0A625F42, 0x2B200018, + 0x2197038B, 0x12600130, 0x0C625F44, 0x2B200018, + 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F, + 0x112E0002, 0x07625F46, 0x2920013C, 0x02509000, + 0x0A500001, 0x23290002, 0x22484000, 0x3D695F44, + 0x38340002, 0x20605F48, 0x1132FFFF, 0x28038000, + 0x2E0EC000, 0x2E0EC000, 0x040E4000, 0x1632FFFE, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x146B5F42, 0x3E6A5F44, 0x06330001, 0x2FD006D6, + 0x2B2306D7, 0x20800345, 0x2B9702CD, 0x146B5F42, + 0x356A5F46, 0x38200008, 0x0A330002, 0x24D006E2, + 0x07018000, 0x1132FFFF, 0x040E4000, 0x18210124, + 0x222306E8, 0x20800345, 0x18210124, 0x2B9702CD, + 0x356A5F46, 0x2E9702C7, 0x356A5F46, 0x2E9702C7, + 0x146B5F42, 0x356A5F46, 0x1B210128, 0x0D330003, + 0x20D0070F, 0x116B5F48, 0x2B008000, 0x1132FFFF, + 0x37370001, 0x36C806F3, 0x2D0E0000, 0x25200010, + 0x26970345, 0x116B5F48, 0x356A5F46, 0x37370001, + 0x05CC0718, 0x0F69013C, 0x01685F34, 0x356A5F46, + 0x223D9000, 0x1CCC070D, 0x2E2C0028, 0x084B0000, + 0x3E2C0002, 0x27490000, 0x3E2C0002, 0x2D1B4000, + 0x27490000, 0x3E2C0002, 0x2D1B4000, 0x27490000, + 0x2D200028, 0x2D1B4000, 0x2DC8070D, 0x31230718, + 0x20800345, 0x31230718, 0x338006A6, 0x25200010, + 0x2B9702CD, 0x356A5F46, 0x2E9702C7, 0x116B5F48, + 0x356A5F46, 0x37370001, 0x33C806F9, 0x2E9702C7, + 0x3D9702BB, 0x3D6A5F48, 0x09685F3A, 0x17360002, + 0x37C80722, 0x356A5F46, 0x01690134, 0x1132FFFF, + 0x040E4000, 0x1632FFFE, 0x12625F3C, 0x09300002, + 0x0260012C, 0x2368013C, 0x3797022B, 0x2D695F58, + 0x142D0032, 0x22484000, 0x38340002, 0x10CC0738, + 0x016A0154, 0x3A20A000, 0x28038000, 0x06330001, + 0x13D40732, 0x1D2E0001, 0x112E0002, 0x3D33FFFF, + 0x2E0EC000, 0x1632FFFE, 0x11625F5C, 0x0B970DD4, + 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000, + 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x02030000, + 0x052B000B, 0x3EC4021B, 0x372C0744, 0x21884000, + 0x2B800754, 0x0D800811, 0x18800A18, 0x0B800AF1, + 0x3780021B, 0x0D800811, 0x3780021B, 0x0B800AF1, + 0x2D800752, 0x3780021B, 0x2A800753, 0x30380000, + 0x0CCC021B, 0x1C800C2F, 0x3780021B, 0x3780021B, + 0x0620FFFC, 0x2F970383, 0x122D0002, 0x2B200018, + 0x2197038B, 0x12600130, 0x1F600134, 0x0834FFFE, + 0x23C8020F, 0x112E0002, 0x23290002, 0x22484000, + 0x07625F46, 0x34340001, 0x20605F48, 0x2B008000, + 0x3530FFFD, 0x2D0E0000, 0x2D0E0000, 0x1632FFFE, + 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120, + 0x146B5F42, 0x356A5F46, 0x06330001, 0x34D00772, + 0x30230773, 0x20800345, 0x2B9702CD, 0x1E9709E7, + 0x356A5F46, 0x2D200028, 0x1A210000, 0x26970345, + 0x3D9702BB, 0x1A685F46, 0x36695F46, 0x3530FFFD, + 0x2B0C4000, 0x01600120, 0x1531FFFE, 0x20610124, + 0x026A0134, 0x3930FFFE, 0x232C01A0, 0x1132FFFF, + 0x1A210000, 0x084B0000, 0x3E2C0002, 0x2819C000, + 0x262EFFFF, 0x0BCC0785, 0x2435FFFE, 0x3EC80217, + 0x16970D35, 0x01690134, 0x1C6A0120, 0x3D6B0124, + 0x03208400, 0x172E0068, 0x3B2F0068, 0x1861B010, + 0x0862B000, 0x2963B004, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2C69B020, 0x25310002, 0x2DD0079E, + 0x07970D42, 0x34800217, 0x07970D42, 0x1A685F46, + 0x19220000, 0x0C600124, 0x2D010000, 0x1531FFFE, + 0x2E0D0000, 0x23610128, 0x070D4000, 0x2E0D0000, + 0x2E61012C, 0x12625F3C, 0x31200001, 0x1A60013E, + 0x39209000, 0x3797022B, 0x3A20A000, 0x0B970DD4, + 0x28680164, 0x126A0144, 0x28038000, 0x1632FFFE, + 0x2E0EC000, 0x30380000, 0x08D00EB7, 0x1F69014C, + 0x070E8000, 0x2E610140, 0x23620148, 0x35098000, + 0x2D61014C, 0x1531FFFE, 0x23610144, 0x00208200, + 0x00970DD6, 0x2B680168, 0x1C6A014C, 0x30380000, + 0x08D00EB7, 0x12690148, 0x23620148, 0x35098000, + 0x2E610140, 0x35098000, 0x1632FFFE, 0x040D8000, + 0x2D61014C, 0x3620F000, 0x00970DD6, 0x3E680148, + 0x1C690140, 0x19220000, 0x20620144, 0x0160014C, + 0x2E0D0000, 0x2E610140, 0x3230FFFC, 0x0C600148, + 0x1B208001, 0x00970DD6, 0x116A0148, 0x3368014C, + 0x2D6B0154, 0x2D620140, 0x2D010000, 0x3530FFFD, + 0x0F600144, 0x05300001, 0x1C0A0000, 0x040D8000, + 0x20610148, 0x020FC000, 0x12630150, 0x0F208010, + 0x00970DD6, 0x28680164, 0x1C690140, 0x30380000, + 0x08D00EB7, 0x116A0148, 0x3368014C, 0x206B0150, + 0x20610148, 0x2D620140, 0x312F0001, 0x12630150, + 0x1C0A0000, 0x20620144, 0x1B208001, 0x00970DD6, + 0x0C6A0150, 0x2D6B0154, 0x3368014C, 0x12690148, + 0x2E0EC000, 0x3E620150, 0x126A0144, 0x2E610140, + 0x1C0A0000, 0x23620148, 0x010F0000, 0x3A33FFFE, + 0x3D635F5C, 0x3930FFFE, 0x0F600144, 0x00208200, + 0x00970DD6, 0x0E970DE8, 0x07690168, 0x236A5F5C, + 0x1C390000, 0x08D00EB7, 0x1B970ECE, 0x2B200018, + 0x00800ED6, 0x0120FFFD, 0x2F970383, 0x122D0002, + 0x2B200018, 0x2197038B, 0x12600130, 0x1F600134, + 0x0834FFFE, 0x23C8020F, 0x112E0002, 0x23290002, + 0x22484000, 0x07625F46, 0x38340002, 0x20605F48, + 0x2B008000, 0x07018000, 0x3930FFFE, 0x1A32FFFD, + 0x2D0E0000, 0x040E4000, 0x1632FFFE, 0x3A9703A3, + 0x319702B8, 0x1E9709E7, 0x356A5F46, 0x2D200028, + 0x1A210000, 0x1132FFFF, 0x26970345, 0x36200000, + 0x356A5F46, 0x1A210000, 0x1132FFFF, 0x26970345, + 0x3D9702BB, 0x356A5F46, 0x359706A6, 0x36695F46, + 0x1A685F46, 0x1931FFFD, 0x2D610120, 0x29310001, + 0x1F090000, 0x20610124, 0x16970D35, 0x01690134, + 0x1C6A0120, 0x1861B010, 0x172E0068, 0x0862B000, + 0x0662B008, 0x31208808, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2169B024, 0x1C390000, 0x10D008F3, + 0x12690124, 0x03208400, 0x142D0068, 0x0661B004, + 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2C69B020, + 0x25310002, 0x21D408F3, 0x36695F46, 0x1C6A0120, + 0x31208808, 0x040E4000, 0x2E620120, 0x172E0068, + 0x0862B000, 0x0662B008, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2169B024, 0x1C390000, 0x10D008F3, + 0x03208400, 0x3760B01C, 0x362300AF, 0x1A940D3A, + 0x2C69B020, 0x25310002, 0x21D408F3, 0x07970D42, + 0x1A685F46, 0x1F690120, 0x0F600128, 0x3930FFFE, + 0x2E0D0000, 0x2E61012C, 0x329703C1, 0x11615F3C, + 0x3620F000, 0x202A0002, 0x13C408F5, 0x3E695F48, + 0x14350002, 0x21CC08F5, 0x3797022B, 0x0A9709C0, + 0x089709CB, 0x016A0154, 0x3368014C, 0x336B0140, + 0x3E620150, 0x12690148, 0x0F630148, 0x300B0000, + 0x0C630144, 0x3E30FFFF, 0x1F090000, 0x2E610140, + 0x1B208001, 0x00970DD6, 0x1C9709DA, 0x3368014C, + 0x1F6A0140, 0x12690148, 0x2D6B0154, 0x1C0A0000, + 0x2E62014C, 0x3E30FFFF, 0x2E0D0000, 0x2E610140, + 0x05300001, 0x2E0D0000, 0x20610148, 0x36200000, + 0x0F600144, 0x12630150, 0x39209000, 0x0B970DD4, + 0x3E680148, 0x1C690140, 0x1C6A014C, 0x1A084000, + 0x0160014C, 0x20610148, 0x2D620140, 0x2D010000, + 0x3E30FFFF, 0x2E0D0000, 0x3D610150, 0x3F208800, + 0x00970DD6, 0x3368014C, 0x1F6A0140, 0x12690148, + 0x2D6B0154, 0x1C0A0000, 0x2E62014C, 0x3E30FFFF, + 0x1F090000, 0x2E610140, 0x3930FFFE, 0x1C0A0000, + 0x23620148, 0x12630150, 0x39209000, 0x0B970DD4, + 0x3368014C, 0x12690148, 0x1F6A0140, 0x0C600148, + 0x1A084000, 0x28038000, 0x2D0E0000, 0x2E62014C, + 0x09300002, 0x010F0000, 0x01630140, 0x1C208000, + 0x0B970DD4, 0x3A20A000, 0x0B970DD4, 0x2E680154, + 0x1C6A014C, 0x2D010000, 0x29310001, 0x2FD408CD, + 0x322C0001, 0x3E2C0002, 0x0160014C, 0x2D620140, + 0x2D010000, 0x3E30FFFF, 0x2B0C4000, 0x0F600144, + 0x2D010000, 0x3E30FFFF, 0x2E0D0000, 0x20610148, + 0x00208200, 0x00970DD6, 0x3E680148, 0x306B014C, + 0x016A0154, 0x02600140, 0x2D010000, 0x3930FFFE, + 0x38605F5A, 0x1C09C000, 0x23610144, 0x1632FFFE, + 0x11625F5C, 0x03208400, 0x00970DD6, 0x0E970DE8, + 0x1B970ECE, 0x026B5F58, 0x0A6A0160, 0x3D2F0034, + 0x0B4BC000, 0x16420000, 0x3D370004, 0x25CC0DA8, + 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x07970D42, + 0x3F800215, 0x1160013C, 0x2997037C, 0x0C2309A3, + 0x2B635F46, 0x1E2008FB, 0x38605F36, 0x229703B1, + 0x05CC027E, 0x22970251, 0x0B230901, 0x2B635F46, + 0x3B80022E, 0x3E680148, 0x1C6A014C, 0x1C690140, + 0x0160014C, 0x20620144, 0x2D0E0000, 0x3E30FFFF, + 0x1F090000, 0x2E610140, 0x23620148, 0x1B208001, + 0x00970DD6, 0x1C9709DA, 0x12690148, 0x3368014C, + 0x1F6A0140, 0x2D6B0154, 0x2E610140, 0x1C0A0000, + 0x1C0A0000, 0x2E62014C, 0x3930FFFE, 0x0C600148, + 0x36200000, 0x0F600144, 0x12630150, 0x39209000, + 0x0B970DD4, 0x3368014C, 0x12690148, 0x1F6A0140, + 0x0C600148, 0x1A084000, 0x09300002, 0x2D0E0000, + 0x2D620140, 0x05300001, 0x0160014C, 0x25200010, + 0x28695F52, 0x19220000, 0x2B190000, 0x1A615F52, + 0x26695F6C, 0x1F238000, 0x38635F56, 0x22484000, + 0x026B5F34, 0x122D0002, 0x3F424000, 0x351F0000, + 0x0EC80DB1, 0x16235F7A, 0x2449C000, 0x3D2F0002, + 0x1A1D0000, 0x29CC0941, 0x2449C000, 0x1C390000, + 0x3FCC0DB1, 0x25695F56, 0x1C390000, 0x25D40944, + 0x14625F56, 0x302F0006, 0x1D2E0001, 0x03800936, + 0x04685F52, 0x076B5F52, 0x3C34000F, 0x393700F0, + 0x2DCC094C, 0x1C1C8000, 0x26CC094E, 0x06800950, + 0x1C1C8000, 0x3DCC0950, 0x1D32FFFC, 0x01800951, + 0x1E31FFFC, 0x01198000, 0x17615F56, 0x076B5F52, + 0x23310004, 0x1035000F, 0x3F37000F, 0x1C1F4000, + 0x0CC80966, 0x28004000, 0x07645F52, 0x1331FFF8, + 0x32394001, 0x12615F6A, 0x2D010000, 0x22310003, + 0x19615F68, 0x3E30FFFF, 0x032C0D70, 0x05230965, + 0x21884000, 0x38605F6C, 0x116A0148, 0x1F69014C, + 0x30680140, 0x040D8000, 0x1531FFFE, 0x17615F60, + 0x3D6B0148, 0x1C0A0000, 0x2B0F8000, 0x0263014C, + 0x3930FFFE, 0x30605F62, 0x1632FFFE, 0x12625F66, + 0x10970CD3, 0x34200051, 0x2360B444, 0x09685F56, + 0x0A6B5F60, 0x3C34000F, 0x0E300003, 0x2D010000, + 0x0934FF00, 0x010CC000, 0x2060B448, 0x193500FF, + 0x0761B44A, 0x07685F68, 0x016B5F62, 0x206A5F66, + 0x2D010000, 0x0934FF00, 0x010CC000, 0x2D60B44C, + 0x193500FF, 0x0A61B44E, 0x1F62B454, 0x1920098F, + 0x3E210974, 0x362300AF, 0x19800CEA, 0x1D210001, + 0x3561015E, 0x1C208000, 0x1260015C, 0x02970E78, + 0x076B5F52, 0x0A685F6C, 0x3F37000F, 0x293B0100, + 0x2563B144, 0x3C2108C5, 0x3E2C0002, 0x15410000, + 0x09685F56, 0x0B230DB1, 0x3C34000F, 0x07645F52, + 0x0E300003, 0x35605F68, 0x08800DE8, 0x0A9709C0, + 0x089709CB, 0x3368014C, 0x1F6A0140, 0x12690148, + 0x2D6B0154, 0x1C0A0000, 0x2E62014C, 0x1F6A0140, + 0x12630150, 0x2E610140, 0x3930FFFE, 0x1C0A0000, + 0x23620148, 0x36200000, 0x0F600144, 0x39209000, + 0x0B970DD4, 0x1C690140, 0x3E680148, 0x116A0148, + 0x2E610140, 0x1A084000, 0x0160014C, 0x3E30FFFF, + 0x2D0E0000, 0x23620148, 0x36200000, 0x18800928, + 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C, + 0x20620144, 0x1F090000, 0x2D0E0000, 0x2E610140, + 0x23620148, 0x1B208001, 0x06800DD6, 0x3368014C, + 0x12690148, 0x1F6A0140, 0x2E610140, 0x2D0E0000, + 0x23620148, 0x2E020000, 0x1632FFFE, 0x1C0A0000, + 0x2E680154, 0x20620144, 0x020C0000, 0x11600150, + 0x00208200, 0x06800DD6, 0x1F6A0140, 0x12690148, + 0x3368014C, 0x23620148, 0x2E610140, 0x3930FFFE, + 0x1C0A0000, 0x2E680154, 0x20620144, 0x020C0000, + 0x11600150, 0x00208200, 0x06800DD6, 0x25635F4E, + 0x146B5F42, 0x356A5F46, 0x38200008, 0x1A210000, + 0x0A330002, 0x0BD009F4, 0x28038000, 0x1632FFFE, + 0x3D33FFFF, 0x2E0EC000, 0x0A2309FF, 0x20800345, + 0x2B9702CD, 0x356A5F46, 0x2E9702C7, 0x356A5F46, + 0x2E9702C7, 0x356A5F46, 0x2E9702C7, 0x356A5F46, + 0x2E9702C7, 0x356A5F46, 0x2E9702C7, 0x3E695F48, + 0x356A5F46, 0x18350001, 0x17C80A12, 0x2D200028, + 0x21970372, 0x19685F4A, 0x33695F4C, 0x1632FFFE, + 0x1A048000, 0x0FC40A0C, 0x1E2D0001, 0x01615F4C, + 0x2B605F4A, 0x0A20FFFF, 0x1A210000, 0x356A5F46, + 0x15230A13, 0x20800345, 0x359706A6, 0x356A5F46, + 0x25200010, 0x1A210000, 0x176B5F4E, 0x20800345, + 0x0620FFFC, 0x2F970383, 0x03361F00, 0x38C80211, + 0x23320008, 0x33620138, 0x3F2A0011, 0x3BC40211, + 0x3E970398, 0x236B0130, 0x2D010000, 0x2435FFFE, + 0x23C8020F, 0x3008C000, 0x26C00A28, 0x12CC020F, + 0x126B5F44, 0x112E0002, 0x07625F46, 0x3D2F0002, + 0x20635F44, 0x3D33FFFF, 0x1632FFFE, 0x2E0EC000, + 0x1632FFFE, 0x3A9703A3, 0x2E680138, 0x3D695F44, + 0x02030000, 0x0B2B0003, 0x04C40A38, 0x3A200003, + 0x392C0003, 0x15072000, 0x333B0000, 0x02CC0213, + 0x36695F46, 0x092E0010, 0x2B034000, 0x1931FFFD, + 0x1C09C000, 0x040E4000, 0x082A0800, 0x30C40213, + 0x319702B8, 0x36200000, 0x15210120, 0x146B5F42, + 0x356A5F46, 0x06330001, 0x1BD00A4D, 0x14230A4E, + 0x20800345, 0x2B9702CD, 0x08970C0E, 0x356A5F46, + 0x2D200028, 0x1A210000, 0x26970345, 0x3D9702BB, + 0x3D695F44, 0x1A685F46, 0x1231FFFF, 0x2E0D0000, + 0x20610124, 0x3E30FFFF, 0x2E0D0000, 0x2D610120, + 0x16970D35, 0x01690134, 0x1C6A0120, 0x1861B010, + 0x172E0068, 0x0862B000, 0x0662B008, 0x31208808, + 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2169B024, + 0x1C390000, 0x14D00A74, 0x12690124, 0x03208400, + 0x142D0068, 0x0661B004, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2C69B020, 0x25310002, 0x1FD00A76, + 0x07970D42, 0x34800217, 0x07970D42, 0x1A685F46, + 0x3D695F44, 0x1C6A0120, 0x0C600124, 0x2E0D0000, + 0x23610128, 0x0C690130, 0x2E6B0134, 0x3930FFFE, + 0x2D0E0000, 0x2D62012C, 0x11630130, 0x33610134, + 0x19220000, 0x12625F3C, 0x1320E000, 0x3797022B, + 0x28680164, 0x0F690150, 0x30380000, 0x08D00EB7, + 0x2D6B0154, 0x126A0144, 0x3368014C, 0x30610154, + 0x312F0001, 0x12630150, 0x1C690140, 0x2E62014C, + 0x02600140, 0x28004000, 0x040D8000, 0x20610148, + 0x1132FFFF, 0x19088000, 0x0F600144, 0x00208200, + 0x00970DD6, 0x2B680168, 0x2D6B0154, 0x30380000, + 0x08D00EB7, 0x1C6A014C, 0x12690148, 0x12630150, + 0x23620148, 0x35098000, 0x2E610140, 0x040D8000, + 0x1132FFFF, 0x040D8000, 0x2D61014C, 0x3620F000, + 0x00970DD6, 0x3E680148, 0x1F69014C, 0x1F6A0140, + 0x35230000, 0x0C630144, 0x0160014C, 0x2E0D0000, + 0x20610148, 0x2D0E0000, 0x2D620140, 0x1B208001, + 0x00970DD6, 0x116A0148, 0x3368014C, 0x1C690140, + 0x2D6B0154, 0x2D620140, 0x2D0E0000, 0x3E30FFFF, + 0x2D0E0000, 0x23620148, 0x1F090000, 0x23610144, + 0x3D33FFFF, 0x12630150, 0x0F208010, 0x00970DD6, + 0x04690164, 0x3368014C, 0x1C390000, 0x08D00EB7, + 0x1C690140, 0x116A0148, 0x206B0150, 0x20610148, + 0x2D620140, 0x312F0001, 0x12630150, 0x1F090000, + 0x23610144, 0x1B208001, 0x00970DD6, 0x0C6A0150, + 0x2D6B0154, 0x3368014C, 0x12690148, 0x2E0EC000, + 0x3E620150, 0x010F0000, 0x3A33FFFE, 0x3D635F5C, + 0x3E6B0144, 0x2E610140, 0x300B0000, 0x0F630148, + 0x3930FFFE, 0x300B0000, 0x0C630144, 0x00208200, + 0x00970DD6, 0x0E970DE8, 0x07690168, 0x236A5F5C, + 0x1C390000, 0x08D00EB7, 0x1B970ECE, 0x2B200018, + 0x00800ED6, 0x0120FFFD, 0x2F970383, 0x03361F00, + 0x38C80211, 0x23320008, 0x33620138, 0x3F2A0011, + 0x3BC40211, 0x3E970398, 0x236B0130, 0x2D010000, + 0x2435FFFE, 0x23C8020F, 0x3008C000, 0x20C00B01, + 0x12CC020F, 0x126B5F44, 0x112E0002, 0x07625F46, + 0x3D2F0002, 0x20635F44, 0x0200C000, 0x3D33FFFF, + 0x010F0000, 0x1632FFFE, 0x2E0EC000, 0x1632FFFE, + 0x3A9703A3, 0x2E680138, 0x3D695F44, 0x02030000, + 0x0B2B0003, 0x09C40B13, 0x3A200003, 0x3F2C0005, + 0x15072000, 0x333B0000, 0x02CC0213, 0x36695F46, + 0x092E0010, 0x1531FFFE, 0x040E4000, 0x082A0800, + 0x30C40213, 0x319702B8, 0x36200000, 0x1A210000, + 0x3E6A5F44, 0x26970345, 0x08970C0E, 0x356A5F46, + 0x2D200028, 0x1A210000, 0x1132FFFF, 0x26970345, + 0x3D9702BB, 0x11685F44, 0x36695F46, 0x2E020000, + 0x2B034000, 0x3E30FFFF, 0x1231FFFF, 0x280C8000, + 0x0C600124, 0x2B0C4000, 0x0F600128, 0x010CC000, + 0x01600120, 0x16970D35, 0x01690134, 0x126A0128, + 0x3E610130, 0x1861B010, 0x172E0068, 0x0862B000, + 0x0662B008, 0x31208808, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2169B024, 0x1C390000, 0x32D40B46, + 0x07970D42, 0x3F800215, 0x12690124, 0x03208400, + 0x142D0068, 0x0661B004, 0x3760B01C, 0x362300AF, + 0x1A940D3A, 0x2C69B020, 0x25310002, 0x39D40B44, + 0x1C6A0120, 0x31208808, 0x172E0068, 0x0862B000, + 0x0662B008, 0x3760B01C, 0x362300AF, 0x1A940D3A, + 0x2169B024, 0x1C390000, 0x08D00B44, 0x03208400, + 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2C69B020, + 0x25310002, 0x39D40B44, 0x07970D42, 0x1A685F46, + 0x1F690120, 0x0F600128, 0x2E0D0000, 0x2E61012C, + 0x19220000, 0x12625F3C, 0x3620F000, 0x3797022B, + 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C, + 0x20620144, 0x1F090000, 0x2E610140, 0x2D0E0000, + 0x23620148, 0x1B208001, 0x00970DD6, 0x3368014C, + 0x12690148, 0x1F6A0140, 0x2E610140, 0x07018000, + 0x2E0D0000, 0x20610148, 0x3E30FFFF, 0x1C0A0000, + 0x2E680154, 0x20620144, 0x020C0000, 0x11600150, + 0x00208200, 0x00970DD6, 0x016A0154, 0x3368014C, + 0x336B0140, 0x3E620150, 0x12690148, 0x0F630148, + 0x300B0000, 0x0C630144, 0x3E30FFFF, 0x1F090000, + 0x2E610140, 0x1B208001, 0x00970DD6, 0x3368014C, + 0x1F6A0140, 0x12690148, 0x23620148, 0x1C0A0000, + 0x2E680154, 0x20620144, 0x2E610140, 0x020C0000, + 0x11600150, 0x00208200, 0x00970DD6, 0x3368014C, + 0x2D6B0154, 0x12690148, 0x1F6A0140, 0x12630150, + 0x2E610140, 0x2D695F58, 0x1C0A0000, 0x2E62014C, + 0x1F2D0030, 0x0D4A4000, 0x1F2D0006, 0x0E494000, + 0x0F3607FC, 0x26320002, 0x33620154, 0x28038000, + 0x06330001, 0x31D40BB3, 0x1D2E0001, 0x112E0002, + 0x20620144, 0x1132FFFF, 0x23620148, 0x00351F00, + 0x20310008, 0x33610158, 0x1320E000, 0x00970DD6, + 0x3D680144, 0x1C6A014C, 0x1C690140, 0x206B0150, + 0x2D0E0000, 0x2E62014C, 0x0200C000, 0x06330001, + 0x2BD40BC6, 0x322C0001, 0x3E2C0002, 0x3E30FFFF, + 0x2E0D0000, 0x2E610140, 0x1A210000, 0x20610148, + 0x1320E000, 0x00970DD6, 0x206B0150, 0x2E680154, + 0x1C6A014C, 0x0263014C, 0x11600150, 0x1C600154, + 0x02030000, 0x06330001, 0x30D40BD8, 0x322C0001, + 0x3E2C0002, 0x20620144, 0x1C0A0000, 0x2D620140, + 0x3E30FFFF, 0x2D0E0000, 0x23620148, 0x1B208001, + 0x00970DD6, 0x12690148, 0x126A0144, 0x206B0150, + 0x2E610140, 0x23620148, 0x0200C000, 0x3D33FFFF, + 0x12630150, 0x1C600154, 0x02030000, 0x06330001, + 0x30D40BEE, 0x322C0001, 0x3E2C0002, 0x0F600144, + 0x00208200, 0x00970DD6, 0x11690144, 0x116A0148, + 0x3368014C, 0x2D6B0154, 0x2D620140, 0x12630150, + 0x1C600154, 0x02030000, 0x06330001, 0x2FD40BFD, + 0x322C0001, 0x3E2C0002, 0x0160014C, 0x350A4000, + 0x23620148, 0x3930FFFE, 0x1C0A0000, 0x20620144, + 0x00208200, 0x00970DD6, 0x12690148, 0x016A0154, + 0x306B014C, 0x2E610140, 0x3E620150, 0x3D33FFFF, + 0x1C09C000, 0x088008E2, 0x25635F4E, 0x146B5F42, + 0x38200008, 0x1A210000, 0x3E6A5F44, 0x0A330002, + 0x1CD00C1A, 0x196B5F46, 0x1132FFFF, 0x2E0EC000, + 0x19230C2A, 0x20800345, 0x2B9702CD, 0x3E6A5F44, + 0x2E9702C7, 0x3E6A5F44, 0x19685F4A, 0x33695F4C, + 0x1632FFFE, 0x1A048000, 0x10C40C25, 0x1E2D0001, + 0x01615F4C, 0x2B605F4A, 0x356A5F46, 0x0A20FFFF, + 0x1A210000, 0x2B9702CD, 0x356A5F46, 0x25200010, + 0x1A210000, 0x176B5F4E, 0x20800345, 0x3780021B, + 0x02030000, 0x0C37FFFF, 0x0CCC021B, 0x052C0C35, + 0x21884000, 0x06800C36, 0x28970382, 0x3E20000E, + 0x2197038B, 0x093C000E, 0x12CC020F, 0x2A2001FF, + 0x2197038B, 0x3D605F3C, 0x3F340003, 0x12CC020F, + 0x122E000E, 0x1632FFFE, 0x3A9703A3, 0x319702B8, + 0x1122000E, 0x36200000, 0x1A210000, 0x26970345, + 0x01685F34, 0x122101D8, 0x3E610106, 0x3B2C0008, + 0x27490000, 0x3E2C0002, 0x0B480000, 0x07615F4A, + 0x2D605F4C, 0x0F685F3C, 0x30695F40, 0x3930FFFE, + 0x36605F3E, 0x1F090000, 0x04C40C58, 0x2E605F40, + 0x202001A0, 0x08230C5D, 0x19600104, 0x3B635F36, + 0x258002F5, 0x25200010, 0x19600104, 0x2B80043E, + 0x20970106, 0x15220003, 0x1F62B438, 0x2C695FCA, + 0x04685EDE, 0x19220000, 0x1461B400, 0x1162B406, + 0x30380000, 0x36C800A5, 0x2A340080, 0x00C80C6F, + 0x13200C80, 0x19230C70, 0x288000B4, 0x36605EDE, + 0x09685EEC, 0x332300A5, 0x19220000, 0x14625EEC, + 0x28695EDE, 0x366A5EF0, 0x30380000, 0x22C8010E, + 0x01198000, 0x2E6A5F02, 0x01198000, 0x336A5EA0, + 0x24D000B4, 0x3C36FDFF, 0x01625EA0, 0x288000B4, + 0x22215EDE, 0x1F220006, 0x1D97100D, 0x2F215EEC, + 0x21510000, 0x21510000, 0x21884000, 0x1F220030, + 0x1F62B438, 0x21695FCE, 0x19685EF0, 0x19220000, + 0x0161B420, 0x0462B426, 0x30380000, 0x3AC800A6, + 0x2A340080, 0x0CC80C95, 0x02200C9B, 0x05230C96, + 0x288000B4, 0x2B605EF0, 0x11685EFE, 0x3F2300A6, + 0x19220000, 0x0C625EFE, 0x1B800C74, 0x3F215EF0, + 0x1F220006, 0x1D97100D, 0x37215EFE, 0x21510000, + 0x21510000, 0x21884000, 0x1F220300, 0x1F62B438, + 0x21695FCE, 0x01685F02, 0x19220000, 0x0261B440, + 0x0762B446, 0x30380000, 0x3DC800A7, 0x2A340080, + 0x13C80CB0, 0x13200CB6, 0x11230CB1, 0x288000B4, + 0x33605F02, 0x19685F10, 0x382300A7, 0x19220000, + 0x04625F10, 0x1B800C74, 0x27215F02, 0x1F220006, + 0x1D97100D, 0x3F215F10, 0x21510000, 0x21510000, + 0x21884000, 0x04685EDE, 0x22215EDE, 0x30380000, + 0x0CD00CC9, 0x03205EEC, 0x0B518000, 0x0D500000, + 0x30695EA0, 0x0D500000, 0x00390200, 0x02615EA0, + 0x228B4000, 0x0200C000, 0x1F220006, 0x362300AF, + 0x19801030, 0x19685EF0, 0x3F215EF0, 0x30380000, + 0x0CD00CC9, 0x1B205EFE, 0x02800CC2, 0x01685F02, + 0x27215F02, 0x30380000, 0x0CD00CC9, 0x13205F10, + 0x02800CC2, 0x04685EDE, 0x22215EDE, 0x30380000, + 0x33D40CC1, 0x398000AF, 0x19685EF0, 0x3F215EF0, + 0x30380000, 0x35D000AF, 0x1B205EFE, 0x02800CC2, + 0x3B605EEC, 0x1C615EEE, 0x228B4000, 0x23605EFE, + 0x14615F00, 0x228B4000, 0x2B605F10, 0x0C615F12, + 0x228B4000, 0x19685EF0, 0x1A210000, 0x30380000, + 0x0DC80CFE, 0x1F61B434, 0x226A5FCE, 0x0761B426, + 0x0262B420, 0x2A340080, 0x01C80CFD, 0x28635E9C, + 0x3F215EF0, 0x1F220006, 0x1D97100D, 0x1A6B5E9C, + 0x288000B4, 0x07615EF0, 0x228B4000, 0x2E620116, + 0x1B200D02, 0x288000B4, 0x15970CD9, 0x1C6A0116, + 0x0D20B404, 0x19500011, 0x01500003, 0x1150C400, + 0x0A500001, 0x0E500180, 0x0D500000, 0x0962B414, + 0x352000AF, 0x192100AF, 0x362300AF, 0x11800CE4, + 0x01690102, 0x36200000, 0x0A350020, 0x28C8020D, + 0x30218000, 0x1F615ED4, 0x3B605EDA, 0x3D605EDC, + 0x228B4000, 0x2D695ED4, 0x30380000, 0x22C8010E, + 0x1C390000, 0x18D4010A, 0x3B605EDA, 0x228B4000, + 0x2D695ED4, 0x30380000, 0x22C8010E, 0x1C390000, + 0x18D4010A, 0x3D605EDC, 0x228B4000, 0x01685ED4, + 0x27215ED4, 0x30380000, 0x1ED4010C, 0x21510000, + 0x228B4000, 0x30695ECC, 0x07685ED2, 0x1C390000, + 0x06D400A4, 0x30380000, 0x31C800A4, 0x342300A4, + 0x288000B4, 0x3A215ECC, 0x0B518000, 0x36200000, + 0x35605ED2, 0x228B4000, 0x30695ECC, 0x35605ED2, + 0x1C390000, 0x30695EA0, 0x18D4010A, 0x12390008, + 0x02615EA0, 0x228B4000, 0x336A5EA0, 0x1C685ECC, + 0x3A215ECC, 0x2E36FFF7, 0x01625EA0, 0x30380000, + 0x1ED4010C, 0x21510000, 0x228B4000, 0x04685F52, + 0x30218000, 0x2D144000, 0x04CC00A9, 0x1A615F52, + 0x302300A9, 0x19200D53, 0x288000B4, 0x29200400, + 0x2660B144, 0x06210200, 0x1468B144, 0x3C34000F, + 0x2B190000, 0x0A61B144, 0x07645F52, 0x2D010000, + 0x20310008, 0x1139A0C8, 0x214B4000, 0x0F2D002C, + 0x0E494000, 0x2E020000, 0x06330001, 0x20377F00, + 0x1263010A, 0x21320003, 0x1A625F68, 0x2E020000, + 0x1032FFF8, 0x313A4001, 0x11625F6A, 0x2E020000, + 0x1132FFFF, 0x2C2E0D70, 0x07230D84, 0x0E8A4000, + 0x15205F7A, 0x228B4000, 0x12205F82, 0x228B4000, + 0x1C205F8A, 0x228B4000, 0x01205F92, 0x228B4000, + 0x0F205F9A, 0x228B4000, 0x07205FA2, 0x228B4000, + 0x09205FAA, 0x228B4000, 0x14205FB2, 0x228B4000, + 0x1A205FBA, 0x228B4000, 0x04205FC2, 0x228B4000, + 0x38605F6C, 0x27490000, 0x3E2C0002, 0x084B0000, + 0x3E2C0002, 0x244A0000, 0x3E2C0002, 0x0B480000, + 0x1F615F58, 0x38635F56, 0x17625F5A, 0x3E605F5C, + 0x10970E96, 0x236A5F5C, 0x266B010C, 0x1F3A0000, + 0x1AC80DA0, 0x19213000, 0x35098000, 0x190B4000, + 0x3061010E, 0x2CC00D9B, 0x34CC0EB5, 0x0A685F5A, + 0x1F230DA0, 0x33635F54, 0x046B5F68, 0x12800E9B, + 0x0F69010A, 0x0A6B5F56, 0x20310008, 0x0DC80DD1, + 0x2E6A5F58, 0x05390080, 0x162E0035, 0x0E458000, + 0x0E970DE8, 0x04685F52, 0x1B230DAD, 0x16341000, + 0x2DCC109C, 0x3A2000A0, 0x00645F53, 0x2D695F58, + 0x3197028E, 0x0269010E, 0x1A223000, 0x350A4000, + 0x1DC80DCD, 0x28680108, 0x25620114, 0x30380000, + 0x0CC80DBA, 0x06970CFF, 0x10970CD3, 0x0269010E, + 0x1B20B444, 0x19500011, 0x0A500001, 0x1150C400, + 0x0A500001, 0x2335FFFF, 0x15410000, 0x176A0114, + 0x3E2C0002, 0x0D500000, 0x1F62B454, 0x1D200DCB, + 0x31210DCB, 0x362300AF, 0x19800CEA, 0x35203000, + 0x1C60010E, 0x1A210000, 0x36610108, 0x1A615F52, + 0x398000AF, 0x19220000, 0x3662015E, 0x228B4000, + 0x1D210001, 0x3561015E, 0x1260015C, 0x38635F56, + 0x02970E78, 0x076B5F52, 0x0A685F6C, 0x3F37000F, + 0x293B0100, 0x2563B144, 0x25695F56, 0x3E2C0002, + 0x15410000, 0x26695F5A, 0x3E2C0002, 0x15410000, + 0x20695F5C, 0x3E2C0002, 0x15410000, 0x04800DB1, + 0x04685F52, 0x3569B140, 0x3930FFFE, 0x38D003AD, + 0x33635F54, 0x09300002, 0x02030000, 0x3C34000F, + 0x3D3CFFFF, 0x33228000, 0x1A120000, 0x301D8000, + 0x0761B140, 0x336A5EA0, 0x27CC0DF9, 0x2D36FFFB, + 0x01625EA0, 0x3D3CFFFF, 0x3A225F7A, 0x3530FFFD, + 0x1F060000, 0x22520000, 0x22520000, 0x153B2000, + 0x07685F32, 0x35635F52, 0x1A344000, 0x19C80E09, + 0x0A685F36, 0x2E9700B4, 0x02685F54, 0x362300AF, + 0x288000B4, 0x04685F52, 0x3569B140, 0x1F238000, + 0x3C34000F, 0x2E020000, 0x123EFFFF, 0x1C138000, + 0x2819C000, 0x0761B140, 0x3F30FFF8, 0x2838A084, + 0x18500020, 0x3B680118, 0x2E695F54, 0x0418C000, + 0x09600118, 0x351CC000, 0x28CC0E53, 0x2361011E, + 0x07685F68, 0x0763011C, 0x0260011A, 0x10970CD3, + 0x336B011A, 0x1B20B444, 0x1C500041, 0x0A500001, + 0x0E500180, 0x0D500000, 0x2D02C000, 0x2636FF00, + 0x0262B44C, 0x363700FF, 0x2563B44E, 0x3F222000, + 0x1F62B454, 0x3E6B011E, 0x36200000, 0x0F60011E, + 0x333B0000, 0x2BCC0E33, 0x362300AF, 0x16200E36, + 0x3A210E36, 0x19800CEA, 0x3668011C, 0x3569B140, + 0x146A0118, 0x1A1D0000, 0x0761B140, 0x191E0000, + 0x26620118, 0x09C80E4F, 0x36200000, 0x1D210001, + 0x28038000, 0x2E174000, 0x31CC0E46, 0x322C0001, + 0x1231FFFF, 0x0C800E40, 0x2861011C, 0x0E300003, + 0x2B695F32, 0x0260011A, 0x36354000, 0x0CC80E1F, + 0x0A200E1F, 0x096B5F36, 0x288000B4, 0x07685F32, + 0x26695F36, 0x1A344000, 0x33C800AF, 0x0D894000, + 0x1F3A0000, 0x3EC803AD, 0x3B635F36, 0x1A6B5F4A, + 0x19600104, 0x3E610106, 0x19625F3E, 0x23635F48, + 0x0B970CCD, 0x2B680104, 0x0F6A0106, 0x116B5F48, + 0x2360B428, 0x3C21B42A, 0x21510000, 0x0200C000, + 0x0934FF00, 0x281A0000, 0x0162B42C, 0x363700FF, + 0x2663B42E, 0x2B6A5F3E, 0x27200041, 0x2060B424, + 0x1C62B434, 0x3C210E5C, 0x362300AF, 0x18940CE7, + 0x096B5F36, 0x228B4000, 0x3B635F36, 0x39200120, + 0x1A210000, 0x0C220020, 0x1C6B5F4C, 0x11800E58, + 0x33635F54, 0x0F6B5F6A, 0x3A200140, 0x1A210000, + 0x0C220020, 0x3B605F60, 0x1C615F62, 0x12625F66, + 0x36635F5E, 0x10970CD3, 0x09685F60, 0x2D6A5F62, + 0x046B5F5E, 0x2060B448, 0x3F21B44A, 0x21510000, + 0x0200C000, 0x0934FF00, 0x281A0000, 0x0262B44C, + 0x363700FF, 0x2563B44E, 0x206A5F66, 0x27200041, + 0x2360B444, 0x1F62B454, 0x05200EB3, 0x24210E81, + 0x362300AF, 0x19800CEA, 0x33635F54, 0x36200000, + 0x16210140, 0x0F22002C, 0x0F6B5F6A, 0x3B605F60, + 0x1C615F62, 0x12625F66, 0x36635F5E, 0x10970CD3, + 0x286A5F5E, 0x09685F60, 0x2E695F62, 0x28038000, + 0x0A37FF00, 0x0418C000, 0x2060B448, 0x1A3600FF, + 0x0462B44A, 0x0161B44C, 0x36200000, 0x2660B44E, + 0x206A5F66, 0x22200011, 0x2360B444, 0x1F62B454, + 0x3F210E9F, 0x362300AF, 0x1C940CEA, 0x016B5F54, + 0x228B4000, 0x0B210041, 0x1D800DA4, 0x08210021, + 0x1D800DA4, 0x2E6A5F58, 0x04690164, 0x012E0028, + 0x1C390000, 0x1CD00ECA, 0x1F090000, 0x1531FFFE, + 0x2B680168, 0x3F418000, 0x2F34001F, 0x112E0002, + 0x13408000, 0x2B008000, 0x3E2C0002, 0x0D500000, + 0x0D500000, 0x228B4000, 0x1C208000, 0x13408000, + 0x36200000, 0x19800EC3, 0x01685F58, 0x1A210000, + 0x2E2C0028, 0x0D500000, 0x0D500000, 0x0D500000, + 0x15410000, 0x228B4000, 0x11230DA8, 0x0F3607FC, + 0x3EC803AD, 0x33635F54, 0x026B5F58, 0x12625F66, + 0x010CC000, 0x084B0000, 0x3E2C0002, 0x0B480000, + 0x33635F62, 0x2D6B010E, 0x36605F64, 0x2D0DC000, + 0x36610108, 0x1B970CBD, 0x02685F62, 0x28695F64, + 0x3B60B40C, 0x1C61B40E, 0x28680108, 0x206A5F66, + 0x2921B40A, 0x3660B408, 0x21510000, 0x28200081, + 0x3560B404, 0x0962B414, 0x02685F54, 0x2A210EE5, + 0x362300AF, 0x11800CE4, 0x2D695F6E, 0x1C208000, + 0x28150000, 0x1BC80EFB, 0x228B4000, 0x336A5EA0, + 0x33605F6E, 0x0B200F01, 0x2B36FFFD, 0x01625EA0, + 0x288000B4, 0x15685FDC, 0x2D695F6E, 0x30380000, + 0x04C80F64, 0x28605F70, 0x232C0040, 0x27490000, + 0x2E655F6E, 0x3865B112, 0x1F31FFFB, 0x232D4010, + 0x0D4A4000, 0x1F6BB110, 0x122D0002, 0x1F0AC000, + 0x33C00F58, 0x214B4000, 0x2C2DFFF6, 0x333B0000, + 0x2AD40F1D, 0x1A685F70, 0x012D0012, 0x0D4A4000, + 0x282C0042, 0x084B0000, 0x312DFFEE, 0x1F1F8000, + 0x3BCC0F5A, 0x28004000, 0x37215F72, 0x0B97104D, + 0x3D695F72, 0x332C0006, 0x13350003, 0x31CC0F5F, + 0x37215F72, 0x2922FFFC, 0x16971063, 0x1A685F70, + 0x33215FDC, 0x0B970FCB, 0x12971097, 0x1B970CBD, + 0x196B5F70, 0x11685F72, 0x3B695F74, 0x2A22B40A, + 0x3563B408, 0x22520000, 0x3B60B40C, 0x1C61B40E, + 0x28200081, 0x3560B404, 0x20200040, 0x2660B414, + 0x30210F2A, 0x362300AF, 0x14940CE4, 0x01685F6E, + 0x39695FEA, 0x353400FF, 0x3330FFFB, 0x0A2C401A, + 0x084B0000, 0x1E2D0001, 0x312F0001, 0x3A430000, + 0x002CFFF6, 0x244A0000, 0x332C0006, 0x084B0000, + 0x0B615FEA, 0x312F0001, 0x1F0AC000, 0x1BC40F4D, + 0x35230000, 0x3A430000, 0x2E6A5F6E, 0x1A685F70, + 0x1A3600FF, 0x3A3A1000, 0x1462B130, 0x06970FA3, + 0x1C208000, 0x33605F6E, 0x08230F01, 0x26800130, + 0x0D210088, 0x29655F6F, 0x1A685F70, 0x2D695F6E, + 0x3D2C0038, 0x0B480000, 0x0C800F03, 0x35970110, + 0x1A685F70, 0x33215FDC, 0x06230F53, 0x0D800FCB, + 0x336A5EA0, 0x3C350800, 0x1F615F6E, 0x33C800AF, + 0x143A0002, 0x01625EA0, 0x398000AF, 0x1768B148, + 0x05300001, 0x11D00F74, 0x03300007, 0x15D00F79, + 0x0C300008, 0x3D3CFFFF, 0x1464B148, 0x388000A8, + 0x35230000, 0x2663B148, 0x39635FF2, 0x32635FF0, + 0x0B800F6E, 0x0E710048, 0x13710149, 0x2871804B, + 0x12800F7B, 0x00685FFC, 0x276AB1F8, 0x0934FF00, + 0x0C300008, 0x322C0001, 0x03361F00, 0x23320008, + 0x1C0A0000, 0x06C00114, 0x3F225E90, 0x3330FFFB, + 0x1C2C4000, 0x1C0A0000, 0x10C0010E, 0x2F605FD2, + 0x06625FD4, 0x242A000F, 0x16C00108, 0x228B4000, + 0x10685FD6, 0x37695FD4, 0x30380000, 0x01C80F97, + 0x27490000, 0x0E615FD6, 0x228B4000, 0x33290044, + 0x3DC00F9F, 0x1D685FD2, 0x05615FD4, 0x2D010000, + 0x022D0044, 0x03615FD2, 0x228B4000, 0x361C0000, + 0x2F605FD2, 0x29605FD4, 0x228B4000, 0x3C695FD6, + 0x30380000, 0x22C8010E, 0x15410000, 0x22605FD6, + 0x228B4000, 0x1C390000, 0x24C80108, 0x0D4A4000, + 0x30380000, 0x22C8010E, 0x10404000, 0x1F3A0000, + 0x14C80FB7, 0x362C003A, 0x16420000, 0x122E0038, + 0x062CFFC6, 0x13408000, 0x228B4000, 0x222DFFFE, + 0x10404000, 0x228B4000, 0x1C390000, 0x24C80108, + 0x0D4A4000, 0x30380000, 0x22C8010E, 0x10404000, + 0x1F3A0000, 0x0BC80FC8, 0x3D2C0038, 0x16420000, + 0x192E003A, 0x0E2CFFC8, 0x13408000, 0x228B4000, + 0x122D0002, 0x10404000, 0x228B4000, 0x1C390000, + 0x24C80108, 0x30380000, 0x22C8010E, 0x2D635E96, + 0x362C003A, 0x084B0000, 0x0E2CFFFE, 0x244A0000, + 0x333B0000, 0x1EC80FDE, 0x1F3A0000, 0x12C80FEB, + 0x3E2F0038, 0x1542C000, 0x192E003A, 0x0D2FFFC8, + 0x10438000, 0x1C800FE6, 0x3F424000, 0x1F3A0000, + 0x1DC80FE4, 0x192E003A, 0x10438000, 0x1C800FE6, + 0x122D0002, 0x3F424000, 0x0D500000, 0x0D500000, + 0x1F6B5E96, 0x0D2CFFC4, 0x228B4000, 0x122D0002, + 0x3F424000, 0x3E2F0038, 0x1542C000, 0x1C800FE6, + 0x2A320001, 0x0A367FFF, 0x19C81003, 0x252A0008, + 0x3EC00FFF, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000, + 0x0D500000, 0x19C81003, 0x05800FF3, 0x26260008, + 0x0D500000, 0x262EFFFF, 0x24CC1000, 0x228B4000, + 0x26635E94, 0x1D97100D, 0x146B5E94, 0x288000B4, + 0x26635E94, 0x1D97100D, 0x02030000, 0x17685E94, + 0x288000B4, 0x22484000, 0x0F615E92, 0x28605E90, + 0x0C300008, 0x3FD4102E, 0x2D635E96, 0x2C34007F, + 0x3E30FFFF, 0x122D0002, 0x2E0D0000, 0x214B4000, + 0x05300001, 0x322C0001, 0x36695E90, 0x191E0000, + 0x3FCC101E, 0x36200000, 0x07024000, 0x36368000, + 0x0035007F, 0x1A1D0000, 0x3D695E92, 0x03C8102C, + 0x23320008, 0x281A0000, 0x1E2D0001, 0x0E464000, + 0x0200C000, 0x1F6B5E96, 0x30380000, 0x228B4000, + 0x3F424000, 0x04801028, 0x361C0000, 0x228B4000, + 0x28605E90, 0x22484000, 0x0A625E94, 0x0C300008, + 0x36D4104B, 0x2E020000, 0x0C300008, 0x2C34007F, + 0x0336007F, 0x191E0000, 0x24C80108, 0x3E30FFFF, + 0x356A5E90, 0x0F615E92, 0x122D0002, 0x2E0D0000, + 0x3F424000, 0x386A5E94, 0x3D695E92, 0x05300001, + 0x322C0001, 0x191E0000, 0x3CCC1048, 0x36200000, + 0x29380080, 0x21444000, 0x228B4000, 0x36200000, + 0x1A80103C, 0x2D635E96, 0x084B0000, 0x3E2C0002, + 0x13434000, 0x244A0000, 0x122D0002, 0x3F424000, + 0x2E1B8000, 0x3E2C0002, 0x244A0000, 0x122D0002, + 0x3F424000, 0x2E1B8000, 0x3E2C0002, 0x244A0000, + 0x122D0002, 0x3F424000, 0x2B1AC000, 0x1F6B5E96, + 0x3E2C0002, 0x122D0002, 0x228B4000, 0x28605E90, + 0x0F615E92, 0x2D635E96, 0x27490000, 0x280C8000, + 0x0B480000, 0x1C390000, 0x09C8108A, 0x03340FFC, + 0x0EC81072, 0x15280041, 0x3CC01072, 0x16240041, + 0x15072000, 0x0E801077, 0x1831FFFA, 0x07024000, + 0x2936FFC0, 0x2B034000, 0x3937003F, 0x3D695E92, + 0x22484000, 0x1A048000, 0x10404000, 0x122D0002, + 0x22484000, 0x2C04C400, 0x10404000, 0x0AC4108A, + 0x122D0002, 0x22484000, 0x19220000, 0x05048400, + 0x10404000, 0x0AC4108A, 0x122D0002, 0x22484000, + 0x05048400, 0x10404000, 0x1F6B5E96, 0x1A685E90, + 0x228B4000, 0x14685F14, 0x32215F14, 0x30380000, + 0x15D01093, 0x0B518000, 0x228B4000, 0x0200C000, + 0x12220002, 0x362300AF, 0x19801030, 0x14685F14, + 0x3A215F1A, 0x30380000, 0x15D01093, 0x228B4000, + 0x14685F14, 0x32215F14, 0x30380000, 0x1ED4010C, + 0x2A340080, 0x14C810A4, 0x12220002, 0x11801008, + 0x21510000, 0x1C685F1A, 0x28635E9C, 0x30380000, + 0x2DCC10AA, 0x228B4000, 0x3A215F1A, 0x12220002, + 0x14971004, 0x1A6B5E9C, 0x198010A5, 0x3DFFFFFF, + 0x01000000, 0x01000000, 0x01000000 +}; + +// Encapsulates the PKA firmware images information. +typedef struct { + const uint32_t *farm_img; + uint32_t farm_img_size; + const uint32_t *boot_img; + uint32_t boot_img_size; + const uint32_t *master_img; + uint32_t master_img_size; +} pka_firmware_info_t; + +static const pka_firmware_info_t pka_firmware_array[] = +{ + { + fw0_farm_img_data_buf, 2048, // actual length is 1652 + fw0_boot_img_data_buf, 152, + fw0_master_img_data_buf, 4161 + }, + { + fw1_farm_img_data_buf, 2048, // actual length is 2000 + fw1_boot_img_data_buf, 127, + fw1_master_img_data_buf, 4186 + }, + { + fw2_farm_img_data_buf, 2048, // actual length is 2045 + fw2_boot_img_data_buf, 154, + fw2_master_img_data_buf, 4275 + } +}; + +#define PKA_FIRMWARE_IMAGE_0_ID 0 +#define PKA_FIRMWARE_IMAGE_1_ID 1 +#define PKA_FIRMWARE_IMAGE_2_ID 2 + +// Global storage for the actual firmware identifier +static uint8_t pka_firmware_id; + +// Setter of pka_firmware_id +static inline void pka_firmware_set_id(uint8_t id) +{ + pka_firmware_id = id; +} + +// Getter of pka_firmware_id +static inline uint8_t pka_firmware_get_id(void) +{ + return pka_firmware_id; +} + + +#endif diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h new file mode 100644 index 000000000..8081a01fd --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h @@ -0,0 +1,127 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_IOCTL_H__ +#define __PKA_IOCTL_H__ + + +#include +#include + +#define PKA_IOC_TYPE 0xB7 + +/// PKA_RING_GET_REGION_INFO - _IORW(PKA_IOC_TYPE, 0x0, pka_dev_region_info_t) +/// +/// Retrieve information about a device region. This is intended to describe +/// MMIO, I/O port, as well as bus specific regions (ex. PCI config space). +/// Zero sized regions may be used to describe unimplemented regions. +/// Return: 0 on success, -errno on failure. +typedef struct +{ + uint32_t reg_index; ///< Registers region index. + uint64_t reg_size; ///< Registers region size (bytes). + uint64_t reg_offset; ///< Registers region offset from start of device fd. + + uint32_t mem_index; ///< Memory region index. + uint64_t mem_size; ///< Memory region size (bytes). + uint64_t mem_offset; ///< Memeory region offset from start of device fd. +} pka_dev_region_info_t; +#define PKA_RING_GET_REGION_INFO _IOWR(PKA_IOC_TYPE, 0x0, pka_dev_region_info_t) + +/// PKA_GET_RING_INFO - _IORW(PKA_IOC_TYPE, 0x1, pka_dev_ring_info_t) +/// +/// Retrieve information about a ring. This is intended to describe ring +/// information words located in PKA_BUFFER_RAM. Ring information includes +/// base addresses, size and statistics. +/// Return: 0 on success, -errno on failure. +typedef struct // Bluefield specific ring information +{ + /// Base address of the command descriptor ring. + uint64_t cmmd_base; + + /// Base address of the result descriptor ring. + uint64_t rslt_base; + + /// Size of a command ring in number of descriptors, minus 1. + /// Minimum value is 0 (for 1 descriptor); maximum value is + /// 65535 (for 64K descriptors). + uint16_t size; + + /// This field specifies the size (in 32-bit words) of the + /// space that PKI command and result descriptor occupies on + /// the Host. + uint16_t host_desc_size : 10; + + /// Indicates whether the result ring delivers results strictly + /// in-order ('1') or that result descriptors are written to the + /// result ring as soon as they become available, so out-of-order + /// ('0'). + uint8_t in_order : 1; + + /// Read pointer of the command descriptor ring. + uint16_t cmmd_rd_ptr; + + /// Write pointer of the result descriptor ring. + uint16_t rslt_wr_ptr; + + /// Read statistics of the command descriptor ring. + uint16_t cmmd_rd_stats; + + /// Write statistics of the result descriptor ring. + uint16_t rslt_wr_stats; + +} pka_dev_hw_ring_info_t; +#define PKA_GET_RING_INFO _IOWR(PKA_IOC_TYPE, 0x1, pka_dev_hw_ring_info_t) + +/// PKA_CLEAR_RING_COUNTERS - _IO(PKA_IOC_TYPE, 0x2) +/// +/// Clear counters. This is intended to reset all command and result counters. +/// Return: 0 on success, -errno on failure. +#define PKA_CLEAR_RING_COUNTERS _IO(PKA_IOC_TYPE, 0x2) + +/// PKA_GET_RANDOM_BYTES - _IOWR(PKA_IOC_TYPE, 0x3, pka_dev_trng_info_t) +/// +/// Get random bytes from True Random Number Generator(TRNG). +/// Return: 0 on success, -errno on failure. +typedef struct // True Random Number Generator information +{ + /// Number of random bytes in the buffer; Length of the buffer. + uint32_t count; + + /// Data buffer to hold the random bytes. + uint8_t *data; + +} pka_dev_trng_info_t; +#define PKA_GET_RANDOM_BYTES _IOWR(PKA_IOC_TYPE, 0x3, pka_dev_trng_info_t) + +#endif // __PKA_IOCTL_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h new file mode 100644 index 000000000..c70823c2a --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h @@ -0,0 +1,49 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_MMIO_H__ +#define __PKA_MMIO_H__ + + +/// Macros for standard MMIO functions. + +#include +#include +#include + +#define pka_mmio_read64(addr) readq_relaxed(addr) +#define pka_mmio_write64(addr, val) writeq_relaxed((val), (addr)) +#define pka_mmio_read(addr) pka_mmio_read64(addr) +#define pka_mmio_write(addr, val) pka_mmio_write64((addr), (val)) + +#endif // __PKA_MMIO_H__ diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h new file mode 100644 index 000000000..be56b61ee --- /dev/null +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h @@ -0,0 +1,276 @@ +// +// BSD LICENSE +// +// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Mellanox Technologies nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#ifndef __PKA_RING_H__ +#define __PKA_RING_H__ + +/// +/// @file +/// +/// This file forms an interface to the BlueField Public Key Accelerator based +/// on EIP-154. +/// +/// Rings are used as a communication mechanism between ARM cores (controller) +/// and the farm engines controlled by EIP-154 master firmware. +/// +/// Note that the API defines data stuctures and functions to manage rings +/// within window RAM, and to enqueue/dequeue descriptors. Rings are considered +/// as a memory of descriptors (command/result descriptors) using finite size +/// circular queue and a couple of control status registers (count registers). +/// + + +#include + +#ifdef PKA_LIB_RING_DEBUG +// A structure that stores the ring statistics. +typedef struct +{ + uint64_t enq_success_cmd; ///< Cmd descriptors successfully enqueued. + uint64_t enq_fail_cmd; ///< Cmd descriptors that failed to be enqueued. + uint64_t deq_success_rslt; ///< Rslt descriptors successfully dequeued. + uint64_t deq_fail_rslt; ///< Rslt descriptors that failed to be dequeued. +} pka_ring_debug_stats __pka_cache_aligned; +#endif + +#ifdef PKA_LIB_RING_DEBUG +#define __RING_STAT_ADD(r, name, n) ({ ##r##->stats.##name += 1; }) +#else +#define __RING_STAT_ADD(r, name, n) do {} while(0) +#endif + +/// Bluefield PKA command descriptor. +typedef struct // 64 bytes long. 64 bytes aligned +{ + uint64_t pointer_a; + uint64_t pointer_b; + uint64_t pointer_c; + uint64_t pointer_d; + uint64_t tag; + uint64_t pointer_e; + +#ifdef __AARCH64EB__ + uint64_t linked : 1; + uint64_t driver_status : 2; + uint64_t odd_powers : 5; ///< shiftCnt for shift ops + uint64_t kdk : 2; ///< Key Decryption Key number + uint64_t encrypted_mask : 6; + uint64_t rsvd_3 : 8; + uint64_t command : 8; + uint64_t rsvd_2 : 5; + uint64_t length_b : 9; + uint64_t output_attr : 1; + uint64_t input_attr : 1; + uint64_t rsvd_1 : 5; + uint64_t length_a : 9; + uint64_t rsvd_0 : 2; +#else + uint64_t rsvd_0 : 2; + uint64_t length_a : 9; + uint64_t rsvd_1 : 5; + uint64_t input_attr : 1; + uint64_t output_attr : 1; + uint64_t length_b : 9; + uint64_t rsvd_2 : 5; + uint64_t command : 8; + uint64_t rsvd_3 : 8; + uint64_t encrypted_mask : 6; + uint64_t kdk : 2; ///< Key Decryption Key number + uint64_t odd_powers : 5; ///< shiftCnt for shift ops + uint64_t driver_status : 2; + uint64_t linked : 1; +#endif + + uint64_t rsvd_4; +} pka_ring_hw_cmd_desc_t; + +#define CMD_DESC_SIZE sizeof(pka_ring_hw_cmd_desc_t) // Must be 64 + +/// Bluefield PKA result descriptor. +typedef struct // 64 bytes long. 64 bytes aligned +{ + uint64_t pointer_a; + uint64_t pointer_b; + uint64_t pointer_c; + uint64_t pointer_d; + uint64_t tag; + +#ifdef __AARCH64EB__ + uint64_t rsvd_5 : 13; + uint64_t cmp_result : 3; + uint64_t modulo_is_0 : 1; + uint64_t rsvd_4 : 2; + uint64_t modulo_msw_offset : 11; + uint64_t rsvd_3 : 2; + uint64_t rsvd_2 : 11; + uint64_t main_result_msb_offset : 5; + uint64_t result_is_0 : 1; + uint64_t rsvd_1 : 2; + uint64_t main_result_msw_offset : 11; + uint64_t rsvd_0 : 2; + + uint64_t linked : 1; + uint64_t driver_status : 2; ///< Always written to 0 + uint64_t odd_powers : 5; ///< shiftCnt for shift ops + uint64_t kdk : 2; ///< Key Decryption Key number + uint64_t encrypted_mask : 6; + uint64_t result_code : 8; + uint64_t command : 8; + uint64_t rsvd_8 : 5; + uint64_t length_b : 9; + uint64_t output_attr : 1; + uint64_t input_attr : 1; + uint64_t rsvd_7 : 5; + uint64_t length_a : 9; + uint64_t rsvd_6 : 2; +#else + uint64_t rsvd_0 : 2; + uint64_t main_result_msw_offset : 11; + uint64_t rsvd_1 : 2; + uint64_t result_is_0 : 1; + uint64_t main_result_msb_offset : 5; + uint64_t rsvd_2 : 11; + uint64_t rsvd_3 : 2; + uint64_t modulo_msw_offset : 11; + uint64_t rsvd_4 : 2; + uint64_t modulo_is_0 : 1; + uint64_t cmp_result : 3; + uint64_t rsvd_5 : 13; + + uint64_t rsvd_6 : 2; + uint64_t length_a : 9; + uint64_t rsvd_7 : 5; + uint64_t input_attr : 1; + uint64_t output_attr : 1; + uint64_t length_b : 9; + uint64_t rsvd_8 : 5; + uint64_t command : 8; + uint64_t result_code : 8; + uint64_t encrypted_mask : 6; + uint64_t kdk : 2; ///< Key Decryption Key number + uint64_t odd_powers : 5; ///< shiftCnt for shift ops + uint64_t driver_status : 2; ///< Always written to 0 + uint64_t linked : 1; +#endif + + uint64_t rsvd_9; +} pka_ring_hw_rslt_desc_t; + +#define RESULT_DESC_SIZE sizeof(pka_ring_hw_rslt_desc_t) // Must be 64 + +/// Describes a PKA command/result ring as used by the hardware. A pair of +/// command and result rings in PKA window memory, and the data memory used +/// by the commands. +typedef struct +{ + uint32_t num_descs; ///< total number of descriptors in the ring. + + uint32_t cmd_ring_base; ///< base address of the command ring. + uint32_t cmd_idx; ///< index of the command in a ring. + + uint32_t rslt_ring_base; ///< base address of the result ring. + uint32_t rslt_idx; ///< index of the result in a ring. + + uint32_t operands_base; ///< operands memory base address. + uint32_t operands_end; ///< end address of operands memory. + + uint32_t desc_size; ///< size of each element in the ring. + + uint64_t cmd_desc_mask; ///< bitmask of free(0)/in_use(1) cmd descriptors. + uint32_t cmd_desc_cnt; ///< number of command descriptors currently in use. + uint32_t rslt_desc_cnt; ///< number of result descriptors currently ready. +} pka_ring_desc_t; + +/// This structure declares ring parameters which can be used by user interface. +typedef struct +{ + int fd; ///< file descriptor. + int group; ///< iommu group. + int container; ///< vfio cointainer + + uint32_t idx; ///< ring index. + uint32_t ring_id; ///< hardware ring identifier. + + uint64_t mem_off; ///< offset specific to window RAM region. + uint64_t mem_addr; ///< window RAM region address. + uint64_t mem_size; ///< window RAM region size. + + uint64_t reg_off; ///< offset specific to count registers region. + uint64_t reg_addr; ///< count registers region address. + uint64_t reg_size; ///< count registers region size. + + void *mem_ptr; ///< pointer to map-ped memory region. + void *reg_ptr; ///< pointer to map-ped counters region. + + pka_ring_desc_t ring_desc; ///< ring descriptor. + +#ifdef PKA_LIB_RING_DEBUG + struct pka_ring_debug_stats stats; +#endif + + uint8_t big_endian; ///< big endian byte order when enabled. +} pka_ring_info_t; + +typedef struct +{ + uint32_t dst_offset; ///< operands desctination offset. + uint32_t max_dst_offset; ///< operands end offset. + + pka_ring_info_t *ring; +} pka_ring_alloc_t; + +// This sturcture encapsulates 'user data' information, it also includes +// additional information useful for command processing and statistics. +typedef struct +{ + uint64_t valid; ///< if set to 'PKA_UDATA_INFO_VALID' then info is valid + uint64_t user_data; ///< opaque user address. + uint64_t cmd_num; ///< command request number. + uint8_t cmd_desc_idx; ///< index of the cmd descriptor in HW rings + uint8_t ring_num; ///< command request number. + uint8_t queue_num; ///< queue number. +} pka_udata_info_t; + +#define PKA_UDATA_INFO_VALID 0xDEADBEEF + +// This structure consists of a data base to store user data information. +// Note that a data base should be associated with a hardware ring. +typedef struct +{ + pka_udata_info_t entries[32]; // user data information entries. + uint8_t index : 5; // entry index. Wrapping is permitted. +} pka_udata_db_t; + +#endif /// __PKA_RING_H__ + + -- 2.20.1