Add P6 OTA Requestor App (#14563)
* Add P6 ota-requestor app.
* More work on p6 ota app.
* Add new linker script for p6 ota requestor.
Add necessary defines for ota.
* Add anycloud-ota and serial-flash submodules.
* Adding more code to p6 OTA.
* Add factory reset button handling
Fix factory reset bug.
* Move various ota objects to AppTask.
* Fix init bug.
* More p6 ota changes.
* Fix build issues with other p6 apps.
* Add mcuboot config headers.
* Add bootloader hex.
* Format with clang-format and gn format.
* Small improvement to P6 OTA image processor.
* App network commissioning fixes.
* Add ota build scripts.
Add build flag for ota update image.
* Fixup documentation
* Ran gn format
* CI fixes
* Restyling!
* Add DAPLINK to word list.
* More restyling.
* Remove duplicate submodule entry.
* Addressing review issues.
* Add button handling to trigger query-image commands from device.
* Fix for restyle.
* A few more review items.
* More restyle
* Move persistent storage to last 1/4 of flash to leave room for OTA images at start.
* Fix compile issue and add some comments.
* Move NotifyUpdateApplied to after update and reboot.
* Add arg for chip_stack_lock_tracking.
* Delete call to removed function.
* Restyled by clang-format
* Restyled by gn
* Save software version persistently and fix update logic.
* Restyling.
* Fix compile error on other platforms.
* Compile fix for linux fake tests.
* Fix P6 compile after rebase.
* Quick update to README.
* Restyle.
Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt
index a43f325..82beacd 100644
--- a/.github/.wordlist.txt
+++ b/.github/.wordlist.txt
@@ -294,6 +294,7 @@
CYW
DAC
DAP
+DAPLINK
DataFrame
DataModelRevision
dataset
diff --git a/.gitmodules b/.gitmodules
index 3669fb0..45cbaf4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -181,6 +181,9 @@
[submodule "cyw30739_sdk/tools"]
path = third_party/cyw30739_sdk/repos/btsdk-tools
url = https://github.com/Infineon/btsdk-tools.git
+[submodule "third_party/p6/p6_sdk/libs/anycloud-ota"]
+ path = third_party/p6/p6_sdk/libs/anycloud-ota
+ url = https://github.com/Infineon/anycloud-ota
[submodule "third_party/mbed-mcu-boot/repo"]
path = third_party/mbed-mcu-boot/repo
url = https://github.com/ATmobica/mcuboot.git
diff --git a/examples/ota-requestor-app/p6/.gn b/examples/ota-requestor-app/p6/.gn
new file mode 100644
index 0000000..81cec9d
--- /dev/null
+++ b/examples/ota-requestor-app/p6/.gn
@@ -0,0 +1,28 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/build.gni")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+ target_cpu = "arm"
+ target_os = "freertos"
+
+ import("//args.gni")
+}
diff --git a/examples/ota-requestor-app/p6/BUILD.gn b/examples/ota-requestor-app/p6/BUILD.gn
new file mode 100644
index 0000000..f628f77
--- /dev/null
+++ b/examples/ota-requestor-app/p6/BUILD.gn
@@ -0,0 +1,174 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+import("//build_overrides/p6.gni")
+
+import("${build_root}/config/defaults.gni")
+import("${p6_sdk_build_root}/p6_executable.gni")
+import("${p6_sdk_build_root}/p6_sdk.gni")
+
+assert(current_os == "freertos")
+
+p6_project_dir = "${chip_root}/examples/ota-requestor-app/p6"
+examples_plat_dir = "${chip_root}/examples/platform/p6"
+
+declare_args() {
+ # Dump memory usage at link time.
+ chip_print_memory_usage = false
+
+ # PIN code for PASE session establishment.
+ setup_pin_code = 20202021
+
+ # Monitor & log memory usage at runtime.
+ enable_heap_monitoring = false
+
+ # Build update app
+ build_update_image = false
+}
+
+config("p6_ota_config") {
+ ldflags = [ "-T/" + rebase_path("src/cy8c6xxa_cm4_dual_ota_int.ld",
+ "/",
+ "${p6_project_dir}") ]
+
+ ldflags += [ "-Wl,--defsym,MCUBOOT_HEADER_SIZE=0x400,--defsym,MCUBOOT_BOOTLOADER_SIZE=0x18000,--defsym,CY_BOOT_PRIMARY_1_SIZE=0x1C0000" ]
+
+ defines = [
+ "P6_OTA",
+ "OTA_SUPPORT ",
+ "OTA_USE_EXTERNAL_FLASH",
+ "CY_BOOT_USE_EXTERNAL_FLASH",
+ "MCUBOOT_HEADER_SIZE=0x400",
+ "MCUBOOT_MAX_IMG_SECTORS=3584",
+ "CY_BOOT_SCRATCH_SIZE=0x00004000",
+ "MCUBOOT_BOOTLOADER_SIZE=0x00018000",
+ "CY_BOOT_BOOTLOADER_SIZE=0x00018000",
+ "CY_BOOT_PRIMARY_1_START=0x00018000",
+ "CY_BOOT_PRIMARY_1_SIZE=0x1C0000",
+ "CY_BOOT_SECONDARY_1_START=0x00000000",
+ "CY_BOOT_SECONDARY_1_SIZE=0x001C0000",
+ "CY_FLASH_ERASE_VALUE=0xFF",
+ "MCUBOOT_IMAGE_NUMBER=1",
+ "MCUBOOT_SLOT_SIZE=0x1C0000",
+ "MCUBOOT_SCRATCH_SIZE=0x4000",
+ "MCUBOOT_SECTOR_SIZE = 512",
+ "APP_VERSION_MAJOR=1",
+ "APP_VERSION_MINOR=0",
+ "APP_VERSION_BUILD=0",
+ "MCUBOOT_OVERWRITE_ONLY",
+ "CY_ENABLE_XIP_PROGRAM",
+ ]
+
+ if (build_update_image) {
+ defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=2" ]
+ } else {
+ defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=1" ]
+ }
+}
+
+# Warning: Don't change the name of this target without also modifying
+# third_party/p6/BUILD.gn and third_party/p6/p6_sdk.gn. There are conditionals
+# relying on this name.
+p6_sdk_sources("ota_requestor_app_sdk_sources") {
+ include_dirs = [
+ "${chip_root}/src/platform/P6",
+ "${p6_project_dir}/include",
+ "${examples_plat_dir}",
+ "${p6_project_dir}/config",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/flash_map_backend/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/sysflash/",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/bootutil/include",
+ ]
+
+ defines = [
+ "BOARD_ID=${p6_board}",
+ "P6_LOG_ENABLED=1",
+ "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setup_pin_code}",
+ ]
+
+ sources = [
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/bootutil/src/bootutil_misc.c",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_map.c",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_psoc6.c",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_smif_psoc6.c",
+ "${chip_root}/third_party/p6/p6_sdk/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/mem_config_sfdp.c",
+ "${p6_project_dir}/include/CHIPProjectConfig.h",
+ ]
+
+ public_configs = [
+ "${chip_root}/third_party/p6:p6_sdk_config",
+ ":p6_ota_config",
+ ]
+}
+
+p6_executable("ota_requestor_app") {
+ include_dirs = []
+ defines = []
+ output_name = "chip-p6-ota-requestor-example.out"
+
+ sources = [
+ "${examples_plat_dir}/LEDWidget.cpp",
+ "${examples_plat_dir}/init_p6Platform.cpp",
+ "src/AppTask.cpp",
+ "src/ButtonHandler.cpp",
+ "src/ZclCallbacks.cpp",
+ "src/main.cpp",
+ ]
+
+ deps = [
+ ":ota_requestor_app_sdk_sources",
+ "${chip_root}/examples/common/QRCode",
+ "${chip_root}/examples/ota-requestor-app/ota-requestor-common",
+ "${chip_root}/src/app/server",
+ "${chip_root}/src/lib",
+ "${chip_root}/src/setup_payload",
+ ]
+
+ include_dirs += [
+ "include",
+ "${examples_plat_dir}",
+ "${p6_project_dir}/include",
+ "${chip_root}/examples/ota-requestor-app/ota-requestor-common/include",
+ ]
+
+ defines = []
+
+ if (enable_heap_monitoring) {
+ sources += [ "${examples_plat_dir}/MemMonitoring.cpp" ]
+ defines += [ "HEAP_MONITORING" ]
+ }
+
+ if (chip_print_memory_usage) {
+ ldflags += [
+ "-Wl,--print-memory-usage",
+ "-fstack-usage",
+ ]
+ }
+
+ output_dir = root_out_dir
+}
+
+group("p6") {
+ deps = [ ":ota_requestor_app" ]
+}
+
+group("default") {
+ deps = [ ":p6" ]
+}
diff --git a/examples/ota-requestor-app/p6/README.md b/examples/ota-requestor-app/p6/README.md
new file mode 100644
index 0000000..73c5361
--- /dev/null
+++ b/examples/ota-requestor-app/p6/README.md
@@ -0,0 +1,138 @@
+#CHIP P6 OTA Requestor Example
+
+An example demonstrating the OTA Requestor cluster on a Infineon
+CY8CKIT-062S2-43012 board.
+
+<hr>
+
+- [Matter P6 OTA Requestor Example](#chip-p6-ota-requestor-example)
+ - [Introduction](#introduction)
+ - [Building](#building)
+ - [Flashing the Application](#flashing-the-application)
+ - [Running OTA Update Process](#running-ota-update-process)
+ - [Notes](#notes)
+
+<hr>
+
+<a name="introduction"></a>
+
+## Introduction
+
+The P6 OTA Requestor example provides a baseline demonstration of a OTA
+requestor device, built using Matter and the Infineon Modustoolbox SDK. It can
+be controlled by Matter controller over Wi-Fi network.
+
+The P6 device can be commissioned over Bluetooth Low Energy where the device and
+the Matter controller will exchange security information with the Rendezvous
+procedure. Wi-Fi Network credentials are then provided to the P6 device which
+will then join the network.
+
+<a name="building"></a>
+
+## Building
+
+- [Modustoolbox Software](https://www.cypress.com/products/modustoolbox)
+
+ Refer to `integrations/docker/images/chip-build-infineon/Dockerfile` or
+ `scripts/examples/gn_p6_example.sh` for downloading the Software and related
+ tools.
+
+- Install some additional tools (likely already present for Matter
+ developers): \$ sudo apt install gcc g++ clang ninja-build python
+ python3-venv libssl-dev libavahi-client-dev libglib2.0-dev git cmake
+ python3-pip
+
+- Supported hardware:
+ [CY8CKIT-062S2-43012](https://www.cypress.com/CY8CKIT-062S2-43012)
+
+* The following applications must be built to demonstrate the OTA process:
+
+ - The P6 OTA Requestor App
+ - The Updated P6 OTA Requestor App (or other app)
+ - An OTA Provider App (the Linux ota-provider app is used here)
+ - chip-tool
+
+* Build the P6 OTA Requestor application from the chip root dir:
+
+ $ ./examples/ota-requestor-app/examples/ota_base_build.sh
+
+* Build the P6 OTA Update application from the chip root dir:
+
+ $ ./examples/ota-requestor-app/examples/ota_update_build.sh
+
+* On a RPi4: Build the Linux OTA Provider application from the chip root dir:
+
+ $ ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux/ out/ota_provider_debug/ chip_config_network_layer_ble=false
+
+* On a RPi4: Build chip-tool:
+
+ $ ./scripts/examples/gn_build_example.sh examples/chip-tool/ out/chip-tool/
+
+* Additionally a pre-compiled bootloader must be flashed to the board. This
+ can be found at:
+
+ $ ./examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex
+
+<a name="flashing-the-application"></a>
+
+## Flashing the Application
+
+- Flash the bootloader by first putting the CY8CKIT-062S2-43012 board into
+ KitProg3 DAPLINK Mode by pressing the `MODE SELECT` button.
+ `KITPROG3 STATUS` LED will blink to indicate the the board is in the proper
+ mode. A drive named 'DAPLINK' should be automatically mounted. To flash
+ drag-and-drop matter-psoc6-mcuboot-bootloader.hex into that drive.
+
+- Put CY8CKIT-062S2-43012 board back into KitProg3 CMSIS-DAP Mode by pressing
+ the `MODE SELECT` button. `KITPROG3 STATUS` LED is ON confirms board is in
+ proper mode.
+
+- On the command line:
+
+ $ cd ~/connectedhomeip
+ $ python3 out/ota_requestor_debug/chip-p6-ota-requestor-example.flash.py
+
+<a name="running-ota-update-process"></a>
+
+### Running OTA Update Process
+
+- Make sure the ota-requestor-app is flashed and booting on the
+ CY8CKIT-062S2-43012.
+
+- Transfer out/ota_requestor_update_debug/chip-p6-ota-requestor-example.bin to
+ a RPi4.
+
+- On the RPi: In terminal 1 run the Linux ota-provider-app as follows:
+
+ $ ./out/ota_provider_debug/chip-ota-provider-app -f chip-p6-ota-requestor-example.bin
+
+- On the RPi: In terminal 2 run the following chip-tool commands
+
+ $ ./out/chip-tool/chip-tool pairing ble-wifi 2 "<SSID>" "<PASSWORD>" 20202021 3840
+
+ $ ./out/chip-tool/chip-tool pairing onnetwork 1 20202021
+
+ $ ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [1, 2], "targets": [{"cluster": null, "endpoint": 0, "deviceType": null}]}]' 1 0
+
+ $ ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [1, 2], "targets": [{"cluster": null, "endpoint": 0, "deviceType": null}]}]' 2 0
+
+ $ ./chip-tool otasoftwareupdaterequestor write default-ota-providers '[{"fabricIndex": 1, "providerNodeID": 1, "endpoint": 0}]' 2 0
+
+- Press user button 1 on the CY8CKIT-062S2-43012. This will trigger a
+ query-image call from the board using the default ota provider list written
+ in the above commands.
+
+- Using a serial emulator reading from the CY8CKIT-062S2-43012, you should
+ observe the updated application being transferred to the board, written to
+ flash, and, when completed, booted into.
+
+<a name="notes"></a>
+
+#### Notes
+
+Raspberry Pi 4 BLE connection issues can be avoided by running the following
+commands. These power cycle the BlueTooth hardware and disable BR/EDR mode.
+
+ $ sudo btmgmt -i hci0 power off
+ $ sudo btmgmt -i hci0 bredr off
+ $ sudo btmgmt -i hci0 power on
diff --git a/examples/ota-requestor-app/p6/args.gni b/examples/ota-requestor-app/p6/args.gni
new file mode 100644
index 0000000..0afa5bc
--- /dev/null
+++ b/examples/ota-requestor-app/p6/args.gni
@@ -0,0 +1,28 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+import("//build_overrides/pigweed.gni")
+import("${chip_root}/src/platform/P6/args.gni")
+
+declare_args() {
+ chip_enable_ota_requestor = true
+
+ # Disable lock tracking, since our FreeRTOS configuration does not set
+ # INCLUDE_xSemaphoreGetMutexHolder
+ chip_stack_lock_tracking = "none"
+}
+
+p6_target_project =
+ get_label_info(":ota_requestor_app_sdk_sources", "label_no_toolchain")
diff --git a/examples/ota-requestor-app/p6/build_overrides b/examples/ota-requestor-app/p6/build_overrides
new file mode 120000
index 0000000..194ee0b
--- /dev/null
+++ b/examples/ota-requestor-app/p6/build_overrides
@@ -0,0 +1 @@
+../../build_overrides/
\ No newline at end of file
diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h
new file mode 100644
index 0000000..15a6955
--- /dev/null
+++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_assert.h
@@ -0,0 +1,20 @@
+/*
+ * mcuboot_assert.h
+ *
+ * Cypress-specific assert() macro redefinition
+ *
+ */
+
+#ifndef MCUBOOT_ASSERT_H
+#define MCUBOOT_ASSERT_H
+
+#define CYBL_ASSERT(...) Cy_BLServ_Assert(__VA_ARGS__)
+
+#if !defined(NDEBUG)
+#undef assert
+#define assert(...) CYBL_ASSERT(__VA_ARGS__)
+#else
+#define assert
+#endif
+
+#endif /* MCUBOOT_ASSERT_H */
diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h
new file mode 100644
index 0000000..6b11d85
--- /dev/null
+++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_config.h
@@ -0,0 +1,151 @@
+/* Copyright 2019 Cypress Semiconductor Corporation
+ *
+ * Copyright (c) 2018 Open Source Foundries Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+#ifndef MCUBOOT_CONFIG_H
+#define MCUBOOT_CONFIG_H
+
+/*
+ * Template configuration file for MCUboot.
+ *
+ * When porting MCUboot to a new target, copy it somewhere that your
+ * include path can find it as mcuboot_config/mcuboot_config.h, and
+ * make adjustments to suit your platform.
+ *
+ * For examples, see:
+ *
+ * boot/zephyr/include/mcuboot_config/mcuboot_config.h
+ * boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h
+ */
+/* Default maximum number of flash sectors per image slot; change
+ * as desirable. */
+#ifndef MCUBOOT_MAX_IMG_SECTORS
+#define MCUBOOT_MAX_IMG_SECTORS 128
+#endif
+
+/*
+ * Signature types
+ *
+ * You must choose exactly one signature type.
+ */
+
+/* Uncomment for RSA signature support */
+//#define MCUBOOT_SIGN_RSA
+
+/* Uncomment for ECDSA signatures using curve P-256. */
+//#define MCUBOOT_SIGN_EC256
+//#define NUM_ECC_BYTES (256 / 8) // P-256 curve size in bytes, rnok: to make compilable
+
+// #define MCUBOOT_SIGN_EC
+
+/*
+ * Upgrade mode
+ *
+ * The default is to support A/B image swapping with rollback. A
+ * simpler code path, which only supports overwriting the
+ * existing image with the update image, is also available.
+ */
+#ifdef MCUBOOT_OVERWRITE_ONLY
+/* Uncomment to only erase and overwrite those slot 0 sectors needed
+ * to install the new image, rather than the entire image slot. */
+/* #define MCUBOOT_OVERWRITE_ONLY_FAST */
+#else
+/* Using SWAP w Scratch by default.
+ * Comment/Uncomment which is needed. */
+/* #define MCUBOOT_SWAP_USING_SCRATCH 1 */
+/* #define MCUBOOT_SWAP_USING_MOVE 1 */
+#define MCUBOOT_SWAP_USING_STATUS 1
+#endif
+
+/*
+ * Cryptographic settings
+ *
+ * You must choose between mbedTLS and Tinycrypt as source of
+ * cryptographic primitives. Other cryptographic settings are also
+ * available.
+ */
+
+/* Uncomment to use ARM's mbedTLS cryptographic primitives */
+#define MCUBOOT_USE_MBED_TLS
+/* Uncomment to use Tinycrypt's. */
+/* #define MCUBOOT_USE_TINYCRYPT */
+
+/*
+ * Always check the signature of the image in slot 0 before booting,
+ * even if no upgrade was performed. This is recommended if the boot
+ * time penalty is acceptable.
+ */
+//#define MCUBOOT_VALIDATE_PRIMARY_SLOT
+
+/*
+ * Flash abstraction
+ */
+
+/* Uncomment if your flash map API supports flash_area_get_sectors().
+ * See the flash APIs for more details. */
+// TODO: FWSECURITY-755
+#define MCUBOOT_USE_FLASH_AREA_GET_SECTORS
+
+/* Default number of separately updateable images; change in case of
+ * multiple images. */
+#ifndef MCUBOOT_IMAGE_NUMBER
+#define MCUBOOT_IMAGE_NUMBER 1
+#endif
+
+/*
+ * Logging
+ */
+
+/*
+ * If logging is enabled the following functions must be defined by the
+ * platform:
+ *
+ * MCUBOOT_LOG_ERR(...)
+ * MCUBOOT_LOG_WRN(...)
+ * MCUBOOT_LOG_INF(...)
+ * MCUBOOT_LOG_DBG(...)
+ *
+ * The following global logging level configuration macros must also be
+ * defined, each with a unique value. Those will be used to define a global
+ * configuration and will allow any source files to override the global
+ * configuration:
+ *
+ * MCUBOOT_LOG_LEVEL_OFF
+ * MCUBOOT_LOG_LEVEL_ERROR
+ * MCUBOOT_LOG_LEVEL_WARNING
+ * MCUBOOT_LOG_LEVEL_INFO
+ * MCUBOOT_LOG_LEVEL_DEBUG
+ *
+ * The global logging level must be defined, with one of the previously defined
+ * logging levels:
+ *
+ * #define MCUBOOT_LOG_LEVEL MCUBOOT_LOG_LEVEL_(OFF|ERROR|WARNING|INFO|DEBUG)
+ *
+ * MCUBOOT_LOG_LEVEL sets the minimum level that will be logged. The function
+ * priority is:
+ *
+ * MCUBOOT_LOG_ERR > MCUBOOT_LOG_WRN > MCUBOOT_LOG_INF > MCUBOOT_LOG_DBG
+ *
+ * NOTE: Each source file is still able to request its own logging level by
+ * defining BOOT_LOG_LEVEL before #including `bootutil_log.h`
+ */
+#define MCUBOOT_HAVE_LOGGING 1
+
+/*
+ * Assertions
+ */
+
+/* Uncomment if your platform has its own mcuboot_config/mcuboot_assert.h.
+ * If so, it must provide an ASSERT macro for use by bootutil. Otherwise,
+ * "assert" is used. */
+//#define MCUBOOT_HAVE_ASSERT_H
+
+#define MCUBOOT_WATCHDOG_FEED() \
+ do \
+ { \
+ /* TODO: to be implemented */ \
+ } while (0)
+
+#endif /* MCUBOOT_CONFIG_H */
diff --git a/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h
new file mode 100644
index 0000000..35424b4
--- /dev/null
+++ b/examples/ota-requestor-app/p6/config/mcuboot_config/mcuboot_logging.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2018 Nordic Semiconductor ASA
+ * Copyright (c) 2015 Runtime Inc
+ * Copyright (c) 2020 Cypress Semiconductor Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*******************************************************************************/
+
+#ifndef MCUBOOT_LOGGING_H
+#define MCUBOOT_LOGGING_H
+
+#include <stdio.h>
+
+#define MCUBOOT_LOG_LEVEL_OFF 0
+#define MCUBOOT_LOG_LEVEL_ERROR 1
+#define MCUBOOT_LOG_LEVEL_WARNING 2
+#define MCUBOOT_LOG_LEVEL_INFO 3
+#define MCUBOOT_LOG_LEVEL_DEBUG 4
+
+/*
+ * The compiled log level determines the maximum level that can be
+ * printed. Messages at or below this level can be printed, provided
+ * they are also enabled through the Rust logging system, such as by
+ * setting RUST_LOG to bootsim::api=info.
+ */
+#ifndef MCUBOOT_LOG_LEVEL
+#define MCUBOOT_LOG_LEVEL MCUBOOT_LOG_LEVEL_INFO
+#endif
+
+int sim_log_enabled(int level);
+
+#define sim_log_enabled(x) 1
+
+#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_ERROR
+#define MCUBOOT_LOG_ERR(_fmt, ...) \
+ do \
+ { \
+ if (sim_log_enabled(MCUBOOT_LOG_LEVEL_ERROR)) \
+ { \
+ fprintf(stderr, "[ERR] " _fmt "\n\r", ##__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+#define MCUBOOT_LOG_ERR(...) IGNORE(__VA_ARGS__)
+#endif
+
+#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_WARNING
+#define MCUBOOT_LOG_WRN(_fmt, ...) \
+ do \
+ { \
+ if (sim_log_enabled(MCUBOOT_LOG_LEVEL_WARNING)) \
+ { \
+ fprintf(stderr, "[WRN] " _fmt "\n\r", ##__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+#define MCUBOOT_LOG_WRN(...) IGNORE(__VA_ARGS__)
+#endif
+
+#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_INFO
+#define MCUBOOT_LOG_INF(_fmt, ...) \
+ do \
+ { \
+ if (sim_log_enabled(MCUBOOT_LOG_LEVEL_INFO)) \
+ { \
+ fprintf(stderr, "[INF] " _fmt "\n\r", ##__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+#define MCUBOOT_LOG_INF(...) IGNORE(__VA_ARGS__)
+#endif
+
+#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_DEBUG
+#define MCUBOOT_LOG_DBG(_fmt, ...) \
+ do \
+ { \
+ if (sim_log_enabled(MCUBOOT_LOG_LEVEL_DEBUG)) \
+ { \
+ fprintf(stderr, "[DBG] " _fmt "\n\r", ##__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+#define MCUBOOT_LOG_DBG(...) IGNORE(__VA_ARGS__)
+#endif
+
+#define MCUBOOT_LOG_MODULE_DECLARE(...)
+
+#endif /* MCUBOOT_LOGGING_H */
diff --git a/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h b/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h
new file mode 100644
index 0000000..2bf440a
--- /dev/null
+++ b/examples/ota-requestor-app/p6/config/mcuboot_crypto_acc_config.h
@@ -0,0 +1,52 @@
+/*
+ * mbed Microcontroller Library
+ * Copyright (c) 2019 Cypress Semiconductor Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * \file mcuboot_crypto_acc_config.h
+ * \version 1.1
+ */
+
+#ifndef MCUBOOT_MBEDTLS_DEVICE_H
+#define MCUBOOT_MBEDTLS_DEVICE_H
+
+/* Currently this target supports SHA1 */
+// #define MBEDTLS_SHA1_C
+
+#define MBEDTLS_SHA1_ALT
+#define MBEDTLS_SHA256_ALT
+#define MBEDTLS_SHA512_ALT
+
+/* Currently this target supports CBC, CFB, OFB, CTR and XTS cipher modes */
+#define MBEDTLS_AES_ALT
+// #define MBEDTLS_CIPHER_MODE_CBC
+// #define MBEDTLS_CIPHER_MODE_CFB
+// #define MBEDTLS_CIPHER_MODE_OFB
+// #define MBEDTLS_CIPHER_MODE_CTR
+// #define MBEDTLS_CIPHER_MODE_XTS
+
+/* Only NIST-P curves are currently supported */
+#define MBEDTLS_ECP_ALT
+// #define MBEDTLS_ECP_DP_SECP192R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP224R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP256R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP384R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP521R1_ENABLED
+
+#define MBEDTLS_ECDSA_SIGN_ALT
+#define MBEDTLS_ECDSA_VERIFY_ALT
+
+#endif /* MCUBOOT_MBEDTLS_DEVICE_H */
diff --git a/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h b/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h
new file mode 100644
index 0000000..4f0f7d3
--- /dev/null
+++ b/examples/ota-requestor-app/p6/config/mcuboot_crypto_config.h
@@ -0,0 +1,3606 @@
+/**
+ * \file config.h
+ *
+ * \brief Configuration options (set of defines)
+ *
+ * This set of compile-time options may be used to enable
+ * or disable features selectively, and reduce the global
+ * memory footprint.
+ */
+/*
+ * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This file is part of mbed TLS (https://tls.mbed.org)
+ */
+
+#ifndef MBEDTLS_CONFIG_H
+#define MBEDTLS_CONFIG_H
+
+#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+#define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+
+/**
+ * \name SECTION: System support
+ *
+ * This section sets system specific settings.
+ * \{
+ */
+
+/**
+ * \def MBEDTLS_HAVE_ASM
+ *
+ * The compiler has support for asm().
+ *
+ * Requires support for asm() in compiler.
+ *
+ * Used in:
+ * library/aria.c
+ * library/timing.c
+ * include/mbedtls/bn_mul.h
+ *
+ * Required by:
+ * MBEDTLS_AESNI_C
+ * MBEDTLS_PADLOCK_C
+ *
+ * Comment to disable the use of assembly code.
+ */
+#define MBEDTLS_HAVE_ASM
+
+/**
+ * \def MBEDTLS_NO_UDBL_DIVISION
+ *
+ * The platform lacks support for double-width integer division (64-bit
+ * division on a 32-bit platform, 128-bit division on a 64-bit platform).
+ *
+ * Used in:
+ * include/mbedtls/bignum.h
+ * library/bignum.c
+ *
+ * The bignum code uses double-width division to speed up some operations.
+ * Double-width division is often implemented in software that needs to
+ * be linked with the program. The presence of a double-width integer
+ * type is usually detected automatically through preprocessor macros,
+ * but the automatic detection cannot know whether the code needs to
+ * and can be linked with an implementation of division for that type.
+ * By default division is assumed to be usable if the type is present.
+ * Uncomment this option to prevent the use of double-width division.
+ *
+ * Note that division for the native integer type is always required.
+ * Furthermore, a 64-bit type is always required even on a 32-bit
+ * platform, but it need not support multiplication or division. In some
+ * cases it is also desirable to disable some double-width operations. For
+ * example, if double-width division is implemented in software, disabling
+ * it can reduce code size in some embedded targets.
+ */
+//#define MBEDTLS_NO_UDBL_DIVISION
+
+/**
+ * \def MBEDTLS_NO_64BIT_MULTIPLICATION
+ *
+ * The platform lacks support for 32x32 -> 64-bit multiplication.
+ *
+ * Used in:
+ * library/poly1305.c
+ *
+ * Some parts of the library may use multiplication of two unsigned 32-bit
+ * operands with a 64-bit result in order to speed up computations. On some
+ * platforms, this is not available in hardware and has to be implemented in
+ * software, usually in a library provided by the toolchain.
+ *
+ * Sometimes it is not desirable to have to link to that library. This option
+ * removes the dependency of that library on platforms that lack a hardware
+ * 64-bit multiplier by embedding a software implementation in Mbed TLS.
+ *
+ * Note that depending on the compiler, this may decrease performance compared
+ * to using the library function provided by the toolchain.
+ */
+//#define MBEDTLS_NO_64BIT_MULTIPLICATION
+
+/**
+ * \def MBEDTLS_HAVE_SSE2
+ *
+ * CPU supports SSE2 instruction set.
+ *
+ * Uncomment if the CPU supports SSE2 (IA-32 specific).
+ */
+//#define MBEDTLS_HAVE_SSE2
+
+/**
+ * \def MBEDTLS_HAVE_TIME
+ *
+ * System has time.h and time().
+ * The time does not need to be correct, only time differences are used,
+ * by contrast with MBEDTLS_HAVE_TIME_DATE
+ *
+ * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT,
+ * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and
+ * MBEDTLS_PLATFORM_STD_TIME.
+ *
+ * Comment if your system does not support time functions
+ */
+#define MBEDTLS_HAVE_TIME
+
+/**
+ * \def MBEDTLS_HAVE_TIME_DATE
+ *
+ * System has time.h, time(), and an implementation for
+ * mbedtls_platform_gmtime_r() (see below).
+ * The time needs to be correct (not necessarily very accurate, but at least
+ * the date should be correct). This is used to verify the validity period of
+ * X.509 certificates.
+ *
+ * Comment if your system does not have a correct clock.
+ *
+ * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that
+ * behaves similarly to the gmtime_r() function from the C standard. Refer to
+ * the documentation for mbedtls_platform_gmtime_r() for more information.
+ *
+ * \note It is possible to configure an implementation for
+ * mbedtls_platform_gmtime_r() at compile-time by using the macro
+ * MBEDTLS_PLATFORM_GMTIME_R_ALT.
+ */
+#define MBEDTLS_HAVE_TIME_DATE
+
+/**
+ * \def MBEDTLS_PLATFORM_MEMORY
+ *
+ * Enable the memory allocation layer.
+ *
+ * By default mbed TLS uses the system-provided calloc() and free().
+ * This allows different allocators (self-implemented or provided) to be
+ * provided to the platform abstraction layer.
+ *
+ * Enabling MBEDTLS_PLATFORM_MEMORY without the
+ * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide
+ * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and
+ * free() function pointer at runtime.
+ *
+ * Enabling MBEDTLS_PLATFORM_MEMORY and specifying
+ * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the
+ * alternate function at compile time.
+ *
+ * Requires: MBEDTLS_PLATFORM_C
+ *
+ * Enable this layer to allow use of alternative memory allocators.
+ */
+//#define MBEDTLS_PLATFORM_MEMORY
+
+/**
+ * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
+ *
+ * Do not assign standard functions in the platform layer (e.g. calloc() to
+ * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF)
+ *
+ * This makes sure there are no linking errors on platforms that do not support
+ * these functions. You will HAVE to provide alternatives, either at runtime
+ * via the platform_set_xxx() functions or at compile time by setting
+ * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a
+ * MBEDTLS_PLATFORM_XXX_MACRO.
+ *
+ * Requires: MBEDTLS_PLATFORM_C
+ *
+ * Uncomment to prevent default assignment of standard functions in the
+ * platform layer.
+ */
+//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
+
+/**
+ * \def MBEDTLS_PLATFORM_EXIT_ALT
+ *
+ * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the
+ * function in the platform abstraction layer.
+ *
+ * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will
+ * provide a function "mbedtls_platform_set_printf()" that allows you to set an
+ * alternative printf function pointer.
+ *
+ * All these define require MBEDTLS_PLATFORM_C to be defined!
+ *
+ * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows;
+ * it will be enabled automatically by check_config.h
+ *
+ * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as
+ * MBEDTLS_PLATFORM_XXX_MACRO!
+ *
+ * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME
+ *
+ * Uncomment a macro to enable alternate implementation of specific base
+ * platform function
+ */
+//#define MBEDTLS_PLATFORM_EXIT_ALT
+//#define MBEDTLS_PLATFORM_TIME_ALT
+//#define MBEDTLS_PLATFORM_FPRINTF_ALT
+//#define MBEDTLS_PLATFORM_PRINTF_ALT
+//#define MBEDTLS_PLATFORM_SNPRINTF_ALT
+//#define MBEDTLS_PLATFORM_VSNPRINTF_ALT
+//#define MBEDTLS_PLATFORM_NV_SEED_ALT
+//#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT
+
+/**
+ * \def MBEDTLS_DEPRECATED_WARNING
+ *
+ * Mark deprecated functions so that they generate a warning if used.
+ * Functions deprecated in one version will usually be removed in the next
+ * version. You can enable this to help you prepare the transition to a new
+ * major version by making sure your code is not using these functions.
+ *
+ * This only works with GCC and Clang. With other compilers, you may want to
+ * use MBEDTLS_DEPRECATED_REMOVED
+ *
+ * Uncomment to get warnings on using deprecated functions.
+ */
+//#define MBEDTLS_DEPRECATED_WARNING
+
+/**
+ * \def MBEDTLS_DEPRECATED_REMOVED
+ *
+ * Remove deprecated functions so that they generate an error if used.
+ * Functions deprecated in one version will usually be removed in the next
+ * version. You can enable this to help you prepare the transition to a new
+ * major version by making sure your code is not using these functions.
+ *
+ * Uncomment to get errors on using deprecated functions.
+ */
+//#define MBEDTLS_DEPRECATED_REMOVED
+
+/**
+ * \def MBEDTLS_CHECK_PARAMS
+ *
+ * This configuration option controls whether the library validates more of
+ * the parameters passed to it.
+ *
+ * When this flag is not defined, the library only attempts to validate an
+ * input parameter if: (1) they may come from the outside world (such as the
+ * network, the filesystem, etc.) or (2) not validating them could result in
+ * internal memory errors such as overflowing a buffer controlled by the
+ * library. On the other hand, it doesn't attempt to validate parameters whose
+ * values are fully controlled by the application (such as pointers).
+ *
+ * When this flag is defined, the library additionally attempts to validate
+ * parameters that are fully controlled by the application, and should always
+ * be valid if the application code is fully correct and trusted.
+ *
+ * For example, when a function accepts as input a pointer to a buffer that may
+ * contain untrusted data, and its documentation mentions that this pointer
+ * must not be NULL:
+ * - The pointer is checked to be non-NULL only if this option is enabled.
+ * - The content of the buffer is always validated.
+ *
+ * When this flag is defined, if a library function receives a parameter that
+ * is invalid:
+ * 1. The function will invoke the macro MBEDTLS_PARAM_FAILED().
+ * 2. If MBEDTLS_PARAM_FAILED() did not terminate the program, the function
+ * will immediately return. If the function returns an Mbed TLS error code,
+ * the error code in this case is MBEDTLS_ERR_xxx_BAD_INPUT_DATA.
+ *
+ * When defining this flag, you also need to arrange a definition for
+ * MBEDTLS_PARAM_FAILED(). You can do this by any of the following methods:
+ * - By default, the library defines MBEDTLS_PARAM_FAILED() to call a
+ * function mbedtls_param_failed(), but the library does not define this
+ * function. If you do not make any other arrangements, you must provide
+ * the function mbedtls_param_failed() in your application.
+ * See `platform_util.h` for its prototype.
+ * - If you enable the macro #MBEDTLS_CHECK_PARAMS_ASSERT, then the
+ * library defines MBEDTLS_PARAM_FAILED(\c cond) to be `assert(cond)`.
+ * You can still supply an alternative definition of
+ * MBEDTLS_PARAM_FAILED(), which may call `assert`.
+ * - If you define a macro MBEDTLS_PARAM_FAILED() before including `config.h`
+ * or you uncomment the definition of MBEDTLS_PARAM_FAILED() in `config.h`,
+ * the library will call the macro that you defined and will not supply
+ * its own version. Note that if MBEDTLS_PARAM_FAILED() calls `assert`,
+ * you need to enable #MBEDTLS_CHECK_PARAMS_ASSERT so that library source
+ * files include `<assert.h>`.
+ *
+ * Uncomment to enable validation of application-controlled parameters.
+ */
+//#define MBEDTLS_CHECK_PARAMS
+
+/**
+ * \def MBEDTLS_CHECK_PARAMS_ASSERT
+ *
+ * Allow MBEDTLS_PARAM_FAILED() to call `assert`, and make it default to
+ * `assert`. This macro is only used if #MBEDTLS_CHECK_PARAMS is defined.
+ *
+ * If this macro is not defined, then MBEDTLS_PARAM_FAILED() defaults to
+ * calling a function mbedtls_param_failed(). See the documentation of
+ * #MBEDTLS_CHECK_PARAMS for details.
+ *
+ * Uncomment to allow MBEDTLS_PARAM_FAILED() to call `assert`.
+ */
+//#define MBEDTLS_CHECK_PARAMS_ASSERT
+
+/* \} name SECTION: System support */
+
+/**
+ * \name SECTION: mbed TLS feature support
+ *
+ * This section sets support for features that are or are not needed
+ * within the modules that are enabled.
+ * \{
+ */
+
+/**
+ * \def MBEDTLS_TIMING_ALT
+ *
+ * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(),
+ * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay()
+ *
+ * Only works if you have MBEDTLS_TIMING_C enabled.
+ *
+ * You will need to provide a header "timing_alt.h" and an implementation at
+ * compile time.
+ */
+//#define MBEDTLS_TIMING_ALT
+
+/**
+ * \def MBEDTLS_AES_ALT
+ *
+ * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your
+ * alternate core implementation of a symmetric crypto, an arithmetic or hash
+ * module (e.g. platform specific assembly optimized implementations). Keep
+ * in mind that the function prototypes should remain the same.
+ *
+ * This replaces the whole module. If you only want to replace one of the
+ * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags.
+ *
+ * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer
+ * provide the "struct mbedtls_aes_context" definition and omit the base
+ * function declarations and implementations. "aes_alt.h" will be included from
+ * "aes.h" to include the new function definitions.
+ *
+ * Uncomment a macro to enable alternate implementation of the corresponding
+ * module.
+ *
+ * \warning MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their
+ * use constitutes a security risk. If possible, we recommend
+ * avoiding dependencies on them, and considering stronger message
+ * digests and ciphers instead.
+ *
+ */
+//#define MBEDTLS_AES_ALT
+//#define MBEDTLS_ARC4_ALT
+//#define MBEDTLS_ARIA_ALT
+//#define MBEDTLS_BLOWFISH_ALT
+//#define MBEDTLS_CAMELLIA_ALT
+//#define MBEDTLS_CCM_ALT
+//#define MBEDTLS_CHACHA20_ALT
+//#define MBEDTLS_CHACHAPOLY_ALT
+//#define MBEDTLS_CMAC_ALT
+//#define MBEDTLS_DES_ALT
+//#define MBEDTLS_DHM_ALT
+//#define MBEDTLS_ECJPAKE_ALT
+//#define MBEDTLS_GCM_ALT
+//#define MBEDTLS_NIST_KW_ALT
+//#define MBEDTLS_MD2_ALT
+//#define MBEDTLS_MD4_ALT
+//#define MBEDTLS_MD5_ALT
+//#define MBEDTLS_POLY1305_ALT
+//#define MBEDTLS_RIPEMD160_ALT
+//#define MBEDTLS_RSA_ALT
+//#define MBEDTLS_SHA1_ALT
+//#define MBEDTLS_SHA256_ALT
+//#define MBEDTLS_SHA512_ALT
+//#define MBEDTLS_XTEA_ALT
+
+/*
+ * When replacing the elliptic curve module, pleace consider, that it is
+ * implemented with two .c files:
+ * - ecp.c
+ * - ecp_curves.c
+ * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT
+ * macros as described above. The only difference is that you have to make sure
+ * that you provide functionality for both .c files.
+ */
+//#define MBEDTLS_ECP_ALT
+
+/**
+ * \def MBEDTLS_MD2_PROCESS_ALT
+ *
+ * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you
+ * alternate core implementation of symmetric crypto or hash function. Keep in
+ * mind that function prototypes should remain the same.
+ *
+ * This replaces only one function. The header file from mbed TLS is still
+ * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags.
+ *
+ * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will
+ * no longer provide the mbedtls_sha1_process() function, but it will still provide
+ * the other function (using your mbedtls_sha1_process() function) and the definition
+ * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible
+ * with this definition.
+ *
+ * \note Because of a signature change, the core AES encryption and decryption routines are
+ * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt,
+ * respectively. When setting up alternative implementations, these functions should
+ * be overridden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt
+ * must stay untouched.
+ *
+ * \note If you use the AES_xxx_ALT macros, then is is recommended to also set
+ * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES
+ * tables.
+ *
+ * Uncomment a macro to enable alternate implementation of the corresponding
+ * function.
+ *
+ * \warning MD2, MD4, MD5, DES and SHA-1 are considered weak and their use
+ * constitutes a security risk. If possible, we recommend avoiding
+ * dependencies on them, and considering stronger message digests
+ * and ciphers instead.
+ *
+ */
+//#define MBEDTLS_MD2_PROCESS_ALT
+//#define MBEDTLS_MD4_PROCESS_ALT
+//#define MBEDTLS_MD5_PROCESS_ALT
+//#define MBEDTLS_RIPEMD160_PROCESS_ALT
+//#define MBEDTLS_SHA1_PROCESS_ALT
+//#define MBEDTLS_SHA256_PROCESS_ALT
+//#define MBEDTLS_SHA512_PROCESS_ALT
+//#define MBEDTLS_DES_SETKEY_ALT
+//#define MBEDTLS_DES_CRYPT_ECB_ALT
+//#define MBEDTLS_DES3_CRYPT_ECB_ALT
+//#define MBEDTLS_AES_SETKEY_ENC_ALT
+//#define MBEDTLS_AES_SETKEY_DEC_ALT
+//#define MBEDTLS_AES_ENCRYPT_ALT
+//#define MBEDTLS_AES_DECRYPT_ALT
+//#define MBEDTLS_ECDH_GEN_PUBLIC_ALT
+//#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT
+//#define MBEDTLS_ECDSA_VERIFY_ALT
+//#define MBEDTLS_ECDSA_SIGN_ALT
+//#define MBEDTLS_ECDSA_GENKEY_ALT
+
+/**
+ * \def MBEDTLS_ECP_INTERNAL_ALT
+ *
+ * Expose a part of the internal interface of the Elliptic Curve Point module.
+ *
+ * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your
+ * alternative core implementation of elliptic curve arithmetic. Keep in mind
+ * that function prototypes should remain the same.
+ *
+ * This partially replaces one function. The header file from mbed TLS is still
+ * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation
+ * is still present and it is used for group structures not supported by the
+ * alternative.
+ *
+ * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT
+ * and implementing the following functions:
+ * unsigned char mbedtls_internal_ecp_grp_capable(
+ * const mbedtls_ecp_group *grp )
+ * int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp )
+ * void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp )
+ * The mbedtls_internal_ecp_grp_capable function should return 1 if the
+ * replacement functions implement arithmetic for the given group and 0
+ * otherwise.
+ * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_free are
+ * called before and after each point operation and provide an opportunity to
+ * implement optimized set up and tear down instructions.
+ *
+ * Example: In case you uncomment MBEDTLS_ECP_INTERNAL_ALT and
+ * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac
+ * function, but will use your mbedtls_internal_ecp_double_jac if the group is
+ * supported (your mbedtls_internal_ecp_grp_capable function returns 1 when
+ * receives it as an argument). If the group is not supported then the original
+ * implementation is used. The other functions and the definition of
+ * mbedtls_ecp_group and mbedtls_ecp_point will not change, so your
+ * implementation of mbedtls_internal_ecp_double_jac and
+ * mbedtls_internal_ecp_grp_capable must be compatible with this definition.
+ *
+ * Uncomment a macro to enable alternate implementation of the corresponding
+ * function.
+ */
+/* Required for all the functions in this section */
+//#define MBEDTLS_ECP_INTERNAL_ALT
+/* Support for Weierstrass curves with Jacobi representation */
+//#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT
+//#define MBEDTLS_ECP_ADD_MIXED_ALT
+//#define MBEDTLS_ECP_DOUBLE_JAC_ALT
+//#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT
+//#define MBEDTLS_ECP_NORMALIZE_JAC_ALT
+/* Support for curves with Montgomery arithmetic */
+//#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT
+//#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT
+//#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT
+
+/**
+ * \def MBEDTLS_TEST_NULL_ENTROPY
+ *
+ * Enables testing and use of mbed TLS without any configured entropy sources.
+ * This permits use of the library on platforms before an entropy source has
+ * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the
+ * MBEDTLS_ENTROPY_NV_SEED switches).
+ *
+ * WARNING! This switch MUST be disabled in production builds, and is suitable
+ * only for development.
+ * Enabling the switch negates any security provided by the library.
+ *
+ * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
+ *
+ */
+//#define MBEDTLS_TEST_NULL_ENTROPY
+
+/**
+ * \def MBEDTLS_ENTROPY_HARDWARE_ALT
+ *
+ * Uncomment this macro to let mbed TLS use your own implementation of a
+ * hardware entropy collector.
+ *
+ * Your function must be called \c mbedtls_hardware_poll(), have the same
+ * prototype as declared in entropy_poll.h, and accept NULL as first argument.
+ *
+ * Uncomment to use your own hardware entropy collector.
+ */
+//#define MBEDTLS_ENTROPY_HARDWARE_ALT
+
+/**
+ * \def MBEDTLS_AES_ROM_TABLES
+ *
+ * Use precomputed AES tables stored in ROM.
+ *
+ * Uncomment this macro to use precomputed AES tables stored in ROM.
+ * Comment this macro to generate AES tables in RAM at runtime.
+ *
+ * Tradeoff: Using precomputed ROM tables reduces RAM usage by ~8kb
+ * (or ~2kb if \c MBEDTLS_AES_FEWER_TABLES is used) and reduces the
+ * initialization time before the first AES operation can be performed.
+ * It comes at the cost of additional ~8kb ROM use (resp. ~2kb if \c
+ * MBEDTLS_AES_FEWER_TABLES below is used), and potentially degraded
+ * performance if ROM access is slower than RAM access.
+ *
+ * This option is independent of \c MBEDTLS_AES_FEWER_TABLES.
+ *
+ */
+//#define MBEDTLS_AES_ROM_TABLES
+
+/**
+ * \def MBEDTLS_AES_FEWER_TABLES
+ *
+ * Use less ROM/RAM for AES tables.
+ *
+ * Uncommenting this macro omits 75% of the AES tables from
+ * ROM / RAM (depending on the value of \c MBEDTLS_AES_ROM_TABLES)
+ * by computing their values on the fly during operations
+ * (the tables are entry-wise rotations of one another).
+ *
+ * Tradeoff: Uncommenting this reduces the RAM / ROM footprint
+ * by ~6kb but at the cost of more arithmetic operations during
+ * runtime. Specifically, one has to compare 4 accesses within
+ * different tables to 4 accesses with additional arithmetic
+ * operations within the same table. The performance gain/loss
+ * depends on the system and memory details.
+ *
+ * This option is independent of \c MBEDTLS_AES_ROM_TABLES.
+ *
+ */
+//#define MBEDTLS_AES_FEWER_TABLES
+
+/**
+ * \def MBEDTLS_CAMELLIA_SMALL_MEMORY
+ *
+ * Use less ROM for the Camellia implementation (saves about 768 bytes).
+ *
+ * Uncomment this macro to use less memory for Camellia.
+ */
+//#define MBEDTLS_CAMELLIA_SMALL_MEMORY
+
+/**
+ * \def MBEDTLS_CIPHER_MODE_CBC
+ *
+ * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers.
+ */
+#define MBEDTLS_CIPHER_MODE_CBC
+
+/**
+ * \def MBEDTLS_CIPHER_MODE_CFB
+ *
+ * Enable Cipher Feedback mode (CFB) for symmetric ciphers.
+ */
+#define MBEDTLS_CIPHER_MODE_CFB
+
+/**
+ * \def MBEDTLS_CIPHER_MODE_CTR
+ *
+ * Enable Counter Block Cipher mode (CTR) for symmetric ciphers.
+ */
+#define MBEDTLS_CIPHER_MODE_CTR
+
+/**
+ * \def MBEDTLS_CIPHER_MODE_OFB
+ *
+ * Enable Output Feedback mode (OFB) for symmetric ciphers.
+ */
+#define MBEDTLS_CIPHER_MODE_OFB
+
+/**
+ * \def MBEDTLS_CIPHER_MODE_XTS
+ *
+ * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES.
+ */
+#define MBEDTLS_CIPHER_MODE_XTS
+
+/**
+ * \def MBEDTLS_CIPHER_NULL_CIPHER
+ *
+ * Enable NULL cipher.
+ * Warning: Only do so when you know what you are doing. This allows for
+ * encryption or channels without any security!
+ *
+ * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable
+ * the following ciphersuites:
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA
+ * MBEDTLS_TLS_RSA_WITH_NULL_SHA256
+ * MBEDTLS_TLS_RSA_WITH_NULL_SHA
+ * MBEDTLS_TLS_RSA_WITH_NULL_MD5
+ * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA
+ * MBEDTLS_TLS_PSK_WITH_NULL_SHA384
+ * MBEDTLS_TLS_PSK_WITH_NULL_SHA256
+ * MBEDTLS_TLS_PSK_WITH_NULL_SHA
+ *
+ * Uncomment this macro to enable the NULL cipher and ciphersuites
+ */
+//#define MBEDTLS_CIPHER_NULL_CIPHER
+
+/**
+ * \def MBEDTLS_CIPHER_PADDING_PKCS7
+ *
+ * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for
+ * specific padding modes in the cipher layer with cipher modes that support
+ * padding (e.g. CBC)
+ *
+ * If you disable all padding modes, only full blocks can be used with CBC.
+ *
+ * Enable padding modes in the cipher layer.
+ */
+#define MBEDTLS_CIPHER_PADDING_PKCS7
+#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS
+#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN
+#define MBEDTLS_CIPHER_PADDING_ZEROS
+
+/**
+ * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES
+ *
+ * Enable weak ciphersuites in SSL / TLS.
+ * Warning: Only do so when you know what you are doing. This allows for
+ * channels with virtually no security at all!
+ *
+ * This enables the following ciphersuites:
+ * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA
+ *
+ * Uncomment this macro to enable weak ciphersuites
+ *
+ * \warning DES is considered a weak cipher and its use constitutes a
+ * security risk. We recommend considering stronger ciphers instead.
+ */
+//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES
+
+/**
+ * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES
+ *
+ * Remove RC4 ciphersuites by default in SSL / TLS.
+ * This flag removes the ciphersuites based on RC4 from the default list as
+ * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to
+ * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them
+ * explicitly.
+ *
+ * Uncomment this macro to remove RC4 ciphersuites by default.
+ */
+#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
+
+/**
+ * \def MBEDTLS_REMOVE_3DES_CIPHERSUITES
+ *
+ * Remove 3DES ciphersuites by default in SSL / TLS.
+ * This flag removes the ciphersuites based on 3DES from the default list as
+ * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible
+ * to enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including
+ * them explicitly.
+ *
+ * A man-in-the-browser attacker can recover authentication tokens sent through
+ * a TLS connection using a 3DES based cipher suite (see "On the Practical
+ * (In-)Security of 64-bit Block Ciphers" by Karthikeyan Bhargavan and Gaëtan
+ * Leurent, see https://sweet32.info/SWEET32_CCS16.pdf). If this attack falls
+ * in your threat model or you are unsure, then you should keep this option
+ * enabled to remove 3DES based cipher suites.
+ *
+ * Comment this macro to keep 3DES in the default ciphersuite list.
+ */
+#define MBEDTLS_REMOVE_3DES_CIPHERSUITES
+
+/**
+ * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED
+ *
+ * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve
+ * module. By default all supported curves are enabled.
+ *
+ * Comment macros to disable the curve and functions for it
+ */
+// #define MBEDTLS_ECP_DP_SECP192R1_ENABLED
+#define MBEDTLS_ECP_DP_SECP224R1_ENABLED
+#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP384R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP521R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP192K1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP224K1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP256K1_ENABLED
+// #define MBEDTLS_ECP_DP_BP256R1_ENABLED
+// #define MBEDTLS_ECP_DP_BP384R1_ENABLED
+// #define MBEDTLS_ECP_DP_BP512R1_ENABLED
+// #define MBEDTLS_ECP_DP_CURVE25519_ENABLED
+// #define MBEDTLS_ECP_DP_CURVE448_ENABLED
+
+/**
+ * \def MBEDTLS_ECP_NIST_OPTIM
+ *
+ * Enable specific 'modulo p' routines for each NIST prime.
+ * Depending on the prime and architecture, makes operations 4 to 8 times
+ * faster on the corresponding curve.
+ *
+ * Comment this macro to disable NIST curves optimisation.
+ */
+#define MBEDTLS_ECP_NIST_OPTIM
+
+/**
+ * \def MBEDTLS_ECP_RESTARTABLE
+ *
+ * Enable "non-blocking" ECC operations that can return early and be resumed.
+ *
+ * This allows various functions to pause by returning
+ * #MBEDTLS_ERR_ECP_IN_PROGRESS (or, for functions in the SSL module,
+ * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) and then be called later again in
+ * order to further progress and eventually complete their operation. This is
+ * controlled through mbedtls_ecp_set_max_ops() which limits the maximum
+ * number of ECC operations a function may perform before pausing; see
+ * mbedtls_ecp_set_max_ops() for more information.
+ *
+ * This is useful in non-threaded environments if you want to avoid blocking
+ * for too long on ECC (and, hence, X.509 or SSL/TLS) operations.
+ *
+ * Uncomment this macro to enable restartable ECC computations.
+ *
+ * \note This option only works with the default software implementation of
+ * elliptic curve functionality. It is incompatible with
+ * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT, MBEDTLS_ECDSA_XXX_ALT
+ * and MBEDTLS_ECDH_LEGACY_CONTEXT.
+ */
+//#define MBEDTLS_ECP_RESTARTABLE
+
+/**
+ * \def MBEDTLS_ECDH_LEGACY_CONTEXT
+ *
+ * Use a backward compatible ECDH context.
+ *
+ * Mbed TLS supports two formats for ECDH contexts (#mbedtls_ecdh_context
+ * defined in `ecdh.h`). For most applications, the choice of format makes
+ * no difference, since all library functions can work with either format,
+ * except that the new format is incompatible with MBEDTLS_ECP_RESTARTABLE.
+
+ * The new format used when this option is disabled is smaller
+ * (56 bytes on a 32-bit platform). In future versions of the library, it
+ * will support alternative implementations of ECDH operations.
+ * The new format is incompatible with applications that access
+ * context fields directly and with restartable ECP operations.
+ *
+ * Define this macro if you enable MBEDTLS_ECP_RESTARTABLE or if you
+ * want to access ECDH context fields directly. Otherwise you should
+ * comment out this macro definition.
+ *
+ * This option has no effect if #MBEDTLS_ECDH_C is not enabled.
+ *
+ * \note This configuration option is experimental. Future versions of the
+ * library may modify the way the ECDH context layout is configured
+ * and may modify the layout of the new context type.
+ */
+#define MBEDTLS_ECDH_LEGACY_CONTEXT
+
+/**
+ * \def MBEDTLS_ECDSA_DETERMINISTIC
+ *
+ * Enable deterministic ECDSA (RFC 6979).
+ * Standard ECDSA is "fragile" in the sense that lack of entropy when signing
+ * may result in a compromise of the long-term signing key. This is avoided by
+ * the deterministic variant.
+ *
+ * Requires: MBEDTLS_HMAC_DRBG_C
+ *
+ * Comment this macro to disable deterministic ECDSA.
+ */
+#define MBEDTLS_ECDSA_DETERMINISTIC
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
+ *
+ * Enable the PSK based ciphersuite modes in SSL / TLS.
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA
+ */
+#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
+ *
+ * Enable the DHE-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_DHM_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA
+ *
+ * \warning Using DHE constitutes a security risk as it
+ * is not possible to validate custom DH parameters.
+ * If possible, it is recommended users should consider
+ * preferring other methods of key exchange.
+ * See dhm.h for more details.
+ *
+ */
+#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
+ *
+ * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA
+ */
+#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
+ *
+ * Enable the RSA-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,
+ * MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
+ */
+#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
+ *
+ * Enable the RSA-only based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,
+ * MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5
+ */
+#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
+ *
+ * Enable the DHE-RSA based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,
+ * MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
+ *
+ * \warning Using DHE constitutes a security risk as it
+ * is not possible to validate custom DH parameters.
+ * If possible, it is recommended users should consider
+ * preferring other methods of key exchange.
+ * See dhm.h for more details.
+ *
+ */
+#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
+ *
+ * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,
+ * MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA
+ */
+#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
+ *
+ * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C,
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
+ */
+#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
+ *
+ * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
+ */
+#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
+ *
+ * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ */
+#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
+ *
+ * Enable the ECJPAKE based ciphersuite modes in SSL / TLS.
+ *
+ * \warning This is currently experimental. EC J-PAKE support is based on the
+ * Thread v1.0.0 specification; incompatible changes to the specification
+ * might still happen. For this reason, this is disabled by default.
+ *
+ * Requires: MBEDTLS_ECJPAKE_C
+ * MBEDTLS_SHA256_C
+ * MBEDTLS_ECP_DP_SECP256R1_ENABLED
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
+ */
+//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
+
+/**
+ * \def MBEDTLS_PK_PARSE_EC_EXTENDED
+ *
+ * Enhance support for reading EC keys using variants of SEC1 not allowed by
+ * RFC 5915 and RFC 5480.
+ *
+ * Currently this means parsing the SpecifiedECDomain choice of EC
+ * parameters (only known groups are supported, not arbitrary domains, to
+ * avoid validation issues).
+ *
+ * Disable if you only need to support RFC 5915 + 5480 key formats.
+ */
+#define MBEDTLS_PK_PARSE_EC_EXTENDED
+
+/**
+ * \def MBEDTLS_ERROR_STRERROR_DUMMY
+ *
+ * Enable a dummy error function to make use of mbedtls_strerror() in
+ * third party libraries easier when MBEDTLS_ERROR_C is disabled
+ * (no effect when MBEDTLS_ERROR_C is enabled).
+ *
+ * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're
+ * not using mbedtls_strerror() or error_strerror() in your application.
+ *
+ * Disable if you run into name conflicts and want to really remove the
+ * mbedtls_strerror()
+ */
+// #define MBEDTLS_ERROR_STRERROR_DUMMY
+
+/**
+ * \def MBEDTLS_GENPRIME
+ *
+ * Enable the prime-number generation code.
+ *
+ * Requires: MBEDTLS_BIGNUM_C
+ */
+#define MBEDTLS_GENPRIME
+
+/**
+ * \def MBEDTLS_FS_IO
+ *
+ * Enable functions that use the filesystem.
+ */
+// #define MBEDTLS_FS_IO
+
+/**
+ * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
+ *
+ * Do not add default entropy sources. These are the platform specific,
+ * mbedtls_timing_hardclock and HAVEGE based poll functions.
+ *
+ * This is useful to have more control over the added entropy sources in an
+ * application.
+ *
+ * Uncomment this macro to prevent loading of default entropy functions.
+ */
+//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
+
+/**
+ * \def MBEDTLS_NO_PLATFORM_ENTROPY
+ *
+ * Do not use built-in platform entropy functions.
+ * This is useful if your platform does not support
+ * standards like the /dev/urandom or Windows CryptoAPI.
+ *
+ * Uncomment this macro to disable the built-in platform entropy functions.
+ */
+#define MBEDTLS_NO_PLATFORM_ENTROPY
+
+/**
+ * \def MBEDTLS_ENTROPY_FORCE_SHA256
+ *
+ * Force the entropy accumulator to use a SHA-256 accumulator instead of the
+ * default SHA-512 based one (if both are available).
+ *
+ * Requires: MBEDTLS_SHA256_C
+ *
+ * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option
+ * if you have performance concerns.
+ *
+ * This option is only useful if both MBEDTLS_SHA256_C and
+ * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used.
+ */
+//#define MBEDTLS_ENTROPY_FORCE_SHA256
+
+/**
+ * \def MBEDTLS_ENTROPY_NV_SEED
+ *
+ * Enable the non-volatile (NV) seed file-based entropy source.
+ * (Also enables the NV seed read/write functions in the platform layer)
+ *
+ * This is crucial (if not required) on systems that do not have a
+ * cryptographic entropy source (in hardware or kernel) available.
+ *
+ * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C
+ *
+ * \note The read/write functions that are used by the entropy source are
+ * determined in the platform layer, and can be modified at runtime and/or
+ * compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used.
+ *
+ * \note If you use the default implementation functions that read a seedfile
+ * with regular fopen(), please make sure you make a seedfile with the
+ * proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at
+ * least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from
+ * and written to or you will get an entropy source error! The default
+ * implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE
+ * bytes from the file.
+ *
+ * \note The entropy collector will write to the seed file before entropy is
+ * given to an external source, to update it.
+ */
+//#define MBEDTLS_ENTROPY_NV_SEED
+
+/**
+ * \def MBEDTLS_MEMORY_DEBUG
+ *
+ * Enable debugging of buffer allocator memory issues. Automatically prints
+ * (to stderr) all (fatal) messages on memory allocation issues. Enables
+ * function for 'debug output' of allocated memory.
+ *
+ * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C
+ *
+ * Uncomment this macro to let the buffer allocator print out error messages.
+ */
+//#define MBEDTLS_MEMORY_DEBUG
+
+/**
+ * \def MBEDTLS_MEMORY_BACKTRACE
+ *
+ * Include backtrace information with each allocated block.
+ *
+ * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C
+ * GLIBC-compatible backtrace() an backtrace_symbols() support
+ *
+ * Uncomment this macro to include backtrace information
+ */
+//#define MBEDTLS_MEMORY_BACKTRACE
+
+/**
+ * \def MBEDTLS_PK_RSA_ALT_SUPPORT
+ *
+ * Support external private RSA keys (eg from a HSM) in the PK layer.
+ *
+ * Comment this macro to disable support for external private RSA keys.
+ */
+// #define MBEDTLS_PK_RSA_ALT_SUPPORT
+
+/**
+ * \def MBEDTLS_PKCS1_V15
+ *
+ * Enable support for PKCS#1 v1.5 encoding.
+ *
+ * Requires: MBEDTLS_RSA_C
+ *
+ * This enables support for PKCS#1 v1.5 operations.
+ */
+#define MBEDTLS_PKCS1_V15
+
+/**
+ * \def MBEDTLS_PKCS1_V21
+ *
+ * Enable support for PKCS#1 v2.1 encoding.
+ *
+ * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C
+ *
+ * This enables support for RSAES-OAEP and RSASSA-PSS operations.
+ */
+#define MBEDTLS_PKCS1_V21
+
+/**
+ * \def MBEDTLS_PSA_CRYPTO_SPM
+ *
+ * When MBEDTLS_PSA_CRYPTO_SPM is defined, the code is built for SPM (Secure
+ * Partition Manager) integration which separates the code into two parts: a
+ * NSPE (Non-Secure Process Environment) and an SPE (Secure Process
+ * Environment).
+ *
+ * Module: library/psa_crypto.c
+ * Requires: MBEDTLS_PSA_CRYPTO_C
+ *
+ */
+//#define MBEDTLS_PSA_CRYPTO_SPM
+
+/**
+ * \def MBEDTLS_PSA_INJECT_ENTROPY
+ *
+ * Enable support for entropy injection at first boot. This feature is
+ * required on systems that do not have a built-in entropy source (TRNG).
+ * This feature is currently not supported on systems that have a built-in
+ * entropy source.
+ *
+ * Requires: MBEDTLS_PSA_CRYPTO_STORAGE_C, MBEDTLS_ENTROPY_NV_SEED
+ *
+ */
+//#define MBEDTLS_PSA_INJECT_ENTROPY
+
+/**
+ * \def MBEDTLS_RSA_NO_CRT
+ *
+ * Do not use the Chinese Remainder Theorem
+ * for the RSA private operation.
+ *
+ * Uncomment this macro to disable the use of CRT in RSA.
+ *
+ */
+//#define MBEDTLS_RSA_NO_CRT
+
+/**
+ * \def MBEDTLS_SELF_TEST
+ *
+ * Enable the checkup functions (*_self_test).
+ */
+#define MBEDTLS_SELF_TEST
+
+/**
+ * \def MBEDTLS_SHA256_SMALLER
+ *
+ * Enable an implementation of SHA-256 that has lower ROM footprint but also
+ * lower performance.
+ *
+ * The default implementation is meant to be a reasonnable compromise between
+ * performance and size. This version optimizes more aggressively for size at
+ * the expense of performance. Eg on Cortex-M4 it reduces the size of
+ * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about
+ * 30%.
+ *
+ * Uncomment to enable the smaller implementation of SHA256.
+ */
+//#define MBEDTLS_SHA256_SMALLER
+
+/**
+ * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES
+ *
+ * Enable sending of alert messages in case of encountered errors as per RFC.
+ * If you choose not to send the alert messages, mbed TLS can still communicate
+ * with other servers, only debugging of failures is harder.
+ *
+ * The advantage of not sending alert messages, is that no information is given
+ * about reasons for failures thus preventing adversaries of gaining intel.
+ *
+ * Enable sending of all alert messages
+ */
+#define MBEDTLS_SSL_ALL_ALERT_MESSAGES
+
+/**
+ * \def MBEDTLS_SSL_RECORD_CHECKING
+ *
+ * Enable the function mbedtls_ssl_check_record() which can be used to check
+ * the validity and authenticity of an incoming record, to verify that it has
+ * not been seen before. These checks are performed without modifying the
+ * externally visible state of the SSL context.
+ *
+ * See mbedtls_ssl_check_record() for more information.
+ *
+ * Uncomment to enable support for record checking.
+ */
+#define MBEDTLS_SSL_RECORD_CHECKING
+
+/**
+ * \def MBEDTLS_SSL_DTLS_CONNECTION_ID
+ *
+ * Enable support for the DTLS Connection ID extension
+ * (version draft-ietf-tls-dtls-connection-id-05,
+ * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05)
+ * which allows to identify DTLS connections across changes
+ * in the underlying transport.
+ *
+ * Setting this option enables the SSL APIs `mbedtls_ssl_set_cid()`,
+ * `mbedtls_ssl_get_peer_cid()` and `mbedtls_ssl_conf_cid()`.
+ * See the corresponding documentation for more information.
+ *
+ * \warning The Connection ID extension is still in draft state.
+ * We make no stability promises for the availability
+ * or the shape of the API controlled by this option.
+ *
+ * The maximum lengths of outgoing and incoming CIDs can be configured
+ * through the options
+ * - MBEDTLS_SSL_CID_OUT_LEN_MAX
+ * - MBEDTLS_SSL_CID_IN_LEN_MAX.
+ *
+ * Requires: MBEDTLS_SSL_PROTO_DTLS
+ *
+ * Uncomment to enable the Connection ID extension.
+ */
+//#define MBEDTLS_SSL_DTLS_CONNECTION_ID
+
+/**
+ * \def MBEDTLS_SSL_ASYNC_PRIVATE
+ *
+ * Enable asynchronous external private key operations in SSL. This allows
+ * you to configure an SSL connection to call an external cryptographic
+ * module to perform private key operations instead of performing the
+ * operation inside the library.
+ *
+ */
+//#define MBEDTLS_SSL_ASYNC_PRIVATE
+
+/**
+ * \def MBEDTLS_SSL_CONTEXT_SERIALIZATION
+ *
+ * Enable serialization of the TLS context structures, through use of the
+ * functions mbedtls_ssl_context_save() and mbedtls_ssl_context_load().
+ *
+ * This pair of functions allows one side of a connection to serialize the
+ * context associated with the connection, then free or re-use that context
+ * while the serialized state is persisted elsewhere, and finally deserialize
+ * that state to a live context for resuming read/write operations on the
+ * connection. From a protocol perspective, the state of the connection is
+ * unaffected, in particular this is entirely transparent to the peer.
+ *
+ * Note: this is distinct from TLS session resumption, which is part of the
+ * protocol and fully visible by the peer. TLS session resumption enables
+ * establishing new connections associated to a saved session with shorter,
+ * lighter handshakes, while context serialization is a local optimization in
+ * handling a single, potentially long-lived connection.
+ *
+ * Enabling these APIs makes some SSL structures larger, as 64 extra bytes are
+ * saved after the handshake to allow for more efficient serialization, so if
+ * you don't need this feature you'll save RAM by disabling it.
+ *
+ * Comment to disable the context serialization APIs.
+ */
+#define MBEDTLS_SSL_CONTEXT_SERIALIZATION
+
+/**
+ * \def MBEDTLS_SSL_DEBUG_ALL
+ *
+ * Enable the debug messages in SSL module for all issues.
+ * Debug messages have been disabled in some places to prevent timing
+ * attacks due to (unbalanced) debugging function calls.
+ *
+ * If you need all error reporting you should enable this during debugging,
+ * but remove this for production servers that should log as well.
+ *
+ * Uncomment this macro to report all debug messages on errors introducing
+ * a timing side-channel.
+ *
+ */
+//#define MBEDTLS_SSL_DEBUG_ALL
+
+/** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC
+ *
+ * Enable support for Encrypt-then-MAC, RFC 7366.
+ *
+ * This allows peers that both support it to use a more robust protection for
+ * ciphersuites using CBC, providing deep resistance against timing attacks
+ * on the padding or underlying cipher.
+ *
+ * This only affects CBC ciphersuites, and is useless if none is defined.
+ *
+ * Requires: MBEDTLS_SSL_PROTO_TLS1 or
+ * MBEDTLS_SSL_PROTO_TLS1_1 or
+ * MBEDTLS_SSL_PROTO_TLS1_2
+ *
+ * Comment this macro to disable support for Encrypt-then-MAC
+ */
+#define MBEDTLS_SSL_ENCRYPT_THEN_MAC
+
+/** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET
+ *
+ * Enable support for Extended Master Secret, aka Session Hash
+ * (draft-ietf-tls-session-hash-02).
+ *
+ * This was introduced as "the proper fix" to the Triple Handshake familiy of
+ * attacks, but it is recommended to always use it (even if you disable
+ * renegotiation), since it actually fixes a more fundamental issue in the
+ * original SSL/TLS design, and has implications beyond Triple Handshake.
+ *
+ * Requires: MBEDTLS_SSL_PROTO_TLS1 or
+ * MBEDTLS_SSL_PROTO_TLS1_1 or
+ * MBEDTLS_SSL_PROTO_TLS1_2
+ *
+ * Comment this macro to disable support for Extended Master Secret.
+ */
+#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET
+
+/**
+ * \def MBEDTLS_SSL_FALLBACK_SCSV
+ *
+ * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00).
+ *
+ * For servers, it is recommended to always enable this, unless you support
+ * only one version of TLS, or know for sure that none of your clients
+ * implements a fallback strategy.
+ *
+ * For clients, you only need this if you're using a fallback strategy, which
+ * is not recommended in the first place, unless you absolutely need it to
+ * interoperate with buggy (version-intolerant) servers.
+ *
+ * Comment this macro to disable support for FALLBACK_SCSV
+ */
+#define MBEDTLS_SSL_FALLBACK_SCSV
+
+/**
+ * \def MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
+ *
+ * This option controls the availability of the API mbedtls_ssl_get_peer_cert()
+ * giving access to the peer's certificate after completion of the handshake.
+ *
+ * Unless you need mbedtls_ssl_peer_cert() in your application, it is
+ * recommended to disable this option for reduced RAM usage.
+ *
+ * \note If this option is disabled, mbedtls_ssl_get_peer_cert() is still
+ * defined, but always returns \c NULL.
+ *
+ * \note This option has no influence on the protection against the
+ * triple handshake attack. Even if it is disabled, Mbed TLS will
+ * still ensure that certificates do not change during renegotiation,
+ * for exaple by keeping a hash of the peer's certificate.
+ *
+ * Comment this macro to disable storing the peer's certificate
+ * after the handshake.
+ */
+#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
+
+/**
+ * \def MBEDTLS_SSL_HW_RECORD_ACCEL
+ *
+ * Enable hooking functions in SSL module for hardware acceleration of
+ * individual records.
+ *
+ * Uncomment this macro to enable hooking functions.
+ */
+//#define MBEDTLS_SSL_HW_RECORD_ACCEL
+
+/**
+ * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING
+ *
+ * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0.
+ *
+ * This is a countermeasure to the BEAST attack, which also minimizes the risk
+ * of interoperability issues compared to sending 0-length records.
+ *
+ * Comment this macro to disable 1/n-1 record splitting.
+ */
+#define MBEDTLS_SSL_CBC_RECORD_SPLITTING
+
+/**
+ * \def MBEDTLS_SSL_RENEGOTIATION
+ *
+ * Enable support for TLS renegotiation.
+ *
+ * The two main uses of renegotiation are (1) refresh keys on long-lived
+ * connections and (2) client authentication after the initial handshake.
+ * If you don't need renegotiation, it's probably better to disable it, since
+ * it has been associated with security issues in the past and is easy to
+ * misuse/misunderstand.
+ *
+ * Comment this to disable support for renegotiation.
+ *
+ * \note Even if this option is disabled, both client and server are aware
+ * of the Renegotiation Indication Extension (RFC 5746) used to
+ * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1).
+ * (See \c mbedtls_ssl_conf_legacy_renegotiation for the
+ * configuration of this extension).
+ *
+ */
+#define MBEDTLS_SSL_RENEGOTIATION
+
+/**
+ * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
+ *
+ * Enable support for receiving and parsing SSLv2 Client Hello messages for the
+ * SSL Server module (MBEDTLS_SSL_SRV_C).
+ *
+ * Uncomment this macro to enable support for SSLv2 Client Hello messages.
+ */
+//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
+
+/**
+ * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
+ *
+ * Pick the ciphersuite according to the client's preferences rather than ours
+ * in the SSL Server module (MBEDTLS_SSL_SRV_C).
+ *
+ * Uncomment this macro to respect client's ciphersuite order
+ */
+//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
+
+/**
+ * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
+ *
+ * Enable support for RFC 6066 max_fragment_length extension in SSL.
+ *
+ * Comment this macro to disable support for the max_fragment_length extension
+ */
+#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
+
+/**
+ * \def MBEDTLS_SSL_PROTO_SSL3
+ *
+ * Enable support for SSL 3.0.
+ *
+ * Requires: MBEDTLS_MD5_C
+ * MBEDTLS_SHA1_C
+ *
+ * Comment this macro to disable support for SSL 3.0
+ */
+//#define MBEDTLS_SSL_PROTO_SSL3
+
+/**
+ * \def MBEDTLS_SSL_PROTO_TLS1
+ *
+ * Enable support for TLS 1.0.
+ *
+ * Requires: MBEDTLS_MD5_C
+ * MBEDTLS_SHA1_C
+ *
+ * Comment this macro to disable support for TLS 1.0
+ */
+#define MBEDTLS_SSL_PROTO_TLS1
+
+/**
+ * \def MBEDTLS_SSL_PROTO_TLS1_1
+ *
+ * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled).
+ *
+ * Requires: MBEDTLS_MD5_C
+ * MBEDTLS_SHA1_C
+ *
+ * Comment this macro to disable support for TLS 1.1 / DTLS 1.0
+ */
+#define MBEDTLS_SSL_PROTO_TLS1_1
+
+/**
+ * \def MBEDTLS_SSL_PROTO_TLS1_2
+ *
+ * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled).
+ *
+ * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C
+ * (Depends on ciphersuites)
+ *
+ * Comment this macro to disable support for TLS 1.2 / DTLS 1.2
+ */
+#define MBEDTLS_SSL_PROTO_TLS1_2
+
+/**
+ * \def MBEDTLS_SSL_PROTO_DTLS
+ *
+ * Enable support for DTLS (all available versions).
+ *
+ * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0,
+ * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2.
+ *
+ * Requires: MBEDTLS_SSL_PROTO_TLS1_1
+ * or MBEDTLS_SSL_PROTO_TLS1_2
+ *
+ * Comment this macro to disable support for DTLS
+ */
+#define MBEDTLS_SSL_PROTO_DTLS
+
+/**
+ * \def MBEDTLS_SSL_ALPN
+ *
+ * Enable support for RFC 7301 Application Layer Protocol Negotiation.
+ *
+ * Comment this macro to disable support for ALPN.
+ */
+#define MBEDTLS_SSL_ALPN
+
+/**
+ * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY
+ *
+ * Enable support for the anti-replay mechanism in DTLS.
+ *
+ * Requires: MBEDTLS_SSL_TLS_C
+ * MBEDTLS_SSL_PROTO_DTLS
+ *
+ * \warning Disabling this is often a security risk!
+ * See mbedtls_ssl_conf_dtls_anti_replay() for details.
+ *
+ * Comment this to disable anti-replay in DTLS.
+ */
+#define MBEDTLS_SSL_DTLS_ANTI_REPLAY
+
+/**
+ * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY
+ *
+ * Enable support for HelloVerifyRequest on DTLS servers.
+ *
+ * This feature is highly recommended to prevent DTLS servers being used as
+ * amplifiers in DoS attacks against other hosts. It should always be enabled
+ * unless you know for sure amplification cannot be a problem in the
+ * environment in which your server operates.
+ *
+ * \warning Disabling this can ba a security risk! (see above)
+ *
+ * Requires: MBEDTLS_SSL_PROTO_DTLS
+ *
+ * Comment this to disable support for HelloVerifyRequest.
+ */
+#define MBEDTLS_SSL_DTLS_HELLO_VERIFY
+
+/**
+ * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
+ *
+ * Enable server-side support for clients that reconnect from the same port.
+ *
+ * Some clients unexpectedly close the connection and try to reconnect using the
+ * same source port. This needs special support from the server to handle the
+ * new connection securely, as described in section 4.2.8 of RFC 6347. This
+ * flag enables that support.
+ *
+ * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY
+ *
+ * Comment this to disable support for clients reusing the source port.
+ */
+#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
+
+/**
+ * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT
+ *
+ * Enable support for a limit of records with bad MAC.
+ *
+ * See mbedtls_ssl_conf_dtls_badmac_limit().
+ *
+ * Requires: MBEDTLS_SSL_PROTO_DTLS
+ */
+#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT
+
+/**
+ * \def MBEDTLS_SSL_SESSION_TICKETS
+ *
+ * Enable support for RFC 5077 session tickets in SSL.
+ * Client-side, provides full support for session tickets (maintenance of a
+ * session store remains the responsibility of the application, though).
+ * Server-side, you also need to provide callbacks for writing and parsing
+ * tickets, including authenticated encryption and key management. Example
+ * callbacks are provided by MBEDTLS_SSL_TICKET_C.
+ *
+ * Comment this macro to disable support for SSL session tickets
+ */
+#define MBEDTLS_SSL_SESSION_TICKETS
+
+/**
+ * \def MBEDTLS_SSL_EXPORT_KEYS
+ *
+ * Enable support for exporting key block and master secret.
+ * This is required for certain users of TLS, e.g. EAP-TLS.
+ *
+ * Comment this macro to disable support for key export
+ */
+#define MBEDTLS_SSL_EXPORT_KEYS
+
+/**
+ * \def MBEDTLS_SSL_SERVER_NAME_INDICATION
+ *
+ * Enable support for RFC 6066 server name indication (SNI) in SSL.
+ *
+ * Requires: MBEDTLS_X509_CRT_PARSE_C
+ *
+ * Comment this macro to disable support for server name indication in SSL
+ */
+#define MBEDTLS_SSL_SERVER_NAME_INDICATION
+
+/**
+ * \def MBEDTLS_SSL_TRUNCATED_HMAC
+ *
+ * Enable support for RFC 6066 truncated HMAC in SSL.
+ *
+ * Comment this macro to disable support for truncated HMAC in SSL
+ */
+#define MBEDTLS_SSL_TRUNCATED_HMAC
+
+/**
+ * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT
+ *
+ * Fallback to old (pre-2.7), non-conforming implementation of the truncated
+ * HMAC extension which also truncates the HMAC key. Note that this option is
+ * only meant for a transitory upgrade period and is likely to be removed in
+ * a future version of the library.
+ *
+ * \warning The old implementation is non-compliant and has a security weakness
+ * (2^80 brute force attack on the HMAC key used for a single,
+ * uninterrupted connection). This should only be enabled temporarily
+ * when (1) the use of truncated HMAC is essential in order to save
+ * bandwidth, and (2) the peer is an Mbed TLS stack that doesn't use
+ * the fixed implementation yet (pre-2.7).
+ *
+ * \deprecated This option is deprecated and will likely be removed in a
+ * future version of Mbed TLS.
+ *
+ * Uncomment to fallback to old, non-compliant truncated HMAC implementation.
+ *
+ * Requires: MBEDTLS_SSL_TRUNCATED_HMAC
+ */
+//#define MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT
+
+/**
+ * \def MBEDTLS_THREADING_ALT
+ *
+ * Provide your own alternate threading implementation.
+ *
+ * Requires: MBEDTLS_THREADING_C
+ *
+ * Uncomment this to allow your own alternate threading implementation.
+ */
+//#define MBEDTLS_THREADING_ALT
+
+/**
+ * \def MBEDTLS_THREADING_PTHREAD
+ *
+ * Enable the pthread wrapper layer for the threading layer.
+ *
+ * Requires: MBEDTLS_THREADING_C
+ *
+ * Uncomment this to enable pthread mutexes.
+ */
+//#define MBEDTLS_THREADING_PTHREAD
+
+/**
+ * \def MBEDTLS_USE_PSA_CRYPTO
+ *
+ * Make the X.509 and TLS library use PSA for cryptographic operations, and
+ * enable new APIs for using keys handled by PSA Crypto.
+ *
+ * \note Development of this option is currently in progress, and parts
+ * of the X.509 and TLS modules are not ported to PSA yet. However, these parts
+ * will still continue to work as usual, so enabling this option should not
+ * break backwards compatibility.
+ *
+ * \warning The PSA Crypto API is in beta stage. While you're welcome to
+ * experiment using it, incompatible API changes are still possible, and some
+ * parts may not have reached the same quality as the rest of Mbed TLS yet.
+ *
+ * \warning This option enables new Mbed TLS APIs that are dependent on the
+ * PSA Crypto API, so can't come with the same stability guarantees as the
+ * rest of the Mbed TLS APIs. You're welcome to experiment with them, but for
+ * now, access to these APIs is opt-in (via enabling the present option), in
+ * order to clearly differentiate them from the stable Mbed TLS APIs.
+ *
+ * Requires: MBEDTLS_PSA_CRYPTO_C.
+ *
+ * Uncomment this to enable internal use of PSA Crypto and new associated APIs.
+ */
+//#define MBEDTLS_USE_PSA_CRYPTO
+
+/**
+ * \def MBEDTLS_VERSION_FEATURES
+ *
+ * Allow run-time checking of compile-time enabled features. Thus allowing users
+ * to check at run-time if the library is for instance compiled with threading
+ * support via mbedtls_version_check_feature().
+ *
+ * Requires: MBEDTLS_VERSION_C
+ *
+ * Comment this to disable run-time checking and save ROM space
+ */
+// #define MBEDTLS_VERSION_FEATURES
+
+/**
+ * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
+ *
+ * If set, the X509 parser will not break-off when parsing an X509 certificate
+ * and encountering an extension in a v1 or v2 certificate.
+ *
+ * Uncomment to prevent an error.
+ */
+//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
+
+/**
+ * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
+ *
+ * If set, the X509 parser will not break-off when parsing an X509 certificate
+ * and encountering an unknown critical extension.
+ *
+ * \warning Depending on your PKI use, enabling this can be a security risk!
+ *
+ * Uncomment to prevent an error.
+ */
+//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
+
+/**
+ * \def MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
+ *
+ * If set, this enables the X.509 API `mbedtls_x509_crt_verify_with_ca_cb()`
+ * and the SSL API `mbedtls_ssl_conf_ca_cb()` which allow users to configure
+ * the set of trusted certificates through a callback instead of a linked
+ * list.
+ *
+ * This is useful for example in environments where a large number of trusted
+ * certificates is present and storing them in a linked list isn't efficient
+ * enough, or when the set of trusted certificates changes frequently.
+ *
+ * See the documentation of `mbedtls_x509_crt_verify_with_ca_cb()` and
+ * `mbedtls_ssl_conf_ca_cb()` for more information.
+ *
+ * Uncomment to enable trusted certificate callbacks.
+ */
+//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
+
+/**
+ * \def MBEDTLS_X509_CHECK_KEY_USAGE
+ *
+ * Enable verification of the keyUsage extension (CA and leaf certificates).
+ *
+ * Disabling this avoids problems with mis-issued and/or misused
+ * (intermediate) CA and leaf certificates.
+ *
+ * \warning Depending on your PKI use, disabling this can be a security risk!
+ *
+ * Comment to skip keyUsage checking for both CA and leaf certificates.
+ */
+#define MBEDTLS_X509_CHECK_KEY_USAGE
+
+/**
+ * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE
+ *
+ * Enable verification of the extendedKeyUsage extension (leaf certificates).
+ *
+ * Disabling this avoids problems with mis-issued and/or misused certificates.
+ *
+ * \warning Depending on your PKI use, disabling this can be a security risk!
+ *
+ * Comment to skip extendedKeyUsage checking for certificates.
+ */
+#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE
+
+/**
+ * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT
+ *
+ * Enable parsing and verification of X.509 certificates, CRLs and CSRS
+ * signed with RSASSA-PSS (aka PKCS#1 v2.1).
+ *
+ * Comment this macro to disallow using RSASSA-PSS in certificates.
+ */
+#define MBEDTLS_X509_RSASSA_PSS_SUPPORT
+
+/**
+ * \def MBEDTLS_ZLIB_SUPPORT
+ *
+ * If set, the SSL/TLS module uses ZLIB to support compression and
+ * decompression of packet data.
+ *
+ * \warning TLS-level compression MAY REDUCE SECURITY! See for example the
+ * CRIME attack. Before enabling this option, you should examine with care if
+ * CRIME or similar exploits may be applicable to your use case.
+ *
+ * \note Currently compression can't be used with DTLS.
+ *
+ * \deprecated This feature is deprecated and will be removed
+ * in the next major revision of the library.
+ *
+ * Used in: library/ssl_tls.c
+ * library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * This feature requires zlib library and headers to be present.
+ *
+ * Uncomment to enable use of ZLIB
+ */
+//#define MBEDTLS_ZLIB_SUPPORT
+/* \} name SECTION: mbed TLS feature support */
+
+/**
+ * \name SECTION: mbed TLS modules
+ *
+ * This section enables or disables entire modules in mbed TLS
+ * \{
+ */
+
+/**
+ * \def MBEDTLS_AESNI_C
+ *
+ * Enable AES-NI support on x86-64.
+ *
+ * Module: library/aesni.c
+ * Caller: library/aes.c
+ *
+ * Requires: MBEDTLS_HAVE_ASM
+ *
+ * This modules adds support for the AES-NI instructions on x86-64
+ */
+#define MBEDTLS_AESNI_C
+
+/**
+ * \def MBEDTLS_AES_C
+ *
+ * Enable the AES block cipher.
+ *
+ * Module: library/aes.c
+ * Caller: library/cipher.c
+ * library/pem.c
+ * library/ctr_drbg.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA
+ *
+ * PEM_PARSE uses AES for decrypting encrypted keys.
+ */
+#define MBEDTLS_AES_C
+
+/**
+ * \def MBEDTLS_ARC4_C
+ *
+ * Enable the ARCFOUR stream cipher.
+ *
+ * Module: library/arc4.c
+ * Caller: library/cipher.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5
+ * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA
+ *
+ * \warning ARC4 is considered a weak cipher and its use constitutes a
+ * security risk. If possible, we recommend avoidng dependencies on
+ * it, and considering stronger ciphers instead.
+ *
+ */
+#define MBEDTLS_ARC4_C
+
+/**
+ * \def MBEDTLS_ASN1_PARSE_C
+ *
+ * Enable the generic ASN1 parser.
+ *
+ * Module: library/asn1.c
+ * Caller: library/x509.c
+ * library/dhm.c
+ * library/pkcs12.c
+ * library/pkcs5.c
+ * library/pkparse.c
+ */
+#define MBEDTLS_ASN1_PARSE_C
+
+/**
+ * \def MBEDTLS_ASN1_WRITE_C
+ *
+ * Enable the generic ASN1 writer.
+ *
+ * Module: library/asn1write.c
+ * Caller: library/ecdsa.c
+ * library/pkwrite.c
+ * library/x509_create.c
+ * library/x509write_crt.c
+ * library/x509write_csr.c
+ */
+#define MBEDTLS_ASN1_WRITE_C
+
+/**
+ * \def MBEDTLS_BASE64_C
+ *
+ * Enable the Base64 module.
+ *
+ * Module: library/base64.c
+ * Caller: library/pem.c
+ *
+ * This module is required for PEM support (required by X.509).
+ */
+#define MBEDTLS_BASE64_C
+
+/**
+ * \def MBEDTLS_BIGNUM_C
+ *
+ * Enable the multi-precision integer library.
+ *
+ * Module: library/bignum.c
+ * Caller: library/dhm.c
+ * library/ecp.c
+ * library/ecdsa.c
+ * library/rsa.c
+ * library/rsa_internal.c
+ * library/ssl_tls.c
+ *
+ * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support.
+ */
+#define MBEDTLS_BIGNUM_C
+
+/**
+ * \def MBEDTLS_BLOWFISH_C
+ *
+ * Enable the Blowfish block cipher.
+ *
+ * Module: library/blowfish.c
+ */
+#define MBEDTLS_BLOWFISH_C
+
+/**
+ * \def MBEDTLS_CAMELLIA_C
+ *
+ * Enable the Camellia block cipher.
+ *
+ * Module: library/camellia.c
+ * Caller: library/cipher.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ */
+#define MBEDTLS_CAMELLIA_C
+
+/**
+ * \def MBEDTLS_ARIA_C
+ *
+ * Enable the ARIA block cipher.
+ *
+ * Module: library/aria.c
+ * Caller: library/cipher.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ *
+ * MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384
+ */
+//#define MBEDTLS_ARIA_C
+
+/**
+ * \def MBEDTLS_CCM_C
+ *
+ * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher.
+ *
+ * Module: library/ccm.c
+ *
+ * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C
+ *
+ * This module enables the AES-CCM ciphersuites, if other requisites are
+ * enabled as well.
+ */
+#define MBEDTLS_CCM_C
+
+/**
+ * \def MBEDTLS_CERTS_C
+ *
+ * Enable the test certificates.
+ *
+ * Module: library/certs.c
+ * Caller:
+ *
+ * This module is used for testing (ssl_client/server).
+ */
+#define MBEDTLS_CERTS_C
+
+/**
+ * \def MBEDTLS_CHACHA20_C
+ *
+ * Enable the ChaCha20 stream cipher.
+ *
+ * Module: library/chacha20.c
+ */
+#define MBEDTLS_CHACHA20_C
+
+/**
+ * \def MBEDTLS_CHACHAPOLY_C
+ *
+ * Enable the ChaCha20-Poly1305 AEAD algorithm.
+ *
+ * Module: library/chachapoly.c
+ *
+ * This module requires: MBEDTLS_CHACHA20_C, MBEDTLS_POLY1305_C
+ */
+#define MBEDTLS_CHACHAPOLY_C
+
+/**
+ * \def MBEDTLS_CIPHER_C
+ *
+ * Enable the generic cipher layer.
+ *
+ * Module: library/cipher.c
+ * Caller: library/ssl_tls.c
+ *
+ * Uncomment to enable generic cipher wrappers.
+ */
+#define MBEDTLS_CIPHER_C
+
+/**
+ * \def MBEDTLS_CMAC_C
+ *
+ * Enable the CMAC (Cipher-based Message Authentication Code) mode for block
+ * ciphers.
+ *
+ * Module: library/cmac.c
+ *
+ * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C
+ *
+ */
+//#define MBEDTLS_CMAC_C
+
+/**
+ * \def MBEDTLS_CTR_DRBG_C
+ *
+ * Enable the CTR_DRBG AES-based random generator.
+ * The CTR_DRBG generator uses AES-256 by default.
+ * To use AES-128 instead, enable MBEDTLS_CTR_DRBG_USE_128_BIT_KEY below.
+ *
+ * Module: library/ctr_drbg.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_AES_C
+ *
+ * This module provides the CTR_DRBG AES random number generator.
+ */
+#define MBEDTLS_CTR_DRBG_C
+
+/**
+ * \def MBEDTLS_DEBUG_C
+ *
+ * Enable the debug functions.
+ *
+ * Module: library/debug.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ * library/ssl_tls.c
+ *
+ * This module provides debugging functions.
+ */
+#define MBEDTLS_DEBUG_C
+
+/**
+ * \def MBEDTLS_DES_C
+ *
+ * Enable the DES block cipher.
+ *
+ * Module: library/des.c
+ * Caller: library/pem.c
+ * library/cipher.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA
+ *
+ * PEM_PARSE uses DES/3DES for decrypting encrypted keys.
+ *
+ * \warning DES is considered a weak cipher and its use constitutes a
+ * security risk. We recommend considering stronger ciphers instead.
+ */
+#define MBEDTLS_DES_C
+
+/**
+ * \def MBEDTLS_DHM_C
+ *
+ * Enable the Diffie-Hellman-Merkle module.
+ *
+ * Module: library/dhm.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * This module is used by the following key exchanges:
+ * DHE-RSA, DHE-PSK
+ *
+ * \warning Using DHE constitutes a security risk as it
+ * is not possible to validate custom DH parameters.
+ * If possible, it is recommended users should consider
+ * preferring other methods of key exchange.
+ * See dhm.h for more details.
+ *
+ */
+#define MBEDTLS_DHM_C
+
+/**
+ * \def MBEDTLS_ECDH_C
+ *
+ * Enable the elliptic curve Diffie-Hellman library.
+ *
+ * Module: library/ecdh.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * This module is used by the following key exchanges:
+ * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK
+ *
+ * Requires: MBEDTLS_ECP_C
+ */
+#define MBEDTLS_ECDH_C
+
+/**
+ * \def MBEDTLS_ECDSA_C
+ *
+ * Enable the elliptic curve DSA library.
+ *
+ * Module: library/ecdsa.c
+ * Caller:
+ *
+ * This module is used by the following key exchanges:
+ * ECDHE-ECDSA
+ *
+ * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C
+ */
+#define MBEDTLS_ECDSA_C
+
+/**
+ * \def MBEDTLS_ECJPAKE_C
+ *
+ * Enable the elliptic curve J-PAKE library.
+ *
+ * \warning This is currently experimental. EC J-PAKE support is based on the
+ * Thread v1.0.0 specification; incompatible changes to the specification
+ * might still happen. For this reason, this is disabled by default.
+ *
+ * Module: library/ecjpake.c
+ * Caller:
+ *
+ * This module is used by the following key exchanges:
+ * ECJPAKE
+ *
+ * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C
+ */
+//#define MBEDTLS_ECJPAKE_C
+
+/**
+ * \def MBEDTLS_ECP_C
+ *
+ * Enable the elliptic curve over GF(p) library.
+ *
+ * Module: library/ecp.c
+ * Caller: library/ecdh.c
+ * library/ecdsa.c
+ * library/ecjpake.c
+ *
+ * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED
+ */
+#define MBEDTLS_ECP_C
+
+/**
+ * \def MBEDTLS_ENTROPY_C
+ *
+ * Enable the platform-specific entropy code.
+ *
+ * Module: library/entropy.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C
+ *
+ * This module provides a generic entropy pool
+ */
+#define MBEDTLS_ENTROPY_C
+
+/**
+ * \def MBEDTLS_ERROR_C
+ *
+ * Enable error code to error string conversion.
+ *
+ * Module: library/error.c
+ * Caller:
+ *
+ * This module enables mbedtls_strerror().
+ */
+// #define MBEDTLS_ERROR_C
+
+/**
+ * \def MBEDTLS_GCM_C
+ *
+ * Enable the Galois/Counter Mode (GCM) for AES.
+ *
+ * Module: library/gcm.c
+ *
+ * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C
+ *
+ * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other
+ * requisites are enabled as well.
+ */
+#define MBEDTLS_GCM_C
+
+/**
+ * \def MBEDTLS_HAVEGE_C
+ *
+ * Enable the HAVEGE random generator.
+ *
+ * Warning: the HAVEGE random generator is not suitable for virtualized
+ * environments
+ *
+ * Warning: the HAVEGE random generator is dependent on timing and specific
+ * processor traits. It is therefore not advised to use HAVEGE as
+ * your applications primary random generator or primary entropy pool
+ * input. As a secondary input to your entropy pool, it IS able add
+ * the (limited) extra entropy it provides.
+ *
+ * Module: library/havege.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_TIMING_C
+ *
+ * Uncomment to enable the HAVEGE random generator.
+ */
+//#define MBEDTLS_HAVEGE_C
+
+/**
+ * \def MBEDTLS_HKDF_C
+ *
+ * Enable the HKDF algorithm (RFC 5869).
+ *
+ * Module: library/hkdf.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_MD_C
+ *
+ * This module adds support for the Hashed Message Authentication Code
+ * (HMAC)-based key derivation function (HKDF).
+ */
+#define MBEDTLS_HKDF_C
+
+/**
+ * \def MBEDTLS_HMAC_DRBG_C
+ *
+ * Enable the HMAC_DRBG random generator.
+ *
+ * Module: library/hmac_drbg.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_MD_C
+ *
+ * Uncomment to enable the HMAC_DRBG random number geerator.
+ */
+#define MBEDTLS_HMAC_DRBG_C
+
+/**
+ * \def MBEDTLS_NIST_KW_C
+ *
+ * Enable the Key Wrapping mode for 128-bit block ciphers,
+ * as defined in NIST SP 800-38F. Only KW and KWP modes
+ * are supported. At the moment, only AES is approved by NIST.
+ *
+ * Module: library/nist_kw.c
+ *
+ * Requires: MBEDTLS_AES_C and MBEDTLS_CIPHER_C
+ */
+//#define MBEDTLS_NIST_KW_C
+
+/**
+ * \def MBEDTLS_MD_C
+ *
+ * Enable the generic message digest layer.
+ *
+ * Module: library/md.c
+ * Caller:
+ *
+ * Uncomment to enable generic message digest wrappers.
+ */
+#define MBEDTLS_MD_C
+
+/**
+ * \def MBEDTLS_MD2_C
+ *
+ * Enable the MD2 hash algorithm.
+ *
+ * Module: library/md2.c
+ * Caller:
+ *
+ * Uncomment to enable support for (rare) MD2-signed X.509 certs.
+ *
+ * \warning MD2 is considered a weak message digest and its use constitutes a
+ * security risk. If possible, we recommend avoiding dependencies on
+ * it, and considering stronger message digests instead.
+ *
+ */
+//#define MBEDTLS_MD2_C
+
+/**
+ * \def MBEDTLS_MD4_C
+ *
+ * Enable the MD4 hash algorithm.
+ *
+ * Module: library/md4.c
+ * Caller:
+ *
+ * Uncomment to enable support for (rare) MD4-signed X.509 certs.
+ *
+ * \warning MD4 is considered a weak message digest and its use constitutes a
+ * security risk. If possible, we recommend avoiding dependencies on
+ * it, and considering stronger message digests instead.
+ *
+ */
+//#define MBEDTLS_MD4_C
+
+/**
+ * \def MBEDTLS_MD5_C
+ *
+ * Enable the MD5 hash algorithm.
+ *
+ * Module: library/md5.c
+ * Caller: library/md.c
+ * library/pem.c
+ * library/ssl_tls.c
+ *
+ * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2
+ * depending on the handshake parameters. Further, it is used for checking
+ * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded
+ * encrypted keys.
+ *
+ * \warning MD5 is considered a weak message digest and its use constitutes a
+ * security risk. If possible, we recommend avoiding dependencies on
+ * it, and considering stronger message digests instead.
+ *
+ */
+#define MBEDTLS_MD5_C
+
+/**
+ * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C
+ *
+ * Enable the buffer allocator implementation that makes use of a (stack)
+ * based buffer to 'allocate' dynamic memory. (replaces calloc() and free()
+ * calls)
+ *
+ * Module: library/memory_buffer_alloc.c
+ *
+ * Requires: MBEDTLS_PLATFORM_C
+ * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS)
+ *
+ * Enable this module to enable the buffer memory allocator.
+ */
+//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
+
+/**
+ * \def MBEDTLS_NET_C
+ *
+ * Enable the TCP and UDP over IPv6/IPv4 networking routines.
+ *
+ * \note This module only works on POSIX/Unix (including Linux, BSD and OS X)
+ * and Windows. For other platforms, you'll want to disable it, and write your
+ * own networking callbacks to be passed to \c mbedtls_ssl_set_bio().
+ *
+ * \note See also our Knowledge Base article about porting to a new
+ * environment:
+ * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS
+ *
+ * Module: library/net_sockets.c
+ *
+ * This module provides networking routines.
+ */
+// #define MBEDTLS_NET_C
+
+/**
+ * \def MBEDTLS_OID_C
+ *
+ * Enable the OID database.
+ *
+ * Module: library/oid.c
+ * Caller: library/asn1write.c
+ * library/pkcs5.c
+ * library/pkparse.c
+ * library/pkwrite.c
+ * library/rsa.c
+ * library/x509.c
+ * library/x509_create.c
+ * library/x509_crl.c
+ * library/x509_crt.c
+ * library/x509_csr.c
+ * library/x509write_crt.c
+ * library/x509write_csr.c
+ *
+ * This modules translates between OIDs and internal values.
+ */
+#define MBEDTLS_OID_C
+
+/**
+ * \def MBEDTLS_PADLOCK_C
+ *
+ * Enable VIA Padlock support on x86.
+ *
+ * Module: library/padlock.c
+ * Caller: library/aes.c
+ *
+ * Requires: MBEDTLS_HAVE_ASM
+ *
+ * This modules adds support for the VIA PadLock on x86.
+ */
+#define MBEDTLS_PADLOCK_C
+
+/**
+ * \def MBEDTLS_PEM_PARSE_C
+ *
+ * Enable PEM decoding / parsing.
+ *
+ * Module: library/pem.c
+ * Caller: library/dhm.c
+ * library/pkparse.c
+ * library/x509_crl.c
+ * library/x509_crt.c
+ * library/x509_csr.c
+ *
+ * Requires: MBEDTLS_BASE64_C
+ *
+ * This modules adds support for decoding / parsing PEM files.
+ */
+#define MBEDTLS_PEM_PARSE_C
+
+/**
+ * \def MBEDTLS_PEM_WRITE_C
+ *
+ * Enable PEM encoding / writing.
+ *
+ * Module: library/pem.c
+ * Caller: library/pkwrite.c
+ * library/x509write_crt.c
+ * library/x509write_csr.c
+ *
+ * Requires: MBEDTLS_BASE64_C
+ *
+ * This modules adds support for encoding / writing PEM files.
+ */
+#define MBEDTLS_PEM_WRITE_C
+
+/**
+ * \def MBEDTLS_PK_C
+ *
+ * Enable the generic public (asymetric) key layer.
+ *
+ * Module: library/pk.c
+ * Caller: library/ssl_tls.c
+ * library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C
+ *
+ * Uncomment to enable generic public key wrappers.
+ */
+#define MBEDTLS_PK_C
+
+/**
+ * \def MBEDTLS_PK_PARSE_C
+ *
+ * Enable the generic public (asymetric) key parser.
+ *
+ * Module: library/pkparse.c
+ * Caller: library/x509_crt.c
+ * library/x509_csr.c
+ *
+ * Requires: MBEDTLS_PK_C
+ *
+ * Uncomment to enable generic public key parse functions.
+ */
+#define MBEDTLS_PK_PARSE_C
+
+/**
+ * \def MBEDTLS_PK_WRITE_C
+ *
+ * Enable the generic public (asymetric) key writer.
+ *
+ * Module: library/pkwrite.c
+ * Caller: library/x509write.c
+ *
+ * Requires: MBEDTLS_PK_C
+ *
+ * Uncomment to enable generic public key write functions.
+ */
+#define MBEDTLS_PK_WRITE_C
+
+/**
+ * \def MBEDTLS_PKCS5_C
+ *
+ * Enable PKCS#5 functions.
+ *
+ * Module: library/pkcs5.c
+ *
+ * Requires: MBEDTLS_MD_C
+ *
+ * This module adds support for the PKCS#5 functions.
+ */
+#define MBEDTLS_PKCS5_C
+
+/**
+ * \def MBEDTLS_PKCS11_C
+ *
+ * Enable wrapper for PKCS#11 smartcard support.
+ *
+ * Module: library/pkcs11.c
+ * Caller: library/pk.c
+ *
+ * Requires: MBEDTLS_PK_C
+ *
+ * This module enables SSL/TLS PKCS #11 smartcard support.
+ * Requires the presence of the PKCS#11 helper library (libpkcs11-helper)
+ */
+//#define MBEDTLS_PKCS11_C
+
+/**
+ * \def MBEDTLS_PKCS12_C
+ *
+ * Enable PKCS#12 PBE functions.
+ * Adds algorithms for parsing PKCS#8 encrypted private keys
+ *
+ * Module: library/pkcs12.c
+ * Caller: library/pkparse.c
+ *
+ * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C
+ * Can use: MBEDTLS_ARC4_C
+ *
+ * This module enables PKCS#12 functions.
+ */
+#define MBEDTLS_PKCS12_C
+
+/**
+ * \def MBEDTLS_PLATFORM_C
+ *
+ * Enable the platform abstraction layer that allows you to re-assign
+ * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit().
+ *
+ * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT
+ * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned
+ * above to be specified at runtime or compile time respectively.
+ *
+ * \note This abstraction layer must be enabled on Windows (including MSYS2)
+ * as other module rely on it for a fixed snprintf implementation.
+ *
+ * Module: library/platform.c
+ * Caller: Most other .c files
+ *
+ * This module enables abstraction of common (libc) functions.
+ */
+#define MBEDTLS_PLATFORM_C
+
+/**
+ * \def MBEDTLS_POLY1305_C
+ *
+ * Enable the Poly1305 MAC algorithm.
+ *
+ * Module: library/poly1305.c
+ * Caller: library/chachapoly.c
+ */
+#define MBEDTLS_POLY1305_C
+
+/**
+ * \def MBEDTLS_PSA_CRYPTO_C
+ *
+ * Enable the Platform Security Architecture cryptography API.
+ *
+ * \warning The PSA Crypto API is still beta status. While you're welcome to
+ * experiment using it, incompatible API changes are still possible, and some
+ * parts may not have reached the same quality as the rest of Mbed TLS yet.
+ *
+ * Module: crypto/library/psa_crypto.c
+ *
+ * Requires: MBEDTLS_CTR_DRBG_C, MBEDTLS_ENTROPY_C
+ *
+ */
+#define MBEDTLS_PSA_CRYPTO_C
+
+/**
+ * \def MBEDTLS_PSA_CRYPTO_STORAGE_C
+ *
+ * Enable the Platform Security Architecture persistent key storage.
+ *
+ * Module: crypto/library/psa_crypto_storage.c
+ *
+ * Requires: MBEDTLS_PSA_CRYPTO_C,
+ * either MBEDTLS_PSA_ITS_FILE_C or a native implementation of
+ * the PSA ITS interface
+ */
+//#define MBEDTLS_PSA_CRYPTO_STORAGE_C
+
+/**
+ * \def MBEDTLS_PSA_ITS_FILE_C
+ *
+ * Enable the emulation of the Platform Security Architecture
+ * Internal Trusted Storage (PSA ITS) over files.
+ *
+ * Module: crypto/library/psa_its_file.c
+ *
+ * Requires: MBEDTLS_FS_IO
+ *
+ */
+//#define MBEDTLS_PSA_ITS_FILE_C
+
+/**
+ * \def MBEDTLS_RIPEMD160_C
+ *
+ * Enable the RIPEMD-160 hash algorithm.
+ *
+ * Module: library/ripemd160.c
+ * Caller: library/md.c
+ *
+ */
+#define MBEDTLS_RIPEMD160_C
+
+/**
+ * \def MBEDTLS_RSA_C
+ *
+ * Enable the RSA public-key cryptosystem.
+ *
+ * Module: library/rsa.c
+ * library/rsa_internal.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ * library/ssl_tls.c
+ * library/x509.c
+ *
+ * This module is used by the following key exchanges:
+ * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK
+ *
+ * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C
+ */
+#define MBEDTLS_RSA_C
+
+/**
+ * \def MBEDTLS_SHA1_C
+ *
+ * Enable the SHA1 cryptographic hash algorithm.
+ *
+ * Module: library/sha1.c
+ * Caller: library/md.c
+ * library/ssl_cli.c
+ * library/ssl_srv.c
+ * library/ssl_tls.c
+ * library/x509write_crt.c
+ *
+ * This module is required for SSL/TLS up to version 1.1, for TLS 1.2
+ * depending on the handshake parameters, and for SHA1-signed certificates.
+ *
+ * \warning SHA-1 is considered a weak message digest and its use constitutes
+ * a security risk. If possible, we recommend avoiding dependencies
+ * on it, and considering stronger message digests instead.
+ *
+ */
+#define MBEDTLS_SHA1_C
+
+/**
+ * \def MBEDTLS_SHA256_C
+ *
+ * Enable the SHA-224 and SHA-256 cryptographic hash algorithms.
+ *
+ * Module: library/sha256.c
+ * Caller: library/entropy.c
+ * library/md.c
+ * library/ssl_cli.c
+ * library/ssl_srv.c
+ * library/ssl_tls.c
+ *
+ * This module adds support for SHA-224 and SHA-256.
+ * This module is required for the SSL/TLS 1.2 PRF function.
+ */
+#define MBEDTLS_SHA256_C
+
+/**
+ * \def MBEDTLS_SHA512_C
+ *
+ * Enable the SHA-384 and SHA-512 cryptographic hash algorithms.
+ *
+ * Module: library/sha512.c
+ * Caller: library/entropy.c
+ * library/md.c
+ * library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * This module adds support for SHA-384 and SHA-512.
+ */
+#define MBEDTLS_SHA512_C
+
+/**
+ * \def MBEDTLS_SSL_CACHE_C
+ *
+ * Enable simple SSL cache implementation.
+ *
+ * Module: library/ssl_cache.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_SSL_CACHE_C
+ */
+#define MBEDTLS_SSL_CACHE_C
+
+/**
+ * \def MBEDTLS_SSL_COOKIE_C
+ *
+ * Enable basic implementation of DTLS cookies for hello verification.
+ *
+ * Module: library/ssl_cookie.c
+ * Caller:
+ */
+#define MBEDTLS_SSL_COOKIE_C
+
+/**
+ * \def MBEDTLS_SSL_TICKET_C
+ *
+ * Enable an implementation of TLS server-side callbacks for session tickets.
+ *
+ * Module: library/ssl_ticket.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_CIPHER_C
+ */
+#define MBEDTLS_SSL_TICKET_C
+
+/**
+ * \def MBEDTLS_SSL_CLI_C
+ *
+ * Enable the SSL/TLS client code.
+ *
+ * Module: library/ssl_cli.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_SSL_TLS_C
+ *
+ * This module is required for SSL/TLS client support.
+ */
+#define MBEDTLS_SSL_CLI_C
+
+/**
+ * \def MBEDTLS_SSL_SRV_C
+ *
+ * Enable the SSL/TLS server code.
+ *
+ * Module: library/ssl_srv.c
+ * Caller:
+ *
+ * Requires: MBEDTLS_SSL_TLS_C
+ *
+ * This module is required for SSL/TLS server support.
+ */
+#define MBEDTLS_SSL_SRV_C
+
+/**
+ * \def MBEDTLS_SSL_TLS_C
+ *
+ * Enable the generic SSL/TLS code.
+ *
+ * Module: library/ssl_tls.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ *
+ * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C
+ * and at least one of the MBEDTLS_SSL_PROTO_XXX defines
+ *
+ * This module is required for SSL/TLS.
+ */
+#define MBEDTLS_SSL_TLS_C
+
+/**
+ * \def MBEDTLS_THREADING_C
+ *
+ * Enable the threading abstraction layer.
+ * By default mbed TLS assumes it is used in a non-threaded environment or that
+ * contexts are not shared between threads. If you do intend to use contexts
+ * between threads, you will need to enable this layer to prevent race
+ * conditions. See also our Knowledge Base article about threading:
+ * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading
+ *
+ * Module: library/threading.c
+ *
+ * This allows different threading implementations (self-implemented or
+ * provided).
+ *
+ * You will have to enable either MBEDTLS_THREADING_ALT or
+ * MBEDTLS_THREADING_PTHREAD.
+ *
+ * Enable this layer to allow use of mutexes within mbed TLS
+ */
+//#define MBEDTLS_THREADING_C
+
+/**
+ * \def MBEDTLS_TIMING_C
+ *
+ * Enable the semi-portable timing interface.
+ *
+ * \note The provided implementation only works on POSIX/Unix (including Linux,
+ * BSD and OS X) and Windows. On other platforms, you can either disable that
+ * module and provide your own implementations of the callbacks needed by
+ * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide
+ * your own implementation of the whole module by setting
+ * \c MBEDTLS_TIMING_ALT in the current file.
+ *
+ * \note See also our Knowledge Base article about porting to a new
+ * environment:
+ * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS
+ *
+ * Module: library/timing.c
+ * Caller: library/havege.c
+ *
+ * This module is used by the HAVEGE random number generator.
+ */
+// #define MBEDTLS_TIMING_C
+
+/**
+ * \def MBEDTLS_VERSION_C
+ *
+ * Enable run-time version information.
+ *
+ * Module: library/version.c
+ *
+ * This module provides run-time version information.
+ */
+// #define MBEDTLS_VERSION_C
+
+/**
+ * \def MBEDTLS_X509_USE_C
+ *
+ * Enable X.509 core for using certificates.
+ *
+ * Module: library/x509.c
+ * Caller: library/x509_crl.c
+ * library/x509_crt.c
+ * library/x509_csr.c
+ *
+ * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C,
+ * MBEDTLS_PK_PARSE_C
+ *
+ * This module is required for the X.509 parsing modules.
+ */
+#define MBEDTLS_X509_USE_C
+
+/**
+ * \def MBEDTLS_X509_CRT_PARSE_C
+ *
+ * Enable X.509 certificate parsing.
+ *
+ * Module: library/x509_crt.c
+ * Caller: library/ssl_cli.c
+ * library/ssl_srv.c
+ * library/ssl_tls.c
+ *
+ * Requires: MBEDTLS_X509_USE_C
+ *
+ * This module is required for X.509 certificate parsing.
+ */
+#define MBEDTLS_X509_CRT_PARSE_C
+
+/**
+ * \def MBEDTLS_X509_CRL_PARSE_C
+ *
+ * Enable X.509 CRL parsing.
+ *
+ * Module: library/x509_crl.c
+ * Caller: library/x509_crt.c
+ *
+ * Requires: MBEDTLS_X509_USE_C
+ *
+ * This module is required for X.509 CRL parsing.
+ */
+#define MBEDTLS_X509_CRL_PARSE_C
+
+/**
+ * \def MBEDTLS_X509_CSR_PARSE_C
+ *
+ * Enable X.509 Certificate Signing Request (CSR) parsing.
+ *
+ * Module: library/x509_csr.c
+ * Caller: library/x509_crt_write.c
+ *
+ * Requires: MBEDTLS_X509_USE_C
+ *
+ * This module is used for reading X.509 certificate request.
+ */
+#define MBEDTLS_X509_CSR_PARSE_C
+
+/**
+ * \def MBEDTLS_X509_CREATE_C
+ *
+ * Enable X.509 core for creating certificates.
+ *
+ * Module: library/x509_create.c
+ *
+ * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C
+ *
+ * This module is the basis for creating X.509 certificates and CSRs.
+ */
+#define MBEDTLS_X509_CREATE_C
+
+/**
+ * \def MBEDTLS_X509_CRT_WRITE_C
+ *
+ * Enable creating X.509 certificates.
+ *
+ * Module: library/x509_crt_write.c
+ *
+ * Requires: MBEDTLS_X509_CREATE_C
+ *
+ * This module is required for X.509 certificate creation.
+ */
+#define MBEDTLS_X509_CRT_WRITE_C
+
+/**
+ * \def MBEDTLS_X509_CSR_WRITE_C
+ *
+ * Enable creating X.509 Certificate Signing Requests (CSR).
+ *
+ * Module: library/x509_csr_write.c
+ *
+ * Requires: MBEDTLS_X509_CREATE_C
+ *
+ * This module is required for X.509 certificate request writing.
+ */
+#define MBEDTLS_X509_CSR_WRITE_C
+
+/**
+ * \def MBEDTLS_XTEA_C
+ *
+ * Enable the XTEA block cipher.
+ *
+ * Module: library/xtea.c
+ * Caller:
+ */
+#define MBEDTLS_XTEA_C
+
+/* \} name SECTION: mbed TLS modules */
+
+/**
+ * \name SECTION: Module configuration options
+ *
+ * This section allows for the setting of module specific sizes and
+ * configuration options. The default values are already present in the
+ * relevant header files and should suffice for the regular use cases.
+ *
+ * Our advice is to enable options and change their values here
+ * only if you have a good reason and know the consequences.
+ *
+ * Please check the respective header file for documentation on these
+ * parameters (to prevent duplicate documentation).
+ * \{
+ */
+
+/* MPI / BIGNUM options */
+//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */
+//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */
+
+/* CTR_DRBG options */
+//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with
+// SHA-256) */ #define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ #define
+// MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ #define
+// MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ #define
+// MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ #define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
+///**< Use 128-bit key for CTR_DRBG - may reduce security (see ctr_drbg.h) */
+
+/* HMAC_DRBG options */
+//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */
+//#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */
+//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */
+//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */
+
+/* ECP options */
+//#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */
+//#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */
+//#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */
+
+/* Entropy options */
+//#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */
+//#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */
+//#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Default minimum number of bytes required for the hardware entropy
+// source mbedtls_hardware_poll() before entropy is released */
+
+/* Memory buffer allocator options */
+//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */
+
+/* Platform options */
+//#define MBEDTLS_PLATFORM_STD_MEM_HDR <stdlib.h> /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't
+// define if no header is needed. */ #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be
+// undefined */ #define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ #define
+// MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_TIME time
+///**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ #define MBEDTLS_PLATFORM_STD_FPRINTF fprintf
+///**< Default fprintf to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can
+// be undefined */
+/* Note: your snprintf must correctly zero-terminate the buffer! */
+//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */
+//#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */
+//#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */
+//#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be
+// undefined */ #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function
+// to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default
+// implementation */
+
+/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */
+/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */
+//#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */
+//#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */
+//#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */
+//#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be
+// enabled */ #define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined.
+// MBEDTLS_HAVE_TIME must be enabled */ #define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can
+// be undefined */ #define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */
+/* Note: your snprintf must correctly zero-terminate the buffer! */
+//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */
+//#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */
+//#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be
+// undefined */ #define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function
+// to use, can be undefined */
+
+/**
+ * \brief This macro is invoked by the library when an invalid parameter
+ * is detected that is only checked with #MBEDTLS_CHECK_PARAMS
+ * (see the documentation of that option for context).
+ *
+ * When you leave this undefined here, the library provides
+ * a default definition. If the macro #MBEDTLS_CHECK_PARAMS_ASSERT
+ * is defined, the default definition is `assert(cond)`,
+ * otherwise the default definition calls a function
+ * mbedtls_param_failed(). This function is declared in
+ * `platform_util.h` for the benefit of the library, but
+ * you need to define in your application.
+ *
+ * When you define this here, this replaces the default
+ * definition in platform_util.h (which no longer declares the
+ * function mbedtls_param_failed()) and it is your responsibility
+ * to make sure this macro expands to something suitable (in
+ * particular, that all the necessary declarations are visible
+ * from within the library - you can ensure that by providing
+ * them in this file next to the macro definition).
+ * If you define this macro to call `assert`, also define
+ * #MBEDTLS_CHECK_PARAMS_ASSERT so that library source files
+ * include `<assert.h>`.
+ *
+ * Note that you may define this macro to expand to nothing, in
+ * which case you don't have to worry about declarations or
+ * definitions. However, you will then be notified about invalid
+ * parameters only in non-void functions, and void function will
+ * just silently return early on invalid parameters, which
+ * partially negates the benefits of enabling
+ * #MBEDTLS_CHECK_PARAMS in the first place, so is discouraged.
+ *
+ * \param cond The expression that should evaluate to true, but doesn't.
+ */
+//#define MBEDTLS_PARAM_FAILED( cond ) assert( cond )
+
+/* SSL Cache options */
+//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */
+//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */
+
+/* SSL options */
+
+/** \def MBEDTLS_SSL_MAX_CONTENT_LEN
+ *
+ * Maximum length (in bytes) of incoming and outgoing plaintext fragments.
+ *
+ * This determines the size of both the incoming and outgoing TLS I/O buffers
+ * in such a way that both are capable of holding the specified amount of
+ * plaintext data, regardless of the protection mechanism used.
+ *
+ * To configure incoming and outgoing I/O buffers separately, use
+ * #MBEDTLS_SSL_IN_CONTENT_LEN and #MBEDTLS_SSL_OUT_CONTENT_LEN,
+ * which overwrite the value set by this option.
+ *
+ * \note When using a value less than the default of 16KB on the client, it is
+ * recommended to use the Maximum Fragment Length (MFL) extension to
+ * inform the server about this limitation. On the server, there
+ * is no supported, standardized way of informing the client about
+ * restriction on the maximum size of incoming messages, and unless
+ * the limitation has been communicated by other means, it is recommended
+ * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN
+ * while keeping the default value of 16KB for the incoming buffer.
+ *
+ * Uncomment to set the maximum plaintext size of both
+ * incoming and outgoing I/O buffers.
+ */
+//#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384
+
+/** \def MBEDTLS_SSL_IN_CONTENT_LEN
+ *
+ * Maximum length (in bytes) of incoming plaintext fragments.
+ *
+ * This determines the size of the incoming TLS I/O buffer in such a way
+ * that it is capable of holding the specified amount of plaintext data,
+ * regardless of the protection mechanism used.
+ *
+ * If this option is undefined, it inherits its value from
+ * #MBEDTLS_SSL_MAX_CONTENT_LEN.
+ *
+ * \note When using a value less than the default of 16KB on the client, it is
+ * recommended to use the Maximum Fragment Length (MFL) extension to
+ * inform the server about this limitation. On the server, there
+ * is no supported, standardized way of informing the client about
+ * restriction on the maximum size of incoming messages, and unless
+ * the limitation has been communicated by other means, it is recommended
+ * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN
+ * while keeping the default value of 16KB for the incoming buffer.
+ *
+ * Uncomment to set the maximum plaintext size of the incoming I/O buffer
+ * independently of the outgoing I/O buffer.
+ */
+//#define MBEDTLS_SSL_IN_CONTENT_LEN 16384
+
+/** \def MBEDTLS_SSL_CID_IN_LEN_MAX
+ *
+ * The maximum length of CIDs used for incoming DTLS messages.
+ *
+ */
+//#define MBEDTLS_SSL_CID_IN_LEN_MAX 32
+
+/** \def MBEDTLS_SSL_CID_OUT_LEN_MAX
+ *
+ * The maximum length of CIDs used for outgoing DTLS messages.
+ *
+ */
+//#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32
+
+/** \def MBEDTLS_SSL_CID_PADDING_GRANULARITY
+ *
+ * This option controls the use of record plaintext padding
+ * when using the Connection ID extension in DTLS 1.2.
+ *
+ * The padding will always be chosen so that the length of the
+ * padded plaintext is a multiple of the value of this option.
+ *
+ * Note: A value of \c 1 means that no padding will be used
+ * for outgoing records.
+ *
+ * Note: On systems lacking division instructions,
+ * a power of two should be preferred.
+ *
+ */
+//#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16
+
+/** \def MBEDTLS_SSL_OUT_CONTENT_LEN
+ *
+ * Maximum length (in bytes) of outgoing plaintext fragments.
+ *
+ * This determines the size of the outgoing TLS I/O buffer in such a way
+ * that it is capable of holding the specified amount of plaintext data,
+ * regardless of the protection mechanism used.
+ *
+ * If this option undefined, it inherits its value from
+ * #MBEDTLS_SSL_MAX_CONTENT_LEN.
+ *
+ * It is possible to save RAM by setting a smaller outward buffer, while keeping
+ * the default inward 16384 byte buffer to conform to the TLS specification.
+ *
+ * The minimum required outward buffer size is determined by the handshake
+ * protocol's usage. Handshaking will fail if the outward buffer is too small.
+ * The specific size requirement depends on the configured ciphers and any
+ * certificate data which is sent during the handshake.
+ *
+ * Uncomment to set the maximum plaintext size of the outgoing I/O buffer
+ * independently of the incoming I/O buffer.
+ */
+//#define MBEDTLS_SSL_OUT_CONTENT_LEN 16384
+
+/** \def MBEDTLS_SSL_DTLS_MAX_BUFFERING
+ *
+ * Maximum number of heap-allocated bytes for the purpose of
+ * DTLS handshake message reassembly and future message buffering.
+ *
+ * This should be at least 9/8 * MBEDTLSSL_IN_CONTENT_LEN
+ * to account for a reassembled handshake message of maximum size,
+ * together with its reassembly bitmap.
+ *
+ * A value of 2 * MBEDTLS_SSL_IN_CONTENT_LEN (32768 by default)
+ * should be sufficient for all practical situations as it allows
+ * to reassembly a large handshake message (such as a certificate)
+ * while buffering multiple smaller handshake messages.
+ *
+ */
+//#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768
+
+//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */
+//#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */
+//#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number
+// of cookies issued */
+
+/**
+ * Complete list of ciphersuites to use, in order of preference.
+ *
+ * \warning No dependency checking is done on that field! This option can only
+ * be used to restrict the set of available ciphersuites. It is your
+ * responsibility to make sure the needed modules are active.
+ *
+ * Use this to save a few hundred bytes of ROM (default ordering of all
+ * available ciphersuites) and a few to a few hundred bytes of RAM.
+ *
+ * The value below is only an example, not the default.
+ */
+//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+
+/* X509 options */
+//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */
+//#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null
+// terminator character ('\0'). */
+
+/**
+ * Allow SHA-1 in the default TLS configuration for certificate signing.
+ * Without this build-time option, SHA-1 support must be activated explicitly
+ * through mbedtls_ssl_conf_cert_profile. Turning on this option is not
+ * recommended because of it is possible to generate SHA-1 collisions, however
+ * this may be safe for legacy infrastructure where additional controls apply.
+ *
+ * \warning SHA-1 is considered a weak message digest and its use constitutes
+ * a security risk. If possible, we recommend avoiding dependencies
+ * on it, and considering stronger message digests instead.
+ *
+ */
+//#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES
+
+/**
+ * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake
+ * signature and ciphersuite selection. Without this build-time option, SHA-1
+ * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes.
+ * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by
+ * default. At the time of writing, there is no practical attack on the use
+ * of SHA-1 in handshake signatures, hence this option is turned on by default
+ * to preserve compatibility with existing peers, but the general
+ * warning applies nonetheless:
+ *
+ * \warning SHA-1 is considered a weak message digest and its use constitutes
+ * a security risk. If possible, we recommend avoiding dependencies
+ * on it, and considering stronger message digests instead.
+ *
+ */
+#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE
+
+/**
+ * Uncomment the macro to let mbed TLS use your alternate implementation of
+ * mbedtls_platform_zeroize(). This replaces the default implementation in
+ * platform_util.c.
+ *
+ * mbedtls_platform_zeroize() is a widely used function across the library to
+ * zero a block of memory. The implementation is expected to be secure in the
+ * sense that it has been written to prevent the compiler from removing calls
+ * to mbedtls_platform_zeroize() as part of redundant code elimination
+ * optimizations. However, it is difficult to guarantee that calls to
+ * mbedtls_platform_zeroize() will not be optimized by the compiler as older
+ * versions of the C language standards do not provide a secure implementation
+ * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to
+ * configure their own implementation of mbedtls_platform_zeroize(), for
+ * example by using directives specific to their compiler, features from newer
+ * C standards (e.g using memset_s() in C11) or calling a secure memset() from
+ * their system (e.g explicit_bzero() in BSD).
+ */
+//#define MBEDTLS_PLATFORM_ZEROIZE_ALT
+
+/**
+ * Uncomment the macro to let Mbed TLS use your alternate implementation of
+ * mbedtls_platform_gmtime_r(). This replaces the default implementation in
+ * platform_util.c.
+ *
+ * gmtime() is not a thread-safe function as defined in the C standard. The
+ * library will try to use safer implementations of this function, such as
+ * gmtime_r() when available. However, if Mbed TLS cannot identify the target
+ * system, the implementation of mbedtls_platform_gmtime_r() will default to
+ * using the standard gmtime(). In this case, calls from the library to
+ * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex
+ * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the
+ * library are also guarded with this mutex to avoid race conditions. However,
+ * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will
+ * unconditionally use the implementation for mbedtls_platform_gmtime_r()
+ * supplied at compile time.
+ */
+//#define MBEDTLS_PLATFORM_GMTIME_R_ALT
+
+/**
+ * Enable the verified implementations of ECDH primitives from Project Everest
+ * (currently only Curve25519). This feature changes the layout of ECDH
+ * contexts and therefore is a compatibility break for applications that access
+ * fields of a mbedtls_ecdh_context structure directly. See also
+ * MBEDTLS_ECDH_LEGACY_CONTEXT in include/mbedtls/ecdh.h.
+ */
+//#define MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED
+
+/* \} name SECTION: Customisation configuration options */
+
+/* Target and application specific configurations
+ *
+ * Allow user to override any previous default.
+ *
+ */
+#if defined(MBEDTLS_USER_CONFIG_FILE)
+#include MBEDTLS_USER_CONFIG_FILE
+#endif
+
+#include "mbedtls/check_config.h"
+
+#endif /* MBEDTLS_CONFIG_H */
diff --git a/examples/ota-requestor-app/p6/include/AppConfig.h b/examples/ota-requestor-app/p6/include/AppConfig.h
new file mode 100644
index 0000000..a7b2502
--- /dev/null
+++ b/examples/ota-requestor-app/p6/include/AppConfig.h
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "cybsp.h"
+#include "cyhal.h"
+
+// ---- OTA Requestor Example App Config ----
+
+#define APP_TASK_NAME "APP"
+
+#define APP_UPDATE_BUTTON_IDX 0
+#define APP_FUNCTION_BUTTON_IDX 1
+
+#define APP_UPDATE_BUTTON CYBSP_USER_BTN1
+#define APP_FUNCTION_BUTTON CYBSP_USER_BTN2
+#define APP_BUTTON_DEBOUNCE_PERIOD_MS 50
+
+#define APP_BUTTON_PRESSED 0
+#define APP_BUTTON_RELEASED 1
+
+#define SYSTEM_STATE_LED CYBSP_USER_LED1
+#define UPDATE_LED CYBSP_USER_LED2
+
+// Time it takes in ms for the simulated actuator to move from one
+// state to another.
+#define ACTUATOR_MOVEMENT_PERIOS_MS 2000
+
+// ---- Thread Polling Config ----
+#define THREAD_ACTIVE_POLLING_INTERVAL_MS 100
+#define THREAD_INACTIVE_POLLING_INTERVAL_MS 1000
+
+// P6 Logging
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void appError(int err);
+void P6Log(const char * aFormat, ...);
+#define P6_LOG(...) P6Log(__VA_ARGS__)
+
+#ifdef __cplusplus
+}
+
+#include <lib/core/CHIPError.h>
+void appError(CHIP_ERROR error);
+#endif
diff --git a/examples/ota-requestor-app/p6/include/AppEvent.h b/examples/ota-requestor-app/p6/include/AppEvent.h
new file mode 100644
index 0000000..671a1be
--- /dev/null
+++ b/examples/ota-requestor-app/p6/include/AppEvent.h
@@ -0,0 +1,52 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2018 Nest Labs, Inc.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+struct AppEvent;
+typedef void (*EventHandler)(AppEvent *);
+
+struct AppEvent
+{
+ enum AppEventTypes
+ {
+ kEventType_Button = 0,
+ kEventType_Timer,
+ kEventType_Light,
+ kEventType_Install,
+ };
+
+ uint16_t Type;
+
+ union
+ {
+ struct
+ {
+ uint8_t ButtonIdx;
+ uint8_t Action;
+ } ButtonEvent;
+ struct
+ {
+ void * Context;
+ } TimerEvent;
+ };
+
+ EventHandler Handler;
+};
diff --git a/examples/ota-requestor-app/p6/include/AppTask.h b/examples/ota-requestor-app/p6/include/AppTask.h
new file mode 100644
index 0000000..43d448e
--- /dev/null
+++ b/examples/ota-requestor-app/p6/include/AppTask.h
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "AppEvent.h"
+#include "FreeRTOS.h"
+#include "timers.h" // provides FreeRTOS timer support
+#include <ble/BLEEndPoint.h>
+#include <platform/CHIPDeviceLayer.h>
+
+// Application-defined error codes in the CHIP_ERROR space.
+#define APP_ERROR_EVENT_QUEUE_FAILED CHIP_APPLICATION_ERROR(0x01)
+#define APP_ERROR_CREATE_TASK_FAILED CHIP_APPLICATION_ERROR(0x02)
+#define APP_ERROR_UNHANDLED_EVENT CHIP_APPLICATION_ERROR(0x03)
+#define APP_ERROR_CREATE_TIMER_FAILED CHIP_APPLICATION_ERROR(0x04)
+#define APP_ERROR_START_TIMER_FAILED CHIP_APPLICATION_ERROR(0x05)
+#define APP_ERROR_STOP_TIMER_FAILED CHIP_APPLICATION_ERROR(0x06)
+
+class AppTask
+{
+
+public:
+ CHIP_ERROR StartAppTask();
+ static void AppTaskMain(void * pvParameter);
+
+ void PostEvent(const AppEvent * event);
+
+ void ButtonEventHandler(uint8_t btnIdx, uint8_t btnAction);
+
+private:
+ friend AppTask & GetAppTask(void);
+
+ CHIP_ERROR Init();
+
+ void CancelTimer(void);
+
+ void DispatchEvent(AppEvent * event);
+
+ static void FunctionTimerEventHandler(AppEvent * aEvent);
+ static void UpdateButtonHandler(AppEvent * aEvent);
+ static void FunctionHandler(AppEvent * aEvent);
+ static void TimerEventHandler(TimerHandle_t xTimer);
+
+ static void UpdateClusterState(void);
+
+ void StartTimer(uint32_t aTimeoutMs);
+
+ enum class Function
+ {
+ kNoneSelected = 0,
+ kSoftwareUpdate = 0,
+ kStartBleAdv = 1,
+ kFactoryReset = 2,
+
+ kInvalid
+ };
+
+ Function mFunction = Function::kNoneSelected;
+ bool mFunctionTimerActive = false;
+ bool mSyncClusterToButtonAction = false;
+
+ static AppTask sAppTask;
+};
+
+inline AppTask & GetAppTask(void)
+{
+ return AppTask::sAppTask;
+}
diff --git a/examples/ota-requestor-app/p6/include/ButtonHandler.h b/examples/ota-requestor-app/p6/include/ButtonHandler.h
new file mode 100644
index 0000000..8dfbf7e
--- /dev/null
+++ b/examples/ota-requestor-app/p6/include/ButtonHandler.h
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+#include "FreeRTOS.h"
+#include "cyhal.h"
+#include "timers.h" // provides FreeRTOS timer support
+
+#define GPIO_INTERRUPT_PRIORITY (5)
+
+class ButtonHandler
+{
+public:
+ static void Init(void);
+
+private:
+ static void GpioInit(void);
+ static void lockbuttonIsr(void * handler_arg, cyhal_gpio_event_t event);
+ static void functionbuttonIsr(void * handler_arg, cyhal_gpio_event_t event);
+ static void TimerCallback(TimerHandle_t xTimer);
+};
diff --git a/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h b/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h
new file mode 100644
index 0000000..17f8d67
--- /dev/null
+++ b/examples/ota-requestor-app/p6/include/CHIPProjectConfig.h
@@ -0,0 +1,135 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY
+ *
+ * Enables the use of a hard-coded default Chip device id and credentials if no device id
+ * is found in Chip NV storage.
+ *
+ * This option is for testing only and should be disabled in production releases.
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY 34
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
+#endif
+
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
+#endif
+
+// For convenience, Chip Security Test Mode can be enabled and the
+// requirement for authentication in various protocols can be disabled.
+//
+// WARNING: These options make it possible to circumvent basic Chip security functionality,
+// including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS.
+//
+#define CHIP_CONFIG_SECURITY_TEST_MODE 0
+#define CHIP_CONFIG_REQUIRE_AUTH 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION
+ *
+ * The product revision number assigned to device or product by the device vendor. This
+ * number is scoped to the device product id, and typically corresponds to a revision of the
+ * physical device, a change to its packaging, and/or a change to its marketing presentation.
+ * This value is generally *not* incremented for device software revisions.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING
+ *
+ * A string identifying the firmware revision running on the device.
+ * CHIP service currently expects the firmware version to be in the format
+ * {MAJOR_VERSION}.0d{MINOR_VERSION}
+ */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING
+#define CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING "0.1ALPHA"
+#endif
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
+ *
+ * Enable support for Chip-over-BLE (CHIPoBLE).
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1
+
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC
+ *
+ * Enables synchronizing the device's real time clock with a remote Chip Time service
+ * using the Chip Time Sync protocol.
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC 0
+
+/**
+ * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER
+ *
+ * Enables the use of a hard-coded default serial number if none
+ * is found in Chip NV storage.
+ */
+#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN"
+
+/**
+ * CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS
+ *
+ * Enable recording UTC timestamps.
+ */
+#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1
+
+/**
+ * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE
+ *
+ * A size, in bytes, of the individual debug event logging buffer.
+ */
+#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512)
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION
+ *
+ * The hardware version number assigned to device or product by the device vendor. This
+ * number is scoped to the device product id, and typically corresponds to a version of the
+ * physical device, a change to its packaging, and/or a change to its marketing presentation.
+ * This value is generally *not* incremented for device software versions.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+ *
+ * A string identifying the software version running on the device.
+ * CHIP service currently expects the software version to be in the format
+ * {MAJOR_VERSION}.0d{MINOR_VERSION}
+ */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "0.1ALPHA"
+#endif
diff --git a/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex b/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex
new file mode 100644
index 0000000..a8ae0bf
--- /dev/null
+++ b/examples/ota-requestor-app/p6/matter-psoc6-mcuboot-bootloader.hex
@@ -0,0 +1,4099 @@
+:020000041000EA
+:1000000000000208070500100D000000690500103F
+:1000100000000000000000000000000000000000E0
+:100020000000000000000000000000006505001056
+:1000300000000000000000006505001065050010CC
+:1000400065050010650500106505001065050010C8
+:1000500065050010650500106505001065050010B8
+:1000600065050010650500106505001065050010A8
+:100070006505001065050010650500106505001098
+:1000800010B5064C2378002B07D1054B002B02D06E
+:10009000044800E000BF0123237010BD740700086E
+:1000A00000000000DCF60010044B10B5002B03D05C
+:1000B0000349044800E000BF10BDC0460000000036
+:1000C00078070008DCF6001010B500F07DF800F0AD
+:1000D00007F800F069F800F01FF800F029F810BDEB
+:1000E00010B50021012007F059F94D22002101200F
+:1000F00007F092F80021012007F00EF900210020FE
+:1001000007F04CF900220021002007F085F80021BB
+:10011000002007F001F910BD10B5002200212F20AA
+:1001200007F0C0F800220121052007F0BBF810BD40
+:1001300010B5134C134A0021200004F0AFFD124A01
+:100140000121200004F0AAFD104C114A00212000DA
+:1001500004F0A4FD0F4A0121200004F09FFD0E4C85
+:100160000E4A0421200004F099FD0D4A06212000CA
+:1001700004F094FD0B4A0721200004F08FFD10BD10
+:1001800000003140FCDF001030E000108002314000
+:1001900094DF0010C8DF00100003314060DF001062
+:1001A0002CDF0010F8DE0010034B332203495A50B5
+:1001B00003495A507047C0460000304008200000F4
+:1001C00010200000FEE7000030B583B0962100202B
+:1001D00008F048F808F00CF800281BD1774AFF23F4
+:1001E0001B02D4583F231C4007F0F2FF002806D022
+:1001F000012007F0DBFF714B9B6C002B25DB6F4A66
+:10020000FF231B02D45007F07BFA07F06DFA0120A0
+:1002100007F08EFA012008F005FD08F0A1FC08F0B7
+:1002200087FD08F06FFD0021002007F0FFF9002096
+:1002300007F086F9012007F067F9002007F0E2F8DF
+:100240005F4B1A683F23D45C06E00620FFF7BAFF35
+:10025000200007F0BBFC013C002CF9D1002101205B
+:1002600007F09EFA002007F0CFF9002800D189E0BE
+:1002700007F054FB0021002007F092FA0021002033
+:1002800007F0A4F94F4C002500950023002200211F
+:10029000200004F055FC00950023002201212000DD
+:1002A00004F04EFC484807F0FFF9002800D075E044
+:1002B000012007F017F9002007F042F9012007F0AC
+:1002C00023F9002007F09EF80021012007F068FACA
+:1002D0000021002007F064FA0021022007F060FAF4
+:1002E0000021032007F05CFA0021042007F058FAEF
+:1002F0000021052007F054FA344807F02DFB0028B0
+:100300004FD1334807F0F6FB00284DD101210020E2
+:1003100007F05CF90021002007F088F92D49012041
+:1003200007F07AFC002842D12B49012007F00AFD92
+:1003300000283FD10021022007F048F901210220C6
+:1003400007F074F9022007F00DF907F0BFF800205C
+:1003500007F088F8002007F09DF807F0ABF80020C0
+:1003600008F0F4FC012007F06BF807F0BDF901205C
+:1003700007F0DEF99021002007F074FF00F01AF971
+:1003800003B030BD07F03AFA1223FF33984200D091
+:100390006EE70121002007F019F969E70520FFF752
+:1003A00011FF0420FFF70EFF0420FFF70BFF0320CF
+:1003B000FFF708FF0320FFF705FFC04600002740B6
+:1003C000D45F01080000314040420F00C0E100103E
+:1003D000400D0300D4E100101027000010B503F019
+:1003E00059F9054C200004F055FB200004F052FBA5
+:1003F000012002F04FFE10BD8002314010B584682C
+:1004000003681B89E418094B1B68DB68382201214B
+:1004100007480AF0B5F80A21064803F01DF9FFF76E
+:10042000DDFF200000F082F910BDC046EC0100089D
+:10043000DCE100100000654010B584B0FFF744FE19
+:1004400062B6E120400203F0E9F8264C2368DB683D
+:100450001022012124480AF093F82368DB68222245
+:10046000012122480AF08CF8012002F0C1FD041E8F
+:100470000DD11C4B1B68DB682E2201211C480AF0A1
+:100480007FF8002C0BD0002008F032FAFBE7154B68
+:100490001B68D8682200174909F0FEFFF1E701A8A0
+:1004A00000F086FF00280FD10E4B1B68DB682F225F
+:1004B000012111480AF064F8FA20000102F0BAFFA5
+:1004C00001A8FFF79BFFDEE7064B1B68DB683222C3
+:1004D00001210A480AF054F80A21094803F0BCF83F
+:1004E000D1E7C046EC01000818E200102CE2001031
+:1004F00050E2001080E20010C4E20010F4E20010AC
+:10050000000065407047FFF7FDFF72B60F4C104DBD
+:10051000AC4209DA21686268A368043B02DBC85870
+:10052000D050FAE70C34F3E70A490B4A0020521A7C
+:1005300002DD043A8850FCDC084809490860BFF332
+:100540004F8F00F075F8FFF777FFFEE7E8F6001031
+:1005500000F70010740700087C6001080000000824
+:1005600008ED00E0FEE7FEE700B504207146084212
+:1005700002D0EFF3098001E0EFF30880043007F0C8
+:1005800059FEFEE7000000000230800803D0013071
+:100590000238FCD1C046C0467047EFF3108072B6F7
+:1005A000704780F31088704710B5002004F0C2FD3A
+:1005B00010BD704710B5002007F0EAFC041E00D102
+:1005C00010BD144B186006F0AFFF411C200008F06E
+:1005D00035FC0400104B186006F026FF411C20007B
+:1005E00008F02CFC04000D4B1860013C0C49200065
+:1005F00008F024FC01300B4B1870FA218900200010
+:1006000008F01CFC0130084B1860C003074B186051
+:10061000D6E7C04684000008880000088000000873
+:1006200040420F0094000008900000088C00000871
+:1006300010B5234803F036F8224CB022D200A3585C
+:100640005B005B08A350E02189006358302083439E
+:10065000635080235B04A3501B4B1C4AE2500433BD
+:10066000A0229201E2501A4BFF22E25008F098FBC0
+:10067000C0225200A35801218B43A350FFF799FFDA
+:10068000FFF798FF134B1B68BA20195ACA00521A79
+:10069000196A8C4662440021D1601A6A185AC30054
+:1006A0001B1AD31859600C4A8031032004F09AFDBC
+:1006B0000A4804F0F3FB0A4804F048FC10BDC046A9
+:1006C000F8ED001000002640840500000100020043
+:1006D0008C050000D45F010820070008900700087F
+:1006E00028E30010034A90235B01D35803201840ED
+:1006F0007047C0460000204010B5FFF74EFF084C81
+:10070000902149016358074A1A40074B134363502D
+:10071000034B5B68DB06FBD5FFF743FF10BDC0460C
+:1007200000002040FCFF00000100FA0570B5040045
+:10073000830500D001BEFFF730FF0500FFF7D2FFB1
+:10074000032813D00B4B802292009C509020400134
+:100750001A5809491140094A0A431A50054B5B6867
+:10076000DB06FBD52800FFF71CFF70BDFFF7C4FFB9
+:10077000E8E7C04600002040FCFF00000300FA0547
+:1007800000B583B0130001AA1370012301F055FADC
+:1007900003B000BD10B509F00DFF10BD04280AD04C
+:1007A000052804D101394B1E994108007047401AB1
+:1007B00043425841FAE70120F8E710B582B00C0037
+:1007C000C0B201A901F07EFF002803D0012420005F
+:1007D00002B010BD2100019801F094FA04000198C4
+:1007E00001F084FFF3E710B5040001F015FA0100F1
+:1007F00001222000FFF7C4FF10BD10B5040001F076
+:1008000007FA010001222000FFF7BAFF10BD000027
+:1008100030B583B004000E2A10D80E2915D8120165
+:100820000A436B46DD1DDA7101F0FBF9010001237B
+:100830002A00200001F001FA03B030BD9C21064BD4
+:10084000064A8900064809F009FE9C21054B034A27
+:100850008900034809F002FE5CE30010CCE40010BC
+:1008600070E30010B8E3001010B582B004000191ED
+:1008700001F0DCF90100042301AA200001F0DDF9F8
+:1008800002B010BD30B589B006A90120FFF795FF71
+:10089000002800D08CE004A90230FFF78EFF04008E
+:1008A000444B1B68D86806AB1B78012B28D0032B60
+:1008B00024D0414B06AA51789578D27802920195BE
+:1008C00000913E4A3E4909F0E7FD3A4B1B68D86863
+:1008D00004AB1B78012B17D0032B13D0364B04AA83
+:1008E00051789578D278029201950091354A344931
+:1008F00009F0D2FD002C11D0FF2057E0324BD9E790
+:10090000324BD7E7304BEAE7304BE8E72B79042B43
+:1009100028D006AA9278934224D00134022C3CD8E5
+:1009200063001B195B002A4AD51806A90978D05C18
+:10093000FFF734FF0028F0D004AB19786878FFF790
+:100940002DFF0028E9D0AB78042B03D006AAD2787B
+:100950009342E2D1EB78042BD8D004AAD278934208
+:10096000DBD1D3E7134B1B68D8686B79022B07D018
+:10097000032B10D0042B01D0164A02E0164A00E0E7
+:10098000164A174909F088FD6879831EDBB2022BED
+:100990000CD9FF200AE0134AF3E7064B1B68DB681B
+:1009A00017220121104809F0EBFD012009B030BDEC
+:1009B000FF20FBE7EC010008CCE300100CE4001082
+:1009C00030E4001074E40010D8E30010D0E300100D
+:1009D000F4E40010F0E3001004E40010E0E3001081
+:1009E0009CE40010E8E30010B4E4001070B50500CA
+:1009F000002915D001235B422878584004090F22B2
+:100A00001040094E80008359634018091A40920033
+:100A100093594340013901350029EDD1D84370BDC8
+:100A200001235B42FAE7C04608E50010F0B5CE4668
+:100A3000474680B5A7B0140099462E9F2F9B984635
+:100A4000684602F0B9FC0021684602F0BAFC319B0E
+:100A5000002B02D0329B002B07DC2389E2689446EE
+:100A600063446689F618002513E01A003199684638
+:100A700002F0B5FCF1E723003A002900484601F0F6
+:100A800037FE002811D122003900684602F0A7FC89
+:100A90002D19B54204D2741B4445ECD94446EAE70B
+:100AA0003099684602F0A7FC002027B0C0BCB946C8
+:100AB000B046F0BDF0B59FB017001D002C4B1E686E
+:100AC000279B0493269B039306AB0293259B0193DC
+:100AD000249B00932B00FFF7A9FF041E3DD1289B08
+:100AE000002B04D0202206A9180009F071FD002374
+:100AF0000093204B2A00390016A801F00FFD041EB8
+:100B00002BD11CAB72226A441DA916A801F07CFDF2
+:100B1000002821DB1CDC1CA909881029F1D17223D3
+:100B20006B441B88202B20D10EAA1D99280001F0B0
+:100B3000DFFD071E17D120220EA906A8FFF72AFE07
+:100B400006000D4B1B6801248342DAD03C0004E010
+:100B500063425C41E4B200E00400002C00D13400A8
+:100B600020001FB0F0BD0400F7E701246442F7E75E
+:100B700098000008FFFF00001009000810B50B4B9B
+:100B800002689A420FD1C2680389D843824202D8D0
+:100B9000D418012000E00020002805D08B68A34273
+:100BA00002D8002000E0002010BDC0463DB8F396FA
+:100BB000F0B585B005000C000192002001F098FE10
+:100BC000C0B203A901F07EFD002806D001270398DA
+:100BD00001F08CFD380005B0F0BD2C236343EB1809
+:100BE0001A89DE689619042302AA3100039801F0DD
+:100BF0007FFD071E26D12C214C432D196C8902AB99
+:100C00001A88134B9A420DD0002C1DD102AB1A88C2
+:100C1000104B9A421AD1331902AA52889B18019A92
+:100C20001360D4E702AB59888C4201D00327CEE78A
+:100C30008919042302AA039801F05AFD0028E5D07F
+:100C40000127C4E70127C2E70327C0E70327BEE760
+:100C5000086900000769000010B582B004000800B0
+:100C6000E02212010192012906D002290FD00729A2
+:100C700010D1E26D603401E0626A283401A901F00C
+:100C800085FE002801D1019B236002B010BD226DBA
+:100C90005434F3E70120F8E710B5006A01F018FEBC
+:100CA00010BD70B504000121FFF7D6FF002802D067
+:100CB0000125280070BD02212000FFF7CDFF00288C
+:100CC00001D00125F5E707212000FFF7C5FF051E2C
+:100CD00001D00125EDE72000FFF7DEFFA066E8E781
+:100CE000F0B583B004000F00002001F001FEC0B297
+:100CF00001A901F0E7FC061E1AD1019801F008FED7
+:100D00000500019801F0F2FC2C21794361180023C1
+:100D1000032B05D8CA5C954208D10133DBB2F7E753
+:100D20000123002B07D0300003B0F0BD0023F8E70B
+:100D300001267642F7E701267642F4E700B587B050
+:100D4000130000220492039202920132FF320192B8
+:100D5000044A00920A0000210020FFF7ABFE07B012
+:100D600000BDC046805D0108F0B585B005000C00EF
+:100D70000192244B1F68002001F0BAFDC0B203A904
+:100D800001F0A0FC002802D0380005B0F0BD2C30E6
+:100D900060432E1821002800FFF7A2FF00282BD067
+:100DA0003369D90601D5012727E0019B039A310059
+:100DB0002800FFF7C3FF0700039D29003000FFF75D
+:100DC000DDFE002803D0104B1B68BB4215D0002C61
+:100DD0000AD10E4B1B68D868002C0BD10C4A0D4968
+:100DE00009F05AFB012708E0AA680021280001F059
+:100DF00015FDEEE7084AF2E70127039801F076FCBB
+:100E0000C2E7C0469800000810090008EC0100087D
+:100E100054E500105CE5001048E5001070B50500D1
+:100E20000E000020FFF72EFD0400022805D0042844
+:100E300003D0032801D0200070BD3200012128001A
+:100E4000FFF792FF044B1B688342F4D0012801D0C6
+:100E50000524F0E70400EEE710090008F8B50600E5
+:100E60000D0017000024012C11DC2C226243B21863
+:100E70003B002100300000F0D9FB002801D10134F3
+:100E8000F1E7002C04DD002D02D1002000E000205D
+:100E9000F8BD002383718360C36001334371036035
+:100EA0000371C37170474379012B01D00020704753
+:100EB0000368012B01D00020F9E70379012B01D051
+:100EC0000020F4E70120F2E730B583B005000C0004
+:100ED0000023009301930800FFF7E5FF002830D0BE
+:100EE000204B2A689A4212D01E4BEA6A9A421BD0C3
+:100EF000019B009A934200D90093009BA360009A43
+:100F00002100280000F0D2FD002003B030BD6A4669
+:100F100000212800FFF74CFE0028E5D0124B134AB1
+:100F20001349144809F09AFA01AA01212800FFF791
+:100F30003FFE0028DCD00C4B0C4A0F490D4809F04D
+:100F40008DFA21000831002001F000F8002802D1BC
+:100F5000A3680093D3E7044B044A0849054809F005
+:100F60007DFAC0463DB8F39688E50010C8E600104B
+:100F70003604000090E500104D0400006D040000F0
+:100F800070B504000D00FFF79FFF002812D1EB7928
+:100F90006422A354033BDBB2012B11D9EB79022B62
+:100FA00017D0042B15D0032B13D06423E35CFF2B45
+:100FB00018D070BD124B134A1349144809F04EFA69
+:100FC000002000F011FA0028E8D06423FF22E25448
+:100FD000E4E7002000F0F4F90028E6D06423FF22C3
+:100FE000E254E2E70A4B1B68DB680E220121094844
+:100FF00009F0C6FA084B034A0849044809F02EFADA
+:1010000088E50010D8E600109605000090E5001075
+:10101000EC010008D0E50010E0E50010AE0500008E
+:1010200070B50400FFF750FF002814D16423E55C7D
+:10103000EB1EDBB2012B14D9022D03D0042D01D0FD
+:10104000032D07D1002000F0BBF9002802D0642353
+:10105000FF22E25470BD084B084A0949094809F0CB
+:10106000FDF9002000F0C0F90028E5D06423FF223C
+:10107000E254FF25E2E7C04688E50010B4E6001020
+:101080005305000090E5001070B504000D00FFF757
+:1010900008FE00280FD1002200212000FFF7DEFE0D
+:1010A000002814D1200000F0CDFB00281AD16423C1
+:1010B0000122E2540AE0344B1B68D868E022120196
+:1010C000324909F0E9F964230122E25470BD2E4B44
+:1010D0001B68D86800222E4909F0DEF9642301223A
+:1010E000E254F3E72800FFF7D4FE2900200001F0C6
+:1010F00001F8002814D12800FFF7D5FE00281AD0E7
+:10110000EB79012B34D02A0001212000FFF72CFEBF
+:10111000204B1B68834232D064230522E254D5E77A
+:10112000194B1B68D86800221B4909F0B5F96423E4
+:101130000122E254CAE729002000FFF721FF00281E
+:101140000AD12A0000212000FFF788FE002809D1DB
+:1011500064230122E254B9E7104B114A11491248A5
+:1011600009F07CF90D4B0E4A10490F4809F076F949
+:1011700029002000FFF752FE6423E054A6E7EA7935
+:101180006423E254A2E7C046EC010008E4E5001045
+:101190002CE60010100900085CE6001088E500103D
+:1011A000F4E600105306000090E500105906000018
+:1011B00010B501F033FB10BDF8B5DE4657464E467C
+:1011C0004546E0B58946924698460A9B9B460B9E4B
+:1011D000002512E04346E9182300124A484601F070
+:1011E00087FA002819D15B46E91823000D4A5046BA
+:1011F00001F0BEFA002812D12D19B54206D2741B97
+:101200008023DB009C42E5D91C00E3E70020F0BC12
+:10121000BB46B246A946A046F8BD0120F7E701202B
+:10122000F5E7C04680090008F0B5C64600B584B0B1
+:1012300004000E004E4B1B6898466C22002109F0FA
+:10124000D0F94C4B63624C4B23654C4BE365012753
+:101250007F420025012D14D82900002001F048FB11
+:101260002C21694320316118C0B201F02BFA071E0E
+:1012700001D10135EEE7424B424A4349434809F068
+:10128000EDF869462000FFF7FFFE6423E35C6A4641
+:10129000D371042B18D8022B21D2012B2BD164231C
+:1012A000E35CFF2B2BD0012B37D1394B22689A42BC
+:1012B0003BD0384B1B68D86800232200364909F020
+:1012C000EBF80327002549E0052B14D1002000F09E
+:1012D0008BF8071EE3D06423FF22E254DFE7694660
+:1012E0002000FFF79DFE071ED9D0254B254A2B492C
+:1012F000264809F0B3F86423FF22E254CFE7254BD8
+:101300001B68DB680E220121254809F039F9254BBD
+:101310001C4A25491D4809F0A1F86A460021200011
+:10132000FFF79CFD071EC0D0CCE7102200216846C5
+:1013300009F057F9236A5B783371236A5B68B360FD
+:1013400034601A4B1B689846BCE70122521B2C23C1
+:101350005343E318186A01F0C9F90135012DF4D996
+:10136000002F00D14746380004B080BCB846F0BD1D
+:1013700098000008800D0008807D000880ED0008BE
+:1013800088E5001014E70010D406000090E5001076
+:101390003DB8F396EC0100088CE60010140700003D
+:1013A000D0E50010E0E500102B0700001009000850
+:1013B00010B501000148FFF737FF10BD1409000800
+:1013C00010B582B001A9012001F07CF9002803D0FA
+:1013D0000124200002B010BD0198FFF704FA0400B8
+:1013E000019801F083F9F4E710B584B003A9012056
+:1013F00001F068F9002803D00124200004B010BDDA
+:1014000001A9039800F07EFC041E0CD101ABDB782F
+:10141000032B03D0039801F069F9EEE70398FFF777
+:10142000ECF90400F6E70124F4E70000F0B5CE463D
+:1014300000B582B00C0016001D00526AC300D758D8
+:101440001368FF1A0138C0001258D31A99462B6846
+:10145000012B15D1EB68022B0CD00899300000F05D
+:101460008BFD00282AD12A000899300000F0EAFDFF
+:1014700000282AD10999300000F07EFD00282BD1E8
+:10148000220039000898FFF793FE00282BD1019421
+:1014900000974B46089A11003000FFF78DFE002898
+:1014A00028D12900300000F0E9FB2B6801332B60C4
+:1014B000002826D102B080BCB946F0BD5421144B9F
+:1014C000144AFF31144808F0C9FFAB21104B114AF0
+:1014D0004900114808F0C2FFAD210D4B0D4A4900EB
+:1014E0000D4808F0BBFFAF21094B0A4A49000A48E2
+:1014F00008F0B4FF6221064B064AFF31064808F0A7
+:10150000ADFFB321024B034A4900034808F0A6FF90
+:1015100088E50010CCE8001024E70010F0B5CE46B6
+:10152000474680B583B00F0015001C00566AC30003
+:10153000F2583368D21A90460138C0003658F61A6D
+:101540002A6D11581368CB1A99462279012A07D0BF
+:101550002379022B32D003B0C0BCB946B046F0BDEF
+:101560003A0031000A98FFF723FE002818D10197AE
+:1015700000964B460A9A0B992800FFF71DFE00289B
+:1015800015D12100280000F079FB022323710028E7
+:10159000DED08021224B234AFF31234808F05EFF32
+:1015A0007A211F4B1F4AFF311F4808F057FFBE2109
+:1015B0001B4B1C4A49001C4808F050FF3A004946A2
+:1015C0000B98FFF7F5FD00281CD101974B460093BF
+:1015D00043460B9A0A992800FFF7EEFD002818D120
+:1015E0002100280000F04AFB236801332360012317
+:1015F00023710028AFD08C21094B0A4AFF310A48D9
+:1016000008F02CFFC221064B064A4900064808F0A4
+:1016100025FF8821024B034AFF31034808F01EFFD3
+:1016200088E50010B8E8001024E7001070B582B01B
+:1016300016001C1E3AD0436A5D686379012B12D0F4
+:10164000022B19D00025002001F052F9C0B201A9E7
+:1016500001F038F8002830D00125019801F046F853
+:10166000280002B070BD002922D11D4B1B682268E2
+:101670009A42E8D80025E6E72368012B08D9184AE2
+:101680001268934204D8002914D100250131DAE709
+:10169000012B01D00025D6E7002900D00025012923
+:1016A000D1D12379022BCED10021CCE70025CAE786
+:1016B0000025C8E700250021C5E7202332002900C6
+:1016C000019801F015F8051E08D1002CC5D032682C
+:1016D000044B9A42C1D001256D42BEE70125BCE70B
+:1016E0009C0000083DB8F396F0B5DE4657464E46DE
+:1016F0004546E0B589B006000591049200230393A6
+:101700000378032B00D182E000F095FAE0252D014B
+:1017100000239A460133019300239B46013B9946DF
+:101720000023029380464F460BE06B1E9B460292BD
+:101730001AE0019BA34202D001239C46E244013DF2
+:101740000194002D1DDD30784346E918013901234D
+:1017500006AA073200F086FE041E5ADB06ABDA79D1
+:10176000531EDBB2012BE0D9300001F0D1F806ABFB
+:1017700007331B789842DCD07A1CE0D12F0003930A
+:10178000DDE7B9465346012B24DC049908310020DB
+:1017900000F0DCFB041E2BD1049B9E6805998F6E24
+:1017A0003900300007F04AFB05003900300007F02F
+:1017B000CBFB4B1E99416918484601302AD0894518
+:1017C0001CDA0123049A537113004A461A60039AE3
+:1017D0001A711FE0134B1B68DB6825220121124898
+:1017E00008F0CEFE114B124AC221124808F036FE14
+:1017F000114B0F4AC8210F4808F030FE0223049A0B
+:10180000537113005A461A60029A1A7102E00724B3
+:1018100000E00124200009B0F0BCBB46B246A94656
+:10182000A046F0BDEC0100086CE70010E0E50010F8
+:1018300010E9001024E7001088E500100068484314
+:101840007047000070B5856A446DAC4202D0631CDD
+:10185000AB4213D1E0231B019D4219D80023002184
+:10186000A34229D2DA00416A89184968066DB44654
+:10187000624452688A4215D10133F1E7194B1B6863
+:10188000DB683A220121184808F07AFE002012E0B5
+:10189000144B1B68DB6831220121144808F070FEEC
+:1018A000002008E00F4B1B68DB682E220121104846
+:1018B00008F066FE002070BDAC4211D2426ADB0027
+:1018C000D3185B68994201D10120F4E7054B1B68EE
+:1018D000DB682E220121064808F052FE0020EAE7CC
+:1018E0000120E8E7EC01000894E70010D0E70010C1
+:1018F00004E8001070B586B004A90120FEF75DFF72
+:10190000041E25D11D4B1B68D86804AB1B78012B26
+:1019100027D0032B23D01A4B04AD6A78A978EE7830
+:10192000029601910092174A174908F0B5FD2B78ED
+:10193000012B02D1AB78032B15D0104B1B68DB6851
+:1019400019220121114808F01BFE200006B070BDCD
+:1019500030210F4B0F4AFF310F4808F07FFD0F4B2E
+:10196000DAE70F4BD8E7054B1B68DB682122012122
+:101970000C4808F005FE0224E7E7C046EC01000829
+:10198000CCE3001034E8001030E400107CE80010D4
+:1019900088E50010FCE8001024E70010D8E30010F0
+:1019A000D0E3001058E80010F0B589B005900C00A5
+:1019B0001500334962681140324A914202D12268CF
+:1019C000012A01D009B0F0BD06A91800FEF7F5FE06
+:1019D000002834D12C4B1B68D86806AB1B78012B30
+:1019E00036D0032B32D0294B06AF7A78B978FE78FF
+:1019F000029601910092264A264908F04DFD3B7857
+:101A0000032BDFD12900059800F0B6FA002821D178
+:101A10002800FEF7F2FE002823D1A1682800FEF777
+:101A200023FF002824D1280000F010F90028C9D095
+:101A3000B821194B194AFF31194808F00FFDD4217C
+:101A4000154B164A4900164808F008FD154BCBE720
+:101A5000154BC9E7D721104B104A4900104808F030
+:101A6000FDFCB2210C4B0D4AFF310D4808F0F6FC8D
+:101A7000DA21094B094A4900094808F0EFFCC04641
+:101A800000FF00FF00010004EC010008CCE300109F
+:101A900098E8001030E4001088E50010ECE8001031
+:101AA00024E70010D8E30010D0E30010F0B5C646DC
+:101AB00000B584B080460E00354B00211960436AA2
+:101AC0005F680023DB19324D29684C1C2C6093425F
+:101AD000F8D303A9012000F0F5FD002812D102A9D6
+:101AE000022000F0EFFD002813D10223029A3100FA
+:101AF0004046FFF759FF7379012B11D00223737110
+:101B0000012429E0D821234B234AFF31234808F040
+:101B1000A5FCED211F4B204A4900204808F09EFCFF
+:101B20001B4B1C6800E0013C002C11D0184B1B68BB
+:101B300032689B1A0133A342F5D3029B0193039BA6
+:101B400000933300424639002000FFF76FFCEAE7BC
+:101B500001233360D2E701340D4B1B68A3420DD340
+:101B60003368A342F7D8029B0193039B0093330091
+:101B7000424639002000FFF7D1FCECE7039800F063
+:101B8000B5FD029800F0B2FD04B080BCB846F0BDCF
+:101B90009C00000888E50010E0E8001024E7001031
+:101BA000012800D170470220FCE7000010B5102288
+:101BB000044908F0FFFC002801D0022010BD0120DC
+:101BC000FCE7C046E4E4001030B585B00D0001200C
+:101BD00000F078FD041E02D0200005B030BD1023B7
+:101BE0006A460949012000F03DFC041E07D110227D
+:101BF0000649684608F0DEFC002800D10400286889
+:101C000000F074FDE8E7C04684110000E4E4001031
+:101C1000004870478311000010B5FFF7F9FF013845
+:101C200010BD10B5FFF7F8FF013810BD10B5FFF774
+:101C3000F8FF043810BD0020704710B5007800F0A0
+:101C40009FFB002800D110BD0120FCE710B50078F3
+:101C50001023044A044900F093FB002800D110BD72
+:101C60000120FCE7E4E400108411000010B5C36D0E
+:101C700059689020800107F0E1F810BD30B583B0BD
+:101C80000C0001A9012000F01DFD002806D0012450
+:101C9000019800F02BFD200003B030BD0198FFF744
+:101CA000CAFF050001212000FFF7C8FD291863794C
+:101CB000012B0ED023790133DBB26A460332137055
+:101CC000019B1878012300F05BFB041EE0D0012487
+:101CD000DEE72379F1E7F0B5C64600B580460F0090
+:101CE0001600002400E00134B44207D23D5D4046B6
+:101CF00000F00EFE8542F6D0002000E0012080BCFE
+:101D0000B846F0BDF0B5DE4657464E464546E0B50E
+:101D100089B004000E0002A9072000F0D3FC051EC4
+:101D200008D00127380009B0F0BCBB46B246A9462E
+:101D3000A046F0BD2078102304AA834900F092FB4E
+:101D4000002800DAEEE0102204A90298FFF7C3FF92
+:101D5000071E00DAE8E001286FD004A8FFF726FF8D
+:101D600030700023994698462000FFF75AFF010083
+:101D70002078012302AA073200F074FB002800DA61
+:101D8000D4E0012202ABD91D0298FFF7A4FF00287E
+:101D900000DACDE002AB07331B780F221A407270D5
+:101DA0001B093371012801D0042A03D90123737060
+:101DB000002333712000FFF72FFF01002078B71CAC
+:101DC00001233A0000F04EFB002800DAB2E00122C5
+:101DD00039000298FFF77FFF002800DAACE0012805
+:101DE00063D0B078FFF7DCFEB0702000FFF710FF83
+:101DF00082462078F31C9B4601235A46514600F048
+:101E000031FB002800DA99E0012259460298FFF7D9
+:101E100062FF071E00DA93E0012849D0F078FFF74F
+:101E2000BFFEF0704B46002B00D18BE010224146E4
+:101E3000200000F0F3FC070074E7032333702378DD
+:101E4000022B05D0062B03D00023994698468BE73A
+:101E5000A36810225242944663449846102304AA71
+:101E60004146200000F06EFD8146031E00DA59E76E
+:101E700001280DD004A8FFF799FEC0B230700128E8
+:101E80000BD04B46002B00DA4CE7012399466BE759
+:101E9000023333700023994666E72078102304AAA2
+:101EA000294900F06DFA8146EBE70323B3709CE704
+:101EB0000323F3702378052B25D021D8012B22D0C2
+:101EC000022B00D02EE7A3681822524294466344A6
+:101ED000984601235A464146200000F033FD031E78
+:101EE000019000DA1EE7012811D0F078FFF758FEC4
+:101EF000C0B2F07002280DD1019B002B96DA11E7D9
+:101F0000062BE0D00EE7B378012B8BD1DBE7023351
+:101F1000F37087E7207801235A46514600F030FAE3
+:101F20000190E9E70127FDE60127FBE60127F9E635
+:101F30000127F7E60127F5E60127F3E60127F1E699
+:101F40000127EFE62F00EDE68411000030B583B0E5
+:101F50000C0001A9FFF738FE002801D003B030BD06
+:101F6000019D2800FFF762FE01002878042322006B
+:101F700000F078FAF2E70000F0B5CE46474680B5AB
+:101F800083B007008946294B1B68D8680A7828491E
+:101F900008F082FA01A9072000F094FB002806D07F
+:101FA0000124200003B0C0BCB946B046F0BD0021FA
+:101FB00000F09EFC04000121002000F099FC4B463B
+:101FC0001B78A34201D083422ED1180000F048F9BB
+:101FD00080463800FFF74AFE441E0025FA6DE300F4
+:101FE000D3185E6819681368C91A41443200019811
+:101FF000FFF7DEF8002811D1013CAD1990239B01B9
+:102000009D42EBD34B46996840394022484600F048
+:1020100005FC0400019800F069FBC2E7054B064A85
+:102020000649074808F01AFA0124BAE7EC0100084B
+:1020300028E9001088E50010C0E90010190200002E
+:102040004CE9001030B583B00C0015006946022041
+:10205000FEF7B3FB002814D1E979012917D16B46AB
+:10206000DB78012B1FD0A9682000FEF7FDFB0028BC
+:1020700024D12000FFF7EAFD002825D1002003B07D
+:1020800030BD144B144A1549154808F0E7F90022F1
+:102090002000FEF7BDFB0028E1D00E4B0E4A11498F
+:1020A0000F4808F0DBF92000FEF7A7FB0028DAD084
+:1020B000084B094A0C490A4808F0D0F9054B064A72
+:1020C0000A49074808F0CAF9024B034A084904487C
+:1020D00008F0C4F988E50010ACE900103E020000E9
+:1020E0004CE9001042020000470200004B020000D1
+:1020F0005602000070B584B005000E00FFF7FAFB31
+:10210000041EF06008D0022809D103A9012000F0C4
+:10211000D9FA002809D00124200004B070BD1E4B5C
+:102120001E4A1F491F4808F099F902A9072000F02C
+:10213000C9FA002801D00124EEE7320029000398F3
+:10214000FFF7D2FA041E19D10398FFF76AFD0100C8
+:1021500001236A460732012000F084F901226B4610
+:10216000D91D0298FFF7B7FD002813DB01280CD01A
+:102170006B46DA790F231340F3710400039800F0E3
+:10218000B5FA029800F0B2FAC6E76B460122DA719E
+:102190002000EDE70124BFE7E0E5001098E900101A
+:1021A0006F0200004CE9001010B5FA21490006F05A
+:1021B00045FE10BD10B5FFF7F7FF400210BD10B58A
+:1021C000FEF714FC10BD000070B5204CA5440400BF
+:1021D0000E001D000132839201A9072000F072FA5F
+:1021E000002805D00124200084239B009D4470BD5D
+:1021F000FA225200290002A808F0EAF9839B809392
+:10220000134B1B687F93FE21490002A8FFF7D7FFFD
+:1022100082908190012E10D00136F1008919490277
+:10222000091980239B0002AA019800F0A1FA041E5C
+:1022300005D1019800F05AFAD5E70026EDE7054BE5
+:10224000054AE921054808F009F9C046F0FDFFFFFD
+:10225000C4EA001088E500107CEA0010DCE90010F8
+:10226000012804D0022804D190208001704700206A
+:10227000FCE701204042F9E7F0B5DE4657464E46FE
+:102280004546E0B5394CA54481460191029205A925
+:10229000072000F017FA061E63D100250023984698
+:1022A00000279A4603930CE0859B9B46FE2149003C
+:1022B00006A8FFF784FF584518D001239C46E24446
+:1022C0000135012D19D8EC00641964024C448023B7
+:1022D0009B0006AA2100059800F00AFA002842D1C6
+:1022E000234B839A9A42DFD00137E9E7849B9845D4
+:1022F000E6D82E0098460394E2E7022F11D0534609
+:10230000022B1CD101267642059800F0EFF930002F
+:1023100087239B009D44F0BCBB46B246A946A0461D
+:10232000F0BD0023029A1360059800F0F1FA010055
+:10233000FA225200019808F054F90126E4E7029BC2
+:1023400042461A60FA235B00019A0399059800F04F
+:10235000CFF90028D8D0074B074AAB21074808F02F
+:102360007DF80126D3E70126D1E7C046E4FDFFFF53
+:10237000AFBEADDE88E50010ACEA0010DCE900106D
+:10238000F0B5CE46474680B5FFB007000C00914639
+:102390001E00FA214900200006F0D6FD0D0032197A
+:1023A0002A4B9A420DD83800FFF75AFF071E0FDB61
+:1023B0002000FFF7FFFEC719002398460120404286
+:1023C00026E00E21224B234AFF31234808F046F82D
+:1023D0001221224B1F4AFF311F4808F03FF85A1BB9
+:1023E000280068444946414408F0F2F86B467D9A5B
+:1023F00021003800FFF7E8FE002818D1F53EFF3E27
+:1024000080239B009C4667440C3B9C46E04400258F
+:10241000002E15DD7DAA69463800FFF72DFF041E4A
+:102420000CDBFA235B009E42D9DC3200D8E72E2178
+:102430000B4B084AFF31084808F010F801204042D1
+:102440007FB0C0BCB946B046F0BDC0469411000094
+:1024500028EA001098EA0010DCE9001054EA0010A5
+:1024600088E50010F0B5C64600B5FEB005000E00C8
+:1024700090461C00FA214900300006F065FD0F006F
+:10248000A219214B9A420AD82800FFF7E9FE051E3F
+:102490000CDB3000FFF78EFE451900261DE0AA2157
+:1024A0001A4B1B4A49001B4807F0D8FFAC211A4BB6
+:1024B000174A4900174807F0D1FF22003900694444
+:1024C0004346981908F084F8F53CFF3C80239B00B4
+:1024D0009C466544F536FF360027002C0CDD7DAAAE
+:1024E00069462800FFF7C8FE00280ADBFA235B00D4
+:1024F0009C42E2DDDA1BE1E700207EB080BCB846FA
+:10250000F0BD01204042F8E79411000028EA0010D5
+:1025100064EA0010DCE9001054EA0010F0B5D64679
+:102520004F464646C0B582B004000D0017009946DC
+:102530000AAA13789A46002845D0002947D0002FD0
+:1025400049D00E89CB689C466644042301AA310019
+:10255000380000F0CDF88046002840D101AB1A8841
+:10256000274B9A421FD06B89002B40D101AB1A88B0
+:10257000244B9A423FD1256067604B4623815346E6
+:10258000A3726B899B19E3606B899B1901AA52881E
+:102590009B18636104362661404602B0E0BCBA462F
+:1025A000B146A846F0BD6B8901AA51888B421AD169
+:1025B00089190423380000F09BF80028D6D00123A5
+:1025C0005B429846E8E701235B429846E4E7012333
+:1025D0005B429846E0E701235B429846DCE7012333
+:1025E0005B429846D8E701235B429846D4E7012333
+:1025F0005B429846D0E701235B429846CCE7C04651
+:102600000869000007690000F0B583B004000F00FE
+:1026100016001D00002848D00368002B48D04368EE
+:10262000002B20D1012040423BE0042301AA216974
+:10263000606800F05DF800283DD1A37A002B03D03C
+:102640002369E268934239D223891D4A934218D004
+:1026500001AA1288934214D001AB5B882269944688
+:102660006344043323612369626993421BD2226865
+:102670005289002AD9D0E2689A42D6D10433236124
+:10268000D3E7002D02D001AB1B882B8023690433D4
+:102690003B6001AB5B88338022699446634404331A
+:1026A000236103B0F0BD0120FBE701204042F8E7C1
+:1026B00001204042F5E701204042F2E70120F0E727
+:1026C000FFFF000010B5002200E001329300064C2D
+:1026D0001B59002B05D01C788442F6D10B600020DA
+:1026E00001E00120404210BDA0000008704700003A
+:1026F00070B5150044688C4214D9CA18944218D990
+:10270000611842787F2A1BD052B2002A1EDB0124B6
+:102710006442114B1B68D8682200104907F0BCFEC8
+:10272000200070BD20210E4B0E4AFF310E4807F0ED
+:1027300095FE90210D4B0B4A49000B4807F08EFE89
+:102740001A00280007F044FF0024E9E72A0000F0FF
+:102750006FF9041EE4D0DCE7EC01000844EB001044
+:10276000C8EA001098EC0010DCEA00102CEB001016
+:10277000F8B5150044688C420CD9CA18944210D997
+:10278000641842787F2A13D052B2002A34DB012029
+:102790004042F8BDA3211B4B1B4A49001B4807F0D0
+:1027A0005DFE48211A4B184AFF31184807F056FEC3
+:1027B000DA0506D1E205D00D002A09D15F0A06002C
+:1027C00017E0A921134B104A4900104807F046FEB4
+:1027D0005421114B0C4AFF310C4807F03FFE2900F1
+:1027E000200002F017F980239B009C466444654456
+:1027F0000136BE42F3D3CCE72A00210000F040F9B5
+:10280000C7E7C046C8EA001084EC0010DCEA0010FC
+:102810002CEB00106CEB00108CEB001070B5836893
+:10282000934211D38B4216D9541845685B199C42C8
+:1028300018D26D18531941787F291AD049B200294E
+:1028400034DB0120404270BDBC211B4B1B4A4900B8
+:102850001B4807F003FE7A211A4B184AFF3118482B
+:1028600007F0FCFDBD21184B144A4900144807F03D
+:10287000F5FD6D0A6D025B0A5B029D4212D05B1B87
+:102880005C0A0020002CDED0013C6002401902F0FE
+:1028900087F80028F6D094210C4B084AFF310848ED
+:1028A00007F0DCFD280002F07BF8CCE711002800DF
+:1028B00000F00EF9C7E7C046B8EB001070EC00104E
+:1028C000DCEA0010CCEB0010E0EB001008EC00108C
+:1028D00010B543787F2B08D05BB2002B02DB0120C0
+:1028E000404210BD00F0C6FBFBE780208000F8E707
+:1028F000012908D0022908D0002902D00120404235
+:1029000070470120FCE70220FAE70320F8E7000007
+:1029100010B543787F2B0BD05BB2002B02DAFF207F
+:10292000C0B210BD034B044A0449054807F096FDA8
+:102930000020F5E724EC001058EC00101F02000006
+:10294000DCEA0010F8B5CE46474680B50700904651
+:102950001E00FFF7CDFE814600280FD10024B442AF
+:1029600009D243461D5D3800FFF7D2FF854208D1EA
+:102970000134E4B2F3E70123994602E001235B420C
+:1029800099464846C0BCB946B046F8BDF8B50E00F9
+:102990001500002200E00132930020495B58002B13
+:1029A00004D019788142F6D11C0000E01C00002BF5
+:1029B0002ED063787F2B11D05BB2002B2BDA00F086
+:1029C00061FB0700A368D8190138390006F036FA10
+:1029D000336883420BD36268002414E0072802D1D5
+:1029E0008027BF00EEE700F04DFB0700EAE70C4B45
+:1029F0000C4A0D490D4807F031FDE300EB185F600C
+:102A00001A60D21901348442F7D330600020F8BD37
+:102A100001204042FBE701204042F8E7A000000807
+:102A20002CEC001040EC001072020000DCEA0010F8
+:102A3000F0B5C64600B582B00E0017001C00437802
+:102A40007F20184000F0AEFA0500E8231B069C46E4
+:102A5000664400F0AFFA804600F0B0FA01900094AE
+:102A60003B0032002900404604F0F6F9002804D16A
+:102A7000002002B080BCB846F0BD01204042F8E71B
+:102A8000F0B5C64600B582B00E0017001C004378B2
+:102A90007F20184000F086FA0500E8231B069C46BC
+:102AA000664400F087FA804600F088FA01900094AE
+:102AB0003B0032002900404604F048FA002804D1C7
+:102AC000002002B080BCB846F0BD01204042F8E7CB
+:102AD000F0B583B00500002000F064FA0400E8239C
+:102AE0001B06E818A3699D696D42054000F062FA73
+:102AF0000600A3699F6900F061FA00903B002A007C
+:102B00002100300004F0C0FA002802D1002003B0F8
+:102B1000F0BD01204042FAE7F0B5C64600B58C682A
+:102B20000A688423C3580F252B40073DED1A230064
+:102B3000AC4226D92B0024E055782D021678354377
+:102B4000D678360697783F043E4335439827C551DB
+:102B500055792D0216793543A846D67936069579EA
+:102B60002D042E4345463543C551D218E41A84231B
+:102B7000C3580F252B40073DED1A2300AC4200D966
+:102B80002B00002B00D183E0082BD5D0012B24D0C3
+:102B9000022B26D0032B2BD0042B33D0052B3ED079
+:102BA000062B4CD0072B5DD053781B0215782B4396
+:102BB000D5782D069678360435432B4398268351D5
+:102BC00053791B0215792B43D5792D0697793F044C
+:102BD0003D432B4383510823C7E716789025465180
+:102BE000C3E755782D021678354394268551BCE706
+:102BF00055782D0216783543942685519678902580
+:102C00004651B2E755782D0216783543D678360608
+:102C100097783F043E43354398268551A5E755787C
+:102C20002D0216783543D678360697783F043E4312
+:102C300035439826855116799025465195E7557864
+:102C40002D0216783543D678360697783F043E43F2
+:102C500035439826855155792D02167935439426AA
+:102C6000855182E755782D0216783543D678360699
+:102C700097783F043E4335439826855155792D0278
+:102C800016793543942685519679902546516CE7FF
+:102C90000A608C60002C0CD1F924E4000359012255
+:102CA000934303518A61CB69002B02D0CB69012089
+:102CB000984780BCB846F0BDF8B50E004C69CA68AC
+:102CC000C423C3580F21194023008C421CD90B0088
+:102CD0001AE0D825415911700F0A57700F0C9770E0
+:102CE000090ED17045591571290A5171290C91713C
+:102CF0002D0ED571D218E41AC423C3580F251D40D8
+:102D00002300AC4200D92B00002B6DD0082BE0D063
+:102D1000012B1ED0022B20D0032B24D0042B2BD030
+:102D2000052B33D0062B3ED0072B4BD0D821435850
+:102D300013701D0A55701D0C95701B0ED3704358EF
+:102D40001371190A5171190C91711B0ED37108235B
+:102D5000D0E7D02141581170CCE7D42141581170EF
+:102D6000090A5170C6E7D42141581170090A5170FF
+:102D7000D02141589170BDE7D821415811700D0AFA
+:102D800055700D0C9570090ED170B3E7D8214158DC
+:102D900011700D0A55700D0C9570090ED170D0216F
+:102DA00041581171A6E7D821415811700D0A55708C
+:102DB0000D0C9570090ED170D42141581171090A7A
+:102DC000517197E7D821415811700D0A55700D0CBB
+:102DD0009570090ED170D42141581171090A5171B1
+:102DE000D0214158917185E7F2607461002C0DD1BA
+:102DF000F922D200835802218B4383500323B3610D
+:102E0000336A002B02D0336A032098477461F8BDFF
+:102E100010B5264A264BD358DA070DD49A0716D494
+:102E20005A071FD5234B05229A61204AF823DB005D
+:102E30000421D150D35809E01C4C1E492000FFF753
+:102E40006BFEF823DB000122E250E35810BD174C63
+:102E500018492000FFF730FFF823DB000222E25080
+:102E6000E358F3E71A0709D5124B06229A610F4A75
+:102E7000F823DB000821D150D358E7E7DA0609D55B
+:102E80000C4B07229A61094AF823DB001021D1502C
+:102E9000D358DBE79B06D9D5064B08229A61034A33
+:102EA000F823DB002021D150D358CFE70000424067
+:102EB000CC070000805E010810B52E4C2E4A03217D
+:102EC000200001F0EBFE11220321200001F00CFE96
+:102ED0002A4A0421200001F0E1FE112204212000F1
+:102EE00001F002FE264A0521200001F0D7FE112242
+:102EF0000521200001F0F8FD224A0621200001F002
+:102F0000CDFE11220621200001F0EEFD1E4A072110
+:102F1000200001F0C3FE11220721200001F0E4FD92
+:102F20000021022004F052FB0221022004F07EFB6B
+:102F3000022004F017FB1549154805F0BBF8FA22EA
+:102F4000144B92001449154802F040FD041E0FD1A5
+:102F50000F4B00229B5E002B06DB1F2213401E3A04
+:102F60009A4013000E4A13600A490C4802F00CFF05
+:102F7000200010BD8005314044ED001010ED001020
+:102F8000DCEC0010A8EC001078ED0010112E001001
+:102F9000E4010008805E0108ACED00100000424032
+:102FA00000E100E0024B1B685B688000C05870477E
+:102FB000385F0108004870470000424000487047F1
+:102FC000805E010810B50400FFF776FF002800D0EE
+:102FD00010BD044B1C60044A2100044803F02EFE7F
+:102FE000F6E7C046385F0108805E010800004240F5
+:102FF00070B51D4B5B68032831D00AD8012811D069
+:10300000022803D11B6802221A700EE00120404200
+:1030100024E0042803D11B6808221A7005E001206F
+:1030200040421BE01B6801221A7001380F4A43001E
+:10303000191889008C581918890051184D680E7A92
+:103040000B4A16722900200001F028FE32002900E8
+:10305000200001F049FD0448FFF7B4FF70BD1B6874
+:1030600004221A70E1E7C046D40100088C01000870
+:10307000E4000008024B5B681B689B69586A704754
+:10308000D4010008024B5B681B689B699869704714
+:10309000D401000870B504001D4D280003F040FB6A
+:1030A0002B685B005B082B60022004F073FA194B5D
+:1030B00000229B5E002B0BDB1F2213401E3A9A401E
+:1030C0001300154980228B50BFF34F8FBFF36F8FD2
+:1030D000104B59880020185E04F0BAFF013C6000D4
+:1030E000001980000D4BC05801F0D4FC0C4C20009E
+:1030F00001F0D0FC200001F0CDFC200001F0CAFC62
+:10310000200001F0C7FC200001F0C4FC70BDC046E7
+:1031100000004240E401000800E100E08C010008EA
+:1031200080053140074BC200D05A9B1859889A88B5
+:10313000DB88084310431843C0B2431E9841C0B215
+:103140007047C046845F010870B515000024002C4C
+:1031500002D0124C200070BDA3005B195B00104A26
+:103160009A5A6B000F4E9B5B9A4201D30134EEE7F3
+:1031700000230B704C700C4B03602000FFF7D2FF54
+:10318000002807D00649A20055196D006B5A01337B
+:103190006B52DFE7044800F0FDFBF3E7011000008D
+:1031A000845F0108BCED00100000104070B50600FF
+:1031B0000D004C78A3009B185B0010495B5A002B54
+:1031C00004D0A400A4186400013B63526878FFF7A0
+:1031D000A9FF002800D070BD094B1B68002B05D04B
+:1031E0003368002B05DB01232B70F4E700F026FB8E
+:1031F000F6E7300000F014FCF5E7C046845F0108F4
+:10320000D85F010870B504000D0000280BD0211D07
+:103210002A002000FFF798FF002800D1A571434243
+:103220005841C0B270BD01BEF1E710B5002803D00F
+:103230000379002B02D010BD01BEF9E782790100AD
+:1032400001C9FFF7B3FFF6E730B583B005000C0006
+:10325000002801D0002901D103B030BD0321684608
+:10326000FFF7D0FF002803D16846FFF7DEFFF3E742
+:103270000098A3B2074A11682D228A5C1F2A04D83D
+:103280000022290000F07AFCEEE70022290000F07D
+:1032900003FDE9E7D45F010810B5041E01D0002941
+:1032A00000D110BDFFF7D0FF03212000FFF7AAFFD8
+:1032B000F7E7000070B505000C1E22D0002B23D0CC
+:1032C000006816490E682D21715C1F2911D8210054
+:1032D00000F05EFD00281AD12868104B1A682D23D3
+:1032E000D35C1F2B09D8210000F008FE002811D163
+:1032F00070BD210000F0D6FEECE7210000F060FF79
+:10330000F4E701204042F3E701204042F0E70120CA
+:103310004042EDE701204042EAE7C046D45F0108A1
+:1033200070B5002913D0002A14D0CC68002C14D01A
+:1033300000680D4C25682D242C5D1F2C04D800F04E
+:10334000F3FD00280CD170BD00F050FFF9E701201B
+:103350004042F8E701204042F5E701204042F2E711
+:1033600001204042EFE7C046D45F010810B50029B4
+:1033700013D0002A14D0CB68002B14D000680D4B5A
+:103380001C682D23E35C1F2B04D800F019FE0028D5
+:103390000CD110BD01F0C6F8F9E701204042F8E772
+:1033A00001204042F5E701204042F2E7012040427F
+:1033B000EFE7C046D45F010810B59821FFF76CFF16
+:1033C00010BD10B50B0001000831002B05D1022201
+:1033D00003003833FFF76EFF10BD0122F8E710B588
+:1033E0000C00131E01D1002010BD01000831220085
+:1033F000FFF796FFF8E710B50A0001000831FFF764
+:10340000B5FF10BD10B50549C02252008B580120F0
+:1034100003438B5005F008FD10BDC0460000264058
+:103420000349C02252008B58012083438B507047C0
+:103430000000264070B50400421E304B9A4256D818
+:103440002F4B1B78002B55D12D4B01221A702D4B81
+:103450001B78002B0ED0FFF7E3FF2B4B1C800023C3
+:103460000C2B1FD89900294A52185288A24212D90F
+:103470000133F5E7264D8032FF32AB580126334346
+:10348000AB5005F0D1FCE122D200AB58B343AB50B6
+:103490001C4B1E70DFE70A001C49525AA24202D997
+:1034A000140000E00C231B4A1370FF251D40280068
+:1034B00005F0A0FC2004000C06F02CFE164A174B69
+:1034C00005F06AFF05F07EFE82B211235B1B01202E
+:1034D0009840101A80B20E4AC2235B00D358C0181D
+:1034E00080B205F06FFCFFF78DFF002070BD01205A
+:1034F0004042FBE701204042F8E7C0466F1700005A
+:10350000905F0108915F01088E5F0108C4ED001013
+:10351000000026408C5F010833DFC14F1C409F3FF5
+:10352000064AD0239B00D05803E0044AD0239B00D6
+:10353000D058431CF9D0C0B27047C0460000654067
+:1035400010B50400002003E02100034801F0E8FE6C
+:103550000028F9D010BDC0460000654070B50600D7
+:103560000D00002102F0AAF80021012003F016FF4F
+:10357000040004F01DFDE9004B08C01805F05EFCD6
+:10358000421E002C08D0002C0CD0326880231B0671
+:1035900013433360200070BD0021012003F03CFE86
+:1035A0000400F0E70021012003F0B6FE0400ECE780
+:1035B00070B50C001600002901D0002509E0002597
+:1035C000280070BD2078094B1870FFF7B9FF01344F
+:1035D0000135B542F4DA23780A2BF3D1034B1B787B
+:1035E0000D2BEFD00D20FFF7ABFFEBE7D05F01080D
+:1035F00070B50C001600002901D0002503E000255D
+:10360000280070BD0134B542FADAFFF789FF207057
+:1036100001350A28F4D00D28F4D1F1E710B50400E3
+:103620000A4A0B490B4801F08FFE002808D00028F9
+:1036300005D1084A116880231B060B43136010BD97
+:1036400021000448FFF78AFFF1E7C046945F0108B4
+:10365000B8DE00100000654070B505000C0007E002
+:103660000B4B1B689800C0184000FCF78DFF013C15
+:10367000002C0BD082229200AB58DB05DB0DA95841
+:10368000C90B01220A409B18002BE9D170BDC0462E
+:103690009000000810B5024801F0DEFF10BDC046E2
+:1036A00000006540014B18607047C046D45F0108B8
+:1036B000F0B51F001D4B1E68002E2DD0B36B1B18DC
+:1036C0001B68346D2418E41A631E9C41E3B29C46C7
+:1036D000B368C41825680F242C40062CF8D81306AC
+:1036E000F26882183B43136063460B4313D00F4BC1
+:1036F0001B689B68C3181B68DB03F8D50C4B1A6862
+:103700002D23D35C1F2B09D8084B1B681B681B1883
+:103710001B681B06F8D4F0BD3300D2E7034B1B68CF
+:103720001B681B181B68002BF8D1F4E7D85F010851
+:10373000D45F010810B50400E0239B05802200211E
+:10374000FFF7B6FFD0239B05802200212000FFF762
+:10375000AFFFC0239B05802200212000FFF7A8FFB8
+:10376000B0239B05802200212000FFF7A1FFA023AA
+:103770009B05802200212000FFF79AFF90239B05E4
+:10378000802200212000FFF793FF80239B058022E9
+:1037900000212000FFF78CFFE0235B058022002141
+:1037A0002000FFF785FFC0235B0580220021200059
+:1037B000FFF77EFFA0235B05802200212000FFF79A
+:1037C00077FF80235B05802200212000FFF770FF38
+:1037D000C0231B05802200212000FFF769FF802302
+:1037E0001B05802200212000FFF762FF8023DB04FD
+:1037F000802200212000FFF75BFF002380220021B0
+:103800002000FFF755FF0B4B1B689B080A4A116805
+:103810002D228A5C1F2A0AD80C229340F02292059E
+:103820001343802200212000FFF742FF10BD0D222C
+:10383000F3E7C046DC5F0108D45F0108054B1A6856
+:103840002D23D35C1F2B03D8034A044B1A60704707
+:10385000034AFAE7D45F0108B8EE0010D85F010808
+:103860000CEF0010F0B583B01400444B1B68002B24
+:1038700075D0002918D0002973D0002C73D0802275
+:103880001202944200D972E080225201944239D04F
+:1038900021D88022D200944236D00ED98022120143
+:1038A000944216D1782225E0002AE4D11A6D11182D
+:1038B000334A1268D46CA400DDE78022520094429F
+:1038C00024D00132FF32944201D17E2212E02D4DEC
+:1038D0004AE02C4D48E08022D201944218D0802248
+:1038E0001202944201D1002204E08022920194420B
+:1038F0003FD16022224D2E682D25765D1F2E09D9DD
+:10390000671E08E07022F5E77C22F3E77F22F1E7EB
+:103910004022EFE71C4F01910D003D4039422AD172
+:103920001F2E02D91202194942509B6B1B18019A93
+:103930001A60A308124A11682D228A5C1F2A0CD82B
+:103940000C2293401A00F0239B0513438022002190
+:10395000FFF7AEFE0E4B1C6006E00D22F1E7094DAD
+:1039600002E0084D00E0074D280003B0F0BD054D12
+:10397000FAE7044DF8E7034DF6E7C046D85F0108C3
+:10398000D45F01080B003200FF3F000088140000E4
+:10399000DC5F010810B50400FFF750FF1A4B1A68EE
+:1039A0002D23D35C1F2B10D8184B2360184B1B689A
+:1039B0005B6B1B1901221A60164B1B68002B16D07B
+:1039C0002000FFF7B7FE002010BD2368124A134005
+:1039D00023600F4B1B685B681B19104A1A60226832
+:1039E00080231B06134323600323A360DEE7084BF9
+:1039F0001B68196D6118044B1B68DA6C920020007B
+:103A0000FFF730FFDCE7C046D45F01080300008009
+:103A1000D85F0108DC5F0108FFFFFE7F01000200A4
+:103A2000084B1A682D23D35C1F2B06D80023036094
+:103A3000054B00221A60002070470023036083605A
+:103A4000F6E7C046D45F0108DC5F010870B50D4C95
+:103A50002568AC68241826680F243440042CF6D856
+:103A6000EC680419084D2560064C2568ED68451979
+:103A700029602168C96841180A602268D2688018E4
+:103A8000036070BDD85F01081002004270B50F4C92
+:103A90002568AC68241826680C242642F7D1EC6807
+:103AA00004190B4D2560094C2568ED6845192960FE
+:103AB0002168C96841180A602268D26882181360B8
+:103AC0002368DB68C018049B036070BDD85F0108E1
+:103AD0001032004370B51D0004AB1E78084A14680C
+:103AE000A3681A1812681307F8D409060223B34012
+:103AF00019430123AB40E26880181943016070BD8F
+:103B0000D85F010830B51D000B4A1468A3681A1865
+:103B100012681307F8D409060323049A9340194343
+:103B20000223039A934019430123AB40E2688018B3
+:103B30001943016030BDC046D85F010810B582B09E
+:103B4000040008001100002B01D102B010BD0200DA
+:103B50002000FFF77BFF08230093043B0022502145
+:103B60002000FFF7B7FF044B1B681B681B191B687D
+:103B7000DB06F8D4E9E7C046D85F010810B582B08B
+:103B8000040010001A1E01D102B010BD0300200075
+:103B9000FFF75CFF0C230093043B0022512120001F
+:103BA000FFF798FF034B1B681B681B191B68DB069C
+:103BB000F8D4E9E7D85F0108F0B5002B00D1F0BDDB
+:103BC0001E00314C2568AC68241827680F243C403F
+:103BD000042CF6D8862464010459002CFADBEC6826
+:103BE00004192A4D2560284D2C68E46804192260C8
+:103BF0002A68D26882181660234A1468A2681218CC
+:103C000015680F222A40042AF6D8E2688218204C50
+:103C100014601D4C2268D268821811602268D26834
+:103C2000821816600EE0184A11688A681218146823
+:103C30000F222240062AF6D8CA6882181549116058
+:103C4000103B9BB20F2BEED8002B07D10E4B1B68FD
+:103C50001B681B181B68002BF8D1B0E70A4A1168D3
+:103C60008A68121814680F222240062AF6D81B040C
+:103C7000C02212021343CA68821808210B43802114
+:103C8000C9050B431360E1E7D85F01080800007124
+:103C90000C00007008C01040F0B5002B00D1F0BD42
+:103CA0001F00264C2568AC68241826680F24344071
+:103CB000042CF6D8EC680419214D25601F4D2C68A2
+:103CC000E468041921602968C96841180F600F2B46
+:103CD00014D91A490C68A16809180D680F212940E8
+:103CE0000629F6D8E168411886256D03154384241A
+:103CF000E4052C430C60103B9BB2E8E7002B07D196
+:103D00000E4B1B681B681B181B68002BF8D1C6E7FD
+:103D10000A490C68A16809180D680F212940062975
+:103D2000F6D81B04C02109020B43E16841181A436D
+:103D30008423DB051A430A60E2E7C046D85F010826
+:103D40000C00007010B582B004000B0011000722B7
+:103D500058680240C020800022501A699B69009276
+:103D60002000FFF793FE0C230193043B0093043BD8
+:103D700000224C212000FFF7C5FE044B1B681B6886
+:103D80001B191B685B07F8D402B010BDD85F01088F
+:103D900010B5002B01D0002900D101BE062A00D9A0
+:103DA00098E090004C4C205887468B6018004030BB
+:103DB000086154338B610A6000234B60474BCB6230
+:103DC0004023CB602C3B4B614B622D33FF33CB61E7
+:103DD000002010BD8B6018004030086160338B619B
+:103DE0000A6001234B603E4BCB624023CB60203BFB
+:103DF0004B61043B4B62E433CB610020E9E78B600D
+:103E000018004030086160338B610A6001234B6009
+:103E1000344BCB624023CB60203B4B614B62E033A1
+:103E2000CB610020D5E78B60180080300861C0337B
+:103E30008B610A6002234B602B4BCB628023CB60EB
+:103E4000403B4B61103B4B62A0239B00CB610020A9
+:103E5000BFE78B60180080300861C0338B610A6057
+:103E600002234B60214BCB628023CB60403B4B61F4
+:103E70004B62A0239B00CB610020AAE78B60180057
+:103E800080300861C0338B610A6002234B60184B9D
+:103E9000CB628023CB60403B4B61243B4B62A02331
+:103EA0009B00CB61002094E78B6018008030086194
+:103EB000C0338B610A6002234B600E4BCB628023C0
+:103EC000CB60403B4B61203B4B62A0239B00CB610E
+:103ED00000207EE708487CE760EF00107CEF0010D0
+:103EE00090EF0010B0EF0010D0EF001010F00010B5
+:103EF00050F0001090F000100B00320010B50A1EB8
+:103F00000ED000238B620B624B69002B01D1054858
+:103F100010BD0969D26A9BB2FFF710FE0020F7E7D7
+:103F20000048F5E70B003200F0B5D6464F4646464E
+:103F3000C0B581460E001700002931D0002A31D0CB
+:103F4000CA689046002A2FD0002B34D00A6AD218B3
+:103F50000A628C6A1D0014E043461B1B9A46B36834
+:103F6000191953469BB23A004846FFF7E7FDB2687D
+:103F700031004846FFF7E6FE4346E41A2D19574440
+:103F800000242B199845E7D9B362002D0DD0B168F4
+:103F90000919ABB23A004846FFF7D0FD002504E00E
+:103FA000064D02E0054D00E0044D2800E0BCBA4695
+:103FB000B146A846F0BD1D00F7E7C0460B00320031
+:103FC000F0B5DE4657464E464546E0B583B0009014
+:103FD0000E00140000295FD0002A5FD00D698B68A5
+:103FE0009846CF688B6A9A460B6ADB009946802F09
+:103FF0002DD038230193802342465146535401313A
+:104000004144BBB29B4652469B1A9BB2013B9BB2BA
+:1040100000220098FFF7B2FD019B53451AD93B1FC0
+:104020004A46120E4146CA544B461A0CFB1ECA544D
+:104030004B461A0ABB1ECA54013F4A46CA5542465D
+:1040400031000098FFF77EFE706A80081BE0702345
+:104050000193D0E742463100009B9A461800FFF7D3
+:1040600071FE5B46002241465046FFF787FDD6E7CA
+:10407000EB782370AB7863706B78A3702B78E37068
+:104080000434043501380028F2D103B0F0BCBB463B
+:10409000B246A946A046F0BD0148F6E70048F4E75D
+:1040A0000B00320010B5002B01D0002900D101BE59
+:1040B000062A00D970E09000384C205887468B6063
+:1040C00040330B610A6069234B60354BCB62402360
+:1040D000CB602C3B4B614B62002010BD8B604033AA
+:1040E0000B610A606A234B602E4BCB624023CB608E
+:1040F000203B4B614B620020EFE78B6040330B614C
+:104100000A606A234B60284BCB624023CB60203B84
+:104110004B61043B4B620020DFE78B6080330B6117
+:104120000A606B234B60214BCB628023CB60403B0A
+:104130004B614B620020D0E78B6080330B610A60DB
+:104140006B234B601A4BCB628023CB60403B4B61AF
+:10415000103B4B620020C0E78B6080330B610A602C
+:104160006B234B60134BCB628023CB60403B4B6196
+:10417000203B4B620020B0E78B6080330B610A600C
+:104180006B234B600C4BCB628023CB60403B4B617D
+:10419000243B4B620020A0E708489EE7D0F00010C7
+:1041A000ECF0001020F1001000F1001080F1001080
+:1041B00040F1001000F20010C0F100100B003200BE
+:1041C00010B50A1E0ED000238B620B624B69002BC8
+:1041D00001D1054810BD0969D26A9BB2FFF7ECFC1A
+:1041E0000020F7E70048F5E70B003200F0B5D646AF
+:1041F0004F464646C0B504009146002900D180E1F3
+:10420000002A00D17FE1CE68002E00D17DE1002B95
+:1042100005D11800E0BCBA46B146A846F0BD0A6A0E
+:10422000D01808628D6ABA480768BA68101902681F
+:104230000F2010400628F6D8F8682018C827FF0578
+:104240000760B34800680068001900680028F8D1CA
+:104250000A6990464A699446AD480768BA681019D9
+:1042600002680F2010400428F6D8F8682018A94FDB
+:104270000760A74F3868C068201842460260386857
+:10428000C0682018624602604A699446A0480768E0
+:10429000BA68101902680F2010400628F6D8F8688E
+:1042A0002018CC27FF05624617430760984800682E
+:1042B0000068201802689246002AF7D194480268E4
+:1042C0009068001907680F2038400628F6D8D06893
+:1042D0002018CA22D2050260002D48D18C480268FD
+:1042E0009068001907680F2038400428F6D8862007
+:1042F000400120580028FADBD0682018864A026066
+:10430000834A94461068C06820184A460260624694
+:104310001268D268A21813605A19964257D8721BB5
+:1043200090467B4A10688268121917680F223A403B
+:10433000062AF6D82A02C068201847461743CC221E
+:10434000D2053A4302604A689046714A1068826812
+:10435000121917680F223A40062AF6D8C268A21826
+:10436000404600061060AD1B5B195546D4E78A68CD
+:104370009046674802689068001907680F20384027
+:104380000428F6D8D0682018624A0260604A106893
+:10439000C0682018474607601068C068201805608C
+:1043A0005B4802689068001907680F2038400628AB
+:1043B000F6D8D0682018CC22D2052A43026054488F
+:1043C00000680068201800680028F8D186E78A6233
+:1043D000002B4ED18D6A002D64D10E694D694C4B76
+:1043E0001A6893681B1918680F230340042BF6D82A
+:1043F000D368E318494A1A60454A1368DB68E31832
+:104400001E601368DB68E3181D60414B1A689368EF
+:104410001B1918680F230340062BF6D8D368E3183E
+:10442000CA22D2051A604869394B1A6893681B1969
+:1044300019680F230B40062BF6D8D368E318CE2259
+:10444000D20502431A60324B1B681B68E3181868D8
+:104450000028F8D12E4B1A6893681B1919680F238E
+:104460000B40062BF6D8D368E418CA23DB0523607B
+:10447000D0E6274A10688268121916680F22324067
+:10448000062AF6D82D02C268A2182B43CC25ED05CA
+:104490002B4313601E4B1B681B68E3181B68002B23
+:1044A000F8D197E78E681A4B1A6893681B19186839
+:1044B0000F230340042BF6D8D368E318174A1A6079
+:1044C000134A1368DB68E3181E601368DB68E3189F
+:1044D0001D608D6A0E4B1A6893681B1918680F23AC
+:1044E0000340062BF6D8D368E318CE22D2052A4320
+:1044F0001A60074B1B681B68E3181B68002BF8D178
+:104500006BE7074886E6064884E6054882E6C0462B
+:10451000D85F010808000070080000710C000070EE
+:104520000B003200F0B5DE4657464E464546E0B534
+:1045300083B003000192002900D198E1002A00D144
+:1045400097E1CC688E6A0D6A6A0F9346ED00802C65
+:1045500000D171E138229446C7480768BA68D0187C
+:1045600002680F2010400628F6D8F8681818C827E7
+:10457000FF050760C04800680068C0180068002890
+:10458000F8D10A6991464A699046BB480768BA68FB
+:10459000D01802680F2010400428F6D8F8681818C0
+:1045A000B64A0260B44A92461068C06818184A4673
+:1045B000026052461068C0681818424602604A6994
+:1045C0009146AD480768BA68D01802680F201040BD
+:1045D0000628F6D8F8681818CC22D2054F4617439B
+:1045E0000760A54800680068181800680028F8D11E
+:1045F000A1480768BA68D01802680F201040062842
+:10460000F6D8F8681818CA27FF0507608A68904628
+:1046100099480768BA68D01802680F20104004282B
+:10462000F6D8F8681818954F0760934F3868C06837
+:104630001818424602603868C068181806608E482C
+:104640000768BA68D01802680F2010400628F6D80C
+:10465000F8681818CC27FF053743076086480068BC
+:104660000068181800680028F8D183480768BA68FD
+:10467000D01802680F2010400628F6D83202914662
+:10468000F8681818802290464A4647463A439146B1
+:10469000D022D20590464A4647463A430260B44586
+:1046A00000D8CCE0621F94465A46D2B29046724877
+:1046B0000668B268D01807680F2038400628F6D878
+:1046C00062461702F068181842461743D026F605CE
+:1046D00037430760221F90462A0E944666480668B4
+:1046E000B268D01807680F2038400628F6D842462E
+:1046F0001002F6689E1962461043D027FF05384322
+:104700003060E21E9046280CC2B294465A480668B1
+:10471000B268D01807680F2038400628F6D84246FD
+:104720001002F6689E1962461043D027FF053843F1
+:104730003060A21E9046280AC2B294464E480668CF
+:10474000B268D01807680F2038400628F6D84246CD
+:104750001002F6689E1962461043D027FF053843C1
+:104760003060013CEAB2944643480668B268D0180B
+:1047700007680F2038400628F6D82502F068181878
+:1047800062461543D024E405254305604E683A4847
+:104790000468A268D01805680F2028400628F6D8BB
+:1047A000E068181836060660334800680068181874
+:1047B00000680028F8D14F6A2F4C2568AA68D418E1
+:1047C00026680F243440042CF6D8EC681C192C4DB4
+:1047D0002560294D2C68E4681C19019A22602A681A
+:1047E000D2689A181760244A1468A268D21815680B
+:1047F0000F222A40062AF6D8E2689A18CA24E4054D
+:1048000014604D6A1C4A11688A68D21814680F2215
+:104810002240062AF6D8CA689A18CE21C90529432B
+:104820001160184A9A58002AFBDB03B0F0BCBB4663
+:10483000B246A946A046F0BD702294468CE64A686E
+:1048400090460D480668B268D01807680F203840B7
+:104850000628F6D8F068181842461606066006487C
+:1048600000680068181800680028F8D11AE70648A0
+:10487000DBE70548D9E7C046D85F010808000070AB
+:104880000C000070F01000000B003200C005434225
+:104890005841C0B270470000A0231B0698422AD09E
+:1048A00014D8802829D008D980235B0098422AD0C8
+:1048B0001B4B984209D01B4807E010281FD0402806
+:1048C00001D1194801E000281BD17047174B9842CD
+:1048D0001BD007D9164B98421ED0164B98421DD1BB
+:1048E0001548F2E7154B984211D0154B984211D15B
+:1048F000A420C003E9E70020E7E71248E5E71248F3
+:10490000E3E70848E1E70648DFE71048DDE7A020D5
+:10491000C003DAE70348D8E70D48D6E70148D4E7F3
+:1049200006005200FF00520002005000030000F099
+:10493000040000F0050000F003005200090000A090
+:10494000010000F00500520001005000010052007B
+:104950000200520010B50F4B1A683323D35C002BB2
+:1049600000D101BE0B4B1C68BC23E358226A94465D
+:1049700063441B68002B0BDB074B1868FFF78CFFA9
+:10498000636801229A6063689B68002BFBD110BDAD
+:104990000248FCE7D45F0108E05F01080200500014
+:1049A00010B50400FFF772FF002801D1134810BDB5
+:1049B000FBF700FE124B134A1A605C6000229A60FB
+:1049C000DA60114B1A685423D35C002B10D003F02B
+:1049D000FCFAFA21890004F031FA01000B4804F0D6
+:1049E0002DFA0B4BC1188020400009F05DFADEE77C
+:1049F00080200021400009F057FAD8E70600520055
+:104A0000E05F01080001001CD45F010860F5900020
+:104A10009808000070B504000D00FFF737FF00286C
+:104A200027D0002D27D0FBF7C5FD144B144A1A6080
+:104A300000225A609C60DD60124B1A685223D35CDE
+:104A4000002B10D003F0C1FAFA21890004F0F6F926
+:104A500001000D4804F0F2F90C4BC1188020400011
+:104A600009F022FA06E080200021400009F01CFA3B
+:104A700000E0074870BD0648FCE7C046E05F01085B
+:104A800000010005D45F0108C0EA210148260000AA
+:104A90000600520030B5134A11688B69C31ADB094E
+:104AA00049691B01C91800230360812415682C5D26
+:104AB00004192360822415682C5D04192360832463
+:104AC00015682C5D04192360802415682C5D041979
+:104AD0002360836114688422A25C801803600B60E9
+:104AE0004B6030BDD45F010810B5072900D901BE65
+:104AF0001F2314009C4300D001BE104B1B689C690F
+:104B0000001BC0095B690001181803290AD8046852
+:104B1000C9001F238B409C431F231A408A40224315
+:104B2000026010BD04394468C9001F238B409C43B8
+:104B30001F231A408A4022434260F2E7D45F0108F3
+:104B4000F8B506000C0015001F0006AB1A780729FF
+:104B500000D901BE0F232900994303D1012D01D0B3
+:104B6000092D00D101BE012F00D901BE1F23110064
+:104B7000994300D001BE21003000FFF7B5FF336834
+:104B800001210A00A24093433940A14019433160FA
+:104B9000074B1A688123D05C86193268A400723BE7
+:104BA0001900A1408A432B40A34013433360F8BD52
+:104BB000D45F0108072900D901BE012A00D901BE2E
+:104BC00001238B40002A01D1436070478360FCE7DA
+:104BD00030B50400072900D901BE0F231000984307
+:104BE00003D1012A01D0092A00D101BE8900074B57
+:104BF00018688123C05C00190468723B1D008D4059
+:104C0000AC4313408B402343036030BDD45F0108A5
+:104C100030B50300072900D901BE012A00D901BE21
+:104C2000074804688220205CC018046801231D0026
+:104C30008D40AC4313408B402343036030BDC046DE
+:104C4000D45F010830B5082900D901BE012A00D976
+:104C500001BE846901231D008D40AC4313408B408D
+:104C60002343836130BD000030B50300082900D91B
+:104C700001BE032A00D901BE49000748046880200C
+:104C8000205CC018046803231D008D40AC43134012
+:104C90008B402343036030BDD45F0108F8B5CE4696
+:104CA000474680B507000E001400002800D1B1E08F
+:104CB000002A00D1B0E0072900D901BE2368012BEA
+:104CC00000D901BE63680F221900914303D1012B63
+:104CD00001D0092B00D101BE237A1F22934300D0BB
+:104CE00001BEE368032B00D901BE2369012B00D963
+:104CF00001BE6369012B00D901BE236A012B00D9D3
+:104D000001BE636A012B00D901BEA36A012B00D941
+:104D100001BEE36A032B00D901BE236B072B00D928
+:104D200001BEE369032B00D901BEA369012B00D9A1
+:104D300001BE01252B00B3407000103003229146C4
+:104D4000110081400B439C46344B984683234146D7
+:104D50000968C95CC9190B68624693439C46A369FC
+:104D60002B40B340624613439C46E2694B461340D6
+:104D70001A008240634613430B60626831003800BA
+:104D8000FFF726FF227A31003800FFF7ADFEE26818
+:104D900031003800FFF768FF226931003800FFF763
+:104DA00051FF626931003800FFF732FF43461A684D
+:104DB0008423D25CBA1810687B3398469843236AE0
+:104DC0001D40636A5B009C46022361460B401D4305
+:104DD000A36A9B009C46042361460B402B43E16A77
+:104DE000C90018250D402B43216B4D014146294038
+:104DF0000B43B100FE25AD0029408B4003431360F7
+:104E0000226831003800FFF7D5FE0020C0BCB9464B
+:104E1000B046F8BD0248F9E70148F7E7D45F01085A
+:104E200001005A00084B1A68BC23D3581B181B6892
+:104E3000002B07DA0B0C00D001BE0904090C4160FD
+:104E4000002070470148FCE7D45F010801008A0098
+:104E50000368002B08DAC2600B0C00D001BE090405
+:104E6000090C8160002070470048FCE701008A00BF
+:104E700000290BD0074B1A68BC23D3581B181B689A
+:104E8000002B05DAC3680B600020704701BEF1E714
+:104E90000148FAE7D45F010801008A00034B1B6850
+:104EA000002B00D07047014B1860FBE7046001083D
+:104EB00070B5040023480068002840D021480568E8
+:104EC0002C2060432818FF2425001D4005601E0A81
+:104ED000344044601B0C83601B4B1C683323E35C31
+:104EE0009D4200D301BE184B1C68BA23E35A6B43A2
+:104EF000256AAC466344036143683425645DA3427C
+:104F000000D301BE104C2468246A80335B01E4188E
+:104F1000446183681D0C00D001BE1D0C00D001BE91
+:104F20001B041D0C2B43A360C2610162002383613B
+:104F3000049B002B02D000229B5E838170BD01BECA
+:104F4000BCE7C04604600108D45F0108F0B58FB02B
+:104F5000041E44D06368032B00D901BEE36A002B12
+:104F60003FD0236B002B3ED007AA1300210061C95C
+:104F700061C321C921C302AE230014333100A1CB88
+:104F8000A1C121CB21C10821535E0CAD2B80174B51
+:104F90001B681B8F079989B25B186B80089B0D9368
+:104FA0000B9B0A980095A26AE16AFFF781FF069BB6
+:104FB0000598002200920021FFF77AFF216B28005C
+:104FC00003F078F80022AB5E002B06DB1F221340B3
+:104FD0001E3A9A401300064A13600FB0F0BD01BE9E
+:104FE000B8E701BEBDE701BEBEE7C046D45F010819
+:104FF00000E100E0F0B504000800002A2DD01C49B3
+:10500000096800292BD01A4909682C256C430C1912
+:105010004543491901263500486885402D046068DC
+:1050200086402769002F1CD0886900281BD13F6863
+:10503000002F1ADA17683F043F0C17603D431560D4
+:105040002569EA6001228A614B622369320C00D033
+:1050500001BE3604360C9E60F0BD01BECFE701BE36
+:10506000D1E70448F8E70448F6E70348F4E7C04608
+:105070000460010804028A0007028A0070B582B049
+:1050800004000023019300282BD02369002B2AD091
+:105090006369002B29D0236A002B28D06369DD685F
+:1050A0002A0C0BD012041A601B682069204B1A6866
+:1050B000BC23D3581B181B68002B1ADB2D042A0CA9
+:1050C000002D0AD063691A601B68636A002B2AD01E
+:1050D0009847002363620023A36163691B6802B0E1
+:1050E00070BD01BED1E701BED2E701BED3E701BE6C
+:1050F000D4E701A9FFF7BCFE00280ED10198026891
+:10510000160CFF231340E2699A4207D99B00226ADA
+:10511000D358002B02D0984700E0002631002069C8
+:10512000FFF780FECAE7A36A002BD4D09847D2E7E6
+:10513000D45F010810B50200064B1B68002B07D096
+:10514000044B18682C235343C018FFF797FF10BD7A
+:1051500001BEF5E70460010870B50C001D4B1A682C
+:105160003323D35C834230D9002930D00B68DB066F
+:1051700001D019482AE03323D35C984200D301BE02
+:10518000144B1B681D6ABA229B5A58432D18134EA4
+:1051900035602368DA080021606805F022FA0021F2
+:1051A0002800FFF73FFE306822000021FFF750FE85
+:1051B000002801D00A4809E0084B18680021FFF7D1
+:1051C00031FE002802D0064800E0034870BD0248C6
+:1051D000FCE7C046D45F010803018A0008600108AB
+:1051E00001018A0010B50B00002A05D0002A1DD04D
+:1051F000002B15D10E4810BD0029F7D10D4A1168BA
+:1052000033228A5C904200D301BE0A4A11680A6ABE
+:10521000BA24095B4843121807490A601800EAE7F4
+:1052200006490B604A60FFF797FFE4E70048E2E7B2
+:1052300003018A00D45F01080860010830070008F4
+:10524000F0B5C64600B50C00194B1B68DE68336824
+:1052500083422BD947091F23184001258540002987
+:1052600018D000239846124B18680368002B17DAF1
+:105270007368BF00DF193B681D420FD0AB433B6032
+:1052800000250021FFF7CEFD002C0BD0280080BCAC
+:10529000B846F0BDFBF781F98046E4E7054DF0E73D
+:1052A000054DF1E74046FBF77CF9EFE7034DEDE7ED
+:1052B00008600108020188000301880004018A00D7
+:1052C0000A4B1B68DB681A6882420BD941091F220E
+:1052D00010401E3A8240586889000B581A4203D089
+:1052E000034800E0034870470348FCE708600108F2
+:1052F0000101880004018A0000018800074B1B6837
+:105300009B6CC340DB0700D401BE044B1B681B69C8
+:1053100010308002C3580F2018407047D45F010836
+:1053200003681B050CD5802282239B00C358DB0534
+:10533000DB0D934206D090239B00C15001207047A3
+:105340004022F1E70020FAE7F0B5002800D16CE137
+:10535000002900D16BE10B78022B00D901BE4B7BF9
+:10536000023BDBB2062B00D901BE8B7B002B04D0A5
+:10537000022B02D0032B00D001BE2123CB5C012BDA
+:1053800000D901BE2823CB5C012B00D901BE0B78CC
+:10539000012B07D98B7F002B09D04B68013B062BD3
+:1053A00005D903E04B68083B082B00D901BE8B6888
+:1053B000053B042B00D901BE4B69FF2B00D901BE70
+:1053C0008B69FF2B00D901BE8B7C002B06D00B789C
+:1053D000002B02D18B68092B74D001BE964B4C6B0D
+:1053E0001C4200D001BE954BCC6B1C4200D001BECC
+:1053F0000B78022B6AD04B685D1E0B7F002B6AD0A6
+:1054000080235B028C68082C67D880242401234306
+:105410000F242C4023438024A404234303600C6BFB
+:1054200003681B055BD580239C4200D301BE8C6BB7
+:1054300003681B0555D580239C4200D301BE4C6AEE
+:1054400003681B054FD580239C4200D301BE0B7817
+:105450001B06C024A404234003644B7F002B44D0CC
+:1054600040238C7C002C42D08024E40023430C7C1D
+:10547000002C3ED08024640023434C7C002C3AD086
+:105480008024A4002343CC6A013C2404F0252D038E
+:105490002C4023434D7B013D07242C4023438D7B2F
+:1054A0002D0130242C40234383640B7B002B24D01C
+:1054B00080246400CB7B002B21D10B78022B46D0BB
+:1054C00000231EE08B7B002B88D086E78B7F002B90
+:1054D00091D1002591E7002394E7002497E740232A
+:1054E000A2E74023A8E74023AEE70023B9E7002462
+:1054F000BCE70024C0E70024C4E70024DAE78023E7
+:105500009B001C438B685D1E0F231D402C43C0264F
+:10551000B6008451FF244D692C408D692D04FF276E
+:105520003F043D402C43C425AD004451CC6A85590D
+:105530002B4003339C4201D3102C00D901BECB7FFA
+:10554000002B07D00B78012B5FD0002503E08023D0
+:105550009B00D6E700254C7B013C072323402B43CF
+:105560008D7B2D0130242C40234343640B7B002B87
+:105570004ED080256D008B685C1E0F2323402B438B
+:105580000C78012C46D0002423438024A40003512E
+:10559000FF230C6B2340C124A40003512023CB5CC8
+:1055A000002B3AD080239B0421240C5D012C36D0A3
+:1055B0000024234328240C5D012C33D000242343F2
+:1055C000FF244D6A25402B4303658B6B1C408123D0
+:1055D0009B00C4501A4B4C6B23401A4C03511A4B7E
+:1055E000CC6B2340194C0351002A22D00023536076
+:1055F00013609360D3601362D3625363897F303347
+:10560000D154134B93630020F0BD80256D00A2E7B9
+:105610000025B0E780246402B6E70023C4E78024B5
+:105620006404C6E780246402C9E70A48ECE7094835
+:10563000EAE70020E8E7C04692F4FFFF8CF8FFFF9E
+:105640006D0B0000C80F000073070000880F0000FA
+:10565000EFCDAB000160AA00114B03600F3B036468
+:10566000002383640822FF32C021890042500431A4
+:1056700043500C31435043641139FF394250FD32DD
+:1056800083500365074A8350074A8350074A835073
+:10569000074A8350074A8350074A83507047C046E1
+:1056A0000F000003C80E0000880E0000C80F0000A5
+:1056B000880F0000080F0000480F000003685B001F
+:1056C0005B080360002904D000234B600B600B6271
+:1056D000CB627047F0B5C64600B58C680A68842373
+:1056E000C3580F252B40073DED1A2300AC4226D9A5
+:1056F0002B0024E055782D0216783543D6783606EF
+:1057000097783F043E4335439827C55155792D027C
+:1057100016793543A846D679360695792D042E4359
+:1057200045463543C551D218E41A8423C3580F2582
+:105730002B40073DED1A2300AC4200D92B00002B73
+:1057400000D183E0082BD5D0012B24D0022B26D00A
+:10575000032B2BD0042B33D0052B3ED0062B4CD063
+:10576000072B5DD053781B0215782B43D5782D0677
+:105770009678360435432B439826835153791B0280
+:1057800015792B43D5792D0697793F043D432B435B
+:1057900083510823C7E7167890254651C3E755780B
+:1057A0002D021678354394268551BCE755782D0295
+:1057B0001678354394268551967890254651B2E760
+:1057C00055782D0216783543D678360697783F04FB
+:1057D0003E43354398268551A5E755782D02167826
+:1057E0003543D678360697783F043E4335439826AE
+:1057F000855116799025465195E755782D021678F2
+:105800003543D678360697783F043E43354398268D
+:10581000855155792D02167935439426855182E7B5
+:1058200055782D0216783543D678360697783F049A
+:105830003E4335439826855155792D0216793543D7
+:10584000942685519679902546516CE70A608C60C4
+:10585000002C0CD1F924E400035901229343035195
+:105860008A61CB69002B02D0CB690120984780BCAC
+:10587000B846F0BDF8B50E004C69CA68C423C358D9
+:105880000F21194023008C421CD90B001AE0D825A7
+:10589000415911700F0A57700F0C9770090ED17093
+:1058A00045591571290A5171290C91712D0ED57127
+:1058B000D218E41AC423C3580F251D402300AC425C
+:1058C00000D92B00002B6DD0082BE0D0012B1ED06F
+:1058D000022B20D0032B24D0042B2BD0052B33D02C
+:1058E000062B3ED0072B4BD0D821435813701D0AEE
+:1058F00055701D0C95701B0ED37043581371190A07
+:105900005171190C91711B0ED3710823D0E7D0216E
+:1059100041581170CCE7D42141581170090A5170D7
+:10592000C6E7D42141581170090A5170D02141585D
+:105930009170BDE7D821415811700D0A55700D0CBA
+:105940009570090ED170B3E7D821415811700D0A36
+:1059500055700D0C9570090ED170D0214158117100
+:10596000A6E7D821415811700D0A55700D0C95709D
+:10597000090ED170D42141581171090A517197E76C
+:10598000D821415811700D0A55700D0C9570090EF3
+:10599000D170D42141581171090A5171D021415857
+:1059A000917185E7F2607461002C0DD1F922D2006B
+:1059B000835802218B4383500323B361336A002B46
+:1059C00002D0336A032098477461F8BD10B50028EF
+:1059D00032D0002932D0002B32D05A62F922D200C4
+:1059E00083580324A34383500B78012B00D901BEB5
+:1059F0000B7A032B00D901BE4B68072B00D901BEDF
+:105A00000B7B012B00D901BE01230A6813408A6871
+:105A10001203C024A401224013434A681204E02464
+:105A2000E40222401343CA681206802149040A4056
+:105A300013430360002010BD0248FCE70148FAE769
+:105A40000048F8E70400B2004B1EDBB2012B04D97A
+:105A5000042902D0082900D001BE032A00D901BEC2
+:105A6000042920D008D801290DD002291AD1882371
+:105A70001B019C4660440AE0082913D198231B01AE
+:105A80009C46604403E080231B019C466044002840
+:105A900008D0036806490B401204C02189020A405D
+:105AA0001A430260704790231B019C466044EEE756
+:105AB000FFFFFCFFF8B5DE4657464E464546E0B5CB
+:105AC000070008009A460AAB40CB1B789B460CABFC
+:105AD0001B78111FC9B2FA2900D801BE59460439F2
+:105AE000C9B2FA2900D801BE591EC9B2012904D988
+:105AF000042B02D0082B00D001BE002E02D051464C
+:105B000000291CD0002E02D05946FF2919D01B02B3
+:105B1000F02109010B4099460E9B5D6A1104C022D9
+:105B2000920211404B4619430143002E0BD10D9BAD
+:105B3000DA07120C11433965002400200CE001BE85
+:105B4000E0E701BEE3E70022F4E703433B650134ED
+:105B5000E4B2002D1FD128002100B44225D2164BFB
+:105B6000984222D07B6C0422100018401A42F0D1D7
+:105B700053465B5C4A46134398465A461204C02378
+:105B80009B021A40434613430131B142DDD30D9AC3
+:105B9000D007000CD9E7012002F008FB013D002DE1
+:105BA00001D00020D8E70448D6E7F0BCBB46B24697
+:105BB000A946A046F8BDC0460200B20070B58AB042
+:105BC0000500181FC0B2FA2800D801BE002A34D040
+:105BD000686C042634000440064231D11B04C02006
+:105BE00080020340501E0004000C03438020C002CA
+:105BF00003432B65002925D00E9B5E6A009102921B
+:105C00000023079302330693200006E0012002F0F0
+:105C1000CDFA013E002E0ED02000069B022B0DD1A6
+:105C2000094B98420AD069462800FFF753FD002E21
+:105C3000ECD13000F1E70448EFE704480AB070BD4A
+:105C40000348FBE72000F9E70200B2000400B200BD
+:105C50000100B200F0B50400069D181FC0B2FA287A
+:105C600000D801BE002A21D0666C042738003040DD
+:105C700037421DD11B04C026B6023340561E3604DF
+:105C8000360C3343802636033343236500290ED078
+:105C9000E9602A616A61059B2B620423AB61F922EA
+:105CA000D200A35802210B43A35000E00148F0BDED
+:105CB0000148FCE70400B2000100B20070B58AB0F0
+:105CC0000500181FC0B2FA2800D801BE002A34D03F
+:105CD000686C042634000440064231D11B04C02005
+:105CE00080020340501E0004000C03438020000388
+:105CF00003432B65002925D00E9B5E6A0391059214
+:105D00000023089304330693200006E0012002F0EC
+:105D10004DFA013E002E0ED02000069B042B0DD123
+:105D2000094B98420AD069462800FFF7A3FD002ED0
+:105D3000ECD13000F1E70448EFE704480AB070BD49
+:105D40000348FBE72000F9E70200B2000400B200BC
+:105D50000100B20010B5030000290DD0426C0424EC
+:105D600020001040144209D101390904090CC02255
+:105D700012031143196510BD0148FCE70148FAE719
+:105D80000400B2000100B20000230B604B608B6086
+:105D9000CB600B614B618B61026880231B06134350
+:105DA0000360704770B58D69AA682B6AFF26CC68BE
+:105DB000B44384600C696442B443C4602D68013DFF
+:105DC00003242C404969002901D080214900214346
+:105DD0000162002A33D01468611C67D0FF21214082
+:105DE00014792404C025AD022C40214380242406CC
+:105DF0002143016451790904C024A4022140416473
+:105E00009468611C54D0FF212140147B2404C025D8
+:105E1000AD022C4021438024240621438164116972
+:105E2000002905D001391F240C4080210906214397
+:105E3000C164127D1204C02189020A400265002B50
+:105E400033D019684A1C35D0FF220A401979090459
+:105E5000C024A40221400A43802109060A430266A5
+:105E60005A791204C02189020A40426699684A1C84
+:105E700022D0FF220A40197B0904C024A402214039
+:105E80000A43802109060A4382661A69002A05D05E
+:105E9000013A1F211140802212060A43C2661B7D6F
+:105EA0001B04C02292021340036770BD0021A0E7CB
+:105EB0000021B3E70022D2E70022E5E770B5050034
+:105EC00008220026002000E008328B790133DB0035
+:105ED000934216D3FF232B408C5CA342F4D12C0AAF
+:105EE000FF2323408C18E479A342EDD18B185B7813
+:105EF000B342E9D38C18A478012CE5D11E00100020
+:105F0000E2E770BD70B50C0015001E00FFF7D6FF6C
+:105F100000280BD021180B79AB704B796B708B7903
+:105F20002B70CB789B003360002070BD0048FCE7ED
+:105F30008000B2008278520803231340012B07D05F
+:105F4000022B07D0002B01D0002070470320FCE774
+:105F50000420FAE70420F8E70200407900021379F0
+:105F60001843D3791B069279120413431843002B6C
+:105F700002DB0130C0087047033880231B0618433A
+:105F8000F9E7437A0B6000230B7102334B71037AFC
+:105F90005B0908D1013B8B60027A1F2313400B6120
+:105FA00002230B757047FF238B60FD3B0B73F3E7F8
+:105FB000C37A0B6000230B714B71837A5B0908D1A4
+:105FC000013B8B60827A1F2313400B6102230B7508
+:105FD0007047FF238B6000230B73F3E7C37B0B60D9
+:105FE00000230B7101334B71837B5B0908D1013BAB
+:105FF0008B60827B1F2313400B6101230B7570475D
+:10600000FF238B60FE3B0B73F3E7437B0B600023A6
+:106010000B714B71037B5B0908D1013B8B60027BE9
+:106020001F2313400B6101230B757047FF238B6007
+:1060300000230B73F3E703230B6000230B714B71F9
+:10604000012252428A600B610B75704710B50B003C
+:106050001100012B0DD0032B09D00123002B12D0EE
+:1060600083789A0607D45B0609D4FF2010BD00236D
+:10607000F4E70023F2E7FFF784FF0520F6E7FFF7D8
+:1060800097FF0420F2E78378DA0605D4DB0707D40C
+:10609000FFF7D1FF0120E9E7FFF7A0FF0320E5E7C5
+:1060A000FFF7B3FF0220E1E70068052907D8890060
+:1060B0000D4B5B589F46830601D5EC231360704758
+:1060C000C306FCD56C231360F9E70307F7D5BC239F
+:1060D0001360F4E74307F2D53C231360EFE783072F
+:1060E000EDD50C231360EAE740F200102823C35CCF
+:1060F0001B09012098407047F0B5C64600B54F6AAD
+:106100001B38430898460F263E400021002411E02A
+:10611000012800D11024701C013363434D00AC46AC
+:106120008C446546AD00AC46944443435B006046F6
+:1061300083600131032917D8CB005B1A3800D8409F
+:106140000509430A032018401F232B40022809D0C9
+:1061500003D80028DCD10124DDE70328DBD1FA24B1
+:10616000A400D8E78024D6E7434658004044850081
+:106170000C3D5219906880BCB846F0BD10B5446A19
+:10618000816A4A0F032313400A0E1F2111400F2278
+:106190002240022B11D00BD8002B11D0012B11D192
+:1061A00080204000531C013148435843400010BD3B
+:1061B000032B09D1FA200002F4E7FA200001F1E7ED
+:1061C0001020EFE70020EDE70020EBE7836A190AD3
+:1061D0001F2001400F221A409B0406D408230132DD
+:1061E000481C58435043400070474023F7E70623BC
+:1061F00003600023037170470423036000230371CD
+:10620000704702230360002303714371012252424D
+:1062100082600373036103757047122303600023D8
+:10622000037143710122524282600373036103755B
+:1062300070473423036000230371437101225242EB
+:106240008260037303610233037570473E2303606A
+:10625000002202713C3B437101214942816003737A
+:1062600002610375704710B50368042922D009D86C
+:106270000139C9B2022904D85B062BD51000FFF7FB
+:10628000CCFF10BD0529FCD1D90507D4190609D4C6
+:106290005B060BD51000FFF7C0FFF2E71000FFF719
+:1062A000D5FFEEE71000FFF7C4FFEAE71000FFF7A5
+:1062B000A8FFE6E7190605D45B0607D51000FFF72F
+:1062C000ACFFDEE71000FFF7B4FFDAE71000FFF7DE
+:1062D00098FFD6E71000FFF794FFD2E7052303608D
+:1062E0000023037170470000C36A002B10D0036BBA
+:1062F000002B0FD00023026B13713A33CA5C1209D2
+:10630000333B1340052B0ED89B00154AD3589F46AC
+:1063100001BEECE701BEEDE701235B42C363026B04
+:106320001360C26A136070470223C363036B0122C8
+:106330001A60C36A34321A60F5E74023C363036B03
+:1063400001221A60C36A04321A60ECE78023C36337
+:10635000036B3E221A60C36A01321A60E3E7C0464B
+:1063600058F2001060230360002303717047F0B5FA
+:1063700005000368042B07D01D200B5CFF2B2BD1DD
+:10638000222828D80230F8E74369012040421860EB
+:106390004B785B080F261E400023042B07D80124EE
+:1063A0009C4030002040844201D00133F5E7032BAC
+:1063B0001FD81F1D0020032807D8061D44002418DD
+:1063C000A4008E5D16550130F5E76A69C95D11605C
+:1063D00058001D3005E00020002802D06B690A5CDF
+:1063E0001A60002806D000236A6913716A69537124
+:1063F00003E000206B69FF221A71F0BD70B5002226
+:1064000000240FE023001C33C65C53009B189B0044
+:10641000CB180125B5405D6025001D35455D1D701B
+:1064200002340132032AEDD970BD10B5013B9C182E
+:106430000855000A002BF9D110BD10B50400002347
+:10644000002003E00002E25C104301338B42F9D3E9
+:1064500010BD000030B587B004001D004B062AD4E3
+:106460001648CB0725D58B0710D5D368002B0DD048
+:106470001A7919780A9B0493012303930295FE333A
+:106480000193002300932000FFF714FB0B4B98426D
+:1064900001D000280DD10A9B049301230393029598
+:1064A000FE330193002300930022B7212000FFF761
+:1064B00001FB07B030BD0020D3E7C0468000B2002A
+:1064C00030B587B004000800150019000C9B049338
+:1064D00000230393029001930B9B00930A9B0022DD
+:1064E0002000FFF7E7FA002801D007B030BD0C9B71
+:1064F00000930023012229002000FFF7DFFBF4E7CF
+:10650000F0B5DE4657464E464546E0B589B00590A3
+:106510000D0090469B4612AB1B789A4600230693CB
+:106520005D4E002400273000139B99462DE0032088
+:1065300000E00420002108E00020FBE72218521AA6
+:10654000AA18D67806AA565401318842F6D84A4687
+:106550000292019006AA0092172202A98C46624478
+:1065600051460598FFF7ACFF00280BD17F00FBB226
+:10657000172202A98C4662441778049A17407A1EA3
+:1065800097411F430834444531D82B5D9B0716D4EF
+:10659000631CEB5CE21CAA5C0492172202A98C46E5
+:1065A0006244002111702A1992789209012ABED002
+:1065B000022ABED0002ABFD05A461068BAE70600A9
+:1065C000002E16D0002E5CD12B199B780133DBB244
+:1065D00004935A46D364012B5BD93700B24600239B
+:1065E00005961E00A8462500149B994617E02B4EE1
+:1065F000E6E742462B195B78BB42E3D02B199B7828
+:1066000002339B00E418A242F4D2244EDAE7E3609E
+:106610005168380002F012FC60600136F6B2049B4B
+:106620009E422DD2BA440435434658195B5D0F2172
+:10663000194001220023114207D15200D2B2013386
+:10664000DBB2042BF7D9154A059207683F0A0137D8
+:106650003F02B2005946096D8C58524622605A00DA
+:10666000D3189B004A46D2184946CB5CA360936876
+:1066700023615368BB42CAD9E76001236360CCE75A
+:10668000059E300009B0F0BCBB46B246A946A04604
+:10669000F0BD014EF5E7C0460600B2000700B200AB
+:1066A000F0B587B006000D0010000E9C0A7909783D
+:1066B00004940027039702936B79019303230093BB
+:1066C00003003000FFF7F6F9002801D007B0F0BD55
+:1066D00029693000FFF73EFB0028F7D12B7D01949C
+:1066E000002200920C9A0D993000FFF7B3FA061EB3
+:1066F000ECD1656A06E0012001F058FD013D002D56
+:106700000AD03000A369032BE0D0044B9842DDD0BF
+:10671000002DF0D12800F5E70048F3E70200B200B1
+:1067200010B5002134E00B001033DB0100221A50B9
+:10673000CB01C318184C1C192260184C1C1922607C
+:10674000822424011C192260842424011C19226043
+:10675000134C1C192260134C1C192260124C1C197A
+:106760002260852424011C192260862424011C191E
+:1067700022600E4C1C1922600D4C1C1922600D4C1D
+:106780001C19226087242401A44663441A60013145
+:106790000329C8D910BDC046080800000C08000035
+:1067A00044080000480800004C080000640800008D
+:1067B000680800006C08000010B586B00B001400DB
+:1067C0008A69D16800290ED00A79097804940124D5
+:1067D00003941B780293FF23019300230093FFF798
+:1067E00069F906B010BD0148FBE7C0468000B20061
+:1067F00030B587B004000800150019000A9B049307
+:106800000023039302780292FF2201920093002258
+:106810002000FFF74FF9002801D007B030BD0A9BD8
+:1068200000930023012229002000FFF747FAF4E734
+:1068300010B584B00F236B4401241C708C69A36ACB
+:10684000002B0DD01B7800920F226A44FFF7D0FF77
+:10685000002805D1A36B0F226A4411780B401370F6
+:106860000F236B441878431E9841C0B204B010BD8A
+:10687000F0B5002808D085696B6893421DD92E6D4C
+:10688000002E03D0002004E001BEF4E70C4813E022
+:106890000130EB6C83420ED98300F458E3686768DB
+:1068A0007B432768BC466344BA42F1D39A42EFD295
+:1068B0000C60002000E00248F0BD0248FCE7C04642
+:1068C0000600B2000400B200F0B58BB006900C00D8
+:1068D00015000793002928D0002D30D0A6697769CC
+:1068E0000023099331682800FFF7A7FD020009A9DA
+:1068F0002000FFF7BDFF002F1BD03A79FF2A1AD0E6
+:10690000104B984219D0002811D1099B197A079B86
+:106910000493012303932378029301923368009335
+:106920002B000698FFF7C6F80AE001BED4E73978D5
+:10693000EDE7054804E0044802E0034800E00148B0
+:106940000BB0F0BD0400B2008000B200F0B5DE462E
+:1069500057464E464546E0B5C9B005000C00160046
+:106960009946002913D02EAAAE4B19881180997828
+:1069700091702DAA19881180997891702CAA198884
+:1069800011809B789370636B9846002305E001BEED
+:10699000E9E72FA90022CA540133632BF9D94A46EB
+:1069A00031002800FFF750F84346002B13D0529BCC
+:1069B00002932FAB01933823009333002EAA414654
+:1069C0002800FFF76DFE071E06D12FAB9B79062B23
+:1069D00002D9954F07E0944F002F04D12FAB1B78BD
+:1069E000532B08D0904F380049B0F0BCBB46B2469C
+:1069F000A946A046F0BD2FAB5B78462B01D08A4F4D
+:106A0000F1E72FAB9B78442B01D0874FEBE72FABFF
+:106A1000DB78502B01D0844FE5E72FAB1B79052B9A
+:106A200000D8FCE02FAB5B79012B01D07E4FDAE779
+:106A3000049704AB2DAA2FA97C48FFF763FA0597AA
+:106A400005AB2CAA2FA97A48FFF75CFA794B98423C
+:106A500000D1A0E000230693FF2006AB2EAA2FA9A9
+:106A60000002FFF74FFA071EBDD1A368002B00D12B
+:106A700095E0E368002B00D193E02369002B00D15F
+:106A800091E06369002B00D18FE0E369002B00D116
+:106A90008DE0236A002B00D18BE0A36A002B00D18C
+:106AA00089E0529B02932FAB9A460193069B009379
+:106AB00033002EAA41462800FFF7F2FD070020A967
+:106AC0005046FFF79BFC5046FFF734FA20605046D3
+:106AD000FFF742FA60605046FFF708FB6062E0682B
+:106AE000FFF785FB2069FFF787FB0123A363A06AFB
+:106AF000FFF7F4FB51462000FFF7F6FBE069FFF7D4
+:106B000031FC5046FFF73AFB60645046FFF75EFBEE
+:106B1000A064A3689B461A0049465046FFF796FAC0
+:106B200081462368042B48D0206AFFF76AFB20AA1D
+:106B30002FA92000FFF71BFC002809D0431E2FA916
+:106B4000CA5C01239340A36120AAFFF7D5FA206411
+:106B5000236D002B00D146E7529B02932FAB01938C
+:106B6000059B009333002CAA41462800FFF798FDAF
+:106B7000071E00D037E720AB0293529B019300968B
+:106B80002300059A2FA92800FFF7BAFC2A4B984248
+:106B900041D0070027E70023E36423655AE701BEDD
+:106BA00067E701BE69E701BE6BE701BE6DE701BEA5
+:106BB0006FE701BE71E701BE73E752463833D15C1F
+:106BC000529B0093330022002800FFF743FC071E6E
+:106BD00003D0002F0FD00120B0E7529B029307ABE8
+:106BE0000193049B009333002DAA41462800FFF730
+:106BF00057FD0700EDE75A46494607A8FFF754FA44
+:106C0000226A494607A8FFF72EFB20AA07A9200001
+:106C1000FFF7ADFB90E70023E3642365E3E6024F53
+:106C2000E1E6C04670F200100500B20084FF0000EB
+:106C300081FF00008000B2000600B200F0B5DE4621
+:106C400057464E464546E0B583B0061E904600D1F5
+:106C5000ACE0002900D1B1E04F68002F00D1AFE0D7
+:106C6000002A00D1AEE00B689946002B03D0002526
+:106C700000239A465DE0544899E001BE70E0524816
+:106C800007E0082B04D198231B019B46B3440CE07A
+:106C90004D485346002B00D189E0B2200004184330
+:106CA00085E080231B019B46B3445B46002B00D14B
+:106CB0007AE01B68454A1340227A1204C0218902F7
+:106CC0000A4013435A4613606368042210001840B8
+:106CD0001A4257D1A3691B68013B032B00D901BE9F
+:106CE000002825D163689B0722D52169E06802F05E
+:106CF0002BF9002900D001BE236980225202934261
+:106D000002D35A1E1A4200D001BE21005846FFF796
+:106D100049F80223FF3362681340227A1204C0212B
+:106D200089020A4013438022120613435A46136015
+:106D30000135A94536D9AB00FC58002CF8D0227893
+:106D4000531EDBB2012B04D9042A02D0082A00D03A
+:106D500001BE237A032B00D901BEA369002B8CD07E
+:106D60002378042B09D08CD8012B9AD0022B86D102
+:106D700088231B019B46B34497E790231B019B4646
+:106D8000B34492E7237A2278A1694046009030000C
+:106D9000FFF7DCFD00289DD00823AB4052461A4384
+:106DA000924697E7002074E7074872E7064803B069
+:106DB000F0BCBB46B246A946A046F0BD0248F6E785
+:106DC0000148F4E70048F2E70400B200FFFFFCFFCF
+:106DD000F0B5D6464F464646C0B507008846140073
+:106DE00099469608194B9A4203D8002E08D10126DD
+:106DF00006E0174E04E0A41B00281CD0002C1AD07B
+:106E0000FA218900300002F019F88246FA2189003F
+:106E1000300002F099F88DB2504601F0D1F9280007
+:106E200001F0D2F94A4641463800FFF701FDB4426D
+:106E3000E1D80024E0E7002805D10020E0BCBA46F4
+:106E4000B146A846F0BD0348F8E7C04603093D0037
+:106E500040420F000200B200F0B5DE4657464E46F3
+:106E60004546E0B589B082460F0090469946129C8F
+:106E7000139B9B460023079300290BD04B46002B06
+:106E80000AD0BA69956843461B195268934205D8DF
+:106E90002D4817E001BEF1E701BEF2E72A4809B02C
+:106EA000F0BCBB46B246A946A046F0BD002802D1C0
+:106EB000296900293AD100283CD00028EFD1A41B31
+:106EC000B044B144002CEAD0260080235B029C42EF
+:106ED00000D91E00BB691B68002207A94046FFF7C6
+:106EE000A4FABB692A7929785846049000200390B7
+:106EF00038780290687901901B68009307AB504680
+:106F0000FEF7D8FD0028D1D1A9684B1CCED02A7B32
+:106F1000C9B25B4604930023039338780290FF20A4
+:106F2000019000935046FEF7C5FDBFE75046FEF7BF
+:106F300011FFC0E72B7D5A46009232004946504669
+:106F4000FEF7BCFEB9E7C0460400B200F0B5DE466D
+:106F500057464E464546E0B589B082460F001600BA
+:106F60009846129D00230793002910D04346002B1A
+:106F70000FD0BA69536A9946136A9B4673195268CF
+:106F8000934208D83F483B004F46994618E001BE5F
+:106F9000ECE701BEEDE73B4809B0F0BCBB46B246AA
+:106FA000A946A046F0BD2C00139A49465046FFF76B
+:106FB00003FC00280FD00028EED1A04436192D1B69
+:106FC000002DE9D03900300001F0BEFF6B18BB4244
+:106FD000E9D37C1AE8E74B469B691B68002207A9A6
+:106FE0003000FFF722FA4B469B695A461279594600
+:106FF0000978139804900020039048460078029086
+:107000005846407901901B68009307AB5046FEF745
+:1070100051FD002803D15B4699684B1C12D1002812
+:1070200003D15B46196900291DD100281FD0002813
+:10703000C1D14B469B699A6C139B49465046FFF75A
+:10704000C7FEB8E75B461A7BC9B2139B04930023C3
+:107050000393484600780290FF2001900093504629
+:10706000FEF728FDDBE75046FEF774FEDDE75B46E2
+:107070001B7D139A0092220041465046FEF79EFD6A
+:10708000D5E7C0460400B200F0B5DE4657464E468E
+:107090004546E0B587B007000E0015000093109A32
+:1070A0009046EB18013B01930023059304930029BC
+:1070B00048D0B3699B469B699A465B461B6C02931A
+:1070C0005B465B68019A93423ED80023994603933E
+:1070D000504C504B9C4200D194E04B46E81A51462C
+:1070E00001F032FF002900D08BE0039B019A93420C
+:1070F00044D3484B9C4200D184E0019B4A46981AF5
+:107100000130514601F020FF002943D1009B002BA4
+:1071100078D02A0004A93000FFF7AAFB041E6AD128
+:10712000049A13690293D3689A46116853685246C9
+:1071300053435B18013B9946019B4B452ED2019B63
+:1071400099462BE001BEB4E72A0004A93000FFF7FE
+:107150008FFB041E0AD1049B1A689146DA68924696
+:107160005B6853434B44013B039302E00023994681
+:107170000393009B9A45ACD9264CAAE704A930009A
+:10718000FFF776FB041EB4D1049B1A689146DB68B6
+:107190009A46AEE71F4C35E0002CB7D14D45B5D22D
+:1071A000424631003800FFF707FB041EF4D15B466E
+:1071B0001B68002205A92800FFF737F9434605AAF6
+:1071C00031003800FFF780FB041EE5D1029B5A0115
+:1071D000D21A92009C466244D200434631003800E5
+:1071E000FFF7F6FD009B534508D9554452469B1ABC
+:1071F00000930400D0E7019B9946CFE70094040078
+:1072000084E7044C200007B0F0BCBB46B246A94658
+:10721000A046F0BD0400B20010B5002814D1072923
+:107220002ED8FF2A2ED81A4B186883687824005B62
+:107230001B188900C9180B68164803401206120C67
+:107240001A430A60002002E0012801D0124810BD54
+:107250000F2919D880235B029A4217D20C4B186869
+:1072600083687A24005B1B188900C9180B680B48D7
+:10727000034012020A4802401A430A600020E6E76F
+:107280000548E4E70448E2E70348E0E70248DEE7B0
+:10729000D45F0108FF00FFFF01004A00FF0000FF6C
+:1072A00000FFFF0030B51A4B1B6842241C5D84426E
+:1072B00028D9032928D8002901D1072A0FD9012963
+:1072C00005D0022906D0032907D012481BE00F2A57
+:1072D00005D9F6E7032A02D9F5E7002A16D1752465
+:1072E0001D5DA940723CAC40214074241C5D2240CD
+:1072F0009B680A43C02189008C4660448000C250CC
+:10730000002000E0034830BD0248FCE70148FAE7EE
+:10731000D45F010801004A00F0B5032835D80028E1
+:1073200001D107290FD9012805D0022806D003284A
+:1073300007D0184828E00F2905D9F6E7032902D914
+:10734000F5E7002923D1144B1C687723E35C032263
+:1073500015009D402B007425655D7626A65D2F00E7
+:10736000B7403B437526A65DB040B240104018437D
+:10737000294008438021090608438023DB00A268D6
+:10738000D050A268D3580020F0BD0248FCE7014865
+:10739000FAE7C04601004A00D45F010810B503288F
+:1073A00028D8002801D107290FD9012805D00228A3
+:1073B00006D0032807D011481BE00F2905D9F6E7AE
+:1073C000032902D9F5E7002916D10D4B1A68752358
+:1073D000D45CA040723BA34018407423D35C194096
+:1073E000926801438020C00501438023DB00D15017
+:1073F000002010BD0148FCE70048FAE701004A0000
+:10740000D45F0108064B1B681A6888215B58D218A4
+:10741000136804490B400002034313607047C046E1
+:10742000D45F0108FF00FFFF044B1A68136888212E
+:1074300052589B181868000AC0B27047D45F010800
+:10744000012800D901BE054A136805490B40000216
+:10745000C021890008401843106070470000274091
+:10746000FFFCFFFF10B5074B984200D901BE06494B
+:10747000064A8B58064C2340024C20401843885043
+:1074800010BDC046010300000000264004050000B6
+:10749000FEFCFFFF10B50449044A8B58044C2340FE
+:1074A000000403438B5010BD00002640040500007B
+:1074B000FFFF00FF0349044A885880231B0603434B
+:1074C0008B50704700002640040500000349044A21
+:1074D0008B585B005B088B507047C046000026400D
+:1074E0000405000010B50300032800D901BE054CB7
+:1074F000A021C900605803229043134018436050F4
+:1075000010BDC04600002640064B1B681A68882143
+:107510005B58D21813681B021B0A00060343136052
+:107520007047C046D45F0108044B1A68136888216D
+:1075300052589B181868000E7047C046D45F010867
+:10754000064B1B681A688C215B58D21813680449D3
+:107550000B400002034313607047C046D45F01082C
+:10756000FF00FFFF084B1A684023D35C834209D910
+:10757000064AE0308000815880231B060B4383506D
+:10758000002070470248FCE7D45F01080000264055
+:1075900001004A0000280ED0094B1A684023D35C32
+:1075A00083420AD9074AE030800083585B005B08B9
+:1075B0008350002070470448FCE70348FAE7C046C0
+:1075C000D45F01080000264001004A0010B50B4BB3
+:1075D0001A684023D35C83420CD90F290CD8084C7D
+:1075E000E030800003590F229343114019430151A9
+:1075F000002010BD0348FCE70248FAE7D45F010809
+:107600000000264001004A00064B1A684023D35C64
+:10761000834200D801BEE0308000034BC3580F20E6
+:1076200018407047D45F01080000264010B50C4B8D
+:107630001A684023D35C83420DD903290DD8094C25
+:10764000E03080000359302293430901114019436F
+:107650000151002010BD0448FCE70348FAE7C0468A
+:10766000D45F01080000264001004A00074B1A6859
+:107670004023D35C834200D801BEE0308000044B3D
+:10768000C3581B09032018407047C046D45F010847
+:1076900000002640034B1B6904201840431E9841FC
+:1076A000C0B270470000274010B504000A4A1368B2
+:1076B00008210B43136003E0012000F077FD013C3B
+:1076C000FFF7E8FF002801D1002CF5D1002C01D0F4
+:1076D000002010BD0148FCE70000274002004A00DE
+:1076E00000207047002070470349044A88588023CF
+:1076F0001B0603438B507047000026400C0500001A
+:10770000084AC0235B00D3580122100018401A42D7
+:1077100006D10449044A8B585B005B088B507047C4
+:107720000248FCE7000026400C05000003004A0068
+:10773000064A074BD35801229343002800D1002268
+:1077400013430249024A8B507047C046000026404E
+:107750000C050000014B18687047C0460C6001081A
+:10776000084AA623DB00D25803231340032B06D07C
+:10777000044AA623DB00D35801201840704702209A
+:10778000FCE7C0460000264010B5FFF7E9FF0228DD
+:1077900001D0002010BD014B1868FBE71060010804
+:1077A000134B1A683E23D35C83421DD9042904D9A4
+:1077B0004B1EFF3B9BB2132B18D8FF290CD91F235C
+:1077C00019400C4A0300C0339B009950D030800010
+:1077D00004238350002008E007231940D0308000A4
+:1077E000044BC150002000E0034870470248FCE70A
+:1077F000D45F01080000264001004A0003000C4A43
+:1078000011683E228A5C824200D801BE1A00D03242
+:1078100092000849505807221040042800D07047B1
+:10782000C0339B005B581B300340E1301843F6E740
+:10783000D45F01080000264010B52A4B1A683E2389
+:10784000D35C834200D801BEFFF7D8FF88235B00DA
+:10785000984231D012D802282BD004D903280BD15A
+:10786000FFF73EFF3CE0002839D0012802D1FFF7A6
+:1078700071FF35E0002033E0002031E089235B0018
+:10788000984229D01423FF33984206D1164A174B49
+:10789000D358002B1DDB002022E01223FF33984237
+:1078A00005D1FFF7F7FE002810D1002018E00020D6
+:1078B00016E0FFF769FF13E00B4A0D4BD358002B7E
+:1078C00001DB00200CE08020000209E080200002A3
+:1078D00006E08020000203E0FFF704FF00E0054817
+:1078E00010BDC046D45F0108000026403C050000E2
+:1078F0000C05000000127A00024AB023DB00D058C9
+:10790000C00F704700002640034AB223DB00D35863
+:10791000012018407047C046000026400B4BB120A4
+:10792000C0001A580A491140802292050A431A5091
+:10793000B021C9005A58520052085A5005495A58A5
+:10794000520052085A5000207047C046000026409E
+:10795000FFFFFFCF8C05000070B5041E00D175E05D
+:10796000FFF7CAFF002800D074E08023DB02226802
+:107970009A4200D301BE23689B039B0BE279002A45
+:1079800000D165E08022520413433349B022D20073
+:107990008B50A28880239B019A4200D301BE22898A
+:1079A00080239B009A4200D301BEA388DB04DB0C3A
+:1079B0002289120429490A4013432749284A8B5037
+:1079C000A37A0F2B00D901BEE37A0F2B00D901BE99
+:1079D000A28980239B019A4200D301BEA27A0F2381
+:1079E0001340E17A0901FF220A401343A2891202DF
+:1079F0001C490A401343A27B1207C02189050A4093
+:107A000013431549B122D2008B50A379042B00D91E
+:107A100001BE228A80239B009A4200D301BE0E48F9
+:107A200011494358114A1340A2791202E025ED0092
+:107A30002A401343435043580D4A1340228A1204EC
+:107A4000064C224013434350002070BD01BE87E71F
+:107A5000002299E70748F8E7000026400000FF01F0
+:107A60008405000000FF1F008C050000FFF8FFFFE9
+:107A7000FFFF00FE03004A0010B5002832D01A496B
+:107A8000B023DB00CB589A03920B02608022520491
+:107A900013405A1E9341C371144BCB58DA04D20CD5
+:107AA00082801B0CDB05DB0D0381B123DB00CB588F
+:107AB0000F2214001C4084721C092240C2721A0A50
+:107AC000D204D20C82811B0F032213408373084B14
+:107AD000CB58190A04320A4082711B0CDB05DB0DFE
+:107AE000038210BD01BECAE70000264084050000E5
+:107AF0008C05000070B505002649274A8858802368
+:107B00001B0603438B502C0003E0012000F04EFBCA
+:107B1000013C204AB223DB00D3585B0701D4002C80
+:107B2000F3D11C48B121C90043581C4A1A40802394
+:107B30009B0513434350002D01D0002C0CD0154958
+:107B4000B022D200885880231B0603438B5003E0E9
+:107B5000012000F02BFB013CFFF7D6FE002801D1ED
+:107B6000002CF5D1002D01D0002C0ED00949B122F6
+:107B7000D2008858C0239B0503438B50002D02D0B0
+:107B8000002C05D00025280070BDFFF7C7FEF5E7E3
+:107B9000034DF8E7000026408C050000FFFFFFCFF3
+:107BA00002004A000138074B1A683F23D35C834226
+:107BB00000D801BE8130FF308000034BC058C00F99
+:107BC0007047C046D45F01080000264070B50138F8
+:107BD0000D4B1A683F23D35C834201D80B4870BD1C
+:107BE0000B4D8130FF30840063590A4A1A408023CC
+:107BF0009B0513436351012000F0D8FA63595B00E1
+:107C00005B0863510020EAE7D45F010801004A00E5
+:107C100000002640FFFFFFCFF8B504000D002F4BFA
+:107C20001A683F23D35C834201D22D48F8BDFFF789
+:107C3000B9FF002845D1AA78931EDBB20E2B42D89B
+:107C40006B78002B41D0122B41D82F783E00E97879
+:107C5000002932D0133086423BD300292FD0382060
+:107C6000864238D8013C2879022816D07F20384037
+:107C70001B02F8267601334003431204F820400328
+:107C800002401A43C90680231B05194011432300F3
+:107C90008133FF339B00134A995012498134FF34DA
+:107CA000A4006358104A13402A791207C0208005A7
+:107CB0000240134363500020B8E71620CBE7702042
+:107CC000CEE70A48B2E70648B0E70548AEE7044801
+:107CD000ACE70348AAE70248A8E7C046D45F01081A
+:107CE00001004A0000002640FFFFFFCF03004A00CA
+:107CF0000138114B1A683F23D35C83421AD9813073
+:107D0000FF3080000D4BC3587F221A400A70180ABA
+:107D10001F2210404870180C02408A708022120501
+:107D20001A40501E8241CA701B0F032213400B7170
+:107D3000002070470248FCE7D45F0108000026409D
+:107D400001004A0070B50D00461E294B1A683F23FA
+:107D5000D35CB34249D9274933008133FF339B00B9
+:107D600058588022120602435A502C0003E001208A
+:107D700000F01CFA013C33009133FF339B001D4A95
+:107D80009B58DB0701D4002CF1D1002D01D0002C31
+:107D900017D033008133FF339B00164A9A58120FD5
+:107DA00003231340022B01D0002070BD114A8136FD
+:107DB000FF36B600B158C0239B050B43B3500020DB
+:107DC000F3E70C4C8136FF36B60033590A4A1A40A5
+:107DD00080239B0513433351012000F0E7F9335909
+:107DE0005B005B0833510548DFE70548DDE7C04627
+:107DF000D45F010800002640FFFFFFCF02004A00C9
+:107E000001004A00F0B587B01422002101A802F059
+:107E1000E8FB01A8FFF730FEFFF76EFD002807D052
+:107E200001AB9B7B022B01D0012302E0002300E089
+:107E3000002301AA019E94882000D279002A1FD035
+:107E40000225002B1ED000281DD00020FFF7F4FCD7
+:107E500032000023002101F087F906000F002A00FC
+:107E600000232000002101F07FF902000B00CC0765
+:107E70004008204349088019794101F055F902E092
+:107E80000125DEE7002007B0F0BD0000F0B585B0A9
+:107E900004002E4B1B683F229A5C002A53D0002816
+:107EA00052D03E229B5C834200D801BE274B1A6809
+:107EB0003F23D35CA34201D2002045E005220021EC
+:107EC00002A802F08EFB02A92000FFF711FF20009C
+:107ED000FFF768FE002807D002AB1B79022B01D008
+:107EE000012302E0002300E0002302AA167857785D
+:107EF00038009578002B24D0002F25D0002D01D1FB
+:107F0000280021E02000FFF797FC32000023002129
+:107F100001F02AF9009001912A0000233800002185
+:107F200001F022F902000B00CC0740082043490869
+:107F3000009C019D24184D412000290001F0F4F817
+:107F400002E0002000E0002005B0F0BDD45F010891
+:107F500010B504000D4B1A683E23D35C834200D851
+:107F600001BE002C09D0094B1A683F23D35CA34201
+:107F700008D22000FFF760FC10BDFFF743FF002888
+:107F8000FAD1F6E72000FFF781FFF8E7D45F010898
+:107F900070B50600FFF76AFB05000124844030003D
+:107FA000FFF732FBFFF7D4FF64082018E84070BDEC
+:107FB00010B50020FFF7ECFF0400FFF7B5FA411CF5
+:107FC0004808001900F03AFF10BD10B5FFF7F0FFA8
+:107FD0000400FFF729FA411C4808001900F02EFFA1
+:107FE00010BD000030B5194B1B682C229A5C1F2A6B
+:107FF00015D884080722250095432A1E22D1033272
+:108000001040C000FC3282401B682033A4001B19C2
+:108010001C688140614011406140196012E03C22BF
+:108020009A5E0BB29A420ED007230340074A1268A9
+:10803000126880200006184380239B019C466144FF
+:108040008900885030BD01BEEEE7C046D45F01080C
+:1080500010B50A4B1B682C229A5C1F2A0AD91A6891
+:1080600080239B019C46614489008B585B005B0820
+:108070008B5010BD998FFFF7B5FFFAE7D45F010869
+:10808000094B9A68094B9A4204D010308000084B83
+:10809000C0587047002905D01030044A8300985812
+:1080A0009950F6E701BEF7E700ED00E00000000898
+:1080B00000000010F0B5C64600B582B0041E019164
+:1080C0004FD04368032B00D901BE0023E05E002897
+:1080D00025DA254E0023E25E6168002A24DB93083E
+:1080E000224DC0339B005859804603273A40D200A6
+:1080F000FF208446070097404046B84307008901A7
+:1081000060460840904038435851194B9A68194BC3
+:108110009A4220D0300002B080BCB846F0BD6188E1
+:10812000FFF760FF0026D5E70F231340083B9B08AD
+:1081300006339B000E48844663445F680320024078
+:10814000D200FC3005009540AF43890108409040C3
+:1081500038435860D9E70023E05E0199FFF790FFAC
+:10816000D8E7014ED6E7C0460100560000E100E026
+:1081700000ED00E00000000810B5040006E0084B28
+:108180001868F8F701FA074B9C46644480231B02E9
+:108190009C42F4D8044B18686043F8F7F5F910BD19
+:1081A0008C0000080080FFFF9000000810B5034B12
+:1081B0001B785843F8F7E8F910BDC0469400000852
+:1081C00010B5FFF7D9FF10BD10B5FFF7EFFF10BDD9
+:1081D000054B802212069A649B6C002B01DB002069
+:1081E00070470248FCE7C0460000274003004600F5
+:1081F0000D4B8022120198585B68FF221A4202D070
+:108200008023DB021843084A084BD3581B0402D0D2
+:1082100080235B021843044A044BD3581B0C02D042
+:1082200080239B021843704700002640040800008A
+:10823000FEE7000010B50A4B0268DA6142681A6274
+:1082400082685A62C2689A620269DA6242691A6393
+:1082500082695A63C2699A63FFF7EAFF10BDC0469C
+:1082600038070008F0B5C64600B5002833D01923FA
+:108270008B429B415B42314C22681668AC27D25B33
+:10828000B61832680325AA432B401A433260266889
+:108290003268F65B92191768294E374017602768D5
+:1082A0003A689046AE229446BF5A3A004244176854
+:1082B000AF433B431360226813686446125B9B180C
+:1082C0001A6832401A60002807D010291DD92129C8
+:1082D00027D801221AE06423CAE7184B1B685522ED
+:1082E0009A5C8A421FD256229A5C8A421DD2572239
+:1082F0009A5C8A421BD258229A5C8A4219D259222D
+:108300009B5C8B4217D3553A00E000220B4B1B6855
+:1083100059680B680F20834313430B6080BCB84639
+:10832000F0BD0222F2E70022F0E70122EEE702228E
+:10833000ECE70322EAE70522E8E7C046D45F01083C
+:10834000FFFCFFFFB0235B055B78002B04D0B0235C
+:108350005B055878C0B270472120FCE7B0235B056D
+:108360009B899BB2002B04D0B0235B05988980B217
+:10837000704780204000FBE770B5FFF7EFFF8023D8
+:108380005B0098421AD0B0204005174BC358174ADB
+:108390001340174C21680A689C25495952181168E6
+:1083A000C025AD0029400B43136022681368A0214B
+:1083B00052589B180F4A82581A6070BD0C4B1A68AD
+:1083C00011689C20125889180A680F24A2439A3811
+:1083D00002430A601B681A68A0215B58D218136810
+:1083E000A34303431360E8E748180000FFFCFFFFC6
+:1083F000D45F01084418000070B5FFF7AFFF802379
+:108400005B0098421AD0B0204005134BC358134A62
+:108410001340134C21680A689C2549595218116869
+:10842000C025AD0029400B43136022681368A021CA
+:1084300052589B180B4A82581A6070BD084B1A6834
+:1084400013689C2152589B181A68074911408022D2
+:10845000D2010A431A60F0E750180000FFFCFFFF4A
+:10846000D45F01084C180000FF8FFFFF10B5FFF725
+:1084700075FF80235B00984212D0B02252050F4B4B
+:10848000D3580F4A13400F4A11680A689C200958B4
+:1084900052181168C020800001400B43136010BDCA
+:1084A000084B1A6813689C2152589B181A68064991
+:1084B0001140C022D2010A431A60F0E71C180000E4
+:1084C000FFFCFFFFD45F0108FF8FFFFF70B5FFF7D0
+:1084D00045FF80235B0098421BD0B0204005184B1D
+:1084E000C358184A1340184C21680A689C254959FA
+:1084F00052181168C025AD0029400B431360226853
+:108500001368A02152589B18C122520182581A6048
+:1085100070BD0D4B1A6811689C20125889180A68A2
+:108520000F24A243993802430A601B681A68A021ED
+:108530005B58D2181368A34303431360E8E7C046AF
+:1085400024180000FFFCFFFFD45F010870B5204B2A
+:108550001A6813689C2152589B181C68C02000019F
+:108560000440FFF7FBFE80235B0098421FD01849B0
+:10857000086803689C2280581B181868154D28400D
+:1085800018600868036880581B181D68C0263601EB
+:108590003000A04305431D6009680B688A589B188A
+:1085A00018683040001B431E9841C0B270BD0020C7
+:1085B000FCF7A4FE0400FFF7C5FE222803D8002C18
+:1085C00003D10120F2E70120F0E70020EEE7C046EA
+:1085D000D45F0108FFF3FFFF70B584B006000D0003
+:1085E000022804D9042802D0032800D001BE6B1E43
+:1085F000DBB2012B04D9042D02D0082D00D001BE1E
+:10860000B300294A9C58042D1FD0012D1FD0022DE4
+:1086100033D026006469002CFBD1002034E064696B
+:10862000002C18D0214B984213D0A3682B42F6D1CE
+:10863000E3681A6802925B6801930393290002A819
+:10864000236898471A4B1C60E9E70020E8E7002000
+:10865000E6E7012DE9D1012D01D004B070BD134B27
+:10866000984204D0B600134B0022F250F5E7B60052
+:108670000F4B1A680F4BF250EFE70D4B1E68002EA0
+:10868000CBD03669C9E73669002EE6D0B3682B42F5
+:10869000F9D1F3681A6802925B6801930393290089
+:1086A00002A833689847EEE754600108FF004200D3
+:1086B000506001083C600108F0B5C64600B50700EF
+:1086C000012800D901BEFFF73DFE85B2FFF746FE47
+:1086D00006000020FCF712FE041E17D180235B0069
+:1086E0009E4201D02A4C12E0222D42D8294B1B6811
+:1086F000586829494358294A134098463A06802326
+:108700005B041A4043461343435000E0204C80234F
+:108710005B009E422FD080235B009E4225D01D4BE4
+:108720001A683323D35C002B00D101BE194B1B68A0
+:108730001D6A80235B009E4220D0002F24D0184A5F
+:1087400001212800FCF784FB00280ED1114B1A6888
+:10875000BC23D3585B191B68002BF7DBEB681B0E9F
+:108760001B06A0221206934210D0200080BCB846FF
+:10877000F0BD074CCBE7222DD1D8CCE7002F01D09C
+:10878000084ADDE7084ADBE7084AD9E70400ECE7D6
+:1087900004004200D45F010818F00000FFFFFFFE54
+:1087A0000300000C01010030010000300100000C4A
+:1087B00000283DD01F4B1B6888229A5819688C46A8
+:1087C0006244126802628C229A5819688C4662448C
+:1087D0001268426246229A5C002A28D0E0229968F8
+:1087E0008A58D20623D5DA68F223DB01D358036016
+:1087F000104B1B68F022D201D9688A5842600E4A99
+:10880000D9688A5882600D4AD9688A58C2600C4A71
+:10881000D9688A5802610B4AD9688A5842610A4A63
+:10882000D9688A588261DA68084BD358C3617047A7
+:1088300001BEBFE7D45F010804780000087800009B
+:108840000C78000010780000147800001878000000
+:1088500010B500283BD01F4B19680A6888240959B5
+:108860005218016A116019680A68043409595218CB
+:10887000416A11601B6846229A5C002A26D0E022D9
+:1088800099688A58D20621D5F022D201D968446865
+:108890008C50114AD96884688C50104AD968C468D1
+:1088A0008C500F4AD96804698C500E4AD9684469C3
+:1088B0008C500D4AD96884698C500C4AD968C469B7
+:1088C0008C50DA680168F223DB01D15010BD01BE83
+:1088D000C1E7C046D45F01080478000008780000B2
+:1088E0000C78000010780000147800001878000060
+:1088F000F0B5C64600B50700FFF724FD0500012FBF
+:1089000000D901BE7E4B5B68002B00D187E00121BE
+:108910000120FFF761FE041E72D1F7F73EFE06004C
+:10892000774B5B68002B03D004210120FFF754FE36
+:10893000744B1A68136ABA21515ACA00521A9B180A
+:108940001A68002AF4DADB68DA0000D569E08020D2
+:10895000800518436B4B1B68BA215D5AEA00521B15
+:108960001D6AAC466244D060585AC200121A186A96
+:1089700084466244002050601A6A595ACB005B1A40
+:10898000D3185B68FFF7EAFC80235B00984200D1B4
+:108990007FE05C4B1A683323D35C002B00D101BE0F
+:1089A000584B1A68116ABC23D3585B181B68002BFC
+:1089B00000DB72E0544C534B1A68136ABA21515AC7
+:1089C000CA00521A9B181A68002AF4DADD68EB0014
+:1089D00000D581E04D4B1D404A4B1B68BA21585AC7
+:1089E000C200121A186A84466244D5601A6A595A3B
+:1089F000CB005B1AD31800225A603000F7F7D1FD84
+:108A0000002C00D06DE03E4B5B68002B03D00821AA
+:108A10000120FFF7E1FD200080BCB846F0BD002436
+:108A20007BE71B0F1B0798463948FFF7C1FE212D36
+:108A300018D0344D2B68196888229B58C9180B68C8
+:108A400034480340783213430B6029680B688C2547
+:108A500049595B18196801400A431A602C4B424679
+:108A6000134374E7274D2B68196888229B58C9184F
+:108A70000B68284803409022120113430B602968B9
+:108A80000B688C2549595B18196801400A431A6024
+:108A9000E4E7380005F000FA8DE73323D35C012BBF
+:108AA00000D801BE174B1968BA23CA5A0B6A9C46F4
+:108AB0006244BC23CB589B181B68002B0ADB164A68
+:108AC000136904210B431361012F01D030BF72E7FA
+:108AD00020BF70E70C4C6EE728010009FFF7B8FED5
+:108AE00078E7074B5B68002B03D002210120FFF7DA
+:108AF00073FD054B9C4200D18DE7084C8BE7C046C7
+:108B000054600108D45F010805004200FFFFFFDF49
+:108B100014600108FF00FFFF00ED00E0FF004200CD
+:108B2000074A084BD3581F200340B0214905E822CB
+:108B3000D200885CC01A431E9841C0B27047C0463C
+:108B4000000026401CFF0000044B186880231B0413
+:108B5000184043425841C0B27047C046000026400A
+:108B600010B5FFF7F1FF002810D01C4A13681C490C
+:108B70000B4013600820FFF719FB6423174A1268A3
+:108B8000002A09DB002B07D0013BF7E7134A1368E3
+:108B900014490B401360EDE7002B01D1124810BDC2
+:108BA0000E4A136811490B4013600120FFF7FEFACB
+:108BB000FFF7CAFF002801D10020F0E7FFF7B0FF60
+:108BC000012801D00020EAE7B0225205084BD15815
+:108BD000024A084BD1500020E1E7C0460000264081
+:108BE000FFFFFBACFFFFFBAD02004200FFFFFFFBFE
+:108BF00010180000307F000010B5FFF7A5FF002817
+:108C000008D0054B054A10681840C01A4342584125
+:108C1000C0B210BD024BF5E700000453000026402F
+:108C200000000452F8B50400012800D901BEFFF786
+:108C30008DFC002802D12D4D2800F8BDF7F7ADFCC2
+:108C40000600002C14D12A4A2A4B0021D150B02210
+:108C50005205E823DB00D75CFFB20120FFF72CFDB3
+:108C6000051E02D0002D2AD11DE0FFF785FBF9E794
+:108C7000FFF7C2FF002826D01D4A1E4B5021D150BD
+:108C8000B02252051C4BD75CFFB219491B4A8B58C6
+:108C90001F208343143803438B500838FFF786FAAC
+:108CA000FFF7AAFB00251248144943581F2293439B
+:108CB0003A4013434350002C0DD1FFF7D7FB30004F
+:108CC000F7F76FFCB8E7B02252050D4BD158084AB0
+:108CD000084BD150D4E70720FFF768FAFFF7F6FBFF
+:108CE0000020FFF7E9FC0500E9E7C0460300420069
+:108CF00000002640307F0000410700001CFF0000FC
+:108D000010180000084B5A6C120AFF2313403A2B2C
+:108D100000D0704704494B6C044A1A40E8239B0179
+:108D200013434B64F5E7C04600002740FFC5FFDF53
+:108D300004494B6C044A1A40E8239B0113434B64DB
+:108D40007047C04600002740FF00FFFF042810D0F6
+:108D500000060B4B1A681368A42152589B18C022B6
+:108D6000920410401860074A1368A0398B431360BF
+:108D70007047044A136804210B431360F8E7C046A8
+:108D8000D45F010810E000E0044AC0235B00D05823
+:108D9000800F431E9841C0B27047C0460000264075
+:108DA0000749C02252008B589B009B088020C005B9
+:108DB00003438B50885880231B0603438B50704716
+:108DC0000000264010B5040080235B02984200D3C7
+:108DD00001BEFFF7D9FF002809D1054AC4235B0073
+:108DE000D058000C00042404240C0443D45010BDBB
+:108DF0000000264010B504000F2800D901BEFFF77F
+:108E0000C3FF00280BD10649C42252008B580548E5
+:108E100003402404F020000304401C438C5010BD88
+:108E200000002640FFFFF0FF034AE023DB000121A2
+:108E3000D150D3587047C046000026400022430856
+:108E40008B4274D303098B425FD3030A8B4244D312
+:108E5000030B8B4228D3030C8B420DD3FF22090254
+:108E600012BA030C8B4202D31212090265D0030B13
+:108E70008B4219D300E0090AC30B8B4201D3CB0309
+:108E8000C01A5241830B8B4201D38B03C01A52414B
+:108E9000430B8B4201D34B03C01A5241030B8B424D
+:108EA00001D30B03C01A5241C30A8B4201D3CB0238
+:108EB000C01A5241830A8B4201D38B02C01A52411D
+:108EC000430A8B4201D34B02C01A5241030A8B4220
+:108ED00001D30B02C01A5241CDD2C3098B4201D338
+:108EE000CB01C01A524183098B4201D38B01C01AB6
+:108EF000524143098B4201D34B01C01A524103092D
+:108F00008B4201D30B01C01A5241C3088B4201D3DB
+:108F1000CB00C01A524183088B4201D38B00C01A88
+:108F2000524143088B4201D34B00C01A5241411AAF
+:108F300000D20146524110467047FFE701B50020BC
+:108F400000F0F0F802BDC0460029F7D076E7704780
+:108F500003460B437FD4002243088B4274D303099A
+:108F60008B425FD3030A8B4244D3030B8B4228D33B
+:108F7000030C8B420DD3FF22090212BA030C8B4261
+:108F800002D31212090265D0030B8B4219D300E001
+:108F9000090AC30B8B4201D3CB03C01A5241830B86
+:108FA0008B4201D38B03C01A5241430B8B4201D336
+:108FB0004B03C01A5241030B8B4201D30B03C01A5F
+:108FC0005241C30A8B4201D3CB02C01A5241830AD9
+:108FD0008B4201D38B02C01A5241430A8B4201D308
+:108FE0004B02C01A5241030A8B4201D30B02C01A32
+:108FF0005241CDD2C3098B4201D3CB01C01A524199
+:1090000083098B4201D38B01C01A524143098B4221
+:1090100001D34B01C01A524103098B4201D30B010A
+:10902000C01A5241C3088B4201D3CB00C01A52412F
+:1090300083088B4201D38B00C01A524143088B42F4
+:1090400001D34B00C01A5241411A00D2014652418D
+:10905000104670475DE0CA0F00D04942031000D3AC
+:109060004042534000229C4603098B422DD3030A01
+:109070008B4212D3FC22890112BA030A8B420CD311
+:10908000890192118B4208D3890192118B4204D33A
+:1090900089013AD0921100E08909C3098B4201D3BA
+:1090A000CB01C01A524183098B4201D38B01C01AF4
+:1090B000524143098B4201D34B01C01A524103096B
+:1090C0008B4201D30B01C01A5241C3088B4201D31A
+:1090D000CB00C01A524183088B4201D38B00C01AC7
+:1090E0005241D9D243088B4201D34B00C01A52419E
+:1090F000411A00D20146634652415B10104601D32B
+:109100004042002B00D54942704763465B1000D3B4
+:10911000404201B5002000F005F802BD0029F8D05A
+:1091200016E770477047C046002B11D1002A0FD1B7
+:10913000002900D1002802D00021C943080007B44B
+:10914000024802A14018029003BDC046D9FFFFFFAC
+:1091500003B4684601B5029800F052F8019B9E46A0
+:1091600002B00CBC7047C046F0B5CE46474680B54D
+:10917000070099463B0C9C4613041B0C1D000E0077
+:1091800061460004140C000C45434B4360436143AB
+:10919000C0182C0C20188C46834203D980235B0214
+:1091A0009846C444494679437243030C63442D04F2
+:1091B0002D0CC918000440198918C0BCB946B04626
+:1091C000F0BDC04670B500220C4B04000D0001F04C
+:1091D00005F8002804D12000290000F065FF70BDCB
+:1091E000064B00222000290000F0CCFB00F05CFFC1
+:1091F00080231B069C466044F1E7C0460000E04126
+:10920000F0B557464E464546DE46E0B504000D0033
+:109210009246994683B08B4230D82DD0494650466D
+:1092200001F004F829000600200000F0FFFF331AC7
+:109230009846203B9B4633D45A4653469340424679
+:109240001F00534693401E00AF423AD8AF4200D1B0
+:1092500078E05B46A41BBD41002B00DA75E00022DC
+:1092600000230092019301235A4693400193012366
+:1092700042469340009328E08242CFD90022002347
+:10928000009201930C9B002B01D01C605D60009844
+:10929000019903B0F0BCBB46B246A946A046F0BD5A
+:1092A000424620239B1A5246DA40414613004A4662
+:1092B0008A40170042461F43534693401E00AF4268
+:1092C000C4D900220023009201934346002BD9D039
+:1092D000FB0772081A4346467B080EE0AB4201D1F9
+:1092E000A2420CD8A41A9D41012024196D410021ED
+:1092F000013E24184D41002E06D0AB42EED9013E6E
+:1093000024196D41002EF8D1009801995B4600198F
+:109310006941002B24DB2B005A464446D3402A00E7
+:10932000E2401C005B461500002B2ADB26009E4015
+:10933000330026004746BE403200801A9941009013
+:1093400001919FE7A342BCD883E742462023002136
+:109350009B1A0022009101920122DA40019286E7D5
+:10936000424620239B1A2A0046469A402300F34097
+:10937000444613432A00E2401C005B461500002BC4
+:10938000D4DA42462F002023260097409B1ADE4065
+:109390003B003343CDE7C046F0B557464E46454601
+:1093A000DE46E0B5814605000C03480092461F00EA
+:1093B00085B0240B400DCE0F002800D156E1D44BD0
+:1093C000984200D172E16B0FE4001C4380231B0420
+:1093D00023439846CF4BED009B4600239946834498
+:1093E00000933C037B005046240B5B0DFF0F002BCA
+:1093F00000D11FE1C64A934200D162E1C549420F44
+:109400008C46E40059461443802263441204CB1A6C
+:1094100014439B46C200002033007B409A464B46D3
+:109420000F2B27D8BC499B00CB589F46B246009BC8
+:10943000022B16D0032B00D18EE2012B00D0D9E0F5
+:1094400000230024002552461B052343D207134363
+:109450002800190005B0F0BCBB46B246A946A0469C
+:10946000F0BD00240025AA4BEDE7BA46A046150042
+:109470000090DCE7444500D2C7E100D1C2E10123FE
+:109480005B429C462E0040460025E3442302140E16
+:109490001C431B0C994623041F0C120249460092E0
+:1094A0000197FFF751FD02007A430B04310C80460F
+:1094B00019438A4207D901235B429C460919E044BB
+:1094C0008C4200D807E2881A4946FFF73DFD09049F
+:1094D0008C4631046646019A090C4243030031432D
+:1094E0008A4204D90919013B8C4200D8EDE1881A5F
+:1094F000424612041A4390464146009B0E041B0C40
+:109500001F000293009B360C1B04190C0B007343C5
+:10951000120C7E43039151437A431F0CBC467618CC
+:109520006644B14203D9802149028C466244310C21
+:109530008A1831041E04360C8E19904202D312D1BF
+:10954000B54210D24346591E009B9C4665441F00FD
+:109550009D429B415B421B19C018844200D2A0E18E
+:1095600000D19BE18846AE1BB542AD41801A6D42E9
+:10957000401B844200D1D5E14946FFF7E5FC019A42
+:109580000B044243310C050019438A4200D96CE1B7
+:10959000881A4946FFF7D8FC019A36044243090469
+:1095A000360C03000E43B24200D953E10398B61AB9
+:1095B00002002D041D43029F2B041B0C5A437B43C6
+:1095C0009C46290C4843130C8444634479439842D5
+:1095D00003D98020400284466144180C12041B0405
+:1095E000120C41189B188E4200D2FFE000D1FAE025
+:1095F00001231D43494A5A44002A00DCAAE06B07B4
+:1096000000D03DE1ED084346DB0106D54246444B20
+:109610001A4090468022D2005A44424B9A4200DDC2
+:109620001FE743465B071D43434652055C02240B7C
+:10963000530D08E75246224300D17BE0002C00D1B5
+:10964000FAE0200000F0D4FD02000B3A1D230100D7
+:109650009B1A52460839DA408C40144352468A40DD
+:10966000314B58449B4683440020D5E64B46234368
+:10967000984644D0002C00D1CEE0200000F0B8FD88
+:10968000010002000B391D235B1A49461000D94026
+:10969000083884400B004D462343984685402348B4
+:1096A000831A9B460023994600939AE64B46234330
+:1096B00098461DD108239946063B00258346009312
+:1096C0008FE65246224309D1022349461943184BDB
+:1096D00089469C4600240220E3449DE603234A4633
+:1096E0001A43134B91469C4652460320E34493E6AB
+:1096F0000C239946093BA0468346009371E6042358
+:10970000994600239B4601330025009369E6C04635
+:10971000FF07000001FCFFFF74F20010FF030000D0
+:10972000FFFFFFFEFE070000F30300000DFCFFFF3C
+:1097300001F8FFFF4946012319438946002401200F
+:109740006AE6002380249A4600258A4B24037AE6A1
+:1097500001256D4201239B1A382B00DD70E61F2B7B
+:1097600000DCBFE01F2149428A1A4146D1400A006D
+:10977000202B04D04146804B5B4499400D436B1E27
+:109780009D4107232A431D0000241540134200D1A8
+:10979000D4E00F2100231140042900D1CBE0111D9A
+:1097A0009142924152429B180A00190200D4C2E031
+:1097B00001230024002546E6802341461B0319426D
+:1097C00008D01C4206D11C432403BA461500694B3D
+:1097D000240B38E68024434624031C432403B2466A
+:1097E000644B240B2FE6002B00D103E7A619681E5B
+:1097F000A64200D28DE08E4200D2A3E000D1B3E0B9
+:109800000500F5E6AA4200D939E64346DE075808C6
+:109810006B081E43ED0739E6484600F0E9FC0100FD
+:109820000200153120321C2900DC2CE74B46083899
+:1098300083400025984632E700F0DAFC03001A0066
+:10984000153220301C2A00DC00E75446083B002279
+:109850009C4005E73619013BB44200D9A6E6B24266
+:1098600000D8A3E6831E3619A0E60919013D8C42F3
+:1098700000D98DE68A4200D88AE6851E091987E656
+:109880000F232B40042B00D1BCE605235B42AB42E7
+:109890009B4104355B42ED089844B4E6AF4200D9E1
+:1098A00060E6824204D800D05CE6AE4200D859E6B9
+:1098B00002235B429C46009BE0449C4665449D42DB
+:1098C0009B415B421B19C0184DE68A4200D80EE648
+:1098D000831E09190BE68A4200D8F4E5831E9846D8
+:1098E0000919F0E52549280059448D4042468A402F
+:1098F000691E8D414146D840D94002432A430B009E
+:10990000510700D151E70F211140042900D046E74B
+:109910004BE705008E4200D06AE6009A934200D0E1
+:1099200066E667E6164A5A44002A00DC10E701237F
+:109930000025984467E65D075B021C0BD2080023F4
+:10994000154380E50098023D42008242BF417F42BC
+:109950003C1936190092DDE78024434624031C435A
+:109960002403044B240B6EE5009A9A42EAD30500C7
+:10997000D3E7C046FF0700003E0400001E040000BD
+:10998000FF030000F8B557464E464546DE46E0B5B3
+:109990001E0017004A000B03520D5B0A9046420F4F
+:1099A0001A43CD0FCD4C3103C300944670007A0F9B
+:1099B000490AFF009A46B946400DF60F1143A042EE
+:1099C00000D1B1E001225640B346B54200D188E053
+:1099D0004246121A002A00DCAEE0002800D1C1E0A5
+:1099E000BE48804500D151E1802000040143382A5F
+:1099F00000DD7BE11F2A00DDEEE120203E00801A21
+:109A00000C00D640D140874062468440521A781EEE
+:109A10008741944634432743DC1BA3429B41624663
+:109A20005B42D31A99464B461B0200D418E14B46C1
+:109A30005802430A99464B46002B00D137E148466D
+:109A400000F0D6FB010008392023220048465B1AAB
+:109A5000DA4088408C4043461043884500DD36E1BB
+:109A6000C91A4B1C1F2B00DDEAE020222600D21A67
+:109A700001009440DE40D84000239140621E944192
+:109A80008146984631430C43630709D00F23234096
+:109A9000042B05D0231DA342A4416442A1441C0011
+:109AA0004B461B0200D4DEE041468C4B013199420B
+:109AB00000D1E7E04B468A48E40803401800490516
+:109AC0005B07400223434A0D040B1205ED072243B6
+:109AD0002A4318001100F0BCBB46B246A946A04676
+:109AE000F8BD4246121A002A52DD002800D19CE03F
+:109AF000A04500D1CAE0802000040143382A00DDDF
+:109B000049E11F2A00DC97E110000E002038C64012
+:109B1000202A04D04020821A91400F43B9464C4677
+:109B2000621E944134433AE10A003A4328D0B346D6
+:109B3000B5422BD06B4A4244002A5DD0424644468F
+:109B4000821A002C00D0F5E065461D4300D19CE14F
+:109B5000551E012A00D1FBE1604CA24200D1BDE1BB
+:109B60002A00F0E00800384300D1C3E0501E012A6B
+:109B700000D1A8E1594CA24200D187E0020036E7AB
+:109B800001225640B346B54200D021E7554A42442F
+:109B9000002A00D1B5E042464446821A002C00D18A
+:109BA00038E14E4EB04200D1DEE1802664463604F4
+:109BB0003443A446382A00DD96E11F2A00DD24E262
+:109BC0002026B41AA24664465646B440A1461C005C
+:109BD0004E46D440264334005646B3405E1EB34141
+:109BE0001C436346D340C918E419BC42BF417F42BD
+:109BF000B94680468944D8E040463B4C013020427B
+:109C000000D0B4E04046002800D044E1604618434C
+:109C100000D190E10800384300D0AAE16146DB089A
+:109C200049070B436146CC0827E00800384361D060
+:109C3000501E012A00D139E1A24227D002005DE77F
+:109C400002001F39CA401100202B03D04022D31A32
+:109C500098400443631E9C410023994698460C4358
+:109C6000630700D012E74B464A46E4085B072343EC
+:109C7000D408424619498A420ED024035205240BC7
+:109C8000520D22E70A00002400231EE7DB0862468B
+:109C9000520713436246D4081A00224300D1FCE164
+:109CA00080221203144324030C4A240B0DE72000E6
+:109CB00000F09EFA010018311F2900DCC4E60838C4
+:109CC0008440434620000024884500DCC8E6044A5E
+:109CD0005B1A104098468146D6E6C046FF07000052
+:109CE000FFFF7FFF01F8FFFFFE0700000F437A1E12
+:109CF000974191E66146DB0849070B436146CC0872
+:109D0000B8E74046D34C0130204200D0A2E04046A4
+:109D1000002800D001E16046184300D15EE1080050
+:109D2000384300D05FE16146DB0849070B436146D9
+:109D3000CC08A2E7C84DA84200D1CFE080256446F8
+:109D40002D042C43A446382A56DC1F2A00DDD1E01E
+:109D500020251E00AD1A6446AB40AC40D6405D1EC7
+:109D6000AB41344323436446D440091B49E0604679
+:109D7000DC1B461AA34280414042814630004E46D9
+:109D8000801B8146000276D44B46234300D052E626
+:109D90000024002571E739430C00621E9441E41849
+:109DA0009C429B415B42634499464B461B0200D454
+:109DB00056E701239C46A84BE044984538D04B46D3
+:109DC000A648012203401800630814401C43C3073F
+:109DD0001C434308994657E610000E002038C64041
+:109DE000202A04D04020821A91400F43B9464F46A2
+:109DF0007A1E974137430FE662461A4313005A1EF4
+:109E00009341FC1AA742BF417F42CB1B99465D4656
+:109E1000804608E666461E4300D1BEE0561E012A73
+:109E200000D109E18C4CA24200D119E13200C1E617
+:109E300042460024002348E620200C00801A3E0001
+:109E400087408440D640781E8741D14034433C430C
+:109E50008C44A4E7804A904200D1E9E0DF199F4298
+:109E60009B4161445B42C918CC077F084B08994667
+:109E700080463C43F4E6FC1AA742BF4163467F425A
+:109E8000C91ACB1B99465D46D5E5FF084B075D46D1
+:109E90003B43CC08EEE662461A4300D082E00B005A
+:109EA0003B431BD1802400252403F9E6DC199C42A6
+:109EB0009B41614489465B4299444B461B0244D412
+:109EC00001239846CCE6DC1B6246A3429B41511A13
+:109ED0005B42CB1A994601239846A4E5FF084B073D
+:109EE0005D463B43CC08D7E662461A431400631E26
+:109EF0009C4179E615006446203DEC40A046202AAE
+:109F000005D040256446AA1A944023439A465446F5
+:109F1000631E9C414346234373E762461A4323D0A2
+:109F20000A003A4300D0A0E06246DB085207134320
+:109F30006246D408B0E60B003B4300D128E7FF0897
+:109F40004B075D463B43CC0897E60223984636E72D
+:109F5000FC1AA742BF4163467F42C91ACB1B9946F0
+:109F600001235D4698465EE54B07FF083B43CC085E
+:109F700092E6DC1B6046A342B641401A7642801B43
+:109F80008146000260D5FC1AA742BF4163467F426A
+:109F9000C91ACB1B99465D4676E5FF084B073B4344
+:109FA000CC0867E60A00DB083A4300D16FE6624658
+:109FB000520713436246D40880221203144207D08A
+:109FC000C808104204D15D460400FB0849070B4352
+:109FD0005A0FDB00DB08520713435DE64B07FF080F
+:109FE0003B43CC0849E6DC199C429B4161448946CD
+:109FF0005B4299444B461B0200D431E64A46174B5C
+:10A000001A400123914698462AE616006446203EEF
+:10A01000F440A046202A05D040266446B21A944057
+:10A0200023439A465446631E9C4143461C43DBE54A
+:10A0300002000024002348E5DC19BC42BF41614412
+:10A0400089467F42B94438E74B46234300D19FE617
+:10A0500006E6C046FE070000FF070000FFFF7FFF87
+:10A06000FF084B073B43CC0816E66246DB08520765
+:10A0700013436246D40880221203144207D0C80852
+:10A08000104204D15D460400FB0849070B435A0FF8
+:10A09000DB005207DB081343FEE50023014A1C00E6
+:10A0A00013E5C046FF0700000A0030B5134C53000B
+:10A0B00009030500090B00205B0DD20FA34204DD4C
+:10A0C0000F48834202DD0F4BD01830BD8020400383
+:10A0D00001430D48C01A1F2808DD0C48C31AD94097
+:10A0E0000B005842002AF0D11800EEE7084CC5409A
+:10A0F000A446634499400B002B43F2E7FE030000A3
+:10A100001D040000FFFFFF7F330400001304000064
+:10A11000EDFBFFFF70B5002816D0C317C5185D40D2
+:10A12000C40F280000F064F8114A121A0A2816DC3D
+:10A1300003002E0015339E400B23181AC54052050C
+:10A140002D032D0B530D03E00024002300250026D2
+:10A150001B052B43E40723433000190070BD0B3867
+:10A16000854052052D0300262D0B530DF0E7C04608
+:10A170001E0400008446100062468C4619006346A7
+:10A1800000E0C0461FB500F005F9002801D4002109
+:10A19000C8421FBD10B500F055F84042013010BD57
+:10A1A00010B500F0F7F8002801DB002010BD0120F9
+:10A1B00010BDC04610B500F0EDF8002801DD00200C
+:10A1C00010BD012010BDC04610B500F07DF800287C
+:10A1D00001DC002010BD012010BDC04610B500F00C
+:10A1E00073F8002801DA002010BD012010BDC04620
+:10A1F0001C2101231B04984201D3000C10391B0AB7
+:10A20000984201D3000A08391B09984201D300097A
+:10A21000043902A2105C40187047C04604030202D1
+:10A2200001010101000000000000000010B500293C
+:10A2300003D1FFF7DDFF203002E00800FFF7D8FF71
+:10A2400010BDC046F0B54E464546DE4657469046E0
+:10A25000E0B517001A03120B0500844619480E03D7
+:10A260004C0091465A00DB0F9B46360B640DC90F1C
+:10A27000520D844219D0824210D0012094420ED156
+:10A280004E450CD10120C44509D1594517D0002CA9
+:10A2900005D130002843431E984100E00120F0BC66
+:10A2A000BB46B246A946A046F0BD330001202B4371
+:10A2B000F5D1A242F3D14B463B43F0D1E2E7002077
+:10A2C000EDE7C046FF070000F0B54746CE46040064
+:10A2D000180016001B031B0B2D4D4A00994680B534
+:10A2E00043000F03A446B0463F0B520DC90F5B0D50
+:10A2F000C00FAA4221D0AB4213D0002A22D13C4346
+:10A30000002B02D14D462E4322D0002C10D081428A
+:10A3100022D00220013908400138C0BCB946B046FD
+:10A32000F0BD4D462E4329D1002AF0D13C43EED159
+:10A330000028F2D101204042EFE73D0025431DD126
+:10A340009342EED0002BE2D14C462643DFD1E0E72A
+:10A350000020002CE1D0DCE79A420ADCE8DB4F4524
+:10A36000D7D80ED000204F45D7D20029E2D0080020
+:10A37000D3E74342584140000138CEE70220404233
+:10A38000CBE7C445C5D80020C445C6D2EDE7C046DA
+:10A39000FF070000F0B54746CE460400180016003F
+:10A3A0001B031B0B2C4D4A00994680B543000F033D
+:10A3B000A446B0463F0B520DC90F5B0DC00FAA4219
+:10A3C0000DD0AB4210D0002A27D13C43002B11D135
+:10A3D0004D462E430ED10020002C15D00EE03D003E
+:10A3E000254310D1934218D14D462E430BD1002A5C
+:10A3F00002D13C43002C0BD0814214D00220013901
+:10A400000840013800E00220C0BCB946B046F0BDAB
+:10A410000028F9D101204042F6E7002BECD14C4650
+:10A420002643E9D1EAE79A4204DD4342584140001D
+:10A430000138E9E79A42EBDB4F45DFD806D0002030
+:10A440004F45E1D20029E5D00800DDE7C445D5D865
+:10A450000020C445D8D2F5E7FF07000030B514004E
+:10A460001A00094B05001B6885B0D868074B002C03
+:10A4700001D1074B1C00019300912B000549029468
+:10A4800000F00AF801F07CF8EC010008B4F20010CA
+:10A49000EFF20010C1F200100EB403B5010003ABDF
+:10A4A000044804CB0068019300F0DAF902B008BC5C
+:10A4B00003B01847EC010008F7B553430500170037
+:10A4C000089C01910093002804D08369002B01D1DE
+:10A4D00002F030F8274B9C4225D16C68636EDB0795
+:10A4E00005D4A3899B0502D4A06D00F057F8A38979
+:10A4F0001B0722D52369002B1FD00026009B9E42FC
+:10A5000022D0019B995DA368013BA360002B04DA74
+:10A51000A269934226DB0A2924D023685A1C2260B0
+:10A5200019700136EAE7144B9C4201D1AC68D5E7BB
+:10A53000124B9C42D2D1EC68D0E72100280000F0F9
+:10A54000A7FF0026B042D8D0636EDB0705D4A389ED
+:10A550009B0502D4A06D00F022F839003000FEF710
+:10A560006DFCFEBD2200280000F03CFF431CD8D14A
+:10A57000EAE7C046F0F4001010F50010D0F4001027
+:10A5800007B5009313000A00010002480068FFF7B6
+:10A5900093FF0EBDEC01000870477047704770478D
+:10A5A00010B5034B0100186800F0BCF810BDC046A0
+:10A5B000EC01000830B500240139A24201D100208D
+:10A5C00005E0035D01340D5DAB42F6D0581B30BD94
+:10A5D000002310B59A4200D110BDCC5CC4540133A5
+:10A5E000F8E703008218934200D1704719700133D5
+:10A5F000F9E770B5130C0D0C1ED1002B0CD189B2EC
+:10A6000094B24C43210000F08DF8051E1BD02200AF
+:10A610000021FFF7E6FF16E01D1C0B1C92B289B269
+:10A620009CB25143ABB263430C0C1C19220C07D1F2
+:10A63000240489B20C43E5E7002B01D1131CEDE79C
+:10A640000C2300250360280070BD000070B50500D4
+:10A65000002910D00C1F2368002B00DAE418280012
+:10A6600002F096F81D4A1368002B05D16360146050
+:10A67000280002F095F870BDA34208D9216860183F
+:10A680008342F3D118685B6841182160EEE71A0035
+:10A690005B68002B01D0A342F9D911685018A04281
+:10A6A0000BD120680918501811608342E0D1186856
+:10A6B0005B68411811605360DAE7A04202D90C23AD
+:10A6C0002B60D5E721686018834203D118685B6866
+:10A6D0004118216063605460CAE7C0466C6001089D
+:10A6E00070B50F4E0D0031680400002902D100F052
+:10A6F0005FFE30602900200000F05AFE431C0AD0A3
+:10A700000323C51C9D43A84207D0291A200000F04E
+:10A710004FFE431C01D101256D42280070BDC0468B
+:10A7200070600108F7B50322CB1C93430833060081
+:10A730001F000C2B32D20C27B94231D8300002F066
+:10A7400027F8324D2B681C00002C2ED13900300028
+:10A75000FFF7C6FF0400431C1ED12C682500002D06
+:10A760004AD123682900E3183000019300F020FE4D
+:10A77000019B834243D123680337FF1A03239F437E
+:10A7800008370C2F00D20C2739003000FFF7A8FF44
+:10A79000431C34D02368DF19276013E0002BCBDA89
+:10A7A0000C23002533602800FEBD2268D11B20D475
+:10A7B0000B2917D9E2192760A34211D12A606368D7
+:10A7C000116053603000250001F0EAFF07220B35CD
+:10A7D000231D9543EA1A9D42E5D05B1BA350E2E797
+:10A7E0005A60ECE76268A34201D12A60EAE75A6046
+:10A7F000E8E723006468A7E72C006D68AFE70C2347
+:10A800003000336001F0CCFFCDE7C0466C6001083A
+:10A81000936810B5013B9360002B04DA9469A3425E
+:10A8200007DB0A2905D01368581C1060197008004E
+:10A8300010BD00F0D7FD0100F9E7F8B506000F00E4
+:10A840001400D518AC4201D1002007E021783A006D
+:10A850003000FFF7DDFF0134431CF3D1F8BD0000E9
+:10A86000F0B5A1B006000C001F000392002804D030
+:10A870008369002B01D101F05DFE8E4B9C421CD1FF
+:10A880007468636EDB0705D4A3899B0502D4A06DB1
+:10A89000FFF784FEA3891B0702D52369002B1DD176
+:10A8A0002100300000F0F4FD002817D0636EDB07B4
+:10A8B0000DD50120404221B0F0BD7F4B9C4201D11B
+:10A8C000B468DEE77D4B9C42DBD1F468D9E7A3890D
+:10A8D0009B05EED4A06DFFF762FEEAE7002308AD0A
+:10A8E0006B6120336B761033AB760797039F3B7811
+:10A8F000002B01D0252B4ED1039BFB1A0593039B04
+:10A900009F420DD0059B21003000039AFFF795FF71
+:10A91000431C00D1B5E06A69059B944663446B61B2
+:10A920003B78002B00D1ACE001227B1C0393002379
+:10A9300052426A6004A9543252182B60EB60AB603B
+:10A940001370AB65039B052219785D4801F014FF75
+:10A95000039B5F1C002820D12A68D30604D553230B
+:10A9600004A95B1820211970130704D5532304A9E7
+:10A970005B182B211970039B1B782A2B16D0002102
+:10A98000EB68039F3A78781C303A8446092A4FD9FD
+:10A99000002911D117E00137A9E7494B2A68C01AED
+:10A9A0000123834013432B600397CBE7079B191DBB
+:10A9B0001B680791002B01DB0B9304E05B42EB600B
+:10A9C000022313432B603B782E2B0AD17B782A2B52
+:10A9D00037D1079B02371A1D1B680792002B2DDB0E
+:10A9E000099303223978374801F0C6FE002807D0C2
+:10A9F000344B2A68C01A40238340134301372B602D
+:10AA000039787B1C062230480393297601F0B4FE86
+:10AA1000002845D02D4B002B27D10722079B073359
+:10AA20009343083307936B69049A9B186B615DE746
+:10AA30000A214B4367469B180939A3E701235B4270
+:10AA4000CEE700231A0001376B603978781C303963
+:10AA50008446092903D9002BC3D00992C1E70A23F0
+:10AA60005A4367465218093BEFE707AB00932200B1
+:10AA700029003000164B00F0D7F80490049B0133F6
+:10AA8000D1D1636EDB0705D4A3899B0502D4A06DE9
+:10AA9000FFF785FDA3895B0600D50AE70D980AE755
+:10AAA00007AB0093220029003000094B00F06EFB39
+:10AAB000E3E7C046F0F4001010F50010D0F40010E9
+:10AAC000F4F20010FAF20010FEF2001029AC0010AF
+:10AAD0003BA80010F0B51E00002314008BB09E426E
+:10AAE00004DA8021090673181E002D23129A149F80
+:10AAF0001370202303229F43462F07D03B00453B82
+:10AB000059424B411099013ACB18109309AB049369
+:10AB100008AB0393139B00920293109B22000193B6
+:10AB2000330000F0BFFD0500472F02D1119BDB076A
+:10AB300028D5109BEB180793462F14D12B78302B78
+:10AB40000CD10022002320003100FFF723FB002856
+:10AB500004D10123109A9B1A139A1360139B079A2E
+:10AB60001B68D31807930022002320003100FFF751
+:10AB700011FB002801D0079B09933022099B0799FC
+:10AB80008B4206D32800099B159A5B1B13600BB000
+:10AB9000F0BD591C09911A70F0E7F0B5831C87B01D
+:10ABA000039305000C002B230270002901DA4C42AC
+:10ABB00002336B70092C31DD0A2704ABDE1D200047
+:10ABC00039000196FEF7AAFA013E303120003170BB
+:10ABD00039000294FEF7BCF9029B0400632BEEDC03
+:10ABE000019B30349A1E13000399147004A8073097
+:10ABF00098420ED804AB073300209A4204D804AB25
+:10AC00000930C018019BC01A039B1818401B07B0DD
+:10AC1000F0BD1878013308700131E7E73023E418FC
+:10AC2000AB70281DEC70F1E7F0B595B00C000992FF
+:10AC30001E001A9D070001F01DFD036818000C930B
+:10AC400000F0C8FB00231293237E07220A93236897
+:10AC50000E900D930D992B68C90547D59B1893430A
+:10AC60001A0008322A601A685B68A264E364012251
+:10AC7000A36CE56C0B936B005B080F930B98A74BD1
+:10AC80000F99524203F076F8002831D10122A34BEC
+:10AC90000B980F995242FFF78DFA002828D1002215
+:10ACA000002329000B98FFF77BFA002803D023002C
+:10ACB0002D2243331A700A9B994D472B00D9994D89
+:10ACC00003230D9A236101339A43002322600B93DF
+:10ACD000099B21003800009613AA00F0E7F9431CF5
+:10ACE00000D0A2E00120404215B0F0BD0733B6E726
+:10ACF0000B9A2B001000290003F03CF800280BD021
+:10AD0000002D03DA23002D2243331A700A9B864D4F
+:10AD1000472BD5D9854DD3E720220A996368914303
+:10AD20000F915A1C49D10733636080230D9ADB00D1
+:10AD300013430022069212AA05920A9A08A90492C5
+:10AD400011AA03922322236001936368521802928E
+:10AD5000009338002B000B9AFFF7BCFE0F9B0500F9
+:10AD60001199472B08D1CB1C02DB6368994248DD5F
+:10AD70000A9B023BDBB20A930A9B652B24D8200076
+:10AD80001A00013950301191FFF707FF129A0B900A
+:10AD900013182361012A02DC2268D20701D501338E
+:10ADA0002361232308AA9B181B78002B00D18FE76F
+:10ADB00023002D2243331A708AE70F9A472AB4D111
+:10ADC000002BB2D10133AFE70A9B662B1BD163681E
+:10ADD00000290DDD2161002B02D12268D20702D5A6
+:10ADE000013359182161119BA36500230B93D8E708
+:10ADF000002B03D101222168114200D09A1C22614C
+:10AE0000F1E767230A93119B129A934206DB2268AB
+:10AE10002361D207E7D501332361E4E70121002B49
+:10AE200001DC4918C91A5218E9E72268530507D40A
+:10AE300023692A0038000999B047431C28D151E7FB
+:10AE40000A9B652B00D8E1E0A06CE16C0022002396
+:10AE5000FFF7A0F9002831D001233800344A0999BE
+:10AE6000B047431C00D13DE7119B129A934202DB8D
+:10AE70002368DB070CD538000E9B0C9A0999B04764
+:10AE80000025431C00D12DE7129B013BAB420ADC9D
+:10AE900023689B0700D506E1139BE068984200DB1E
+:10AEA00022E7180020E722000123380009991A320E
+:10AEB000B047431C00D115E70135E5E7119B002B96
+:10AEC00038DC012338001A4A0999B047431C00D1E5
+:10AED00008E7119B129A134302D12368DB07D7D5E9
+:10AEE0000E9B38000C9A0999B047431C00D1F9E633
+:10AEF00000230A93119B0A9A5B42934201DC129B46
+:10AF000097E722000123380009991A32B047431C01
+:10AF100000D1E7E60A9B0133EBE7C046FFFFEF7F76
+:10AF200005F3001009F300100DF3001011F30010E9
+:10AF300015F30010129AA36D0A929A4200DD0A934B
+:10AF40000A9B002B3CDC00230D930A9BDB43DB17A1
+:10AF50000F93A36D0F9A0B930A9B13400B9AD31A6E
+:10AF60000D9A934234DC119B129A93423DDB236885
+:10AF7000DB073AD4129A0B9B1199D31A521A0A92F0
+:10AF80009A4200DD0A930A9B002B36DC0A9B0025BF
+:10AF9000DB43DB170B93119A129B0B999B1A0A9AAE
+:10AFA0000A409B1AAB4200DC72E722000123380002
+:10AFB00009991A32B047431C00D193E60135EAE7FC
+:10AFC0000A9B2A0038000999B047431CBBD189E687
+:10AFD00022000123380009991A32B047431C00D1DE
+:10AFE00080E60D9B01330D93B3E70E9B38000C9A5E
+:10AFF0000999B047431CBDD174E60B9B3800EA1891
+:10B0000009990A9BB047431CC0D16BE6129B012BE8
+:10B0100002DC01231A4234D001232A0038000999A6
+:10B02000B047431C00D15DE60E9B38000C9A09998D
+:10B03000B047431C00D155E6A06CE16C0022002310
+:10B04000FFF7A8F800281AD1129B6A1C013B3800B0
+:10B050000999B047431C0ED144E622000123380071
+:10B0600009991A32B047431C00D13BE60135129BC7
+:10B07000013BAB42F1DC22000B9B5032DAE60025AB
+:10B08000F5E72A00E3E72200012338000999193285
+:10B09000B047431C00D125E60135E368139A9B1A9B
+:10B0A000AB42F0DCF8E60025F7E7C046F7B515003F
+:10B0B00001938A680B690C000090934200DA130038
+:10B0C00022002B6043321278002A01D001332B601A
+:10B0D00023689B0602D52B6802332B602268062367
+:10B0E00017001F401A4227D0230043331B785A1EF3
+:10B0F00093412268920630D4220001990098089E5C
+:10B100004332B047431C25D0062320682A68E168F3
+:10B1100000250340042B03D18D1AEB43DB171D40A0
+:10B12000A3682269934201DD9B1AED180027BD42F6
+:10B1300020D1002010E00137E3682A689B1ABB4247
+:10B14000D2DD2200012301990098089E1932B047F0
+:10B15000431CF0D101204042FEBD3020E1184331B4
+:10B16000087021005A1C45310978A2184332023375
+:10B170001170C1E72200012301990098089E1A323C
+:10B18000B047431CE6D00137D1E70000F0B58BB0E3
+:10B1900006920A0043320793059004920A7E0C003F
+:10B1A000109B782A07D8622A09D8002A00D1C1E06A
+:10B1B000582A00D18CE026004236327022E010007E
+:10B1C00063381528F7D802F023F816001F00F6FFA1
+:10B1D000F6FFF6FFF6FF1F00F6FFF6FFF6FFF6FF9D
+:10B1E000A80036009A00F6FFF6FFB900F6FF360019
+:10B1F000F6FFF6FF9E0026001A684236111D196000
+:10B20000136833700123A7E0086819680A1D050652
+:10B210000BD50D681A60002D03DA2D23049A6D42B8
+:10B220001370614B0A2703931BE00D681A604106F7
+:10B23000F1D52DB2EFE70D681968081D18602E06CC
+:10B2400001D50D6803E06D06FBD50D68ADB2564B18
+:10B25000082703936F2A00D00237230000224333CC
+:10B260001A706368A360002B03DB042221689143FA
+:10B270002160002D02D1049E002B0CD0049E2800DA
+:10B280003900FDF761FE039B013E5B5C33702B00D0
+:10B2900005009F42F3D9082F09D12368DB0706D5A3
+:10B2A00063682269934202DC3023013E3370049BC1
+:10B2B0009B1B2361079B210000930598069B09AA0D
+:10B2C000FFF7F4FE431C4CD1012040420BB0F0BD0F
+:10B2D00045310A70344A03921A68216820CA1A60FC
+:10B2E000080616D5CB0702D5202319432160102765
+:10B2F000002DB2D1202322689A432260ADE720229C
+:10B3000009680A4322602200782145321170274AD9
+:10B31000E1E74806E6D5ADB2E4E71A680D68101D0E
+:10B320004969186013682E0601D5196002E06D06A0
+:10B33000FBD519800023049E2361BBE71A68111D09
+:10B340001960166800213000626801F015FA0028C3
+:10B3500001D0801B6060636823610023049A13702E
+:10B36000A8E72369320006990598079DA847431C62
+:10B37000AAD023689B0715D4099BE0689842A5DAF8
+:10B380001800A3E72200012306990598079E1932A9
+:10B39000B047431C98D00135E368099A9B1AAB4229
+:10B3A000F0DCE9E70025F7E717F3001028F30010B9
+:10B3B000002370B5064D040008002B6002F04EFD1E
+:10B3C000431C03D12B68002B00D0236070BDC04606
+:10B3D000746001080023C25C0133002AFBD1581EAF
+:10B3E00070470000F8B505000E001400002804D0D6
+:10B3F0008369002B01D101F09DF8224B9C422ED194
+:10B400006C68A369A360A3891B0732D52369002B4D
+:10B410002FD023682269F7B2981A6369F6B2834283
+:10B4200005DC2100280000F0E3FF002827D1A368F5
+:10B430000130013BA36023685A1C22601F706369BE
+:10B44000834204D0A389DB0707D50A2E05D121004A
+:10B45000280000F0CDFF002811D13000F8BD0A4BC4
+:10B460009C4201D1AC68CCE7084B9C42C9D1EC6846
+:10B47000C7E72100280000F00BF80028C9D00126FA
+:10B480007642EAE7F0F4001010F50010D0F4001056
+:10B49000374B70B51D6806000C00002D05D0AB6958
+:10B4A000002B02D1280001F045F8324B9C420FD10D
+:10B4B0006C680C23E25E93B211072DD4D90611D427
+:10B4C00009230120336037331343A381404270BD09
+:10B4D000294B9C4201D1AC68EBE7284B9C42E8D158
+:10B4E000EC68E6E75B0713D5616B002908D0230001
+:10B4F0004433994202D03000FFF7A8F80023636379
+:10B500002422A3899343A3810023636023692360DA
+:10B510000823A2891343A3812369002B0BD1A02107
+:10B520008022A389890092000B40934203D021001E
+:10B53000300001F0CBF80C22A35E01201A0099B272
+:10B54000024003420FD00022A26062695242A2610F
+:10B55000002022698242BAD10A06B8D5402213439C
+:10B56000A3810138B3E7880700D46269A260EFE7DE
+:10B57000EC010008F0F4001010F50010D0F40010F9
+:10B58000062010B501F0DAFC012002F075FCF0B5E0
+:10B5900006000B69326987B0002003919A4265DB8F
+:10B5A000013B9C0000930B00143305931B1904937B
+:10B5B0003300143302931C19049B27681B6838005E
+:10B5C0005D1C29000193FDF739FC0190AF4224D3A3
+:10B5D0000025AC460298059F08CF019A99B25143C5
+:10B5E0001B0C534349190A0C9B18026889B292B28A
+:10B5F0006244521A01681D0C090C9BB2CB1A11143B
+:10B600005B18191492B21B041A43049B8C4604C0A5
+:10B61000BB42E1D22368002B30D03000039901F007
+:10B620004BFB002821DB30000024019B03990133F0
+:10B63000019314301431036820C99AB21419AAB2C4
+:10B64000A21A1B0C2D0C14145B1B1B191C1492B298
+:10B650001B04134308C0049B8B42ECD2009B029A4C
+:10B660009B00D3181A68002A15D0019807B0F0BDC6
+:10B670002368002B06D1009B013B0093029B043CF6
+:10B68000A342F5D3009B3361C7E71A68002A06D1AD
+:10B69000009A013A0092029A043B9A42F5D3009B29
+:10B6A0003361E2E7F0B59DB002920393029B039CE5
+:10B6B00008930994446A0700259D002C0ED11020A0
+:10B6C000FEF76EFF021E786204D1EA21C74BC8481C
+:10B6D000FEF7C4FE446084600460C4607B6A19683D
+:10B6E00000290AD05A68012393404A608B603800D1
+:10B6F00001F0A2F800227B6A1A60039B002B20DA7B
+:10B7000001232B60039B5B005B080993099DB94BE8
+:10B71000B84A2B40934217D1B74B249A28031360A1
+:10B72000029B000B184301D100F0BFFDB348269BDC
+:10B730000690002B02D0B24B269A136006981DB0DB
+:10B74000F0BD00232B60E1E7089B099C1293139442
+:10B750001298139900220023FEF71CFD041E09D045
+:10B760000123249A1360A74B0693269B002BE5D058
+:10B77000A54BE1E71AAB01931BAB00933800129A7B
+:10B78000139B01F04DFB6E000590760D00D17CE01F
+:10B7900012981399139B9D4A1B031B0B1A4311000C
+:10B7A0009B4B1894F61800229A4BFEF7EBF89A4A36
+:10B7B0009A4B02F073F89A4A9A4B01F033FD040059
+:10B7C00030000D00FEF7A6FC974A984B02F066F891
+:10B7D00002000B002000290001F024FD04000D00F0
+:10B7E000FEF762FC00220290002320002900FEF7F1
+:10B7F000D7FC00280BD00298FEF78CFC2B0022000F
+:10B80000FEF7C8FC43425841029B1B1A02930123D6
+:10B810001693029B162B0FD812981399DA00844BBB
+:10B820009B181A685B68FEF7BBFC002849D0029B96
+:10B83000013B0293002316931A9B9E1B00230A933D
+:10B840003300013B0D9304D501239B1B0A93002376
+:10B850000D93029B002B36DB029A0D9B94466344AA
+:10B860000D93002315920E93229B0124092B64D87B
+:10B87000052B02DD0024043B2293229B981E032803
+:10B8800064D801F0BBFC293836581A9B1B9A9E18C5
+:10B89000684BF218202A0FDD40239B1A9D40664B0F
+:10B8A0000298F318D840284302F082FA0123634C2F
+:10B8B000013E0919189376E7202302989B1A9840B5
+:10B8C000F2E71690B8E70A9B029A9B1A0A93534232
+:10B8D0000E9300231593C7E700230F93239B0C932C
+:10B8E0000793002B13DC01231A000C930793239278
+:10B8F0000DE00123F1E70023239A0F939446029B66
+:10B9000063440C9301330793002B00DC01230022D6
+:10B91000786A426004321500143541689D4219D995
+:10B92000380000F045FF0690002817D1D52102000D
+:10B93000434B4900CBE60123DEE700230F9422931B
+:10B94000013B0C93079300221333D0E701230F939D
+:10B95000023BF6E7013141605200DCE77B6A069A60
+:10B960001A60079B0E2B00D9EBE0002C00D1E8E019
+:10B97000029B002B68DD1A000F212D4B0A40D200DC
+:10B980009B181D685E68029B1C1102231093029B8A
+:10B99000DB050BD52B4B0C401A6A5B6A1298139986
+:10B9A000FDF7FAFC0323089009911093254B14939B
+:10B9B000002C08D1089809992A003300FDF7ECFC07
+:10B9C000089009915CE001231C420BD0109B2800D9
+:10B9D00001331093149B31001A685B6801F05EFF1D
+:10B9E00005000E00149B64100833E0E747F40010D4
+:10B9F0005EF400100000F07F0F27000043F40010F9
+:10BA000046F4001015F3001016F300100000F03F8C
+:10BA100001FCFFFF0000F83F61436F63A787D23F3F
+:10BA2000B3C8608B288AC63FFB799F501344D33F2D
+:10BA3000C8F500103204000012040000000010FEDF
+:10BA4000BCF40010A0F5001002231093029B002B01
+:10BA500016D0129813995C420F23B64A2340DB009C
+:10BA6000D3181A685B6801F019FF012600230890BB
+:10BA70000991B14D2411002C00D094E0002B9FD1EE
+:10BA8000169B002B00D19BE0089C099D0022200002
+:10BA90002900AA4BFEF784FB002800D190E0079B09
+:10BAA000002B00D18CE00C9B002B46DD029B00227A
+:10BAB000200029005E1EA24B01F0F0FE109B0890B2
+:10BAC0000991013310930C9B1098089C099D1493C5
+:10BAD000FEF720FB22002B0001F0E0FE0022994B34
+:10BAE00001F0A0FB10901191109A119B08920993FC
+:10BAF000954A119B9446634417930993149B002B1A
+:10BB000061D1002220002900904BFDF73BFF089AED
+:10BB1000179B04000D00FEF757FB002800D0AFE292
+:10BB20008B481199844661440B0020002900089A33
+:10BB3000FEF736FB002800D09FE2129B139C08936F
+:10BB400009941B9B002B00DA72E1029A0E2A00DD99
+:10BB50006EE1784BD2009B185C681B680A930B94CB
+:10BB6000239B002B00DBF7E0079B002B00DDF3E0BD
+:10BB700000D082E20A980B990022744B01F08EFEED
+:10BB8000089A099BFEF72AFB079E3500002800D083
+:10BB900059E2069B069A0133089331231370029BE6
+:10BBA0000133029354E2344207D0109B01331093C7
+:10BBB0002A686B6801F072FE3300641008355AE79A
+:10BBC000029E079B80E7149B0F995A1E594BD20087
+:10BBD0009B181A685B68002951D000205D49FDF769
+:10BBE000DBFB089A099BFDF7CDFE069A069B94465F
+:10BBF0001793149B1090119163441993290020000E
+:10BC0000FEF752FA1490FEF785FA02000B002000AE
+:10BC10002900FDF7B7FE179B179A01330893149B71
+:10BC2000040030331370109A119B0D00FEF7B8FA20
+:10BC3000002875D122002B0000204049FDF7A2FE0C
+:10BC4000109A119BFEF7ACFA002800D0D2E0199BA5
+:10BC5000089A934200D170E7109811990022384B4E
+:10BC600001F01CFE364B109011910022200029009B
+:10BC700001F014FE089B04000D001793BEE708981E
+:10BC8000099901F00BFE069A069B94460893149BB3
+:10BC9000109011916344199329002000FEF704FAD3
+:10BCA0001790FEF737FA02000B0020002900FDF77D
+:10BCB00069FE179B089A303313701300199A0133E9
+:10BCC00004000D00089393422CD110981199069A04
+:10BCD000149B94466344002208931E4B01F0A2FA81
+:10BCE00002000B0020002900FEF76EFA002800D0A9
+:10BCF00080E0109A119B00201649FDF743FE0200D8
+:10BD00000B0020002900FEF74BFA002800D114E7B1
+:10BD1000089B1A00013A08921278302AF8D008934A
+:10BD2000029655E00022064B01F0B8FD04000D001C
+:10BD3000B2E7C046C8F50010A0F500100000F03FC3
+:10BD40000000244000001C400000C0FC0000144023
+:10BD50000000C07C0000E03F079B069E013B9B1952
+:10BD60000C93089C099D0A9A0B9B20002900FDF763
+:10BD700013FBFEF799F90790FEF7CCF90A9A0B9B93
+:10BD800001F08CFD02000B0020002900FDF7FAFDF8
+:10BD90003300079A013630321A700C9A08969A428C
+:10BDA00039D102000B0001F03DFA0A9A0B9B040006
+:10BDB0000D00FEF709FA00281BD10A9A0B9B200000
+:10BDC0002900FEF7E7F9002802D0079BDB0710D413
+:10BDD0003800059900F030FD0023089A029813708E
+:10BDE000249B01301860269B002B00D1A6E41A602A
+:10BDF000A4E4029E089B0893013B1A78392A06D1D5
+:10BE0000069A9A42F7D13022069901360A701A78BA
+:10BE100001321A7084E70022AA4B01F03FFD002294
+:10BE2000002304000D00FEF7B5F900289BD0CFE7F2
+:10BE30000F9D0E9E0A9C002D12D0229A012A66DCCC
+:10BE4000189A002A5DD0A04A9B180A9A0121D2189C
+:10BE50000A920D9A3800D3180D9300F09DFD05004D
+:10BE6000002C0EDD0D9B002B0BDD0D9A2300944260
+:10BE700000DD13000A9AE41AD21A0A920D9AD31A14
+:10BE80000D930E9B002B1FD00F9B002B54D0002E28
+:10BE900011DD29003200380000F044FE059A01004F
+:10BEA0000500380000F08EFD05991490380000F070
+:10BEB000C3FC149B05930E9B9A1BB34204D038001D
+:10BEC000059900F02FFE05900121380000F064FD77
+:10BED000159B0600002B31DD1A000100380000F030
+:10BEE00021FE229B0600012B2DDD00230E933369DA
+:10BEF00003339B00F318586800F006FD2023181A3E
+:10BF000039E036231A9A0E9E0A9C9B1A9DE7079BDE
+:10BF10005E1E0E9BB34207DB9E1B079B0A9C002BF9
+:10BF200093DAE41A002390E70E9B159AF31AD318BC
+:10BF30000E9615930026F0E70E9AC0E700230E93A5
+:10BF4000229B012B13DC00230E93089B002B0ED1A8
+:10BF5000099B1B030BD15D4B099A134207D00A9B27
+:10BF600001330A930D9B01330D9301230E93159B0F
+:10BF70000120002BBBD10D9B1F221818030013407A
+:10BF8000104246D00132D21A042A3FDD1C22D31AB5
+:10BF90000A9AE418D2180A920D9AD3180D930A9BA4
+:10BFA000002B05DD1A003800059900F017FE0590FA
+:10BFB0000D9B002B05DD31001A00380000F00EFE4D
+:10BFC0000600169B002B26D03100059800F074FE69
+:10BFD000002820DA029B0A22013B0293380000234A
+:10BFE000059900F04DFC0F9B0590002B00D166E1F8
+:10BFF000002329000A22380000F042FC0C9B0500B7
+:10C00000002B47DC229B022B0DDC43E0042AC6D028
+:10C0100013001C33BCE7079B002B35DC229B022B53
+:10C0200032DD079B0C930C9B002B0CD131000522B9
+:10C03000380000F025FC06000100059800F03CFEE9
+:10C04000002800DDA5E5239BDB430293069B0893B4
+:10C0500000243100380000F0EFFB002D00D1B7E6DE
+:10C06000002C05D0AC4203D02100380000F0E4FBE6
+:10C070002900380000F0E0FBAAE600263500E2E7E0
+:10C080000296149E350084E50F9B002B00D1CEE074
+:10C09000079B0C93002C05DD29002200380000F0DE
+:10C0A0009DFD05000E9B2800002B22D038006968FA
+:10C0B00000F07EFB041E0FD10200054B0549FFF77F
+:10C0C00006FBC04600002440330400000000F07F5F
+:10C0D000BCF40010EA02000029002B690C319A1C04
+:10C0E00092000C30FEF774FA01222100380000F0B3
+:10C0F00075FD069B0C9A0A93013B9B1801222C00AC
+:10C1000005001493089B13400F9331000598FFF727
+:10C110003EFA0300210030330D900598079300F09C
+:10C12000CBFD2A000E903100380000F0E1FDC3681D
+:10C130000890109301230C93109B002B04D1010055
+:10C14000059800F0B9FD0C903800089900F074FBD8
+:10C150000A9B0C9A01330893229B13430F9A1343B3
+:10C160000CD1079B392B26D00E9B002B02DD0D9B9B
+:10C17000313307930A9B079A1A706AE70E9B002BCC
+:10C1800004DB229A13430F9A13431FD10C9B002BFD
+:10C19000F0DD05990122380000F020FD3100059006
+:10C1A00000F08AFD002803DCE4D1079BDB07E1D522
+:10C1B000079B392BDBD139230A9A1370089B08930C
+:10C1C000013B1A78392A68D00132D5E70C9B002B45
+:10C1D00007DD079B392BEED0079B0A9A01331370BA
+:10C1E00037E70A9B079A1A70149B0A9A93423ED02B
+:10C1F00000230A220599380000F042FB0023059035
+:10C200000A2221003800AC4206D100F039FB0400BC
+:10C210000500089B0A9378E700F032FB2900040030
+:10C2200000230A22380000F02BFB0500F1E7079BF2
+:10C230000C93002431000598FFF7A9F9069B3030D4
+:10C2400018550C9B01340790A34207DD00230A22F6
+:10C250003800059900F014FB0590EBE70C9B0120DA
+:10C26000002B00DD18000024069B1B18089305997D
+:10C270000122380000F0B2FC3100059000F01CFDF6
+:10C2800000289BDC02D1079BDB0797D4089B08930F
+:10C29000013B1A78302AFAD0DBE6069A9A428ED110
+:10C2A000029B01330293312399E7094B269A0693A7
+:10C2B000084B002A01D0FFF73FFAFFF73FFA0C9B2B
+:10C2C000002BB6DC229B022B00DDACE6B1E7C046BA
+:10C2D0003AF4001042F40010F7B58B8905000C0009
+:10C2E0001A075FD44A68002A04DC0A6C002A01DCC1
+:10C2F0000020FEBDE76A002FFAD0002280212E68C0
+:10C300002A601A0049010A400B4234D0606DA389AB
+:10C310005B0706D56368C01A636B002B01D0236CE2
+:10C32000C01A0200216A00232800E76AB847A189E1
+:10C33000431C06D12B681D2B31D82C4ADA40D30779
+:10C340002DD50023636023692360CB0405D5431CEE
+:10C3500002D12B68002B00D16065616B2E60002933
+:10C36000C6D023004433994202D02800FEF76EF96C
+:10C3700000206063BDE701232800216AB847431C01
+:10C38000C5D12B68002BC2D01D2B01D0162B01D19B
+:10C390002E60ADE74023A2891343A381A9E7402380
+:10C3A0000B43FAE70F69002FA2D00A680F60D21B77
+:10C3B000019200229B0700D14A69A260019B002BD9
+:10C3C00000DC95E73A002800019B216AA66AB04785
+:10C3D000002806DC40230120A28940421343A381A8
+:10C3E00087E7019B3F181B1A0193E7E701004020F4
+:10C3F0000B6970B505000C00002B02D10025280048
+:10C4000070BD002804D08369002B01D100F092F8A0
+:10C41000144B9C421BD16C680C22A35E002BEDD008
+:10C42000626ED20704D49B0502D4A06DFEF7B6F865
+:10C4300028002100FFF750FF636E0500DB07DED404
+:10C44000A3899B05DBD4A06DFEF7A9F8D7E7064BBF
+:10C450009C4201D1AC68DFE7044B9C42DCD1EC6824
+:10C46000DAE7C046F0F4001010F50010D0F4001028
+:10C47000002310B50400036043608360818143663C
+:10C480001900C28103614361836108225C30FEF7B9
+:10C49000A8F8054B24626362044BA362044BE36279
+:10C4A000044B236310BDC0467DCF0010A5CF001004
+:10C4B000DDCF001009D0001010B5024900F0BAF825
+:10C4C00010BDC0467DD0001070B568254A1E55438A
+:10C4D0000E0029007431FEF725F9041E08D0002152
+:10C4E0002A00016046600C30A0606832FEF779F8DF
+:10C4F000200070BD10B50248FEF750F810BDC046D0
+:10C500006960010810B50248FEF749F810BDC04641
+:10C510006960010810B50248FEF740F810BDC0463A
+:10C520006A60010810B50248FEF739F810BDC04630
+:10C530006A60010813B50400FFF7ECFFA369002B44
+:10C5400002D0FFF7EFFF13BDA364E3642365134B31
+:10C55000134A1B68A2620193A34201D10123A36184
+:10C56000200000F01FF86060200000F01BF8A060C1
+:10C57000200000F017F800220421E0606068FFF757
+:10C5800077FF01220921A068FFF772FF0222122122
+:10C59000E068FFF76DFF0123A361D2E7F0F200101E
+:10C5A000B9C40010F8B50700FFF7A4FF1F4B1868C7
+:10C5B0008369002B01D1FFF7BDFF3E004836B46808
+:10C5C0007368013B04D53368002B22D03668F6E748
+:10C5D0000C22A55E002D1AD12000154B5830E360C7
+:10C5E0006566FDF7D9FFFFF78DFF200008222900BF
+:10C5F0002560A560656025616561A5615C30FDF71A
+:10C60000F0FF6563A563A564E5642000F8BD6834A8
+:10C61000D7E704213800FFF757FF041E3060D5D15B
+:10C62000FFF770FF0C233B60EFE7C046F0F200100D
+:10C630000100FFFFF7B50400060000270191483410
+:10C640006368A5680093009B013B009304D52468B0
+:10C65000002CF5D13800FEBDAB89012B08D90E2284
+:10C66000AB5E013304D029003000019B984707439B
+:10C670006835E8E7004870474003000870B50E00D1
+:10C680001D000E23C95E140096B0002908DA0C22A2
+:10C69000B35E00222A601B0611D48023DB000FE06A
+:10C6A0006A4600F05FFD0028F1DBF02301991B02D0
+:10C6B0001940054BC9184B4259412960EDE7402309
+:10C6C0000020236016B070BD00E0FFFFF7B5022622
+:10C6D0008B8905000C00334206D0230047332360CA
+:10C6E000236101236361F7BD6A4601ABFFF7C6FF13
+:10C6F000009907002800FEF715F8002808D10C2241
+:10C70000A35E9A05EFD4032293431E43A681E4E778
+:10C710000F4BAB628023A28920601343A381009B4F
+:10C7200020616361019B002B0DD028000E23E15E88
+:10C7300000F02AFD002806D00322A38993431A00A3
+:10C7400001231343A381A0890743A781CBE7C046F8
+:10C75000B9C4001082B0002900D101A9101E06D072
+:10C76000002B06D013780B601078431E984102B05E
+:10C77000704702204042FAE7C9B28218904201D1C4
+:10C780000020704703788B42FBD00130F6E70000B1
+:10C7900010B50248FDF702FF10BDC04668600108F1
+:10C7A00010B50248FDF7FBFE10BDC04668600108E9
+:10C7B00070B5456A06000C00002D0ED11020FDF763
+:10C7C000EFFE021E706204D16621194B1948FDF775
+:10C7D00045FE456085600560C560756AEB68002BA5
+:10C7E00013D0736AA200DB689B181868002818D160
+:10C7F00001210D00A5406A1D30009200FDF7F9FEF1
+:10C8000000280CD0446085600DE021220421300016
+:10C81000FDF7EFFE736AE860DB68002BE1D10020D2
+:10C8200070BD02681A6000230361C360F8E7C04668
+:10C8300047F400103AF5001070B5466A05000C0088
+:10C84000002E0ED11020FDF7ABFE021E686204D14F
+:10C850008A21094B0948FDF701FE466086600660A3
+:10C86000C660002C07D06B6A6268DB6892009B1878
+:10C870001A6822601C6070BD47F400103AF5001081
+:10C88000F7B50E0001900C001D0000200F69143652
+:10C890003368013099B251431B0C534349190D0CB5
+:10C8A0005B191D0C89B21B045B1808C68742EFDCBC
+:10C8B000002D22D0A368BB4219DC63680198591C83
+:10C8C000FFF776FF061E05D10200B5210C4B0D487F
+:10C8D000FDF7C4FD210023690C319A1C92000C3035
+:10C8E000FDF776FE21000198FFF7A6FF34003B1DFF
+:10C8F0009B00E3185D607B1C23612000FEBDC046E9
+:10C90000BCF400103AF500100300020C0020824233
+:10C9100001D11B0410301A0E01D108301B021A0F6E
+:10C9200001D104301B019A0F01D102309B00002B72
+:10C9300003DB01305B0000D4202070470368020055
+:10C940000721180008400B420DD0063900200B4289
+:10C9500005D10230034203D0CB400800136070477A
+:10C960009B081360FBE799B2002901D110201B0C32
+:10C97000D9B2002901D108301B0A190701D10430AE
+:10C980001B09990701D102309B08D907E9D401306E
+:10C990005B08E6D12020E2E710B50C000121FFF78B
+:10C9A00007FF002806D1A0210200044B04484900DB
+:10C9B000FDF754FD01234461036110BDBCF4001078
+:10C9C0003AF50010F0B50B69140012690D0089B03A
+:10C9D000934201DA25000C002F6926696968BB19AA
+:10C9E0000293AB68BA19934200DA0131FFF7E0FE17
+:10C9F0000190002806D15E210200484B4848FF31D3
+:10CA0000FDF72CFD019B002214339C46BB199B00B3
+:10CA100063440393634603998B422CD32B0022007B
+:10CA20001433BF0014320693B600DB190493931934
+:10CA30000793042305932B00049915330092994220
+:10CA400005D34B1B153B9B0801339B000593079BAC
+:10CA5000009A9A4211D3029B002B06DD039B043BF4
+:10CA600003931B680093002B53D0019B029A18007C
+:10CA70001A6109B0F0BD04C3CDE7009B1B6898B2F2
+:10CA800000281BD067460024069E02CE3A688BB26F
+:10CA9000434392B29B181B190C0C44433A68110C87
+:10CAA00061181C0C09190C0C9BB209040B4308C734
+:10CAB000049BB342E9D86346059A9C50009B1B68CF
+:10CAC0001E0C20D063462C00604600271B681434DF
+:10CAD00022689BB291B271430268120C8918CF1977
+:10CAE00039040B43036002CC4368090C71439BB2C9
+:10CAF0003F0CCB18049ADB191F0C0430A242E7D874
+:10CB0000624605995350009B0433009304239C44D0
+:10CB10009DE7029B013B02939DE7C046BCF40010D9
+:10CB20003AF50010F7B50323150007000E001A4070
+:10CB30001D4208D02549013A920052580023310085
+:10CB4000FFF79EFE0600AD103DD07C6A002C0FD191
+:10CB50001020FDF725FD021E786205D1D7211C4B60
+:10CB60001C484900FDF77AFC446084600460C4609E
+:10CB70007B6A9C680193002C08D138001649FFF7A6
+:10CB80000BFF019B040098600023036001231D42FA
+:10CB90000AD0310022003800FFF714FF3100019065
+:10CBA0003800FFF749FE019E6D100CD02068002868
+:10CBB00007D1220021003800FFF704FF0023206086
+:10CBC00003600400E2E73000FEBDC04690F60010AE
+:10CBD00047F400103AF5001071020000F0B50C00A7
+:10CBE00017002369551187B0EB18029301330193A5
+:10CBF0004968A3680490019A934210DB0498FFF7F8
+:10CC0000D7FD0023020006001900143298420CD10F
+:10CC1000DA210200264B2748FF31FDF71FFC0131C6
+:10CC20005B00E8E7980011500133AB42FADBEB43BD
+:10CC3000DB171D401F2123003800AD005519226964
+:10CC400014339200084084469A180F422AD00131CA
+:10CC5000091A05910021039567461868B8400143F9
+:10CC6000039802C002CB03900598C1409A42F3D8C2
+:10CC7000200015300423824204D3131B153B9B086C
+:10CC800001339B00E950002902D0029B023301933B
+:10CC9000019B0498013B21003361FFF7CDFD30007B
+:10CCA00007B0F0BD02CB02C59A42FBD8F0E7C04600
+:10CCB000BCF400103AF5001002690B6930B50400AD
+:10CCC000D01A9A420DD19B0014341431E218C918BD
+:10CCD000043A043915680B689D4203D001209D4237
+:10CCE00003D330BD9442F3D3FBE74042F9E70000A1
+:10CCF000F0B50E0007001100300087B01400FFF7F8
+:10CD0000DBFF051E10D101003800FFF751FD021EA8
+:10CD100004D1404B40494148FDF7A0FB0123456148
+:10CD20000361100007B0F0BD01230193002804DB6C
+:10CD3000230034001E000023019338006168FFF7D0
+:10CD400037FD021E03D19021324B8900E3E7019B9E
+:10CD50000027C360206914340194019B84001B19CF
+:10CD60003400029333691434990063180393130059
+:10CD700014339C460593019B0493049B02CC20CB67
+:10CD80000493ABB2DF198BB2FB1A090C2D0C6D1A90
+:10CD900019146D1861462F149BB22D042B4308C142
+:10CDA000039B8C46A342E8D83100039C1531042331
+:10CDB0008C4204D3A31B153B9B0801339B000199B4
+:10CDC000CC1805992600CB189C4602998E4210D3A8
+:10CDD000029EE11E00258E4204D3310003310C1B5C
+:10CDE000A408A5005B19043B196800290FD0106145
+:10CDF00097E702CE8DB2ED190F0C291479180F1494
+:10CE0000ADB209040D43614620C18C46DDE701380F
+:10CE1000E9E7C046BCF40010320200003AF5001009
+:10CE2000F7B5012114001E00089FFFF7C1FC051E85
+:10CE300005D10200264B27492748FDF70FFB330396
+:10CE400076001B0B760D24D10193002C27D0684669
+:10CE50000094FFF773FD009C00281ED0019B202149
+:10CE60001A00091A8A40C34022436A610193019C57
+:10CE7000AC61631E9C4101342C61002E18D0174B0D
+:10CE8000F61835233618181A099B3E6018602800DA
+:10CE9000FEBD802252031343D6E76C61E7E701A889
+:10CEA000FFF74CFD0124019B2C616B612030E4E70E
+:10CEB0000B4BC0180B4B3860E3189B00EB185869FC
+:10CEC000FFF722FD6401099B241A1C60DFE7C046BE
+:10CED000BCF400100A0300003AF50010CDFBFFFF80
+:10CEE000CEFBFFFFFFFFFF3F70B504000D001F29C1
+:10CEF00004D9162303600120404270BD436C002B0F
+:10CF000004D08A009B181A68002A08D1200000F07B
+:10CF100031F82A000100200000F01AF8EDE70020A7
+:10CF2000012AEAD0511C03D1162301302360E4E723
+:10CF3000002428001C6090472000DEE710B5034B5A
+:10CF400001001868FFF7D0FF10BDC046EC010008D3
+:10CF5000002370B5064D0400080011002B6000F09E
+:10CF60006DFF431C03D12B68002B00D0236070BDE4
+:10CF70007460010810B500F051FF10BD70B50C00D1
+:10CF80000E25495F00F026F9002803DB636D1B18AE
+:10CF9000636570BDA389024A1340A381F9E7C046C7
+:10CFA000FFEFFFFFF8B51F008B8905000C0016008E
+:10CFB000DB0505D50E23C95E0022022300F0F6F83A
+:10CFC000A389054A28001340A38132000E23E15EA5
+:10CFD0003B0000F02DF8F8BDFFEFFFFF70B50C002F
+:10CFE0000E25495F00F0E2F8A389421C03D1054AEF
+:10CFF0001340A38170BD802252011343A381606559
+:10D00000F8E7C046FFEFFFFF10B50E23C95E00F042
+:10D0100023F810BD0300081E05D0FF2A04D98A2278
+:10D0200001201A604042704701200A70FBE70000AF
+:10D0300070B50400080011001A000023054D2B6094
+:10D04000F6F7B6FA431C03D12B68002B00D02360FF
+:10D0500070BDC04674600108002370B5064D040021
+:10D0600008002B6000F0CAFE431C03D12B68002B84
+:10D0700000D0236070BDC0467460010870B5050023
+:10D080000C1E02D10026300070BD002804D0836938
+:10D09000002B01D1FFF74EFA2F4B9C4217D16C6841
+:10D0A000636EDB0705D4A3899B0502D4A06DFDF751
+:10D0B00075FA0C22A35E002B13D1626E01331600A9
+:10D0C0001E401A42DED1A06DFDF769FADBE7234B63
+:10D0D0009C4201D1AC68E3E7214B9C42E0D1EC6873
+:10D0E000DEE721002800FFF7F7F8236B0600002B8E
+:10D0F00006D02800216A9847002801DA01267642E6
+:10D10000A3891B0603D528002169FDF79FFA616BEF
+:10D11000002908D023004433994202D02800FDF7AB
+:10D1200095FA00236363A16C002904D02800FDF761
+:10D130008DFA0023A364FFF7DDF90023A381636E5A
+:10D14000DB0702D4A06DFDF72AFAA06DFDF725FAE2
+:10D15000FFF7D8F997E7C046F0F4001010F500107B
+:10D16000D0F40010002370B5064D04000800110033
+:10D170002B6000F04BFE431C03D12B68002B00D02A
+:10D18000236070BD74600108002370B5064D040073
+:10D1900008002B6000F04AFE431C03D12B68002BD3
+:10D1A00000D0236070BDC0467460010870B50400F3
+:10D1B000080011001A000023054D2B6000F046FE08
+:10D1C000431C03D12B68002B00D0236070BDC046E8
+:10D1D0007460010870B50400080011001A000023F3
+:10D1E000054D2B60F6F704FA431C03D12B68002B86
+:10D1F00000D0236070BDC0467460010802B471465F
+:10D2000049084900095C49008E4402BC7047C04689
+:10D2100003B47146490840004900095E49008E4444
+:10D2200003BC7047F0B54F464646D6460D00040095
+:10D23000C0B51F0011002803620F400A10437A0096
+:10D24000520DE3003C039146640AFA0F4F0F6E0043
+:10D2500027439246B846760DED0FC900954200D19E
+:10D2600099E04C46341BA446002C00DC7CE04A4686
+:10D27000002A00D1B8E0C54A964200D11CE18022C4
+:10D280003C0012041443A0466246382A00DD61E1E6
+:10D290001F2A00DDCCE164462022121B4446944044
+:10D2A0000F00A14664469140E7404C464A1E91411A
+:10D2B0003C43424621436446E240801A5C1AA34242
+:10D2C0009B415F42C71B3B0200D4D0E07F027F0A34
+:10D2D000002F00D1FFE03800FCF78AFF0100083979
+:10D2E000202322005B1A8F40DA408C401743B14262
+:10D2F00000DAFFE0891B4B1C1F2B00DDA8E0202279
+:10D300003900D21A200094409140D840621E9441C6
+:10D31000DF40002601430C43630709D00F2323405D
+:10D32000042B05D0231DA342A44164423F191C00D5
+:10D330003B0200D49EE0954B01369E4200D1B7E0FF
+:10D34000934AE40817407B0771057F0223433F0B94
+:10D350004A0D12053A43ED072A4318001100E0BCBC
+:10D36000BA46B146A846F0BD002C4BD04C46A41B93
+:10D37000A446002E00D023E104001C4300D1AFE1FD
+:10D380006246541E012A00D115E2804DAC4500D101
+:10D39000C8E1A4461BE14A46B21A9446002A00DCC2
+:10D3A000ACE04A46002A43D0784A964200D1AFE129
+:10D3B00080223C0012041443A0466246382A67DCEF
+:10D3C0001F2A00DC5FE14746203AD7406246202A08
+:10D3D00005D064464022121B4446944021434A1E15
+:10D3E00091410C003C4357E03A000A4300D105E16B
+:10D3F0002200013A012C00D182E1644CA4455BD0AB
+:10D40000944641E7634C771C274200D0C4E00400F7
+:10D410001C43002E00D069E1002C00D1BFE144463E
+:10D420000C4300D0D0E14207DB081343C00829E0D9
+:10D430003A000A4300D170E162466446013A012C89
+:10D4400000D1E0E0514CA44500D161E19446B4E73D
+:10D450003A001F39CA401100202B03D04022D31AB2
+:10D460009F403C43631E9C41002700260C436307FA
+:10D4700000D053E7B446E4087B072343F808434A47
+:10D4800094451DD06246070352053F0B520D60E7DD
+:10D4900044460C43621E9441E4189C429B415F4207
+:10D4A0003F183B02E3D5394B01369E4200D0B5E030
+:10D4B0003200002700234CE74207DB081343C00873
+:10D4C0001A00024300D1E1E180273F0307433F03F5
+:10D4D0002E4A3F0B3DE72000FCF78AFE0100183181
+:10D4E0001F2900DCFCE60838844027000024B142F4
+:10D4F00000DBFFE6264A761A17400DE7002A2FD0F8
+:10D500004A46921B9446002E00D1ADE01F4A914539
+:10D5100000D10FE18022120410436246382A00DD58
+:10D520000FE11F2A00DD80E1644620221E00121B4D
+:10D530006746040093409440FE405A1E9341F840D1
+:10D5400034431C43804464188C42BF417F424E46A2
+:10D550004744A6E742460A4311004A1E9141ADE600
+:10D560000C4C721C224200D0A1E002001A43002E93
+:10D5700000D0FAE0002A00D145E13A000A4300D089
+:10D5800046E14207DB081343C0087BE7FF070000C2
+:10D59000FFFF7FFFFE07000047465C1AC21BA34245
+:10D5A000BF417F42B94617004A46BF1A3A0200D52A
+:10D5B0008DE023003B4300D08AE60020002561E790
+:10D5C000B44CA14500D1ADE080242404204364463E
+:10D5D000382C3DDC62461F2C00DDB7E020251E0004
+:10D5E0002D1B0400AB40AC40D640D04042465D1EEF
+:10D5F000AB413443121A904623432CE04207DB0828
+:10D600001343C0083BE75C189C429B4140445B428B
+:10D61000C71801263B0200D429E702269E4A630868
+:10D620001740012214401C43FB071C437F0873E68C
+:10D630004446203AD4406246202A05D0674640221C
+:10D64000D21B4746974039434A1E9141214335E654
+:10D650000343581E8341CC1AA142BF4143467F4237
+:10D6600055464E46DF1B2EE602001A4300D1BDE0B0
+:10D6700062466446013A012C00D1E5E0854CA445A0
+:10D6800058D0944649E764462022121B44469440F1
+:10D690000F00A14664469140E7404C464A1E914126
+:10D6A0003C4342460C436146CA408018F4E6794C3C
+:10D6B000A24200D1FDE6591899429B4140445F4285
+:10D6C000C719FC07490816000C437F08CFE6CC1A9F
+:10D6D000A142BF4143467F42181A5546C71BF7E592
+:10D6E000C9087B0755460B43F808C8E6002C00D054
+:10D6F00081E043460B4315D1802000250003E3E67B
+:10D700005C1AA3429B41C71B5B420126FF1ADAE564
+:10D710004207DB081343C008D2E64207DB08134385
+:10D72000C008ACE643464246C9085B0755460B4372
+:10D73000D008C5E6434642465B07C9080B43D008FC
+:10D74000BEE603431C00631E9C41FCE60200203C35
+:10D75000E24014006246202A03D04025AD1AA840BA
+:10D760000343581E8341234375E7002AE2D03A0061
+:10D770000A43CDD04207DB0813438022C0081203BE
+:10D78000104206D0FC08144203D12000CB087A07CF
+:10D7900013435A0FDB005207DB08134390E643465E
+:10D7A0000B4300D109E743464246C9085B0755468B
+:10D7B0000B43D00866E6CC1AA14289413F1A494280
+:10D7C000554601267F1A7EE542465C1A871AA34217
+:10D7D00092415242BF1A3A023DD5CC1AA142894128
+:10D7E000434649421F1A55467F1A95E57B07C908EB
+:10D7F0000B43F80843E64446DB080C4330D14207AC
+:10D800001343C0085CE67B07C9080B43F80839E6F8
+:10D810005C189C429B4140445B42C7183B0200D4C9
+:10D8200025E61D4B01261F4021E60400203AD44086
+:10D830006246202A04D040226646921B9040034351
+:10D840005A1E93411C437EE65C188C428941404439
+:10D8500049424718DDE623003B4300D1ADE606E62A
+:10D86000440723438024C0082403204208D04246B2
+:10D87000D608264204D155463000CB0851070B4349
+:10D880005A0FDB00DB085207134319E60023014A55
+:10D890001F005EE5FF070000FFFF7FFFF0B5574662
+:10D8A0004E464546DE46E0B598460C034B00060062
+:10D8B000924687B0240B5B0DCF0F002B00D15CE1AB
+:10D8C000D94A934200D175E1420FE400144380220B
+:10D8D00012041443D54AC5009446634400930023C0
+:10D8E00099469B46434642461E03D20F5B00504674
+:10D8F0009046360B5B0D00D120E1CB4A934200D11C
+:10D9000062E1CA49420F8C4600996344F6008C4696
+:10D91000164380229C44120463461643C200002032
+:10D9200000930099434601318C4649467B40019360
+:10D930000F2926D8BE4B890059588F46434601937C
+:10D940003400150083465B46022B16D0032B00D112
+:10D9500003E2012B00D0CDE0002200240025019B32
+:10D9600012052243DB071A432800110007B0F0BC60
+:10D97000BB46B246A946A046F0BD00240025AA4AEF
+:10D98000EDE7280C2D042D0C2B00110C1204120CA9
+:10D990005343984613002F00434399464F434F4447
+:10D9A000BB4647460B003F0CBA464343DA4402935A
+:10D9B000D14504D980277F02B9464B440293534690
+:10D9C0001B0C9B4653461F0443461B041B0C9846E6
+:10D9D0003B0043440493330C3604360C9846330022
+:10D9E00043439946434643432F009A464346774371
+:10D9F0005D43380C4D444519A94503D980235B028A
+:10DA00009946CA443F04280C3F0C2D04ED19270CFD
+:10DA10002404240C0300200050437A4391463A002A
+:10DA200053440593030C9A464A4361434944514485
+:10DA3000AB44894503D980235B0299464A440004DC
+:10DA40000B0C000C0904091820009946434670434A
+:10DA50005C437E435F43030C9846A41944444A4404
+:10DA60000397A64204D980235B0298464744039754
+:10DA70002304029E9A46059B5E449846AE42AD4101
+:10DA800076188E4289410004000C504440446D4297
+:10DA90004719B846934649428946C344D9449842F7
+:10DAA0008041A845AD4193459241894589416D42E8
+:10DAB00040422843240C524249420A43039B001926
+:10DAC0008018C7184B46DC0D049B75021D436A1E67
+:10DAD00095414B46F60D7F0235435A023C431543B0
+:10DAE000FB0100D41CE101216A080D401543E20747
+:10DAF000154364084F496144002900DCB0E06B071E
+:10DB000009D00F222A40042A05D02A1DAA42AD417D
+:10DB10006D4264191500E30104D58021464AC9000D
+:10DB200014406144454A914200DD26E76207ED0852
+:10DB3000640249051543240B4A0D10E7524632434F
+:10DB400000D17FE0002E00D1DCE03000FCF750FB7C
+:10DB500002000B3A1D2301009B1A52460839DA4095
+:10DB60008E40164352468A40009B3549181A0300DE
+:10DB70008C46634400200093D3E6250005434AD039
+:10DB8000002C00D1B0E02000FCF732FB01000200C5
+:10DB90000B391D2310005B1A310035000838844012
+:10DBA000D94085400C432648831A009300239946A8
+:10DBB0009B4697E60500254326D1082200930223C1
+:10DBC000002491469B468DE65246009B324310D17D
+:10DBD000154900268C4663444946009302231943A5
+:10DBE000894602209DE65B460197022B00D0ADE6F8
+:10DBF000C3E60D4A0320944663444A460093032338
+:10DC00001A43914652468CE60C22009303230500EA
+:10DC100091469B4666E60423994600230093013310
+:10DC200000249B465EE6C046FF07000001FCFFFFA4
+:10DC30009CF60010FF030000FFFFFFFEFE07000040
+:10DC40000DFCFFFF494601231943894600260120A8
+:10DC500067E6002380240025434A019324037EE6DF
+:10DC60000120401A382800DD76E61F285BDD1F22E0
+:10DC700023005242511ACB401900202803D03B4ABE
+:10DC80006244944025436A1E95412A000A430721B5
+:10DC90000D000024154011425BD00F2100241140DB
+:10DCA000042953D0111D914292415242A4180A00F6
+:10DCB00023024BD501220024002550E680231B03BC
+:10DCC0001C4209D01E4207D133431C0343461500B2
+:10DCD000240B254A019342E68022120314432403B5
+:10DCE000214A240B01973AE6FCF782FA0100020070
+:10DCF000153120321C2900DC4BE7340008380025A0
+:10DD0000844050E7FCF774FA03001A001532203003
+:10DD10001C2A00DC1EE75646083B00229E4023E7F3
+:10DD2000009B9C46E6E61249220061442E008D408D
+:10DD30008A40C640691E8D4132432A43C44053077E
+:10DD4000B6D00F2111400429ACD1B1E765076402B8
+:10DD5000240BD2081543002201E68022120314434B
+:10DD60002403014A240BFAE5FF0700003E040000EB
+:10DD70001E04000070B505000C481C0316005B0073
+:10DD80000A034900120B490D240B5B0D814208D098
+:10DD9000064A0020934203D120003043431E98419D
+:10DDA00070BD01202A43FBD1F2E7C046FF07000007
+:10DDB00010B5041E10D0FCF71BFA0F4B1B1A0A28D3
+:10DDC00011DC0B222100121AD14015300A035B0529
+:10DDD0008440120B5B0D01E0002300221B0513435E
+:10DDE0002000190010BD22000B3882405B05120391
+:10DDF0000024120B5B0DF1E71E04000058220120E5
+:10DE0000014B40421A60704774600108582201209B
+:10DE1000014B40421A60704774600108582201208B
+:10DE2000014B40421A607047746001085822024B4F
+:10DE300000201A607047C046746001085822012013
+:10DE4000014B40421A60704774600108582201205B
+:10DE5000014B40421A60704774600108044A030095
+:10DE60001068002802D0C318136070470148FAE711
+:10DE70007860010880600108FEE7C046F8B5C0463A
+:10DE8000F8BC08BC9E467047F8B5C046F8BC08BC54
+:10DE90009E4670470000000001B40248844601BC61
+:10DEA000604700BF0906000801B40248844601BC6F
+:10DEB000604700BFA5040008000000000800000043
+:10DEC0000800000000020000000000000000000048
+:10DED0000000000000000000000000000000000042
+:10DEE000000000000B0000003F00000000000000E8
+:10DEF0003F00000000000000010000000B000000D7
+:10DF00001D000000000000000000000000000000F4
+:10DF10000000000001000000000000000000000000
+:10DF200000000000000000000000000001000000F0
+:10DF30000A0000001D0000000000000000000000BA
+:10DF400000000000000000000100000000000000D0
+:10DF500000000000000000000000000000000000C1
+:10DF600001000000060000001D000000000000008D
+:10DF700000000000000000000000000001000000A0
+:10DF80000000000000000000000000000000000091
+:10DF90000000000001000000080000001200000066
+:10DFA0000000000000000000000000000000000071
+:10DFB0000100000000000000000000000000000060
+:10DFC000000000000000000001000000060000004A
+:10DFD000120000000000000000000000000000002F
+:10DFE0000000000001000000000000000000000030
+:10DFF0000000000000000000000000000100000020
+:10E000000000000000000000000000000000000010
+:10E0100000000000000000000100000000000000FF
+:10E0200000000000000000000000000000000000F0
+:10E0300001000000000000000000000000000000DF
+:10E0400000000000000000000000000001000000CF
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000010000000300000000000000AC
+:10E0700000000018000000040000000058E100103B
+:10E080006000000000000000FFFFFFFF0000000034
+:10E090000000000000000000DC00000000000000A4
+:10E0A000FFFFFFFF00000000000000000000000074
+:10E0B0003400000000000000FFFFFFFF020000002E
+:10E0C0000000000002000000EC0000000002000060
+:10E0D0000100000002000000040000000200000037
+:10E0E0003500000000000000FFFFFFFF00000000FF
+:10E0F000000000000000000005000000000000001B
+:10E10000FFFFFFFF00000000000000000000000013
+:10E110000400000000000000FFFFFFFF00000000FF
+:10E1200000000000000000000600000000000000E9
+:10E13000FFFFFFFF000000000000000000000000E3
+:10E140000100000000000000FFFFFFFF00000000D2
+:10E1500000000000000000000400000000000004B7
+:10E16000C8E0001028E1001010E1001098E0001055
+:10E170000000040080E00010B0E000100002000089
+:10E18000F8E00010E0E0001040E1001000000000A6
+:10E190000100000002000000280A0000E00407005F
+:10E1A0001405000000000000000000000100000055
+:10E1B000BCE10010020000001400000064E0001048
+:10E1C000F4010000140004010A000905080003001E
+:10E1D0006301000024010200000000005B494E467C
+:10E1E0005D205374617274696E6720557365722087
+:10E1F0004170706C69636174696F6E206F6E20434B
+:10E200004D342E20506C6561736520776169742EE2
+:10E210002E2E0A0D000000005B494E465D201B5B60
+:10E22000324A1B5B3B480A0D000000005B494E462A
+:10E230005D204D4355626F6F7420426F6F746C6F39
+:10E240006164657220537461727465640A0D000024
+:10E250005B494E465D2045787465726E616C204D59
+:10E26000656D6F727920696E697469616C697A6530
+:10E2700064207573696E6720534644500A0D000090
+:10E280005B4552525D2045787465726E616C204D1D
+:10E29000656D6F727920696E697469616C697A6104
+:10E2A00074696F6E207573696E6720534644502001
+:10E2B0004641494C45443A203078253032780A0DA1
+:10E2C000000000005B494E465D2055736572204199
+:10E2D00070706C69636174696F6E2076616C6964DB
+:10E2E00061746564207375636365737366756C6CC4
+:10E2F000790A0D005B494E465D204D4355626F6FB4
+:10E300007420426F6F746C6F6164657220666F7504
+:10E310006E64206E6F20626F6F7461626C6520693D
+:10E320006D6167650A0D0000030000000100000038
+:10E330000100000000000000050360000400000070
+:10E340000100000000000000010000000604600061
+:10E3500008000000F0080008A905001028696D6198
+:10E3600067655F6E756D29203C203078460000009F
+:10E370002E2E2F6D74625F7368617265642F6D63FA
+:10E3800075626F6F742F76312E372E302D63797052
+:10E39000726573732F626F6F742F626F6F74757411
+:10E3A000696C2F7372632F626F6F747574696C5F21
+:10E3B0006D6973632E63000028737761705F7479F1
+:10E3C000706529203C2030784600000062616400BE
+:10E3D000676F6F6400000000756E73657400000065
+:10E3E00074657374000000007065726D00000000B9
+:10E3F0004255473B2063616E2774206861707065E9
+:10E400006E0000007265766572740000626F6F7452
+:10E410005F737761705F747970655F6D756C746937
+:10E420003A205072696D61727920696D616765008B
+:10E430005B494E465D2025733A206D616769633DF7
+:10E4400025732C20737761705F747970653D307827
+:10E4500025782C20636F70795F646F6E653D30782E
+:10E4600025782C20696D6167655F6F6B3D3078257D
+:10E47000780A0D00626F6F745F737761705F7479F3
+:10E4800070655F6D756C74693A205365636F6E6477
+:10E4900061727920696D6167650000005B494E46D5
+:10E4A0005D205377617020747970653A2025730A76
+:10E4B0000D0000005B494E465D205377617020746B
+:10E4C0007970653A206E6F6E650A0D00626F6F7429
+:10E4D0005F77726974655F737761705F696E666F8D
+:10E4E0000000000077C295F360D2EF7F3552500FE5
+:10E4F0002CB679800401040304020401040104031E
+:10E500000103030401040000000000006FC75E1057
+:10E51000DE8EBD20B149E330BC1D7B41D3DA2551ED
+:10E520006293C6610D549871783BF68217FCA892ED
+:10E53000A6B54BA2C97215B2C4268DC3ABE1D3D325
+:10E540001AA830E3756F6EF37365636F6E64617262
+:10E55000790000007072696D617279005B455252FA
+:10E560005D20496D61676520696E207468652025AE
+:10E570007320736C6F74206973206E6F74207661E2
+:10E580006C6964210A0D00007263203D3D2030005B
+:10E590002E2E2F6D74625F7368617265642F6D63D8
+:10E5A00075626F6F742F76312E372E302D63797030
+:10E5B000726573732F626F6F742F626F6F747574EF
+:10E5C000696C2F7372632F6C6F616465722E6300C8
+:10E5D0005B4552525D2070616E6963210A0D000037
+:10E5E000300000005B57524E5D204661696C6564E7
+:10E5F0002072656164696E6720736563746F7273FE
+:10E600003B20424F4F545F4D41585F494D475F5348
+:10E610004543544F52533D2564202D20746F6F2085
+:10E62000736D616C6C3F0A0D000000005B57524E29
+:10E630005D204661696C65642072656164696E671E
+:10E6400020696D61676520686561646572733B2050
+:10E65000496D6167653D25750A0D00005B57524E97
+:10E660005D204661696C65642072656164696E67EE
+:10E6700020626F6F74207374617475733B20496DF1
+:10E680006167653D25750A0D000000005B4552522B
+:10E690005D2062616420696D616765206D616769F5
+:10E6A00063203078256C783B20496D6167653D2596
+:10E6B000750A0D00626F6F745F706572666F726DC0
+:10E6C0005F75706461746500626F6F745F7377610A
+:10E6D000705F696D61676500626F6F745F636F6D16
+:10E6E000706C6574655F7061727469616C5F73777B
+:10E6F00061700000626F6F745F7072657061726547
+:10E700005F696D6167655F666F725F757064617484
+:10E7100065000000636F6E746578745F626F6F747C
+:10E720005F676F002E2E2F6D74625F736861726574
+:10E73000642F6D6375626F6F742F76312E372E30B4
+:10E740002D637970726573732F626F6F742F626FB0
+:10E750006F747574696C2F7372632F737761705F58
+:10E760007374617475732E63000000005B45525230
+:10E770005D20446574656374656420696E636F6EC3
+:10E7800073697374656E7420737461747573210A90
+:10E790000D0000005B57524E5D2043616E6E6F743A
+:10E7A00020757067726164653A206E6F7420612015
+:10E7B000636F6D70617469626C6520616D6F756EF9
+:10E7C00074206F6620736563746F72730A0D0000A6
+:10E7D0005B57524E5D2043616E6E6F74207570679B
+:10E7E000726164653A206D6F726520736563746F42
+:10E7F0007273207468616E20616C6C6F7765640A57
+:10E800000D0000005B57524E5D2043616E6E6F74C9
+:10E8100020757067726164653A206E6F7420736151
+:10E820006D6520736563746F72206C61796F7574A8
+:10E830000A0D0000737761705F7374617475735FA4
+:10E84000736F757263653A205072696D61727920D9
+:10E85000696D6167650000005B494E465D20426F4F
+:10E860006F7420736F757263653A207072696D61A1
+:10E87000727920736C6F740A0D0000005B494E467C
+:10E880005D20426F6F7420736F757263653A206EFE
+:10E890006F6E650A0D00000066697875705F7265BD
+:10E8A000766572743A205365636F6E646172792085
+:10E8B000696D616765000000626F6F745F737761F7
+:10E8C000705F736563746F7273000000626F6F74C2
+:10E8D0005F6D6F76655F736563746F725F757000EF
+:10E8E000737761705F72756E0000000066697875FD
+:10E8F000705F7265766572740000000073776170F6
+:10E900005F7374617475735F736F75726365000014
+:10E91000737761705F726561645F7374617475733E
+:10E920005F627974657300005B494E465D204572F5
+:10E930006173696E6720747261696C65723B2066F1
+:10E94000615F69643D25640A0D0000002E2E2F6D65
+:10E9500074625F7368617265642F6D6375626F6F57
+:10E96000742F76312E372E302D6379707265737364
+:10E970002F626F6F742F626F6F747574696C2F7371
+:10E9800072632F737761705F7374617475735F6DF9
+:10E990006973632E63000000737761705F72656155
+:10E9A000645F737461747573000000007377617045
+:10E9B0005F7374617475735F696E69740000000041
+:10E9C000737761705F65726173655F747261696CA2
+:10E9D00065725F736563746F727300002E2E2F6D06
+:10E9E00074625F7368617265642F6D6375626F6FC7
+:10E9F000742F76312E372E302D63797072657373D4
+:10EA00002F626F6F742F626F6F747574696C2F73E0
+:10EA100072632F737761705F7374617475735F7065
+:10EA20006172742E63000000286F666673202B20CD
+:10EA30006C656E29203C3D20424F4F545F53574137
+:10EA4000505F5354415455535F445F53495A455F97
+:10EA500052415700696E69745F6F666673203E3D70
+:10EA600020300000737761705F7374617475735F39
+:10EA70007265747269657665000000007377617075
+:10EA80005F7374617475735F77726974655F7265C3
+:10EA9000636F726400000000737761705F7374616C
+:10EAA0007475735F7570646174650000737761706D
+:10EAB0005F7374617475735F726561645F726563BF
+:10EAC0006F726400AFBEADDE6F6666203C2066618B
+:10EAD0002D3E66615F6F6666000000002E2E2F6D72
+:10EAE00074625F7368617265642F6D6375626F6FC6
+:10EAF000742F76312E372E302D63797072657373D3
+:10EB00002F626F6F742F637970726573732F6379DF
+:10EB10005F666C6173685F70616C2F63795F666CB0
+:10EB20006173685F6D61702E630000006F66662020
+:10EB30002B206C656E203C2066612D3E66615F6F08
+:10EB4000666600005B4552525D20466C617368202A
+:10EB5000617265612072656164206572726F722CEA
+:10EB6000207263203D2025640A0D000021286C6579
+:10EB70006E20252043595F464C4153485F53495A04
+:10EB8000454F465F524F57290000000021287772F9
+:10EB90006974655F73746172745F61646472202567
+:10EBA0002043595F464C4153485F53495A454F46AD
+:10EBB0005F524F57290000006C656E203C3D206677
+:10EBC000612D3E66615F73697A6500006F6666203D
+:10EBD0003C2066612D3E66615F73697A65000000C6
+:10EBE0006F6666202B206C656E203C2066612D3E92
+:10EBF00066615F6F6666202B2066612D3E66615FF1
+:10EC000073697A65000000007263203D3D2043591E
+:10EC10005F464C4153485F4452565F53554343450A
+:10EC20005353000066616C73650000007365637484
+:10EC30006F72735F6E203C3D202A636E740000008B
+:10EC4000666C6173685F617265615F6765745F734D
+:10EC50006563746F72730000666C6173685F6172E4
+:10EC600065615F6572617365645F76616C00000069
+:10EC7000666C6173685F617265615F65726173651F
+:10EC800000000000666C6173685F617265615F77A8
+:10EC90007269746500000000666C6173685F617280
+:10ECA00065615F7265616400010000000E00000094
+:10ECB0001100000000000000000000000000000043
+:10ECC0000000000001000000000000000000000043
+:10ECD0000000000000000000000000000100000033
+:10ECE0000E00000011000000000000000000000005
+:10ECF0000000000000000000010000000000000013
+:10ED00000000000000000000000000000000000003
+:10ED1000010000000E0000001100000000000000D3
+:10ED200000000000000000000000000001000000E2
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000010000000E00000011000000A3
+:10ED500000000000000000000000000000000000B3
+:10ED600001000000000000000000000000000000A2
+:10ED7000000000000000000001000000060000008C
+:10ED80001100000000000000000000000000000072
+:10ED90000000000001000000000000000000000072
+:10EDA0000000000000000000000000000000000063
+:10EDB000010000000100000000000000010001004F
+:10EDC00000010001A10FB90BD107DC05E903EE0238
+:10EDD000F5017701FB00BC007E005E003F002F00C4
+:10EDE0002000180010000C000800060004000300BA
+:10EDF0000200020001000100000020400000244049
+:10EE000000000040000000000000234000003040EF
+:10EE10000000314000009F400000224000001040F0
+:10EE200000009D402020202020101010101D1D806B
+:10EE300017007500FF0306020600360410200000CC
+:10EE40007FC0000000040000000000000019324BE9
+:10EE5000647D0000000000804000080B10000000EE
+:10EE60000000FF012002001F00800004FF081018AE
+:10EE7000001000140018001C4044484C50000000D2
+:10EE8000081000000800000004000000041000004A
+:10EE90000012000004210000002100000016000004
+:10EEA00040114002C41300138013A01340138813B1
+:10EEB000A81320001C000000040000004000000017
+:10EEC0004400000048000000800000000001000035
+:10EED000100200008802000000040000100400007E
+:10EEE00020040000400400004804000080040000EA
+:10EEF0008404000090040000C0070000C407000064
+:10EF0000C8070000CC07000000400000041000000B
+:10EF1000401000004410000048100000C014000021
+:10EF20000011000018020000980200000014000008
+:10EF300010140000201400004014000048140000C9
+:10EF400080140000841400009014000000010000F0
+:10EF500004010000080100000C0100000080000016
+:10EF6000AA3D0010D43D0010FE3D0010263E0010CA
+:10EF7000523E0010A83E00107C3E00100123456761
+:10EF800089ABCDEFFEDCBA9876543210F0E1D2C3F3
+:10EF9000D89E05C107D57C3617DD703039590EF77C
+:10EFA000310BC0FF11155868A78FF964A44FFABE42
+:10EFB00067E6096A85AE67BB72F36E3C3AF54FA50A
+:10EFC0007F520E518C68059BABD9831F19CDE05B36
+:10EFD0005D9DBBCBD89E05C12A299A6207D57C3698
+:10EFE0005A01599117DD7030D8EC2F1539590EF7A9
+:10EFF00067263367310BC0FF874AB48E11155868F6
+:10F000000D2E0CDBA78FF9641D48B547A44FFABE3F
+:10F0100067E6096A08C9BCF385AE67BB3BA7CA842B
+:10F0200072F36E3C2BF894FE3AF54FA5F1361D5F56
+:10F030007F520E51D182E6AD8C68059B1F6C3E2B32
+:10F04000ABD9831F6BBD41FB19CDE05B79217E13EA
+:10F05000C8373D8CA24D54196699E173D6D4DC892A
+:10F06000AEB7FA1D829CFF3214D59D67CF9F2F58F3
+:10F07000692B6D0FA84DD47B736FE3774289C4046D
+:10F08000A8859D3FC8361D6AADE61211A192D691A2
+:10F09000942131222CF72BFCA35F559FC2644CC8EE
+:10F0A0006BB8932351B1536F19773896BDEA405925
+:10F0B000E23E2896E3FF8EA8251E5EBE9239865357
+:10F0C000FC99012BAAB8852CDC2DB70EA22CC5818A
+:10F0D000BE400010FA400010DC4000103841001023
+:10F0E0001A41001058410010784100106745230173
+:10F0F000EFCDAB8998BADCFE10325476C3D2E1F082
+:10F10000C1059ED8367CD5073070DD17F70E59390A
+:10F11000FFC00B316858151164F98FA7BEFA4FA4D0
+:10F120006A09E667BB67AE853C6EF372A54FF53A98
+:10F13000510E527F9B05688C1F83D9AB5BE0CD19C4
+:10F14000CBBB9D5DC1059ED8629A292A367CD50726
+:10F150009159015A3070DD17152FECD8F70E593937
+:10F1600067332667FFC00B318EB44A876858151184
+:10F17000DB0C2E0D64F98FA747B5481DBEFA4FA4CE
+:10F180006A09E667F3BCC908BB67AE8584CAA73BBA
+:10F190003C6EF372FE94F82BA54FF53A5F1D36F1E5
+:10F1A000510E527FADE682D19B05688C2B3E6C1FC1
+:10F1B0001F83D9ABFB41BD6B5BE0CD19137E217979
+:10F1C0008C3D37C819544DA273E1996689DCD4D6B9
+:10F1D0001DFAB7AE32FF9C82679DD514582F9FCF82
+:10F1E0000F6D2B697BD44DA877E36F7304C48942FC
+:10F1F0003F9D85A86A1D36C81112E6AD91D692A131
+:10F2000022312194FC2BF72C9F555FA3C84C64C27C
+:10F210002393B86B6F53B151963877195940EABDB3
+:10F2200096283EE2A88EFFE3BE5E1E2553863992E5
+:10F230002B0199FC2C85B8AA0EB72DDC81C52CA218
+:10F24000BE600010DE600010D4600010CA600010C4
+:10F25000C0600010B6600010186300102863001032
+:10F260003A6300104C6300102863001028630010FC
+:10F27000000000007494001062940010409400108C
+:10F280006A940010409400104297001040940010BF
+:10F290006A9400106294001062940010429700106B
+:10F2A0006A9400102C9400102C9400102C940010E0
+:10F2B000B89700102C2066756E6374696F6E3A20E3
+:10F2C00000617373657274696F6E2022257322204A
+:10F2D0006661696C65643A2066696C6520222573F5
+:10F2E000222C206C696E65202564257325730A0025
+:10F2F000F0010008232D302B2000686C4C0065665F
+:10F300006745464700494E4600696E66004E414ECD
+:10F31000006E616E003000303132333435363738AC
+:10F320003941424344454600303132333435363773
+:10F330003839616263646566000020202020202047
+:10F340002020202828282828202020202020202095
+:10F350002020202020202020202088101010101095
+:10F3600010101010101010101010040404040404E5
+:10F3700004040404101010101010104141414141C8
+:10F38000410101010101010101010101010101012D
+:10F3900001010101011010101010104242424242BE
+:10F3A00042020202020202020202020202020202FD
+:10F3B00002020202021010101020000000000000E3
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000496E66696E696F
+:10F440007479004E614E005245454E54206D616CFA
+:10F450006C6F6320737563636565646564002F6812
+:10F460006F6D652F706172616C6C656C732F746F5A
+:10F470006F6C636861696E2F6763632D61726D2DB8
+:10F480006E6F6E652D656162692D31302E332D32C0
+:10F490003032312E30372F7372632F6E65776C697F
+:10F4A000622F6E65776C69622F6C6962632F73746B
+:10F4B000646C69622F64746F612E630042616C6CCE
+:10F4C0006F632073756363656564656400000000A5
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F530004300504F534958002E002F686F6D652FC0
+:10F54000706172616C6C656C732F746F6F6C636843
+:10F5500061696E2F6763632D61726D2D6E6F6E65CD
+:10F560002D656162692D31302E332D323032312ECE
+:10F5700030372F7372632F6E65776C69622F6E65FB
+:10F58000776C69622F6C6962632F7374646C696253
+:10F590002F6D707265632E63000000000000000094
+:10F5A0000080E03779C34143176E05B5B5B893467F
+:10F5B000F5F93FE9034F384D321D30F94877825A4B
+:10F5C0003CBF737FDD4F1575000000000000F03F69
+:10F5D000000000000000244000000000000059402E
+:10F5E0000000000000408F40000000000088C34081
+:10F5F00000000000006AF8400000000080842E41F6
+:10F6000000000000D01263410000000084D7974141
+:10F610000000000065CDCD41000000205FA0024247
+:10F62000000000E876483742000000A2941A6D42BC
+:10F63000000040E59C30A2420000901EC4BCD642AF
+:10F6400000003426F56B0C430080E03779C341435A
+:10F6500000A0D8855734764300C84E676DC1AB43D0
+:10F66000003D9160E458E143408CB5781DAF1544EE
+:10F6700050EFE2D6E41A4B4492D54D06CFF08044C9
+:10F68000F64AE1C7022DB544B49DD9794378EA44DE
+:10F6900005000000190000007D00000082D9001064
+:10F6A00040D9001040D900103CD9001046D90010B4
+:10F6B00046D9001052DC00103CD9001046D9001089
+:10F6C00052DC001046D900103CD90010E6DB0010D7
+:10F6D000E6DB0010E6DB0010BCDC001000000000E0
+:08F6E000209BFF7F01000000E8
+:10F6E80000000010000000088000000008F700106B
+:08F6F80080000008A0060000DC
+:08F7000074070008085901001C
+:10F7080000093D0000127A0000093D000000D00702
+:10F71800A00F000004000000FFFFFFFFFFFFFFFF36
+:10F72800B4000008C0000008CC000008D800000899
+:10F7380000000000007F00000000001000800100B1
+:10F74800017F00000080011000001C000280000002
+:10F758000000001800001C00077F000000801D103A
+:10F768000048000001000000060000001100000031
+:10F778000000000000000000000000000000000081
+:10F788000100000000000000000000000000000070
+:10F79800000000000000000004000000000000005D
+:10F7A800F05E0108545F01083C5F0108C05E010873
+:10F7B80000000000A85E0108D85E010800000000F3
+:10F7C800085F0108205F01086C5F0108BC010008A0
+:10F7D8000000000000000000000000000000000021
+:10F7E8000000000000000000000000000100000010
+:10F7F80004000000000000000000001800000000E5
+:10F8080000000000180100086C0100088005314064
+:10F8180002000000110000008005314001000000D6
+:10F8280011000000800531400000000011000000B8
+:10F838000006314004000000110000005A000000DA
+:10F8480000000000FFFFFFFF0000000008000000AC
+:10F85800000000000100000088010008000000000E
+:10F86800000000000700A00001000000F0010008EF
+:10F8780000000000F0F4001010F50010D0F40010A3
+:10F888000000000000000000000000000000000070
+:10F898000000000000000000000000000000000060
+:10F8A8000000000000000000000000000000000050
+:10F8B8000000000000000000000000000000000040
+:10F8C8000000000000000000000000000000000030
+:10F8D80043000000000000000000000000000000DD
+:10F8E8000000000000000000000000000000000010
+:10F8F80043000000000000000000000000000000BD
+:10F9080000000000000000000000000000000000EF
+:10F91800430000000000000000000000000000009C
+:10F9280000000000000000000000000000000000CF
+:10F93800430000000000000000000000000000007C
+:10F9480000000000000000000000000000000000AF
+:10F95800430000000000000000000000000000005C
+:10F96800000000000000000000000000000000008F
+:10F97800430000000000000000000000000000003C
+:10F98800000000000000000000000000000000006F
+:10F99800430000000000000000000000000000001C
+:10F9A800000000000000000000000000000000004F
+:10F9B80015D0001055C700100000000039F30010E2
+:10F9C80038F50010EFF20010EFF20010EFF200101F
+:10F9D800EFF20010EFF20010EFF20010EFF200105B
+:10F9E800EFF20010EFF20010FFFFFFFFFFFFFFFF35
+:10F9F800FFFFFFFFFFFF000001004153434949009B
+:10FA080000000000000000000000000000000000EE
+:10FA18000000000000000000000041534349490075
+:10FA280000000000000000000000000000000000CE
+:10FA3800000000000000000000000000A900001005
+:10FA48008100001010B50004440B002827D0144B87
+:10FA58001A68136ABA21515ACA00521A9B181B68AD
+:10FA6800002BF4DA0F4B3E221A600F4B0F4A1A6034
+:10FA78000F4BA322D200062199500E4A9C509B5846
+:10FA8800074B1A68136AB431515ACA00521A9B18A4
+:10FA980000225A60064A074BD358002BFADA10BDE9
+:10FAA800D45F010804012640080126401E1F0000FB
+:10FAB800000026401C05000010B54378FF2B00D03D
+:10FAC80010BD00F035F9124B1A683323D35C032BB1
+:10FAD80000D801BE0E4B1A68136ABA21515A4A005F
+:10FAE80052189B18DB680B4A13600B4A00211160FF
+:10FAF80001310A4A11605A68094B1A6013680B43AE
+:10FB080013601368DB07FCD400F03AF9D8E7C04665
+:10FB1800D45F010800600108F45F0108F85F01087C
+:10FB2800FC5F0108F0B583B0009001914D4B1A6855
+:10FB38003323D35C002B00D101BE4A4B1B681F6ADC
+:10FB4800BC229C58E4196C3A9B5C002B69D000F0ED
+:10FB5800E7F8060003280ED000F0EAF80500424A4C
+:10FB6800424BD358002B3DDB414C032E52D028008A
+:10FB780000F006F96DE03B4B1A683323D35C062B83
+:10FB880000D801BE374B1968BA23CA5A53009A18CD
+:10FB980052000B6A9C466244BC23CB589B181B68D6
+:10FBA800002B5BDB002000F0DBF8324B984257D08B
+:10FBB800314B1A6800230021012000F0D9F8051EF6
+:10FBC80002D02B4C45E00135002000F0C9F8294B44
+:10FBD800984202D0294B9D42F5D9284B9D42BBD96A
+:10FBE800234C36E0264A0121380000F0A9F8002805
+:10FBF80001D01F4CB9E70198FFF724FF009B002BA9
+:10FC080006D02368002BFCDB00F0C2F80400ACE748
+:10FC18001C4CAAE70121002000F09AF80028F9D12D
+:10FC2800A5E700F085F80600154A0121380000F024
+:10FC380087F8002809D1009B002B0DD02368002BE2
+:10FC4800FCDB00F0A5F8040000E0094C300000F0EF
+:10FC580097F8200003B0F0BD0A4CF7E7044CF8E72A
+:10FC6800034CF6E7D45F0108000026401C0500009D
+:10FC78000500520001018800F05F0108EF49020009
+:10FC8800E05F010801005000F0B5C64600B51C4B06
+:10FC98001B6859681B4A136904242343136101280C
+:10FCA8002CD030BF86235B00CB58002B23D1164CB9
+:10FCB8002768164BA320C0001E58154A90461568A1
+:10FCC800144A226006241C503E2042461060124A04
+:10FCD800063098500D4A104BD358002BFADA862379
+:10FCE8005B000E4ACA50084B1F60084AA323DB007A
+:10FCF800D650074B1D6080BCB846F0BD20BFD1E789
+:10FD0800D45F010800ED00E008012640000026400D
+:10FD1800040126401E1F00001C050000AAAAAAAA6A
+:10FD280001B40248844601BC604700BFE5060010E4
+:10FD380001B40248844601BC604700BF9B0500101F
+:10FD480001B40248844601BC604700BF514E001010
+:10FD580001B40248844601BC604700BF415200100C
+:10FD680001B40248844601BC604700BFC15200107C
+:10FD780001B40248844601BC604700BFF54F00103B
+:10FD880001B40248844601BC604700BFA3050010C7
+:10FD980001B40248844601BC604700BF55490010C1
+:10FDA800000000000000000000000000000000004B
+:08FDB800000000000000000043
+:020000041600E4
+:08080000ACE100100000000053
+:107C0000FC01000020122101000000000008001605
+:107C10000000001000000000000000000000000054
+:107C20000000000000000000000000000000000054
+:107C30000000000000000000000000000000000044
+:107C40000000000000000000000000000000000034
+:107C50000000000000000000000000000000000024
+:107C60000000000000000000000000000000000014
+:107C70000000000000000000000000000000000004
+:107C800000000000000000000000000000000000F4
+:107C900000000000000000000000000000000000E4
+:107CA00000000000000000000000000000000000D4
+:107CB00000000000000000000000000000000000C4
+:107CC00000000000000000000000000000000000B4
+:107CD00000000000000000000000000000000000A4
+:107CE0000000000000000000000000000000000094
+:107CF0000000000000000000000000000000000084
+:107D00000000000000000000000000000000000073
+:107D10000000000000000000000000000000000063
+:107D20000000000000000000000000000000000053
+:107D30000000000000000000000000000000000043
+:107D40000000000000000000000000000000000033
+:107D50000000000000000000000000000000000023
+:107D60000000000000000000000000000000000013
+:107D70000000000000000000000000000000000003
+:107D800000000000000000000000000000000000F3
+:107D900000000000000000000000000000000000E3
+:107DA00000000000000000000000000000000000D3
+:107DB00000000000000000000000000000000000C3
+:107DC00000000000000000000000000000000000B3
+:107DD00000000000000000000000000000000000A3
+:107DE0000000000000000000000000000000000093
+:107DF0000000000000000000C20200000000B33BD1
+:0400000510000507DB
+:00000001FF
diff --git a/examples/ota-requestor-app/p6/ota_base_build.sh b/examples/ota-requestor-app/p6/ota_base_build.sh
new file mode 100755
index 0000000..69ca770
--- /dev/null
+++ b/examples/ota-requestor-app/p6/ota_base_build.sh
@@ -0,0 +1,8 @@
+OUT_DIR=out/ota_requestor_debug/
+ANYCLOUD_DIR=third_party/p6/p6_sdk/libs/anycloud-ota/
+
+./scripts/examples/gn_p6_example.sh examples/ota-requestor-app/p6/ "$OUT_DIR"
+
+mv "$OUT_DIR"/chip-p6-ota-requestor-example.hex "$OUT_DIR"/chip-p6-ota-requestor-example.unsigned.hex
+
+./"$ANYCLOUD_DIR"/scripts/sign_script.bash "$OUT_DIR"/ chip-p6-ota-requestor-example python3 arm-none-eabi-objcopy "-O ihex" "" "$ANYCLOUD_DIR"/source/mcuboot/scripts/ imgtool_v1.7.0/imgtool.py create 0xFF 0x400 3584 1.0.0 0x00018000 0x001C0000 arm-none-eabi-objcopy ""
diff --git a/examples/ota-requestor-app/p6/ota_update_build.sh b/examples/ota-requestor-app/p6/ota_update_build.sh
new file mode 100755
index 0000000..8dbe338
--- /dev/null
+++ b/examples/ota-requestor-app/p6/ota_update_build.sh
@@ -0,0 +1,8 @@
+OUT_DIR=out/ota_requestor_update_debug/
+ANYCLOUD_DIR=third_party/p6/p6_sdk/libs/anycloud-ota/
+
+./scripts/examples/gn_p6_example.sh examples/ota-requestor-app/p6/ "$OUT_DIR" build_update_image=true
+
+mv "$OUT_DIR"/chip-p6-ota-requestor-example.hex "$OUT_DIR"/chip-p6-ota-requestor-example.unsigned.hex
+
+./"$ANYCLOUD_DIR"/scripts/sign_script.bash "$OUT_DIR" chip-p6-ota-requestor-example python3 arm-none-eabi-objcopy "-O ihex" "" "$ANYCLOUD_DIR"/source/mcuboot/scripts/ imgtool_v1.7.0/imgtool.py sign 0xFF 0x400 3584 1.0.0 0x00018000 0x001C0000 arm-none-eabi-objcopy "-k $ANYCLOUD_DIR/source/mcuboot/keys/cypress-test-ec-p256.pem"
diff --git a/examples/ota-requestor-app/p6/src/AppTask.cpp b/examples/ota-requestor-app/p6/src/AppTask.cpp
new file mode 100644
index 0000000..ef45532
--- /dev/null
+++ b/examples/ota-requestor-app/p6/src/AppTask.cpp
@@ -0,0 +1,465 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppTask.h"
+#include "AppConfig.h"
+#include "AppEvent.h"
+#include "ButtonHandler.h"
+#include "LEDWidget.h"
+#include "app/clusters/ota-requestor/BDXDownloader.h"
+#include "app/clusters/ota-requestor/OTARequestor.h"
+#include "platform/GenericOTARequestorDriver.h"
+#include "platform/P6/OTAImageProcessorImpl.h"
+#include "qrcodegen.h"
+#include <app-common/zap-generated/attribute-id.h>
+#include <app-common/zap-generated/attribute-type.h>
+#include <app-common/zap-generated/attributes/Accessors.h>
+#include <app-common/zap-generated/cluster-id.h>
+#include <app/server/Dnssd.h>
+#include <app/server/OnboardingCodesUtil.h>
+#include <app/server/Server.h>
+#include <app/util/attribute-storage.h>
+#include <assert.h>
+#include <credentials/DeviceAttestationCredsProvider.h>
+#include <credentials/examples/DeviceAttestationCredsExample.h>
+#include <cy_wcm.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <setup_payload/QRCodeSetupPayloadGenerator.h>
+#include <setup_payload/SetupPayload.h>
+
+#include <app/clusters/network-commissioning/network-commissioning.h>
+#include <platform/P6/NetworkCommissioningDriver.h>
+
+extern "C" {
+#include "cy_smif_psoc6.h"
+}
+
+#define FACTORY_RESET_TRIGGER_TIMEOUT 3000
+#define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000
+#define APP_TASK_STACK_SIZE (4096)
+#define APP_TASK_PRIORITY 2
+#define APP_EVENT_QUEUE_SIZE 10
+
+using chip::BDXDownloader;
+using chip::CharSpan;
+using chip::FabricIndex;
+using chip::GetRequestorInstance;
+using chip::NodeId;
+using chip::OTADownloader;
+using chip::OTAImageProcessorImpl;
+using chip::OTAImageProcessorParams;
+using chip::OTARequestor;
+using chip::System::Layer;
+
+using namespace ::chip;
+using namespace chip::TLV;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::System;
+
+namespace {
+TimerHandle_t sFunctionTimer; // FreeRTOS app sw timer.
+
+TaskHandle_t sAppTaskHandle;
+QueueHandle_t sAppEventQueue;
+
+LEDWidget sStatusLED;
+
+bool sIsWiFiStationProvisioned = false;
+bool sIsWiFiStationEnabled = false;
+bool sIsWiFiStationConnected = false;
+bool sHaveBLEConnections = false;
+
+uint8_t sAppEventQueueBuffer[APP_EVENT_QUEUE_SIZE * sizeof(AppEvent)];
+StaticQueue_t sAppEventQueueStruct;
+
+StackType_t appStack[APP_TASK_STACK_SIZE / sizeof(StackType_t)];
+StaticTask_t appTaskStruct;
+
+OTARequestor gRequestorCore;
+GenericOTARequestorDriver gRequestorUser;
+BDXDownloader gDownloader;
+OTAImageProcessorImpl gImageProcessor;
+
+app::Clusters::NetworkCommissioning::Instance
+ sWiFiNetworkCommissioningInstance(0 /* Endpoint Id */, &(NetworkCommissioning::P6WiFiDriver::GetInstance()));
+} // namespace
+
+void OnTriggerUpdateTimerHandler(Layer * systemLayer, void * appState);
+
+AppTask AppTask::sAppTask;
+
+void NetWorkCommissioningInstInit()
+{
+ sWiFiNetworkCommissioningInstance.Init();
+}
+
+CHIP_ERROR AppTask::StartAppTask()
+{
+ sAppEventQueue = xQueueCreateStatic(APP_EVENT_QUEUE_SIZE, sizeof(AppEvent), sAppEventQueueBuffer, &sAppEventQueueStruct);
+ if (sAppEventQueue == NULL)
+ {
+ P6_LOG("Failed to allocate app event queue");
+ appError(APP_ERROR_EVENT_QUEUE_FAILED);
+ }
+
+ // Start App task.
+ sAppTaskHandle = xTaskCreateStatic(AppTaskMain, APP_TASK_NAME, ArraySize(appStack), NULL, 1, appStack, &appTaskStruct);
+ return (sAppTaskHandle == nullptr) ? APP_ERROR_CREATE_TASK_FAILED : CHIP_NO_ERROR;
+}
+
+CHIP_ERROR AppTask::Init()
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+
+ int rc = boot_set_confirmed();
+ if (rc != 0)
+ {
+ P6_LOG("boot_set_confirmed failed");
+ appError(CHIP_ERROR_WELL_UNINITIALIZED);
+ }
+
+ // Register the callback to init the MDNS server when connectivity is available
+ PlatformMgr().AddEventHandler(
+ [](const ChipDeviceEvent * event, intptr_t arg) {
+ // Restart the server whenever an ip address is renewed
+ if (event->Type == DeviceEventType::kInternetConnectivityChange)
+ {
+ if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established ||
+ event->InternetConnectivityChange.IPv6 == kConnectivity_Established)
+ {
+ chip::app::DnssdServer::Instance().StartServer();
+ }
+ }
+ },
+ 0);
+ // Init ZCL Data Model
+ chip::Server::GetInstance().Init();
+
+ // Initialize device attestation config
+ SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
+
+ // Initialise WSTK buttons PB0 and PB1 (including debounce).
+ ButtonHandler::Init();
+
+ // Create FreeRTOS sw timer for Function Selection.
+ sFunctionTimer = xTimerCreate("FnTmr", // Just a text name, not used by the RTOS kernel
+ 1, // == default timer period (mS)
+ false, // no timer reload (==one-shot)
+ (void *) this, // init timer id = app task obj context
+ TimerEventHandler // timer callback handler
+ );
+ if (sFunctionTimer == NULL)
+ {
+ P6_LOG("funct timer create failed");
+ appError(APP_ERROR_CREATE_TIMER_FAILED);
+ }
+
+ NetWorkCommissioningInstInit();
+
+ // Initialize LEDs
+ sStatusLED.Init(SYSTEM_STATE_LED);
+
+ ConfigurationMgr().LogDeviceConfig();
+
+ SetRequestorInstance(&gRequestorCore);
+ gRequestorCore.Init(&(Server::GetInstance()), &gRequestorUser, &gDownloader);
+ gImageProcessor.SetOTADownloader(&gDownloader);
+ gDownloader.SetImageProcessorDelegate(&gImageProcessor);
+ gRequestorUser.Init(&gRequestorCore, &gImageProcessor);
+
+ uint32_t savedSoftwareVersion;
+ err = ConfigurationMgr().GetSoftwareVersion(savedSoftwareVersion);
+ if (err != CHIP_NO_ERROR)
+ {
+ P6_LOG("Can't get saved software version");
+ appError(err);
+ }
+
+ if (savedSoftwareVersion != CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION)
+ {
+ ConfigurationMgr().StoreSoftwareVersion(CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION);
+
+ P6_LOG("Confirming update to version: %u", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION);
+ chip::OTARequestorInterface * requestor = chip::GetRequestorInstance();
+ if (requestor != nullptr)
+ {
+ requestor->NotifyUpdateApplied(savedSoftwareVersion);
+ }
+ }
+
+ P6_LOG("Current Software Version: %u", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION);
+ P6_LOG("Current Firmware Version: %s", CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING);
+
+ // Print setup info
+ PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE));
+
+ return err;
+}
+
+void AppTask::AppTaskMain(void * pvParameter)
+{
+ AppEvent event;
+ CHIP_ERROR err = sAppTask.Init();
+ if (err != CHIP_NO_ERROR)
+ {
+ P6_LOG("AppTask.Init() failed");
+ appError(err);
+ }
+
+ P6_LOG("App Task started");
+
+ while (true)
+ {
+ BaseType_t eventReceived = xQueueReceive(sAppEventQueue, &event, pdMS_TO_TICKS(10));
+ while (eventReceived == pdTRUE)
+ {
+ sAppTask.DispatchEvent(&event);
+ eventReceived = xQueueReceive(sAppEventQueue, &event, 0);
+ }
+
+ // Update the status LED if factory reset has not been initiated.
+ //
+ // If system has "full connectivity", keep the LED On constantly.
+ //
+ // If thread and service provisioned, but not attached to the thread network
+ // yet OR no connectivity to the service OR subscriptions are not fully
+ // established THEN blink the LED Off for a short period of time.
+ //
+ // If the system has ble connection(s) uptill the stage above, THEN blink
+ // the LEDs at an even rate of 100ms.
+ //
+ // Otherwise, blink the LED ON for a very short time.
+ if (sAppTask.mFunction != Function::kFactoryReset)
+ {
+ if (sIsWiFiStationEnabled && sIsWiFiStationProvisioned && !sIsWiFiStationConnected)
+ {
+ sStatusLED.Blink(950, 50);
+ }
+ else if (sHaveBLEConnections)
+ {
+ sStatusLED.Blink(100, 100);
+ }
+ else
+ {
+ sStatusLED.Blink(50, 950);
+ }
+ }
+
+ sStatusLED.Animate();
+ }
+}
+
+void AppTask::ButtonEventHandler(uint8_t btnIdx, uint8_t btnAction)
+{
+ if (btnIdx != APP_FUNCTION_BUTTON_IDX && btnIdx != APP_UPDATE_BUTTON_IDX)
+ {
+ return;
+ }
+
+ AppEvent button_event = {};
+ button_event.Type = AppEvent::kEventType_Button;
+ button_event.ButtonEvent.ButtonIdx = btnIdx;
+ button_event.ButtonEvent.Action = btnAction;
+
+ if (btnIdx == APP_FUNCTION_BUTTON_IDX)
+ {
+ button_event.Handler = FunctionHandler;
+ sAppTask.PostEvent(&button_event);
+ }
+ if (btnIdx == APP_UPDATE_BUTTON_IDX)
+ {
+ button_event.Handler = UpdateButtonHandler;
+ sAppTask.PostEvent(&button_event);
+ }
+}
+
+void AppTask::TimerEventHandler(TimerHandle_t xTimer)
+{
+ AppEvent event;
+ event.Type = AppEvent::kEventType_Timer;
+ event.TimerEvent.Context = (void *) xTimer;
+ event.Handler = FunctionTimerEventHandler;
+ sAppTask.PostEvent(&event);
+}
+
+void AppTask::FunctionTimerEventHandler(AppEvent * aEvent)
+{
+ if (aEvent->Type != AppEvent::kEventType_Timer)
+ {
+ return;
+ }
+
+ // If we reached here, the button was held past FACTORY_RESET_TRIGGER_TIMEOUT,
+ // initiate factory reset
+ if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kStartBleAdv)
+ {
+ P6_LOG("Factory Reset Triggered. Release button within %ums to cancel.", FACTORY_RESET_CANCEL_WINDOW_TIMEOUT);
+
+ // Start timer for FACTORY_RESET_CANCEL_WINDOW_TIMEOUT to allow user to
+ // cancel, if required.
+ sAppTask.StartTimer(FACTORY_RESET_CANCEL_WINDOW_TIMEOUT);
+
+ sAppTask.mFunction = Function::kFactoryReset;
+
+ // Turn off all LEDs before starting blink to make sure blink is
+ // co-ordinated.
+ sStatusLED.Set(false);
+
+ sStatusLED.Blink(500);
+ }
+ else if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kFactoryReset)
+ {
+ // Actually trigger Factory Reset
+ sAppTask.mFunction = Function::kNoneSelected;
+ ConfigurationMgr().InitiateFactoryReset();
+ }
+}
+
+void AppTask::FunctionHandler(AppEvent * aEvent)
+{
+ // To trigger software update: press the APP_FUNCTION_BUTTON button briefly (<
+ // FACTORY_RESET_TRIGGER_TIMEOUT) To initiate factory reset: press the
+ // APP_FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT +
+ // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT All LEDs start blinking after
+ // FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated.
+ // To cancel factory reset: release the APP_FUNCTION_BUTTON once all LEDs
+ // start blinking within the FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
+ if (aEvent->ButtonEvent.Action == APP_BUTTON_RELEASED)
+ {
+ if (!sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kNoneSelected)
+ {
+ sAppTask.StartTimer(FACTORY_RESET_TRIGGER_TIMEOUT);
+ sAppTask.mFunction = Function::kStartBleAdv;
+ }
+ }
+ else
+ {
+ // If the button was released before factory reset got initiated, start Thread Network
+ if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kStartBleAdv)
+ {
+ sAppTask.CancelTimer();
+ sAppTask.mFunction = Function::kNoneSelected;
+ }
+ else if (sAppTask.mFunctionTimerActive && sAppTask.mFunction == Function::kFactoryReset)
+ {
+
+ sAppTask.CancelTimer();
+
+ // Change the function to none selected since factory reset has been
+ // canceled.
+ sAppTask.mFunction = Function::kNoneSelected;
+
+ P6_LOG("Factory Reset has been Canceled");
+ }
+ }
+}
+
+void AppTask::UpdateButtonHandler(AppEvent * aEvent)
+{
+ if (aEvent->ButtonEvent.Action == APP_BUTTON_RELEASED)
+ {
+ chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Milliseconds32(2000), OnTriggerUpdateTimerHandler,
+ nullptr);
+ }
+}
+
+void AppTask::CancelTimer()
+{
+ if (xTimerStop(sFunctionTimer, 0) == pdFAIL)
+ {
+ P6_LOG("app timer stop() failed");
+ appError(APP_ERROR_STOP_TIMER_FAILED);
+ }
+
+ mFunctionTimerActive = false;
+}
+
+void AppTask::StartTimer(uint32_t aTimeoutInMs)
+{
+ if (xTimerIsTimerActive(sFunctionTimer))
+ {
+ P6_LOG("app timer already started!");
+ CancelTimer();
+ }
+
+ // timer is not active, change its period to required value (== restart).
+ // FreeRTOS- Block for a maximum of 100 ticks if the change period command
+ // cannot immediately be sent to the timer command queue.
+ if (xTimerChangePeriod(sFunctionTimer, aTimeoutInMs / portTICK_PERIOD_MS, 100) != pdPASS)
+ {
+ P6_LOG("app timer start() failed");
+ appError(APP_ERROR_START_TIMER_FAILED);
+ }
+
+ mFunctionTimerActive = true;
+}
+
+void AppTask::PostEvent(const AppEvent * aEvent)
+{
+ if (sAppEventQueue != NULL)
+ {
+ BaseType_t status;
+ if (xPortIsInsideInterrupt())
+ {
+ BaseType_t higherPrioTaskWoken = pdFALSE;
+ status = xQueueSendFromISR(sAppEventQueue, aEvent, &higherPrioTaskWoken);
+
+#ifdef portYIELD_FROM_ISR
+ portYIELD_FROM_ISR(higherPrioTaskWoken);
+#elif portEND_SWITCHING_ISR // portYIELD_FROM_ISR or portEND_SWITCHING_ISR
+ portEND_SWITCHING_ISR(higherPrioTaskWoken);
+#else // portYIELD_FROM_ISR or portEND_SWITCHING_ISR
+#error "Must have portYIELD_FROM_ISR or portEND_SWITCHING_ISR"
+#endif // portYIELD_FROM_ISR or portEND_SWITCHING_ISR
+ }
+ else
+ {
+ status = xQueueSend(sAppEventQueue, aEvent, 1);
+ }
+
+ if (!status)
+ P6_LOG("Failed to post event to app task event queue");
+ }
+ else
+ {
+ P6_LOG("Event Queue is NULL should never happen");
+ }
+}
+
+void AppTask::DispatchEvent(AppEvent * aEvent)
+{
+ if (aEvent->Handler)
+ {
+ aEvent->Handler(aEvent);
+ }
+ else
+ {
+ P6_LOG("Event received with no handler. Dropping event.");
+ }
+}
+
+void OnTriggerUpdateTimerHandler(Layer * systemLayer, void * appState)
+{
+ P6_LOG("Triggering immediate OTA update query");
+
+ OTARequestor * req = static_cast<OTARequestor *>(GetRequestorInstance());
+ req->TriggerImmediateQuery();
+}
diff --git a/examples/ota-requestor-app/p6/src/ButtonHandler.cpp b/examples/ota-requestor-app/p6/src/ButtonHandler.cpp
new file mode 100644
index 0000000..9701eca
--- /dev/null
+++ b/examples/ota-requestor-app/p6/src/ButtonHandler.cpp
@@ -0,0 +1,98 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ButtonHandler.h"
+#include "AppConfig.h"
+#include "AppTask.h"
+
+namespace {
+constexpr int kButtonCount = 2;
+
+TimerHandle_t buttonTimers[kButtonCount]; // FreeRTOS timers used for debouncing
+// buttons. Array to hold handles to
+// the created timers.
+
+} // namespace
+
+void ButtonHandler::Init(void)
+{
+ GpioInit();
+ // Create FreeRTOS sw timers for debouncing buttons.
+ for (uint8_t i = 0; i < kButtonCount; i++)
+ {
+ buttonTimers[i] = xTimerCreate("BtnTmr", // Just a text name, not used by the RTOS kernel
+ APP_BUTTON_DEBOUNCE_PERIOD_MS, // timer period
+ false, // no timer reload (==one-shot)
+ (void *) (int) i, // init timer id = button index
+ TimerCallback // timer callback handler (all buttons use
+ // the same timer cn function)
+ );
+ }
+}
+
+void ButtonHandler::GpioInit(void)
+{
+ cy_rslt_t result = CY_RSLT_SUCCESS;
+ // Set up button GPIOs to input with pullups.
+ result = cyhal_gpio_init(APP_UPDATE_BUTTON, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_PULLUP, CYBSP_BTN_OFF);
+ if (result != CY_RSLT_SUCCESS)
+ {
+ printf(" cyhal_gpio_init failed for APP_LOCK_BUTTON\r\n");
+ }
+ result = cyhal_gpio_init(APP_FUNCTION_BUTTON, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_PULLUP, CYBSP_BTN_OFF);
+ if (result != CY_RSLT_SUCCESS)
+ {
+ printf(" cyhal_gpio_init failed for APP_FUNCTION_BUTTON\r\n");
+ }
+ /* Configure GPIO interrupt. */
+ cyhal_gpio_register_callback(APP_UPDATE_BUTTON, lockbuttonIsr, NULL);
+ cyhal_gpio_register_callback(APP_FUNCTION_BUTTON, functionbuttonIsr, NULL);
+ cyhal_gpio_enable_event(APP_UPDATE_BUTTON, CYHAL_GPIO_IRQ_FALL, GPIO_INTERRUPT_PRIORITY, true);
+ cyhal_gpio_enable_event(APP_FUNCTION_BUTTON, CYHAL_GPIO_IRQ_FALL, GPIO_INTERRUPT_PRIORITY, true);
+}
+
+void ButtonHandler::lockbuttonIsr(void * handler_arg, cyhal_gpio_event_t event)
+{
+ portBASE_TYPE taskWoken = pdFALSE;
+ xTimerStartFromISR(buttonTimers[APP_UPDATE_BUTTON_IDX], &taskWoken);
+}
+
+void ButtonHandler::functionbuttonIsr(void * handler_arg, cyhal_gpio_event_t event)
+{
+ portBASE_TYPE taskWoken = pdFALSE;
+ xTimerStartFromISR(buttonTimers[APP_FUNCTION_BUTTON_IDX], &taskWoken);
+}
+
+void ButtonHandler::TimerCallback(TimerHandle_t xTimer)
+{
+ // Get the button index of the expired timer and call button event helper.
+ uint32_t timerId;
+ uint8_t buttonevent = 0;
+ timerId = (uint32_t) pvTimerGetTimerID(xTimer);
+ if (timerId)
+ {
+ buttonevent = cyhal_gpio_read(APP_FUNCTION_BUTTON);
+ }
+ else
+ {
+ buttonevent = cyhal_gpio_read(APP_UPDATE_BUTTON);
+ }
+ GetAppTask().ButtonEventHandler(timerId, (buttonevent) ? APP_BUTTON_PRESSED : APP_BUTTON_RELEASED);
+}
diff --git a/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp b/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp
new file mode 100644
index 0000000..f1f6f41
--- /dev/null
+++ b/examples/ota-requestor-app/p6/src/ZclCallbacks.cpp
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file
+ * This file implements the handler for data model messages.
+ */
+
+#include "AppConfig.h"
+#include <lib/support/logging/CHIPLogging.h>
+
+#include <app-common/zap-generated/attribute-id.h>
+#include <app-common/zap-generated/cluster-id.h>
+#include <app-common/zap-generated/ids/Attributes.h>
+#include <app-common/zap-generated/ids/Clusters.h>
+#include <app/util/af-types.h>
+
+using namespace ::chip;
+using namespace ::chip::app::Clusters;
+
+void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type,
+ uint16_t size, uint8_t * value)
+{
+ EndpointId endpoint = attributePath.mEndpointId;
+ ClusterId clusterId = attributePath.mClusterId;
+ AttributeId attributeId = attributePath.mAttributeId;
+ P6_LOG("MatterPostAttributeChangeCallback - Cluster ID: " ChipLogFormatMEI
+ ", EndPoint ID: '0x%02x', Attribute ID: " ChipLogFormatMEI,
+ ChipLogValueMEI(clusterId), endpoint, ChipLogValueMEI(attributeId));
+
+ switch (clusterId)
+ {
+ case Identify::Id:
+ ChipLogProgress(Zcl, "Identify attribute ID: " ChipLogFormatMEI " Type: %u Value: %" PRIu16 ", length %" PRIu16,
+ ChipLogValueMEI(attributeId), type, *value, size);
+ break;
+ default:
+ P6_LOG("Unhandled cluster ID: " ChipLogFormatMEI, ChipLogValueMEI(clusterId));
+ break;
+ }
+}
diff --git a/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld b/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld
new file mode 100644
index 0000000..d1717ff
--- /dev/null
+++ b/examples/ota-requestor-app/p6/src/cy8c6xxa_cm4_dual_ota_int.ld
@@ -0,0 +1,404 @@
+/***************************************************************************//**
+* \file cy8c6xxa_cm4_dual.ld
+* \version 2.60
+*
+* Linker file for the GNU C compiler.
+*
+* The main purpose of the linker script is to describe how the sections in the
+* input files should be mapped into the output file, and to control the memory
+* layout of the output file.
+*
+* \note The entry point location is fixed and starts at 0x10000000. The valid
+* application image should be placed there.
+*
+* \note The linker files included with the PDL template projects must be generic
+* and handle all common use cases. Your project may not use every section
+* defined in the linker files. In that case you may see warnings during the
+* build process. In your project, you can simply comment out or remove the
+* relevant code in the linker file.
+*
+********************************************************************************
+* \copyright
+* Copyright 2016-2019 Cypress Semiconductor Corporation
+* SPDX-License-Identifier: Apache-2.0
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*******************************************************************************/
+
+OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
+SEARCH_DIR(.)
+GROUP(-lgcc -lc -lnosys)
+ENTRY(Reset_Handler)
+
+/* Size of the stack section at the end of CM4 SRAM */
+STACK_SIZE = 0x1000;
+
+/* Size of the Cortex-M0+ application image at the start of FLASH - passed in as argument to ld.exe*/
+/* MCUBOOT_BOOTLOADER_SIZE = 0x12000; */
+
+/* MCUBoot Header Size passed in as argument to ld.exe */
+/* MCUBOOT_HEADER_SIZE = 0x1000; */
+
+/* CY_BOOT_PRIMARY_1_SIZE Slot 1 size passed in as argument to ld.exe */
+/* CY_BOOT_PRIMARY_1_SIZE = 0x0EE000 (Internal FLASH) */
+/* CY_BOOT_PRIMARY_1_SIZE = 0x10C000 (External FLASH) */
+
+/* Force symbol to be entered in the output file as an undefined symbol. Doing
+* this may, for example, trigger linking of additional modules from standard
+* libraries. You may list several symbols for each EXTERN, and you may use
+* EXTERN multiple times. This command has the same effect as the -u command-line
+* option.
+*/
+EXTERN(Reset_Handler)
+
+/* The MEMORY section below describes the location and size of blocks of memory in the target.
+* Use this section to specify the memory regions available for allocation.
+*/
+MEMORY
+{
+ /* The ram and flash regions control RAM and flash memory allocation for the CM4 core.
+ * You can change the memory allocation by editing the 'ram' and 'flash' regions.
+ * Note that 2 KB of RAM (at the end of the SRAM) are reserved for system use.
+ * Using this memory region for other purposes will lead to unexpected behavior.
+ * Your changes must be aligned with the corresponding memory regions for CM0+ core in 'xx_cm0plus.ld',
+ * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.ld'.
+ */
+ ram (rwx) : ORIGIN = 0x08020800, LENGTH = 0xDF000
+ flash (rx) : ORIGIN = 0x10000000 + MCUBOOT_BOOTLOADER_SIZE, LENGTH = CY_BOOT_PRIMARY_1_SIZE
+
+ /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash.
+ * You can assign sections to this memory region for only one of the cores.
+ * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region.
+ * Therefore, repurposing this memory region will prevent such middleware from operation.
+ */
+ em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */
+
+ /* The following regions define device specific memory regions and must not be changed. */
+ sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */
+ sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */
+ sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */
+ sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */
+ sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */
+ xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */
+ efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */
+}
+
+/* Library configurations */
+GROUP(libgcc.a libc.a libm.a libnosys.a)
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ * __Vectors_End
+ * __Vectors_Size
+ */
+
+
+SECTIONS
+{
+ /* Cortex-M4 application flash area */
+ .text ORIGIN(flash) + MCUBOOT_HEADER_SIZE :
+ {
+ . = ALIGN(8);
+ __cy_app_load_addr = . ;
+ __Vectors = . ;
+ KEEP(*(.vectors))
+ . = ALIGN(8);
+ __Vectors_End = .;
+ __Vectors_Size = __Vectors_End - __Vectors;
+ __end__ = .;
+
+ . = ALIGN(8);
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ /* Read-only code (constants). */
+ *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*)
+
+ KEEP(*(.eh_frame*))
+ } > flash
+
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > flash
+
+ __exidx_start = .;
+
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > flash
+ __exidx_end = .;
+
+
+ /* To copy multiple ROM to RAM sections,
+ * uncomment .copy.table section and,
+ * define __STARTUP_COPY_MULTIPLE in startup_psoc6_02_cm4.S */
+ .copy.table :
+ {
+ . = ALIGN(8);
+ __copy_table_start__ = .;
+
+ /* Copy interrupt vectors from flash to RAM */
+ LONG (__Vectors) /* From */
+ LONG (__ram_vectors_start__) /* To */
+ LONG (__Vectors_End - __Vectors) /* Size */
+
+ /* Copy data section to RAM */
+ LONG (__etext) /* From */
+ LONG (__data_start__) /* To */
+ LONG (__data_end__ - __data_start__) /* Size */
+
+ __copy_table_end__ = .;
+ } > flash
+
+
+ /* To clear multiple BSS sections,
+ * uncomment .zero.table section and,
+ * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_02_cm4.S */
+ .zero.table :
+ {
+ . = ALIGN(8);
+ __zero_table_start__ = .;
+ LONG (__bss_start__)
+ LONG (__bss_end__ - __bss_start__)
+ __zero_table_end__ = .;
+ } > flash
+
+ __etext = . ;
+
+
+ .ramVectors (NOLOAD) : ALIGN(8)
+ {
+ __ram_vectors_start__ = .;
+ KEEP(*(.ram_vectors))
+ __ram_vectors_end__ = .;
+ } > ram
+
+
+ .data __ram_vectors_end__ : AT (__etext)
+ {
+ __data_start__ = .;
+
+ *(vtable)
+ *(.data*)
+
+ . = ALIGN(8);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(8);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(8);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(8);
+
+ KEEP(*(.cy_ramfunc*))
+ . = ALIGN(8);
+
+ __data_end__ = .;
+
+ } > ram
+
+
+ /* Place variables in the section that should not be initialized during the
+ * device startup.
+ */
+ .noinit (NOLOAD) : ALIGN(8)
+ {
+ KEEP(*(.noinit))
+ } > ram
+
+
+ /* The uninitialized global or static variables are placed in this section.
+ *
+ * The NOLOAD attribute tells linker that .bss section does not consume
+ * any space in the image. The NOLOAD attribute changes the .bss type to
+ * NOBITS, and that makes linker to A) not allocate section in memory, and
+ * A) put information to clear the section with all zeros during application
+ * loading.
+ *
+ * Without the NOLOAD attribute, the .bss section might get PROGBITS type.
+ * This makes linker to A) allocate zeroed section in memory, and B) copy
+ * this section to RAM during application loading.
+ */
+ .bss (NOLOAD):
+ {
+ . = ALIGN(8);
+ __bss_start__ = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(8);
+ __bss_end__ = .;
+ } > ram
+
+
+ .heap (NOLOAD):
+ {
+ __HeapBase = .;
+ __end__ = .;
+ end = __end__;
+ KEEP(*(.heap*))
+ . = ORIGIN(ram) + LENGTH(ram) - STACK_SIZE;
+ __HeapLimit = .;
+ } > ram
+
+
+ /* .stack_dummy section doesn't contains any symbols. It is only
+ * used for linker to calculate size of stack sections, and assign
+ * values to stack symbols later */
+ .stack_dummy (NOLOAD):
+ {
+ KEEP(*(.stack*))
+ } > ram
+
+
+ /* Set stack top to end of RAM, and stack limit move down by
+ * size of stack_dummy section */
+ __StackTop = ORIGIN(ram) + LENGTH(ram);
+ __StackLimit = __StackTop - SIZEOF(.stack_dummy);
+ PROVIDE(__stack = __StackTop);
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+
+
+ /* Used for the digital signature of the secure application and the Bootloader SDK application.
+ * The size of the section depends on the required data size. */
+ .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 :
+ {
+ KEEP(*(.cy_app_signature))
+ } > flash
+
+
+ /* Emulated EEPROM Flash area */
+ .cy_em_eeprom (NOLOAD):
+ {
+ KEEP(*(.cy_em_eeprom))
+ } > em_eeprom
+
+
+ /* Supervisory Flash: Table of Content # 2 Copy */
+ .cy_rtoc_part2 :
+ {
+ KEEP(*(.cy_rtoc_part2))
+ } > sflash_rtoc_2
+
+
+ /* Places the code in the Execute in Place (XIP) section. See the smif driver
+ * documentation for details.
+ */
+ .cy_xip :
+ {
+ KEEP(*(.cy_xip))
+ } > xip
+
+
+ /* eFuse */
+ .cy_efuse :
+ {
+ KEEP(*(.cy_efuse))
+ } > efuse
+
+
+ /* These sections are used for additional metadata (silicon revision,
+ * Silicon/JTAG ID, etc.) storage.
+ */
+ .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE
+}
+
+
+/* The following symbols used by the cymcuelftool. */
+/* Flash */
+__cy_memory_0_start = 0x10000000;
+__cy_memory_0_length = 0x00200000;
+__cy_memory_0_row_size = 0x200;
+
+/* Emulated EEPROM Flash area */
+__cy_memory_1_start = 0x14000000;
+__cy_memory_1_length = 0x8000;
+__cy_memory_1_row_size = 0x200;
+
+/* Supervisory Flash */
+__cy_memory_2_start = 0x16000000;
+__cy_memory_2_length = 0x8000;
+__cy_memory_2_row_size = 0x200;
+
+/* XIP */
+__cy_memory_3_start = 0x18000000;
+__cy_memory_3_length = 0x08000000;
+__cy_memory_3_row_size = 0x200;
+
+/* eFuse */
+__cy_memory_4_start = 0x90700000;
+__cy_memory_4_length = 0x100000;
+__cy_memory_4_row_size = 1;
+
+/* EOF */
diff --git a/examples/ota-requestor-app/p6/src/main.cpp b/examples/ota-requestor-app/p6/src/main.cpp
new file mode 100644
index 0000000..f2bcc8b
--- /dev/null
+++ b/examples/ota-requestor-app/p6/src/main.cpp
@@ -0,0 +1,158 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * Copyright (c) 2019 Google LLC.
+ * Copyright 2021, Cypress Semiconductor Corporation (an Infineon company)
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <FreeRTOS.h>
+
+#include <lib/support/CHIPMem.h>
+#include <lib/support/CHIPPlatformMemory.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/KeyValueStoreManager.h>
+
+#include <AppTask.h>
+
+#include "AppConfig.h"
+#include "cyhal_wdt.h"
+#include "init_p6Platform.h"
+#include <app/server/Server.h>
+
+#ifdef HEAP_MONITORING
+#include "MemMonitoring.h"
+#endif
+#define MAIN_TASK_STACK_SIZE (4096)
+#define MAIN_TASK_PRIORITY 2
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+
+volatile int apperror_cnt;
+static void main_task(void * pvParameters);
+
+// ================================================================================
+// App Error
+//=================================================================================
+void appError(int err)
+{
+ P6_LOG("!! App Critical Error: %d !!", err);
+ portDISABLE_INTERRUPTS();
+ while (1)
+ ;
+}
+
+void appError(CHIP_ERROR error)
+{
+ appError(static_cast<int>(error.AsInteger()));
+}
+
+// ================================================================================
+// FreeRTOS Callbacks
+// ================================================================================
+extern "C" void vApplicationIdleHook(void)
+{
+ // FreeRTOS Idle callback
+}
+
+extern "C" void vApplicationDaemonTaskStartupHook()
+{
+ // Init Chip memory management before the stack
+ chip::Platform::MemoryInit();
+
+ /* Create the Main task. */
+ xTaskCreate(main_task, "Main task", MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, NULL);
+}
+
+static void main_task(void * pvParameters)
+{
+ CHIP_ERROR ret = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init();
+ if (ret != CHIP_NO_ERROR)
+ {
+ P6_LOG("PersistedStorage::KeyValueStoreMgrImpl().Init() failed");
+ appError(ret);
+ }
+
+ ret = PlatformMgr().InitChipStack();
+ if (ret != CHIP_NO_ERROR)
+ {
+ P6_LOG("PlatformMgr().InitChipStack() failed");
+ appError(ret);
+ }
+
+ ret = chip::DeviceLayer::ConnectivityMgr().SetBLEDeviceName("P6_OTA_REQ");
+ if (ret != CHIP_NO_ERROR)
+ {
+ P6_LOG("ConnectivityMgr().SetBLEDeviceName() failed");
+ appError(ret);
+ }
+
+ P6_LOG("Starting Platform Manager Event Loop");
+ ret = PlatformMgr().StartEventLoopTask();
+ if (ret != CHIP_NO_ERROR)
+ {
+ P6_LOG("PlatformMgr().StartEventLoopTask() failed");
+ appError(ret);
+ }
+ ret = GetAppTask().StartAppTask();
+ if (ret != CHIP_NO_ERROR)
+ {
+ P6_LOG("GetAppTask().Init() failed");
+ appError(ret);
+ }
+
+ /* Delete task */
+ vTaskDelete(NULL);
+}
+
+// ================================================================================
+// Main Code
+// ================================================================================
+int main(void)
+{
+ init_p6Platform();
+
+ // Clear watchdog timer (started by bootloader) so that it doesn't trigger a reset
+ cyhal_wdt_t wdt_obj;
+ cyhal_wdt_init(&wdt_obj, cyhal_wdt_get_max_timeout_ms());
+ cyhal_wdt_free(&wdt_obj);
+
+#ifdef HEAP_MONITORING
+ MemMonitoring::startHeapMonitoring();
+#endif
+
+ P6_LOG("==================================================\r\n");
+ P6_LOG("chip-p6-ota-requestor-example starting\r\n");
+ P6_LOG("==================================================\r\n");
+
+ /* Start the FreeRTOS scheduler */
+ vTaskStartScheduler();
+
+ chip::Platform::MemoryShutdown();
+ PlatformMgr().StopEventLoopTask();
+ PlatformMgr().Shutdown();
+
+ // Should never get here.
+ P6_LOG("vTaskStartScheduler() failed");
+}
diff --git a/examples/ota-requestor-app/p6/third_party/connectedhomeip b/examples/ota-requestor-app/p6/third_party/connectedhomeip
new file mode 120000
index 0000000..11a54ed
--- /dev/null
+++ b/examples/ota-requestor-app/p6/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/scripts/examples/gn_p6_example.sh b/scripts/examples/gn_p6_example.sh
index 29871cc..6d718f0 100755
--- a/scripts/examples/gn_p6_example.sh
+++ b/scripts/examples/gn_p6_example.sh
@@ -41,14 +41,36 @@
# Build steps
EXAMPLE_DIR=$1
+shift
OUTPUT_DIR=out/example_app
P6_BOARD=CY8CKIT-062S2-43012
-if [[ ! -z "$2" ]]; then
- OUTPUT_DIR=$2
+if [[ ! -z "$1" ]]; then
+ OUTPUT_DIR=$1
+ shift
fi
-gn gen --check --fail-on-unused-args "$OUTPUT_DIR" --root="$EXAMPLE_DIR" --args="p6_board=\"$P6_BOARD\""
-ninja -C "$OUTPUT_DIR"
+GN_ARGS=()
+NINJA_ARGS=()
+for arg; do
+ case $arg in
+ -v)
+ NINJA_ARGS+=(-v)
+ ;;
+ *=*)
+ GN_ARGS+=("$arg")
+ ;;
+ *import*)
+ GN_ARGS+=("$arg")
+ ;;
+ *)
+ echo >&2 "invalid argument: $arg"
+ exit 2
+ ;;
+ esac
+done
+
+gn gen --check --fail-on-unused-args "$OUTPUT_DIR" --root="$EXAMPLE_DIR" --args="p6_board=\"$P6_BOARD\" ${GN_ARGS[*]}"
+ninja -C "$OUTPUT_DIR" "${NINJA_ARGS[@]}"
#print stats
arm-none-eabi-size -A "$OUTPUT_DIR"/*.out
diff --git a/src/include/platform/ConfigurationManager.h b/src/include/platform/ConfigurationManager.h
index a06e07d..d78d04a 100644
--- a/src/include/platform/ConfigurationManager.h
+++ b/src/include/platform/ConfigurationManager.h
@@ -118,6 +118,7 @@
virtual CHIP_ERROR StorePrimaryWiFiMACAddress(const uint8_t * buf) = 0;
virtual CHIP_ERROR StorePrimary802154MACAddress(const uint8_t * buf) = 0;
virtual CHIP_ERROR StoreManufacturingDate(const char * mfgDate, size_t mfgDateLen) = 0;
+ virtual CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) = 0;
virtual CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) = 0;
virtual CHIP_ERROR StoreSetupPinCode(uint32_t setupPinCode) = 0;
virtual CHIP_ERROR StoreSetupDiscriminator(uint16_t setupDiscriminator) = 0;
diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.cpp b/src/include/platform/internal/GenericConfigurationManagerImpl.cpp
index d5ec5cd..54ed92f 100644
--- a/src/include/platform/internal/GenericConfigurationManagerImpl.cpp
+++ b/src/include/platform/internal/GenericConfigurationManagerImpl.cpp
@@ -95,6 +95,12 @@
}
template <class ConfigClass>
+inline CHIP_ERROR GenericConfigurationManagerImpl<ConfigClass>::StoreSoftwareVersion(uint32_t softwareVer)
+{
+ return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
+}
+
+template <class ConfigClass>
CHIP_ERROR GenericConfigurationManagerImpl<ConfigClass>::GetDeviceTypeId(uint16_t & deviceType)
{
deviceType = static_cast<uint16_t>(CHIP_DEVICE_CONFIG_DEVICE_TYPE);
diff --git a/src/include/platform/internal/GenericConfigurationManagerImpl.h b/src/include/platform/internal/GenericConfigurationManagerImpl.h
index 8313704..0fe14ef 100644
--- a/src/include/platform/internal/GenericConfigurationManagerImpl.h
+++ b/src/include/platform/internal/GenericConfigurationManagerImpl.h
@@ -63,6 +63,7 @@
CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) override;
CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize) override;
CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override;
+ CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) override;
CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override;
CHIP_ERROR StoreSerialNumber(const char * serialNum, size_t serialNumLen) override;
CHIP_ERROR GetPrimaryMACAddress(MutableByteSpan buf) override;
diff --git a/src/platform/P6/BUILD.gn b/src/platform/P6/BUILD.gn
index ed08a0b..d7af750 100644
--- a/src/platform/P6/BUILD.gn
+++ b/src/platform/P6/BUILD.gn
@@ -1,10 +1,10 @@
-# Copyright (c) 2021 Project CHIP Authors
+# Copyright(c) 2022 Project CHIP Authors
#
-# Licensed under the Apache License, Version 2.0 (the "License");
+# Licensed under the Apache License, Version 2.0(the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
-# http://www.apache.org/licenses/LICENSE-2.0
+# http:// www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,7 +16,6 @@
import("//build_overrides/pigweed.gni")
import("${chip_root}/src/platform/device.gni")
-
assert(chip_device_platform == "p6")
if (chip_enable_openthread) {
@@ -50,6 +49,8 @@
"MTBKeyValueStore.h",
"NetworkCommissioningDriver.h",
"NetworkCommissioningWiFiDriver.cpp",
+ "OTAImageProcessorImpl.cpp",
+ "OTAImageProcessorImpl.h",
"P6Config.cpp",
"P6Config.h",
"P6Utils.cpp",
@@ -67,7 +68,11 @@
"cycfg_gatt_db.c",
"cycfg_gatt_db.h",
]
- deps = [ "${chip_root}/src/lib/dnssd:platform_header" ]
+
+ deps = [
+ "${chip_root}/src/lib/dnssd:platform_header",
+ "${chip_root}/src/setup_payload",
+ ]
public_deps = [
"${chip_root}/src/crypto",
diff --git a/src/platform/P6/ConfigurationManagerImpl.cpp b/src/platform/P6/ConfigurationManagerImpl.cpp
index ef408fe..f078d0b 100644
--- a/src/platform/P6/ConfigurationManagerImpl.cpp
+++ b/src/platform/P6/ConfigurationManagerImpl.cpp
@@ -48,6 +48,13 @@
bool failSafeArmed;
uint32_t rebootCount;
+ // Save out software version on first boot
+ if (!P6Config::ConfigValueExists(P6Config::kConfigKey_SoftwareVersion))
+ {
+ err = StoreSoftwareVersion(CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION);
+ SuccessOrExit(err);
+ }
+
if (P6Config::ConfigValueExists(P6Config::kCounterKey_RebootCount))
{
err = GetRebootCount(rebootCount);
@@ -94,6 +101,16 @@
return WriteConfigValue(P6Config::kCounterKey_RebootCount, rebootCount);
}
+CHIP_ERROR ConfigurationManagerImpl::GetSoftwareVersion(uint32_t & softwareVer)
+{
+ return ReadConfigValue(P6Config::kConfigKey_SoftwareVersion, softwareVer);
+}
+
+CHIP_ERROR ConfigurationManagerImpl::StoreSoftwareVersion(uint32_t softwareVer)
+{
+ return WriteConfigValue(P6Config::kConfigKey_SoftwareVersion, softwareVer);
+}
+
CHIP_ERROR ConfigurationManagerImpl::GetTotalOperationalHours(uint32_t & totalOperationalHours)
{
return ReadConfigValue(P6Config::kCounterKey_TotalOperationalHours, totalOperationalHours);
diff --git a/src/platform/P6/ConfigurationManagerImpl.h b/src/platform/P6/ConfigurationManagerImpl.h
index 8da0df2..a9fd74f 100644
--- a/src/platform/P6/ConfigurationManagerImpl.h
+++ b/src/platform/P6/ConfigurationManagerImpl.h
@@ -40,6 +40,8 @@
public:
CHIP_ERROR GetRebootCount(uint32_t & rebootCount) override;
CHIP_ERROR StoreRebootCount(uint32_t rebootCount) override;
+ CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override;
+ CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer);
CHIP_ERROR GetTotalOperationalHours(uint32_t & totalOperationalHours) override;
CHIP_ERROR StoreTotalOperationalHours(uint32_t totalOperationalHours) override;
// This returns an instance of this class.
diff --git a/src/platform/P6/MTBKeyValueStore.cpp b/src/platform/P6/MTBKeyValueStore.cpp
index 839be54..fe05f60 100644
--- a/src/platform/P6/MTBKeyValueStore.cpp
+++ b/src/platform/P6/MTBKeyValueStore.cpp
@@ -46,9 +46,15 @@
{
return result;
}
- sectorSize = cy_serial_flash_qspi_get_erase_size(ext_mem_address);
- uint32_t length = sectorSize * 2;
+ sectorSize = cy_serial_flash_qspi_get_erase_size(ext_mem_address);
+ uint32_t length = sectorSize * 2;
+#ifdef P6_OTA
+ // If using OTA set the start address towards the end of the flash area so
+ // an update doesn't clobber the persistent storage.
+ uint32_t start_addr = 0x3000000U;
+#else
uint32_t start_addr = 0;
+#endif
block_device.read = bd_read;
block_device.program = bd_program;
diff --git a/src/platform/P6/OTAImageProcessorImpl.cpp b/src/platform/P6/OTAImageProcessorImpl.cpp
new file mode 100644
index 0000000..e7625e5
--- /dev/null
+++ b/src/platform/P6/OTAImageProcessorImpl.cpp
@@ -0,0 +1,213 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <app/clusters/ota-requestor/OTADownloader.h>
+#include <platform/OTARequestorInterface.h>
+
+#include "OTAImageProcessorImpl.h"
+
+namespace chip {
+
+#ifdef P6_OTA
+CHIP_ERROR OTAImageProcessorImpl::PrepareDownload()
+{
+ DeviceLayer::PlatformMgr().ScheduleWork(HandlePrepareDownload, reinterpret_cast<intptr_t>(this));
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::Finalize()
+{
+ DeviceLayer::PlatformMgr().ScheduleWork(HandleFinalize, reinterpret_cast<intptr_t>(this));
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::Apply()
+{
+ DeviceLayer::PlatformMgr().ScheduleWork(HandleApply, reinterpret_cast<intptr_t>(this));
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::Abort()
+{
+ DeviceLayer::PlatformMgr().ScheduleWork(HandleAbort, reinterpret_cast<intptr_t>(this));
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::ProcessBlock(ByteSpan & block)
+{
+ if ((block.data() == nullptr) || block.empty())
+ {
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+
+ // Store block data for HandleProcessBlock to access
+ CHIP_ERROR err = SetBlock(block);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(SoftwareUpdate, "Cannot set block data: %" CHIP_ERROR_FORMAT, err.Format());
+ }
+
+ DeviceLayer::PlatformMgr().ScheduleWork(HandleProcessBlock, reinterpret_cast<intptr_t>(this));
+ return CHIP_NO_ERROR;
+}
+
+void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context)
+{
+ auto * imageProcessor = reinterpret_cast<OTAImageProcessorImpl *>(context);
+ if (imageProcessor == nullptr)
+ {
+ ChipLogError(SoftwareUpdate, "ImageProcessor context is null");
+ return;
+ }
+ else if (imageProcessor->mDownloader == nullptr)
+ {
+ ChipLogError(SoftwareUpdate, "mDownloader is null");
+ return;
+ }
+
+ // Open and erase secondary flash area to prepare
+ if (flash_area_open(FLASH_AREA_IMAGE_SECONDARY(0), &(imageProcessor->mFlashArea)) != 0)
+ {
+ imageProcessor->mDownloader->OnPreparedForDownload(CHIP_ERROR_OPEN_FAILED);
+ return;
+ }
+ // Note: This only erases up to the secondary slot size (which fa_size is
+ // set to). It will not erase the persistent storage as that only uses
+ // a small region towards the end of flash.
+ if (flash_area_erase(imageProcessor->mFlashArea, 0, imageProcessor->mFlashArea->fa_size) != 0)
+ {
+ imageProcessor->mDownloader->OnPreparedForDownload(CHIP_ERROR_OPEN_FAILED);
+ return;
+ }
+
+ imageProcessor->mDownloader->OnPreparedForDownload(CHIP_NO_ERROR);
+}
+
+void OTAImageProcessorImpl::HandleFinalize(intptr_t context)
+{
+ auto * imageProcessor = reinterpret_cast<OTAImageProcessorImpl *>(context);
+ if (imageProcessor == nullptr)
+ {
+ return;
+ }
+
+ flash_area_close(imageProcessor->mFlashArea);
+ ChipLogProgress(SoftwareUpdate, "Setting boot pending");
+ int ret = boot_set_pending(0, 1);
+
+ if (ret != 0)
+ {
+ ChipLogError(SoftwareUpdate, "Failed to set boot pending");
+ return;
+ }
+
+ imageProcessor->ReleaseBlock();
+}
+
+void OTAImageProcessorImpl::HandleAbort(intptr_t context)
+{
+ auto * imageProcessor = reinterpret_cast<OTAImageProcessorImpl *>(context);
+ if (imageProcessor == nullptr)
+ {
+ return;
+ }
+
+ flash_area_erase(imageProcessor->mFlashArea, 0, imageProcessor->mFlashArea->fa_size);
+
+ imageProcessor->ReleaseBlock();
+}
+
+void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context)
+{
+ auto * imageProcessor = reinterpret_cast<OTAImageProcessorImpl *>(context);
+ if (imageProcessor == nullptr)
+ {
+ ChipLogError(SoftwareUpdate, "ImageProcessor context is null");
+ return;
+ }
+ else if (imageProcessor->mDownloader == nullptr)
+ {
+ ChipLogError(SoftwareUpdate, "mDownloader is null");
+ return;
+ }
+
+ int rc = flash_area_write(imageProcessor->mFlashArea, imageProcessor->mParams.downloadedBytes, imageProcessor->mBlock.data(),
+ imageProcessor->mBlock.size());
+ if (rc != 0)
+ {
+ imageProcessor->mDownloader->EndDownload(CHIP_ERROR_WRITE_FAILED);
+ return;
+ }
+
+ imageProcessor->mParams.downloadedBytes += imageProcessor->mBlock.size();
+ imageProcessor->mDownloader->FetchNextData();
+}
+
+void OTAImageProcessorImpl::HandleApply(intptr_t context)
+{
+ ChipLogProgress(SoftwareUpdate, "Rebooting after 2 seconds...");
+
+ cy_rtos_delay_milliseconds(2000);
+
+ NVIC_SystemReset();
+
+ return;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::SetBlock(ByteSpan & block)
+{
+ if (!IsSpanUsable(block))
+ {
+ ReleaseBlock();
+ return CHIP_NO_ERROR;
+ }
+ if (mBlock.size() < block.size())
+ {
+ if (!mBlock.empty())
+ {
+ ReleaseBlock();
+ }
+ uint8_t * mBlock_ptr = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(block.size()));
+ if (mBlock_ptr == nullptr)
+ {
+ return CHIP_ERROR_NO_MEMORY;
+ }
+ mBlock = MutableByteSpan(mBlock_ptr, block.size());
+ }
+ CHIP_ERROR err = CopySpanToMutableSpan(block, mBlock);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(SoftwareUpdate, "Cannot copy block data: %" CHIP_ERROR_FORMAT, err.Format());
+ return err;
+ }
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR OTAImageProcessorImpl::ReleaseBlock()
+{
+ if (mBlock.data() != nullptr)
+ {
+ chip::Platform::MemoryFree(mBlock.data());
+ }
+
+ mBlock = MutableByteSpan();
+ return CHIP_NO_ERROR;
+}
+#endif // P6_OTA
+
+} // namespace chip
diff --git a/src/platform/P6/OTAImageProcessorImpl.h b/src/platform/P6/OTAImageProcessorImpl.h
new file mode 100644
index 0000000..89a2e7c
--- /dev/null
+++ b/src/platform/P6/OTAImageProcessorImpl.h
@@ -0,0 +1,74 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <app/clusters/ota-requestor/OTADownloader.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/OTAImageProcessor.h>
+
+#include <fstream>
+
+#ifdef P6_OTA
+extern "C" {
+#include "bootutil/bootutil.h"
+#include "cy_flash_psoc6.h"
+#include "cy_smif_psoc6.h"
+#include "sysflash/sysflash.h"
+}
+
+namespace chip {
+
+class OTAImageProcessorImpl : public OTAImageProcessorInterface
+{
+public:
+ //////////// OTAImageProcessorInterface Implementation ///////////////
+ CHIP_ERROR PrepareDownload() override;
+ CHIP_ERROR Finalize() override;
+ CHIP_ERROR Apply() override;
+ CHIP_ERROR Abort() override;
+ CHIP_ERROR ProcessBlock(ByteSpan & block) override;
+
+ void SetOTADownloader(OTADownloader * downloader) { mDownloader = downloader; }
+
+private:
+ //////////// Actual handlers for the OTAImageProcessorInterface ///////////////
+ static void HandlePrepareDownload(intptr_t context);
+ static void HandleFinalize(intptr_t context);
+ static void HandleAbort(intptr_t context);
+ static void HandleProcessBlock(intptr_t context);
+ static void HandleApply(intptr_t context);
+
+ /**
+ * Called to allocate memory for mBlock if necessary and set it to block
+ */
+ CHIP_ERROR SetBlock(ByteSpan & block);
+
+ /**
+ * Called to release allocated memory for mBlock
+ */
+ CHIP_ERROR ReleaseBlock();
+
+ MutableByteSpan mBlock;
+ OTADownloader * mDownloader;
+
+ const struct flash_area * mFlashArea;
+};
+
+} // namespace chip
+#endif
diff --git a/src/platform/P6/P6Config.cpp b/src/platform/P6/P6Config.cpp
index 857e0db..f6a5dbb 100644
--- a/src/platform/P6/P6Config.cpp
+++ b/src/platform/P6/P6Config.cpp
@@ -53,6 +53,7 @@
const P6Config::Key P6Config::kConfigKey_MfrDeviceCert = { kConfigNamespace_ChipFactory, "device-cert" };
const P6Config::Key P6Config::kConfigKey_MfrDeviceICACerts = { kConfigNamespace_ChipFactory, "device-ca-certs" };
const P6Config::Key P6Config::kConfigKey_MfrDevicePrivateKey = { kConfigNamespace_ChipFactory, "device-key" };
+const P6Config::Key P6Config::kConfigKey_SoftwareVersion = { kConfigNamespace_ChipFactory, "software-ver" };
const P6Config::Key P6Config::kConfigKey_HardwareVersion = { kConfigNamespace_ChipFactory, "hardware-ver" };
const P6Config::Key P6Config::kConfigKey_ManufacturingDate = { kConfigNamespace_ChipFactory, "mfg-date" };
const P6Config::Key P6Config::kConfigKey_SetupPinCode = { kConfigNamespace_ChipFactory, "pin-code" };
@@ -218,10 +219,11 @@
CHIP_ERROR P6Config::FactoryResetConfig(void)
{
CHIP_ERROR err = CHIP_NO_ERROR;
- const Key * config_keys[] = { &kConfigKey_FabricId, &kConfigKey_ServiceConfig, &kConfigKey_PairedAccountId,
- &kConfigKey_ServiceId, &kConfigKey_GroupKeyIndex, &kConfigKey_LastUsedEpochKeyId,
- &kConfigKey_FailSafeArmed, &kConfigKey_WiFiStationSecType, &kConfigKey_WiFiSSID,
- &kConfigKey_WiFiPassword, &kConfigKey_WiFiSecurity, &kConfigKey_WiFiMode };
+ const Key * config_keys[] = { &kConfigKey_FabricId, &kConfigKey_ServiceConfig, &kConfigKey_PairedAccountId,
+ &kConfigKey_ServiceId, &kConfigKey_GroupKeyIndex, &kConfigKey_LastUsedEpochKeyId,
+ &kConfigKey_FailSafeArmed, &kConfigKey_WiFiStationSecType, &kConfigKey_WiFiSSID,
+ &kConfigKey_WiFiPassword, &kConfigKey_WiFiSecurity, &kConfigKey_WiFiMode,
+ &kConfigKey_SoftwareVersion };
for (uint32_t i = 0; i < (sizeof(config_keys) / sizeof(config_keys[0])); i++)
{
diff --git a/src/platform/P6/P6Config.h b/src/platform/P6/P6Config.h
index b576b47..ae44ced 100644
--- a/src/platform/P6/P6Config.h
+++ b/src/platform/P6/P6Config.h
@@ -60,6 +60,7 @@
static const Key kConfigKey_MfrDeviceCert;
static const Key kConfigKey_MfrDeviceICACerts;
static const Key kConfigKey_MfrDevicePrivateKey;
+ static const Key kConfigKey_SoftwareVersion;
static const Key kConfigKey_HardwareVersion;
static const Key kConfigKey_ManufacturingDate;
static const Key kConfigKey_SetupPinCode;
diff --git a/src/platform/P6/args.gni b/src/platform/P6/args.gni
index e16170a..b34b567 100644
--- a/src/platform/P6/args.gni
+++ b/src/platform/P6/args.gni
@@ -1,10 +1,10 @@
-# Copyright (c) 2021 Project CHIP Authors
+# Copyright(c) 2022 Project CHIP Authors
#
-# Licensed under the Apache License, Version 2.0 (the "License");
+# Licensed under the Apache License, Version 2.0(the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
-# http://www.apache.org/licenses/LICENSE-2.0
+# http: // www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
@@ -17,7 +17,7 @@
import("${chip_root}/examples/platform/p6/args.gni")
-# ARM architecture flags will be set based on p6_family.
+#ARM architecture flags will be set based on p6_family.
arm_platform_config = "${p6_sdk_build_root}/p6_arm.gni"
mbedtls_target = "${p6_sdk_build_root}:p6_build"
diff --git a/src/platform/fake/ConfigurationManagerImpl.h b/src/platform/fake/ConfigurationManagerImpl.h
index fef8584..331c244 100644
--- a/src/platform/fake/ConfigurationManagerImpl.h
+++ b/src/platform/fake/ConfigurationManagerImpl.h
@@ -44,6 +44,7 @@
CHIP_ERROR StoreHardwareVersion(uint16_t hardwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
+ CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
CHIP_ERROR StoreSerialNumber(const char * serialNum, size_t serialNumLen) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
CHIP_ERROR GetPrimaryMACAddress(MutableByteSpan buf) override { return CHIP_ERROR_NOT_IMPLEMENTED; }
diff --git a/third_party/p6/BUILD.gn b/third_party/p6/BUILD.gn
index 6e19423..a4c3b8a 100644
--- a/third_party/p6/BUILD.gn
+++ b/third_party/p6/BUILD.gn
@@ -24,6 +24,9 @@
# Add includes, cflags, asmflags, etc in config
config("p6_sdk_config") {
+ # This is ugly but I'm unsure of any other way to forward (non-global) vars from the ota examples BUILD.gn file to this config object
+ ota_app = p6_target_project == "//:ota_requestor_app_sdk_sources"
+
# Pull out includes from generated json
# Treat these includes as system includes, so warnings in them are not fatal.
_include_dirs = []
@@ -62,11 +65,14 @@
ldflags = filter_exclude(mtb_json.ldflags, [ "-T*" ])
# Pull out linker flags with paths (-T flags) and make paths absolute
- linker_script_flags = filter_include(mtb_json.ldflags, [ "-T*" ])
- foreach(flag, linker_script_flags) {
- ldflags += [ "-T/" + rebase_path(string_replace(flag, "-T", "", 1),
- "/",
- "${p6_sdk_build_root}/p6_sdk/") ]
+ # OTA app provides it's own linker script
+ if (!ota_app) {
+ linker_script_flags = filter_include(mtb_json.ldflags, [ "-T*" ])
+ foreach(flag, linker_script_flags) {
+ ldflags += [ "-T/" + rebase_path(string_replace(flag, "-T", "", 1),
+ "/",
+ "${p6_sdk_build_root}/p6_sdk/") ]
+ }
}
# --specs=nano.specs is getting added twice and causing compile issues so remove from cxx flags here.
diff --git a/third_party/p6/p6_sdk.gni b/third_party/p6/p6_sdk.gni
index e376fe6..2f8b8dc 100644
--- a/third_party/p6/p6_sdk.gni
+++ b/third_party/p6/p6_sdk.gni
@@ -66,22 +66,33 @@
sources += invoker.sources
}
+ # This is ugly. See note in BUILD.gn for reasoning
+ mtb_json_local = mtb_json # Can't modify without copying into current scope
+ if (target_name == "ota_requestor_app_sdk_sources") {
+ mtb_json_local.c_source -= [
+ "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_01_cm0p_sleep.c",
+ "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_02_cm0p_sleep.c",
+ "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_03_cm0p_sleep.c",
+ "./libs/psoc6cm0p/COMPONENT_CM0P_SLEEP/psoc6_04_cm0p_sleep.c",
+ ]
+ }
+
# Pull out c sources from generated json
- foreach(src, mtb_json.c_source) {
+ foreach(src, mtb_json_local.c_source) {
sources += [ rebase_path(src,
"${p6_project_dir}",
"${p6_sdk_build_root}/p6_sdk/") ]
}
# Pull out cpp sources from generated json
- foreach(src, mtb_json.cxx_source) {
+ foreach(src, mtb_json_local.cxx_source) {
sources += [ rebase_path(src,
"${p6_project_dir}",
"${p6_sdk_build_root}/p6_sdk/") ]
}
# Pull out .S files from generated json
- foreach(asm, mtb_json.asm_source) {
+ foreach(asm, mtb_json_local.asm_source) {
sources += [ rebase_path(asm,
"${p6_project_dir}",
"${p6_sdk_build_root}/p6_sdk/") ]
diff --git a/third_party/p6/p6_sdk/libs/anycloud-ota b/third_party/p6/p6_sdk/libs/anycloud-ota
new file mode 160000
index 0000000..040f563
--- /dev/null
+++ b/third_party/p6/p6_sdk/libs/anycloud-ota
@@ -0,0 +1 @@
+Subproject commit 040f563c5fa34bf64a4ab487b7af35c6e6e9d7c5